From 37182ee4b22f3f9716fa0ca1a7b2be631a7db10e Mon Sep 17 00:00:00 2001 From: DaoQuangThiet <67154017+DaoQuangThiet@users.noreply.github.com> Date: Wed, 1 Jun 2022 10:54:17 +0700 Subject: [PATCH] init --- .editorconfig | 23 + .gitignore | 40 + .prettierignore | 5 + .prettierrc | 6 + .vscode/extensions.json | 8 + .vscode/settings.json | 4 + ISSUE_TEMPLATE/1.core_bug_report.yml | 55 + ISSUE_TEMPLATE/2.provider_bug_report.yml | 59 + ISSUE_TEMPLATE/3.feature_request.yml | 28 + ISSUE_TEMPLATE/4.docs_request.yml | 18 + ISSUE_TEMPLATE/config.yml | 5 + README.md | 198 + license.md | 21 + package.json | 27 + packages/bigcommerce/.env.template | 8 + packages/bigcommerce/.prettierignore | 2 + packages/bigcommerce/.prettierrc | 6 + packages/bigcommerce/README.md | 59 + packages/bigcommerce/codegen.json | 27 + packages/bigcommerce/package.json | 86 + packages/bigcommerce/schema.d.ts | 2064 ++ packages/bigcommerce/schema.graphql | 2422 ++ .../scripts/generate-definitions.js | 49 + .../src/api/definitions/catalog.ts | 2993 +++ .../src/api/definitions/store-content.ts | 329 + .../src/api/definitions/wishlist.ts | 142 + .../src/api/endpoints/cart/add-item.ts | 46 + .../src/api/endpoints/cart/get-cart.ts | 35 + .../src/api/endpoints/cart/index.ts | 26 + .../src/api/endpoints/cart/remove-item.ts | 34 + .../src/api/endpoints/cart/update-item.ts | 36 + .../catalog/products/get-products.ts | 79 + .../api/endpoints/catalog/products/index.ts | 18 + .../api/endpoints/checkout/get-checkout.ts | 90 + .../src/api/endpoints/checkout/index.ts | 18 + .../src/api/endpoints/customer/address.ts | 1 + .../src/api/endpoints/customer/card.ts | 1 + .../customer/get-logged-in-customer.ts | 56 + .../src/api/endpoints/customer/index.ts | 18 + .../src/api/endpoints/login/index.ts | 18 + .../src/api/endpoints/login/login.ts | 49 + .../src/api/endpoints/logout/index.ts | 18 + .../src/api/endpoints/logout/logout.ts | 23 + .../src/api/endpoints/signup/index.ts | 18 + .../src/api/endpoints/signup/signup.ts | 62 + .../src/api/endpoints/wishlist/add-item.ts | 67 + .../api/endpoints/wishlist/get-wishlist.ts | 39 + .../src/api/endpoints/wishlist/index.ts | 24 + .../src/api/endpoints/wishlist/remove-item.ts | 39 + .../src/api/fragments/category-tree.ts | 9 + .../bigcommerce/src/api/fragments/product.ts | 113 + packages/bigcommerce/src/api/index.ts | 120 + .../src/api/operations/get-all-pages.ts | 46 + .../api/operations/get-all-product-paths.ts | 66 + .../src/api/operations/get-all-products.ts | 135 + .../api/operations/get-customer-wishlist.ts | 82 + .../src/api/operations/get-page.ts | 54 + .../src/api/operations/get-product.ts | 119 + .../src/api/operations/get-site-info.ts | 87 + .../bigcommerce/src/api/operations/login.ts | 79 + .../src/api/utils/concat-cookie.ts | 14 + packages/bigcommerce/src/api/utils/errors.ts | 25 + .../src/api/utils/fetch-graphql-api.ts | 36 + .../src/api/utils/fetch-store-api.ts | 71 + packages/bigcommerce/src/api/utils/fetch.ts | 3 + .../bigcommerce/src/api/utils/filter-edges.ts | 5 + .../src/api/utils/get-cart-cookie.ts | 20 + .../src/api/utils/get-customer-id.ts | 32 + .../bigcommerce/src/api/utils/parse-item.ts | 28 + .../src/api/utils/set-product-locale-meta.ts | 21 + packages/bigcommerce/src/api/utils/types.ts | 7 + packages/bigcommerce/src/auth/index.ts | 3 + packages/bigcommerce/src/auth/use-login.tsx | 41 + packages/bigcommerce/src/auth/use-logout.tsx | 28 + packages/bigcommerce/src/auth/use-signup.tsx | 46 + packages/bigcommerce/src/cart/index.ts | 4 + .../bigcommerce/src/cart/use-add-item.tsx | 46 + packages/bigcommerce/src/cart/use-cart.tsx | 33 + .../bigcommerce/src/cart/use-remove-item.tsx | 54 + .../bigcommerce/src/cart/use-update-item.tsx | 84 + .../bigcommerce/src/checkout/use-checkout.tsx | 14 + packages/bigcommerce/src/commerce.config.json | 7 + .../src/customer/address/use-add-item.tsx | 15 + .../src/customer/card/use-add-item.tsx | 15 + packages/bigcommerce/src/customer/index.ts | 1 + .../bigcommerce/src/customer/use-customer.tsx | 26 + packages/bigcommerce/src/fetcher.ts | 41 + packages/bigcommerce/src/index.tsx | 9 + packages/bigcommerce/src/lib/get-slug.ts | 5 + packages/bigcommerce/src/lib/immutability.ts | 13 + packages/bigcommerce/src/lib/normalize.ts | 136 + packages/bigcommerce/src/next.config.cjs | 8 + packages/bigcommerce/src/product/index.ts | 2 + .../bigcommerce/src/product/use-price.tsx | 2 + .../bigcommerce/src/product/use-search.tsx | 52 + packages/bigcommerce/src/provider.ts | 34 + packages/bigcommerce/src/types/cart.ts | 66 + packages/bigcommerce/src/types/checkout.ts | 1 + packages/bigcommerce/src/types/common.ts | 1 + packages/bigcommerce/src/types/customer.ts | 5 + packages/bigcommerce/src/types/index.ts | 25 + packages/bigcommerce/src/types/login.ts | 8 + packages/bigcommerce/src/types/logout.ts | 1 + packages/bigcommerce/src/types/page.ts | 11 + packages/bigcommerce/src/types/product.ts | 1 + packages/bigcommerce/src/types/signup.ts | 1 + packages/bigcommerce/src/types/site.ts | 19 + packages/bigcommerce/src/types/wishlist.ts | 24 + packages/bigcommerce/src/wishlist/index.ts | 3 + .../bigcommerce/src/wishlist/use-add-item.tsx | 39 + .../src/wishlist/use-remove-item.tsx | 40 + .../bigcommerce/src/wishlist/use-wishlist.tsx | 57 + packages/bigcommerce/taskfile.js | 20 + packages/bigcommerce/tsconfig.json | 21 + packages/commerce/.prettierignore | 2 + packages/commerce/.prettierrc | 6 + packages/commerce/README.md | 334 + packages/commerce/fixup.mjs | 5 + packages/commerce/new-provider.md | 237 + packages/commerce/package.json | 83 + packages/commerce/src/api/endpoints/cart.ts | 60 + .../src/api/endpoints/catalog/products.ts | 31 + .../commerce/src/api/endpoints/checkout.ts | 49 + .../src/api/endpoints/customer/address.ts | 65 + .../src/api/endpoints/customer/card.ts | 65 + .../src/api/endpoints/customer/index.ts | 36 + packages/commerce/src/api/endpoints/login.ts | 36 + packages/commerce/src/api/endpoints/logout.ts | 35 + packages/commerce/src/api/endpoints/signup.ts | 36 + .../commerce/src/api/endpoints/wishlist.ts | 58 + packages/commerce/src/api/index.ts | 184 + packages/commerce/src/api/operations.ts | 177 + packages/commerce/src/api/utils/errors.ts | 22 + .../src/api/utils/is-allowed-method.ts | 30 + .../src/api/utils/is-allowed-operation.ts | 19 + packages/commerce/src/api/utils/types.ts | 49 + packages/commerce/src/auth/use-login.tsx | 20 + packages/commerce/src/auth/use-logout.tsx | 20 + packages/commerce/src/auth/use-signup.tsx | 20 + packages/commerce/src/cart/use-add-item.tsx | 20 + packages/commerce/src/cart/use-cart.tsx | 32 + .../commerce/src/cart/use-remove-item.tsx | 20 + .../commerce/src/cart/use-update-item.tsx | 20 + .../commerce/src/checkout/use-checkout.ts | 34 + .../src/checkout/use-submit-checkout.tsx | 23 + packages/commerce/src/config.cjs | 35 + .../src/customer/address/use-add-item.tsx | 21 + .../src/customer/address/use-addresses.tsx | 34 + .../src/customer/address/use-remove-item.tsx | 21 + .../src/customer/address/use-update-item.tsx | 21 + .../src/customer/card/use-add-item.tsx | 21 + .../commerce/src/customer/card/use-cards.tsx | 34 + .../src/customer/card/use-remove-item.tsx | 21 + .../src/customer/card/use-update-item.tsx | 21 + .../commerce/src/customer/use-customer.tsx | 20 + packages/commerce/src/index.tsx | 123 + packages/commerce/src/product/use-price.tsx | 64 + packages/commerce/src/product/use-search.tsx | 20 + packages/commerce/src/types/cart.ts | 177 + packages/commerce/src/types/checkout.ts | 57 + packages/commerce/src/types/common.ts | 16 + .../commerce/src/types/customer/address.ts | 111 + packages/commerce/src/types/customer/card.ts | 102 + packages/commerce/src/types/customer/index.ts | 25 + packages/commerce/src/types/index.ts | 25 + packages/commerce/src/types/login.ts | 29 + packages/commerce/src/types/logout.ts | 17 + packages/commerce/src/types/page.ts | 28 + packages/commerce/src/types/product.ts | 99 + packages/commerce/src/types/signup.ts | 26 + packages/commerce/src/types/site.ts | 20 + packages/commerce/src/types/wishlist.ts | 60 + .../commerce/src/utils/default-fetcher.ts | 12 + .../commerce/src/utils/define-property.ts | 37 + packages/commerce/src/utils/errors.ts | 48 + packages/commerce/src/utils/types.ts | 147 + packages/commerce/src/utils/use-data.tsx | 78 + packages/commerce/src/utils/use-hook.ts | 50 + packages/commerce/src/wishlist/index.ts | 3 + .../commerce/src/wishlist/use-add-item.tsx | 20 + .../commerce/src/wishlist/use-remove-item.tsx | 20 + .../commerce/src/wishlist/use-wishlist.tsx | 20 + packages/commerce/taskfile.js | 20 + packages/commerce/tsconfig.json | 21 + packages/commercejs/.env.template | 7 + packages/commercejs/.prettierignore | 2 + packages/commercejs/.prettierrc | 6 + packages/commercejs/README.md | 13 + packages/commercejs/global.d.ts | 1 + packages/commercejs/package.json | 82 + .../src/api/endpoints/cart/index.ts | 1 + .../src/api/endpoints/catalog/index.ts | 1 + .../api/endpoints/catalog/products/index.ts | 1 + .../api/endpoints/checkout/get-checkout.ts | 1 + .../src/api/endpoints/checkout/index.ts | 23 + .../api/endpoints/checkout/submit-checkout.ts | 44 + .../api/endpoints/customer/address/index.ts | 1 + .../src/api/endpoints/customer/card/index.ts | 1 + .../src/api/endpoints/customer/index.ts | 1 + .../src/api/endpoints/login/index.ts | 18 + .../src/api/endpoints/login/login.ts | 33 + .../src/api/endpoints/logout/index.ts | 1 + .../src/api/endpoints/signup/index.ts | 1 + .../src/api/endpoints/wishlist/index.tsx | 1 + packages/commercejs/src/api/index.ts | 46 + .../src/api/operations/get-all-pages.ts | 21 + .../api/operations/get-all-product-paths.ts | 35 + .../src/api/operations/get-all-products.ts | 29 + .../commercejs/src/api/operations/get-page.ts | 15 + .../src/api/operations/get-product.ts | 44 + .../src/api/operations/get-site-info.ts | 36 + .../commercejs/src/api/operations/index.ts | 6 + .../commercejs/src/api/utils/graphql-fetch.ts | 14 + .../commercejs/src/api/utils/sdk-fetch.ts | 21 + packages/commercejs/src/auth/index.ts | 3 + packages/commercejs/src/auth/use-login.tsx | 34 + packages/commercejs/src/auth/use-logout.tsx | 27 + packages/commercejs/src/auth/use-signup.tsx | 17 + packages/commercejs/src/cart/index.ts | 4 + packages/commercejs/src/cart/use-add-item.tsx | 45 + packages/commercejs/src/cart/use-cart.tsx | 41 + .../commercejs/src/cart/use-remove-item.tsx | 36 + .../commercejs/src/cart/use-update-item.tsx | 76 + packages/commercejs/src/checkout/index.ts | 2 + .../commercejs/src/checkout/use-checkout.tsx | 52 + .../src/checkout/use-submit-checkout.tsx | 38 + packages/commercejs/src/commerce.config.json | 10 + packages/commercejs/src/constants.ts | 4 + .../commercejs/src/customer/address/index.ts | 2 + .../src/customer/address/use-add-item.tsx | 25 + .../src/customer/address/use-addresses.tsx | 34 + .../commercejs/src/customer/card/index.ts | 2 + .../src/customer/card/use-add-item.tsx | 25 + .../src/customer/card/use-cards.tsx | 31 + packages/commercejs/src/customer/index.ts | 1 + .../commercejs/src/customer/use-customer.tsx | 44 + packages/commercejs/src/fetcher.ts | 61 + packages/commercejs/src/index.tsx | 9 + packages/commercejs/src/lib/commercejs.ts | 11 + packages/commercejs/src/next.config.cjs | 16 + packages/commercejs/src/product/index.ts | 2 + packages/commercejs/src/product/use-price.tsx | 2 + .../commercejs/src/product/use-search.tsx | 53 + packages/commercejs/src/provider.ts | 55 + packages/commercejs/src/types/cart.ts | 4 + packages/commercejs/src/types/checkout.ts | 3 + packages/commercejs/src/types/common.ts | 1 + packages/commercejs/src/types/customer.ts | 1 + packages/commercejs/src/types/index.ts | 25 + packages/commercejs/src/types/login.ts | 9 + packages/commercejs/src/types/logout.ts | 1 + packages/commercejs/src/types/page.ts | 1 + packages/commercejs/src/types/product.ts | 4 + packages/commercejs/src/types/signup.ts | 1 + packages/commercejs/src/types/site.ts | 3 + packages/commercejs/src/types/wishlist.ts | 1 + .../src/utils/get-deployment-url.ts | 12 + .../commercejs/src/utils/normalize-cart.ts | 74 + .../src/utils/normalize-category.ts | 14 + .../src/utils/normalize-checkout.ts | 63 + .../commercejs/src/utils/normalize-product.ts | 77 + .../commercejs/src/utils/product-search.ts | 54 + .../commercejs/src/wishlist/use-add-item.tsx | 13 + .../src/wishlist/use-remove-item.tsx | 17 + .../commercejs/src/wishlist/use-wishlist.tsx | 40 + packages/commercejs/taskfile.js | 20 + packages/commercejs/tsconfig.json | 21 + packages/kibocommerce/.env.template | 7 + packages/kibocommerce/.prettierignore | 2 + packages/kibocommerce/.prettierrc | 6 + packages/kibocommerce/README.md | 37 + packages/kibocommerce/codegen.json | 21 + packages/kibocommerce/package.json | 87 + packages/kibocommerce/schema.d.ts | 11399 ++++++++++ packages/kibocommerce/schema.graphql | 9129 ++++++++ .../src/api/endpoints/cart/add-item.ts | 101 + .../src/api/endpoints/cart/get-cart.ts | 41 + .../src/api/endpoints/cart/index.ts | 25 + .../src/api/endpoints/cart/remove-item.ts | 45 + .../src/api/endpoints/cart/update-item.ts | 45 + .../api/endpoints/catalog/products/index.ts | 17 + .../endpoints/catalog/products/products.ts | 31 + .../src/api/endpoints/checkout/index.ts | 1 + .../src/api/endpoints/customer/address.ts | 1 + .../src/api/endpoints/customer/card.ts | 1 + .../src/api/endpoints/customer/customer.ts | 36 + .../src/api/endpoints/customer/index.ts | 18 + .../src/api/endpoints/login/index.ts | 20 + .../src/api/endpoints/login/login.ts | 66 + .../src/api/endpoints/logout/index.ts | 18 + .../src/api/endpoints/logout/logout.ts | 22 + .../src/api/endpoints/signup/index.ts | 18 + .../src/api/endpoints/signup/signup.ts | 91 + .../src/api/endpoints/wishlist/add-item.ts | 124 + .../api/endpoints/wishlist/get-wishlist.ts | 35 + .../src/api/endpoints/wishlist/index.ts | 23 + .../src/api/endpoints/wishlist/remove-item.ts | 60 + .../src/api/fragments/cartItemDetails.ts | 11 + .../src/api/fragments/category.ts | 11 + .../kibocommerce/src/api/fragments/product.ts | 98 + .../src/api/fragments/productDetails.ts | 30 + .../kibocommerce/src/api/fragments/search.ts | 32 + packages/kibocommerce/src/api/index.ts | 64 + .../mutations/addItemToWishlist-mutation.ts | 21 + .../src/api/mutations/addToCart-mutation.ts | 12 + .../api/mutations/create-wishlist-mutation.ts | 11 + .../src/api/mutations/login-mutation.ts | 20 + .../mutations/removeItemFromCart-mutation.ts | 9 + .../removeItemFromWishlist-mutation.ts | 8 + .../src/api/mutations/signup-mutation.ts | 41 + .../updateCartItemQuantity-mutation.ts | 9 + .../src/api/operations/get-all-pages.ts | 38 + .../api/operations/get-all-product-paths.ts | 26 + .../src/api/operations/get-all-products.ts | 32 + .../api/operations/get-customer-wishlist.ts | 57 + .../src/api/operations/get-page.ts | 40 + .../src/api/operations/get-product.ts | 35 + .../src/api/operations/get-site-info.ts | 35 + .../kibocommerce/src/api/operations/index.ts | 6 + .../src/api/queries/get-all-pages-query.ts | 11 + .../src/api/queries/get-all-products-query.ts | 21 + .../get-anonymous-shopper-token-query.ts | 11 + .../src/api/queries/get-cart-query.ts | 32 + .../api/queries/get-categories-tree-query.ts | 29 + .../api/queries/get-customer-account-query.ts | 12 + .../queries/get-customer-wishlist-query.ts | 25 + .../src/api/queries/get-page-query.ts | 14 + .../src/api/queries/get-product-query.ts | 15 + .../src/api/queries/product-search-query.ts | 20 + .../src/api/utils/api-auth-helper.ts | 110 + .../src/api/utils/cookie-handler.ts | 61 + .../src/api/utils/fetch-graphql-api.ts | 43 + .../kibocommerce/src/api/utils/fetch-local.ts | 36 + packages/kibocommerce/src/api/utils/fetch.ts | 3 + .../api/utils/get-anonymous-shopper-token.ts | 13 + .../src/api/utils/get-customer-id.ts | 26 + packages/kibocommerce/src/auth/index.ts | 3 + packages/kibocommerce/src/auth/use-login.tsx | 43 + packages/kibocommerce/src/auth/use-logout.tsx | 29 + packages/kibocommerce/src/auth/use-signup.tsx | 46 + packages/kibocommerce/src/cart/index.ts | 4 + .../kibocommerce/src/cart/use-add-item.tsx | 44 + packages/kibocommerce/src/cart/use-cart.tsx | 33 + .../kibocommerce/src/cart/use-remove-item.tsx | 56 + .../kibocommerce/src/cart/use-update-item.tsx | 84 + .../src/checkout/use-checkout.tsx | 14 + .../kibocommerce/src/commerce.config.json | 9 + .../src/customer/address/use-add-item.tsx | 15 + .../src/customer/card/use-add-item.tsx | 15 + packages/kibocommerce/src/customer/index.ts | 1 + .../src/customer/use-customer.tsx | 24 + packages/kibocommerce/src/fetcher.ts | 41 + packages/kibocommerce/src/index.tsx | 9 + .../src/lib/get-cookie-expiration-date.ts | 8 + packages/kibocommerce/src/lib/get-slug.ts | 5 + packages/kibocommerce/src/lib/normalize.ts | 180 + .../src/lib/prepare-set-cookie.ts | 15 + .../src/lib/product-search-vars.ts | 55 + packages/kibocommerce/src/lib/set-cookie.ts | 3 + packages/kibocommerce/src/next.config.cjs | 12 + packages/kibocommerce/src/product/index.ts | 2 + .../kibocommerce/src/product/use-price.tsx | 2 + .../kibocommerce/src/product/use-search.tsx | 37 + packages/kibocommerce/src/provider.ts | 30 + packages/kibocommerce/src/types/customer.ts | 27 + packages/kibocommerce/src/types/login.ts | 8 + packages/kibocommerce/src/types/logout.ts | 1 + packages/kibocommerce/src/types/page.ts | 35 + packages/kibocommerce/src/types/signup.ts | 1 + packages/kibocommerce/src/wishlist/index.ts | 3 + .../src/wishlist/use-add-item.tsx | 38 + .../src/wishlist/use-remove-item.tsx | 40 + .../src/wishlist/use-wishlist.tsx | 52 + packages/kibocommerce/taskfile.js | 20 + packages/kibocommerce/tsconfig.json | 21 + packages/local/.env.template | 1 + packages/local/.prettierignore | 2 + packages/local/.prettierrc | 6 + packages/local/README.md | 1 + packages/local/package.json | 79 + .../local/src/api/endpoints/cart/index.ts | 1 + .../local/src/api/endpoints/catalog/index.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../local/src/api/endpoints/checkout/index.ts | 1 + .../src/api/endpoints/customer/address.ts | 1 + .../local/src/api/endpoints/customer/card.ts | 1 + .../local/src/api/endpoints/customer/index.ts | 1 + .../local/src/api/endpoints/login/index.ts | 1 + .../local/src/api/endpoints/logout/index.ts | 1 + .../local/src/api/endpoints/signup/index.ts | 1 + .../src/api/endpoints/wishlist/index.tsx | 1 + packages/local/src/api/index.ts | 42 + .../local/src/api/operations/get-all-pages.ts | 19 + .../api/operations/get-all-product-paths.ts | 15 + .../src/api/operations/get-all-products.ts | 25 + .../api/operations/get-customer-wishlist.ts | 6 + packages/local/src/api/operations/get-page.ts | 13 + .../local/src/api/operations/get-product.ts | 26 + .../local/src/api/operations/get-site-info.ts | 43 + packages/local/src/api/operations/index.ts | 6 + packages/local/src/api/utils/fetch-local.ts | 34 + packages/local/src/api/utils/fetch.ts | 3 + packages/local/src/auth/index.ts | 3 + packages/local/src/auth/use-login.tsx | 16 + packages/local/src/auth/use-logout.tsx | 17 + packages/local/src/auth/use-signup.tsx | 19 + packages/local/src/cart/index.ts | 4 + packages/local/src/cart/use-add-item.tsx | 17 + packages/local/src/cart/use-cart.tsx | 42 + packages/local/src/cart/use-remove-item.tsx | 20 + packages/local/src/cart/use-update-item.tsx | 20 + packages/local/src/checkout/use-checkout.tsx | 16 + packages/local/src/commerce.config.json | 10 + .../src/customer/address/use-add-item.tsx | 17 + .../local/src/customer/card/use-add-item.tsx | 17 + packages/local/src/customer/index.ts | 1 + packages/local/src/customer/use-customer.tsx | 17 + packages/local/src/data.json | 235 + packages/local/src/fetcher.ts | 11 + packages/local/src/index.tsx | 12 + packages/local/src/next.config.cjs | 8 + packages/local/src/product/index.ts | 2 + packages/local/src/product/use-price.tsx | 2 + packages/local/src/product/use-search.tsx | 17 + packages/local/src/provider.ts | 22 + packages/local/src/wishlist/use-add-item.tsx | 13 + .../local/src/wishlist/use-remove-item.tsx | 17 + packages/local/src/wishlist/use-wishlist.tsx | 43 + packages/local/taskfile.js | 20 + packages/local/tsconfig.json | 21 + packages/ordercloud/.env.template | 6 + packages/ordercloud/.prettierignore | 2 + packages/ordercloud/.prettierrc | 6 + packages/ordercloud/README.md | 3 + packages/ordercloud/package.json | 82 + .../src/api/endpoints/cart/add-item.ts | 99 + .../src/api/endpoints/cart/get-cart.ts | 65 + .../src/api/endpoints/cart/index.ts | 28 + .../src/api/endpoints/cart/remove-item.ts | 45 + .../src/api/endpoints/cart/update-item.ts | 63 + .../catalog/products/get-products.ts | 37 + .../api/endpoints/catalog/products/index.ts | 19 + .../api/endpoints/checkout/get-checkout.ts | 47 + .../src/api/endpoints/checkout/index.ts | 23 + .../api/endpoints/checkout/submit-checkout.ts | 32 + .../endpoints/customer/address/add-item.ts | 47 + .../customer/address/get-addresses.ts | 9 + .../api/endpoints/customer/address/index.ts | 30 + .../endpoints/customer/address/remove-item.ts | 9 + .../endpoints/customer/address/update-item.ts | 9 + .../api/endpoints/customer/card/add-item.ts | 74 + .../api/endpoints/customer/card/get-cards.ts | 9 + .../src/api/endpoints/customer/card/index.ts | 27 + .../endpoints/customer/card/remove-item.ts | 9 + .../endpoints/customer/card/update-item.ts | 9 + .../src/api/endpoints/customer/index.ts | 1 + .../src/api/endpoints/login/index.ts | 1 + .../src/api/endpoints/logout/index.ts | 1 + .../src/api/endpoints/signup/index.ts | 1 + .../src/api/endpoints/wishlist/index.tsx | 1 + packages/ordercloud/src/api/index.ts | 71 + .../src/api/operations/get-all-pages.ts | 22 + .../api/operations/get-all-product-paths.ts | 34 + .../src/api/operations/get-all-products.ts | 35 + .../ordercloud/src/api/operations/get-page.ts | 15 + .../src/api/operations/get-product.ts | 60 + .../src/api/operations/get-site-info.ts | 46 + .../ordercloud/src/api/operations/index.ts | 6 + packages/ordercloud/src/api/utils/cart.ts | 41 + .../ordercloud/src/api/utils/fetch-graphql.ts | 14 + .../ordercloud/src/api/utils/fetch-rest.ts | 180 + packages/ordercloud/src/auth/index.ts | 3 + packages/ordercloud/src/auth/use-login.tsx | 16 + packages/ordercloud/src/auth/use-logout.tsx | 17 + packages/ordercloud/src/auth/use-signup.tsx | 19 + packages/ordercloud/src/cart/index.ts | 4 + packages/ordercloud/src/cart/use-add-item.tsx | 48 + packages/ordercloud/src/cart/use-cart.tsx | 33 + .../ordercloud/src/cart/use-remove-item.tsx | 60 + .../ordercloud/src/cart/use-update-item.tsx | 93 + packages/ordercloud/src/checkout/index.ts | 2 + .../ordercloud/src/checkout/use-checkout.tsx | 41 + .../src/checkout/use-submit-checkout.tsx | 38 + packages/ordercloud/src/commerce.config.json | 10 + packages/ordercloud/src/constants.ts | 6 + .../ordercloud/src/customer/address/index.ts | 4 + .../src/customer/address/use-add-item.tsx | 38 + .../src/customer/address/use-addresses.tsx | 35 + .../src/customer/address/use-remove-item.tsx | 62 + .../src/customer/address/use-update-item.tsx | 52 + .../ordercloud/src/customer/card/index.ts | 4 + .../src/customer/card/use-add-item.tsx | 38 + .../src/customer/card/use-cards.tsx | 33 + .../src/customer/card/use-remove-item.tsx | 62 + .../src/customer/card/use-update-item.tsx | 52 + packages/ordercloud/src/customer/index.ts | 1 + .../ordercloud/src/customer/use-customer.tsx | 15 + packages/ordercloud/src/fetcher.ts | 17 + packages/ordercloud/src/index.tsx | 9 + packages/ordercloud/src/next.config.cjs | 8 + packages/ordercloud/src/product/index.ts | 2 + packages/ordercloud/src/product/use-price.tsx | 2 + .../ordercloud/src/product/use-search.tsx | 41 + packages/ordercloud/src/provider.ts | 62 + packages/ordercloud/src/types/cart.ts | 126 + packages/ordercloud/src/types/category.ts | 10 + packages/ordercloud/src/types/checkout.ts | 4 + .../ordercloud/src/types/customer/address.ts | 32 + .../ordercloud/src/types/customer/card.ts | 16 + packages/ordercloud/src/types/node.d.ts | 3 + packages/ordercloud/src/types/product.ts | 55 + packages/ordercloud/src/utils/product.ts | 47 + .../ordercloud/src/wishlist/use-add-item.tsx | 13 + .../src/wishlist/use-remove-item.tsx | 17 + .../ordercloud/src/wishlist/use-wishlist.tsx | 43 + packages/ordercloud/taskfile.js | 20 + packages/ordercloud/tsconfig.json | 21 + packages/saleor/.env.template | 4 + packages/saleor/.prettierignore | 2 + packages/saleor/.prettierrc | 6 + packages/saleor/README.md | 22 + packages/saleor/codegen.json | 33 + packages/saleor/package.json | 87 + packages/saleor/schema.d.ts | 11488 ++++++++++ packages/saleor/schema.graphql | 18973 ++++++++++++++++ packages/saleor/src/api/cart.ts | 1 + packages/saleor/src/api/catalog/products.ts | 1 + packages/saleor/src/api/checkout.ts | 1 + packages/saleor/src/api/customers/index.ts | 1 + packages/saleor/src/api/customers/login.ts | 1 + packages/saleor/src/api/customers/logout.ts | 1 + packages/saleor/src/api/customers/signup.ts | 1 + packages/saleor/src/api/endpoints/cart.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../src/api/endpoints/checkout/index.ts | 53 + .../src/api/endpoints/customer/address.ts | 1 + .../saleor/src/api/endpoints/customer/card.ts | 1 + .../src/api/endpoints/customer/index.ts | 1 + packages/saleor/src/api/endpoints/login.ts | 1 + packages/saleor/src/api/endpoints/logout.ts | 1 + packages/saleor/src/api/endpoints/signup.ts | 1 + packages/saleor/src/api/endpoints/wishlist.ts | 1 + packages/saleor/src/api/index.ts | 38 + .../src/api/operations/get-all-pages.ts | 47 + .../api/operations/get-all-product-paths.ts | 38 + .../src/api/operations/get-all-products.ts | 64 + .../saleor/src/api/operations/get-page.ts | 50 + .../saleor/src/api/operations/get-product.ts | 46 + .../src/api/operations/get-site-info.ts | 35 + packages/saleor/src/api/operations/index.ts | 7 + packages/saleor/src/api/operations/login.ts | 40 + .../src/api/utils/fetch-all-products.ts | 41 + .../saleor/src/api/utils/fetch-graphql-api.ts | 37 + packages/saleor/src/api/utils/fetch.ts | 2 + .../saleor/src/api/utils/is-allowed-method.ts | 22 + packages/saleor/src/api/wishlist.ts | 1 + packages/saleor/src/auth/use-login.tsx | 63 + packages/saleor/src/auth/use-logout.tsx | 41 + packages/saleor/src/auth/use-signup.tsx | 56 + packages/saleor/src/cart/index.ts | 4 + packages/saleor/src/cart/use-add-item.tsx | 54 + packages/saleor/src/cart/use-cart.tsx | 53 + packages/saleor/src/cart/use-remove-item.tsx | 39 + packages/saleor/src/cart/use-update-item.tsx | 96 + packages/saleor/src/checkout/use-checkout.tsx | 14 + packages/saleor/src/commerce.config.json | 6 + packages/saleor/src/const.ts | 5 + .../src/customer/address/use-add-item.tsx | 15 + .../saleor/src/customer/card/use-add-item.tsx | 15 + packages/saleor/src/customer/index.ts | 1 + packages/saleor/src/customer/use-customer.tsx | 30 + packages/saleor/src/fetcher.ts | 20 + packages/saleor/src/index.tsx | 9 + packages/saleor/src/next.config.cjs | 8 + packages/saleor/src/product/use-price.tsx | 2 + packages/saleor/src/product/use-search.tsx | 74 + packages/saleor/src/provider.ts | 26 + packages/saleor/src/types.ts | 43 + packages/saleor/src/types/cart.ts | 32 + packages/saleor/src/utils/checkout-attach.ts | 12 + packages/saleor/src/utils/checkout-create.ts | 25 + packages/saleor/src/utils/checkout-to-cart.ts | 48 + packages/saleor/src/utils/customer-token.ts | 25 + .../src/utils/fragments/checkout-details.ts | 49 + packages/saleor/src/utils/fragments/index.ts | 2 + .../saleor/src/utils/fragments/product.ts | 29 + packages/saleor/src/utils/get-categories.ts | 23 + packages/saleor/src/utils/get-checkout-id.ts | 9 + .../saleor/src/utils/get-search-variables.ts | 18 + .../saleor/src/utils/get-sort-variables.ts | 30 + packages/saleor/src/utils/get-vendors.ts | 41 + .../saleor/src/utils/handle-fetch-response.ts | 27 + packages/saleor/src/utils/handle-login.ts | 35 + packages/saleor/src/utils/index.ts | 19 + .../src/utils/mutations/account-create.ts | 15 + .../src/utils/mutations/checkout-attach.ts | 12 + .../src/utils/mutations/checkout-create.ts | 17 + .../src/utils/mutations/checkout-line-add.ts | 17 + .../utils/mutations/checkout-line-remove.ts | 17 + .../utils/mutations/checkout-line-update.ts | 17 + packages/saleor/src/utils/mutations/index.ts | 8 + .../src/utils/mutations/session-create.ts | 14 + .../src/utils/mutations/session-destroy.ts | 10 + packages/saleor/src/utils/normalize.ts | 133 + .../saleor/src/utils/queries/checkout-one.ts | 12 + .../src/utils/queries/collection-many.ts | 13 + .../src/utils/queries/collection-one.ts | 13 + .../src/utils/queries/customer-current.ts | 11 + .../saleor/src/utils/queries/customer-one.ts | 7 + .../queries/get-all-product-vendors-query.ts | 16 + .../queries/get-all-products-paths-query.ts | 16 + packages/saleor/src/utils/queries/index.ts | 14 + .../saleor/src/utils/queries/page-many.ts | 13 + packages/saleor/src/utils/queries/page-one.ts | 9 + .../saleor/src/utils/queries/product-many.ts | 15 + .../src/utils/queries/product-one-by-slug.ts | 43 + .../saleor/src/utils/throw-user-errors.ts | 20 + packages/saleor/src/wishlist/use-add-item.tsx | 13 + .../saleor/src/wishlist/use-remove-item.tsx | 17 + packages/saleor/src/wishlist/use-wishlist.tsx | 46 + packages/saleor/taskfile.js | 20 + packages/saleor/tsconfig.json | 21 + packages/sfcc/.env.template | 7 + packages/sfcc/.prettierignore | 2 + packages/sfcc/.prettierrc | 6 + packages/sfcc/README.md | 40 + packages/sfcc/package.json | 80 + packages/sfcc/src/api/endpoints/cart/index.ts | 1 + .../catalog/products/get-products.ts | 32 + .../api/endpoints/catalog/products/index.ts | 19 + .../sfcc/src/api/endpoints/checkout/index.ts | 1 + .../src/api/endpoints/customer/address.ts | 1 + .../sfcc/src/api/endpoints/customer/card.ts | 1 + .../sfcc/src/api/endpoints/customer/index.ts | 1 + .../sfcc/src/api/endpoints/login/index.ts | 1 + .../sfcc/src/api/endpoints/logout/index.ts | 1 + .../sfcc/src/api/endpoints/signup/index.ts | 1 + .../sfcc/src/api/endpoints/wishlist/index.tsx | 1 + packages/sfcc/src/api/index.ts | 48 + .../sfcc/src/api/operations/get-all-pages.ts | 19 + .../api/operations/get-all-product-paths.ts | 45 + .../src/api/operations/get-all-products.ts | 40 + .../api/operations/get-customer-wishlist.ts | 6 + packages/sfcc/src/api/operations/get-page.ts | 13 + .../sfcc/src/api/operations/get-product.ts | 33 + .../sfcc/src/api/operations/get-site-info.ts | 43 + packages/sfcc/src/api/operations/index.ts | 6 + packages/sfcc/src/api/utils/fetch-local.ts | 34 + packages/sfcc/src/api/utils/fetch.ts | 3 + packages/sfcc/src/api/utils/get-auth-token.ts | 42 + .../sfcc/src/api/utils/normalise-product.ts | 96 + packages/sfcc/src/api/utils/sfcc-sdk.ts | 19 + packages/sfcc/src/auth/index.ts | 3 + packages/sfcc/src/auth/use-login.tsx | 16 + packages/sfcc/src/auth/use-logout.tsx | 17 + packages/sfcc/src/auth/use-signup.tsx | 19 + packages/sfcc/src/cart/index.ts | 4 + packages/sfcc/src/cart/use-add-item.tsx | 17 + packages/sfcc/src/cart/use-cart.tsx | 42 + packages/sfcc/src/cart/use-remove-item.tsx | 20 + packages/sfcc/src/cart/use-update-item.tsx | 20 + packages/sfcc/src/checkout/use-checkout.tsx | 16 + packages/sfcc/src/commerce.config.json | 10 + .../src/customer/address/use-add-item.tsx | 17 + .../sfcc/src/customer/card/use-add-item.tsx | 17 + packages/sfcc/src/customer/index.ts | 1 + packages/sfcc/src/customer/use-customer.tsx | 17 + packages/sfcc/src/fetcher.ts | 17 + packages/sfcc/src/index.tsx | 12 + packages/sfcc/src/next.config.cjs | 12 + packages/sfcc/src/product/index.ts | 2 + packages/sfcc/src/product/use-price.tsx | 2 + packages/sfcc/src/product/use-search.tsx | 42 + packages/sfcc/src/provider.ts | 22 + packages/sfcc/src/wishlist/use-add-item.tsx | 13 + .../sfcc/src/wishlist/use-remove-item.tsx | 17 + packages/sfcc/src/wishlist/use-wishlist.tsx | 43 + packages/sfcc/taskfile.js | 20 + packages/sfcc/tsconfig.json | 21 + packages/shopify/.env.template | 4 + packages/shopify/.prettierignore | 2 + packages/shopify/.prettierrc | 6 + packages/shopify/README.md | 135 + packages/shopify/codegen.json | 32 + packages/shopify/package.json | 88 + packages/shopify/schema.d.ts | 5586 +++++ packages/shopify/schema.graphql | 9702 ++++++++ packages/shopify/src/api/endpoints/cart.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../api/endpoints/checkout/get-checkout.ts | 38 + .../src/api/endpoints/checkout/index.ts | 18 + .../src/api/endpoints/customer/address.ts | 1 + .../src/api/endpoints/customer/card.ts | 1 + .../src/api/endpoints/customer/index.ts | 1 + packages/shopify/src/api/endpoints/login.ts | 1 + packages/shopify/src/api/endpoints/logout.ts | 1 + packages/shopify/src/api/endpoints/signup.ts | 1 + .../shopify/src/api/endpoints/wishlist.ts | 1 + packages/shopify/src/api/index.ts | 55 + .../src/api/operations/get-all-pages.ts | 71 + .../api/operations/get-all-product-paths.ts | 55 + .../src/api/operations/get-all-products.ts | 67 + .../shopify/src/api/operations/get-page.ts | 64 + .../shopify/src/api/operations/get-product.ts | 66 + .../src/api/operations/get-site-info.ts | 62 + packages/shopify/src/api/operations/index.ts | 7 + packages/shopify/src/api/operations/login.ts | 48 + .../src/api/utils/fetch-graphql-api.ts | 45 + packages/shopify/src/api/utils/fetch.ts | 2 + packages/shopify/src/auth/use-login.tsx | 63 + packages/shopify/src/auth/use-logout.tsx | 39 + packages/shopify/src/auth/use-signup.tsx | 67 + packages/shopify/src/cart/index.ts | 4 + packages/shopify/src/cart/use-add-item.tsx | 70 + packages/shopify/src/cart/use-cart.tsx | 60 + packages/shopify/src/cart/use-remove-item.tsx | 67 + packages/shopify/src/cart/use-update-item.tsx | 107 + .../shopify/src/checkout/use-checkout.tsx | 16 + packages/shopify/src/commerce.config.json | 7 + packages/shopify/src/const.ts | 13 + .../src/customer/address/use-add-item.tsx | 17 + .../src/customer/card/use-add-item.tsx | 17 + packages/shopify/src/customer/index.ts | 1 + .../shopify/src/customer/use-customer.tsx | 36 + packages/shopify/src/fetcher.ts | 27 + packages/shopify/src/index.tsx | 12 + packages/shopify/src/next.config.cjs | 8 + packages/shopify/src/product/use-price.tsx | 2 + packages/shopify/src/product/use-search.tsx | 91 + packages/shopify/src/provider.ts | 27 + packages/shopify/src/types/cart.ts | 32 + packages/shopify/src/types/checkout.ts | 1 + packages/shopify/src/types/common.ts | 1 + packages/shopify/src/types/customer.ts | 5 + packages/shopify/src/types/index.ts | 25 + packages/shopify/src/types/login.ts | 8 + packages/shopify/src/types/logout.ts | 1 + packages/shopify/src/types/page.ts | 11 + packages/shopify/src/types/product.ts | 1 + packages/shopify/src/types/signup.ts | 1 + packages/shopify/src/types/site.ts | 1 + packages/shopify/src/types/wishlist.ts | 1 + packages/shopify/src/utils/checkout-create.ts | 45 + .../shopify/src/utils/checkout-to-cart.ts | 41 + packages/shopify/src/utils/colors.ts | 154 + packages/shopify/src/utils/customer-token.ts | 21 + packages/shopify/src/utils/get-brands.ts | 44 + packages/shopify/src/utils/get-categories.ts | 34 + packages/shopify/src/utils/get-checkout-id.ts | 8 + .../shopify/src/utils/get-search-variables.ts | 31 + .../shopify/src/utils/get-sort-variables.ts | 32 + .../src/utils/handle-account-activation.ts | 30 + .../src/utils/handle-fetch-response.ts | 27 + packages/shopify/src/utils/handle-login.ts | 36 + packages/shopify/src/utils/index.ts | 15 + .../associate-customer-with-checkout.ts | 18 + .../src/utils/mutations/checkout-create.ts | 19 + .../utils/mutations/checkout-line-item-add.ts | 22 + .../mutations/checkout-line-item-remove.ts | 21 + .../mutations/checkout-line-item-update.ts | 22 + .../mutations/customer-access-token-create.ts | 16 + .../mutations/customer-access-token-delete.ts | 14 + .../mutations/customer-activate-by-url.ts | 19 + .../src/utils/mutations/customer-activate.ts | 19 + .../src/utils/mutations/customer-create.ts | 15 + packages/shopify/src/utils/mutations/index.ts | 9 + packages/shopify/src/utils/normalize.ts | 197 + .../queries/get-all-collections-query.ts | 14 + .../src/utils/queries/get-all-pages-query.ts | 14 + .../queries/get-all-product-vendors-query.ts | 17 + .../queries/get-all-products-paths-query.ts | 17 + .../utils/queries/get-all-products-query.ts | 57 + .../src/utils/queries/get-checkout-query.ts | 70 + .../queries/get-collection-products-query.ts | 21 + .../utils/queries/get-customer-id-query.ts | 8 + .../src/utils/queries/get-customer-query.ts | 16 + .../src/utils/queries/get-page-query.ts | 14 + .../src/utils/queries/get-product-query.ts | 72 + .../src/utils/queries/get-site-info-query.ts | 8 + packages/shopify/src/utils/queries/index.ts | 11 + .../shopify/src/utils/throw-user-errors.ts | 38 + .../shopify/src/wishlist/use-add-item.tsx | 13 + .../shopify/src/wishlist/use-remove-item.tsx | 17 + .../shopify/src/wishlist/use-wishlist.tsx | 46 + packages/shopify/taskfile.js | 20 + packages/shopify/tsconfig.json | 21 + packages/spree/.env.template | 25 + packages/spree/.prettierignore | 2 + packages/spree/.prettierrc | 6 + packages/spree/README-assets/screenshots.png | Bin 0 -> 117099 bytes packages/spree/README.md | 33 + packages/spree/package.json | 83 + .../spree/src/api/endpoints/cart/index.ts | 1 + .../spree/src/api/endpoints/catalog/index.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../api/endpoints/checkout/get-checkout.ts | 44 + .../spree/src/api/endpoints/checkout/index.ts | 22 + .../src/api/endpoints/customer/address.ts | 1 + .../spree/src/api/endpoints/customer/card.ts | 1 + .../spree/src/api/endpoints/customer/index.ts | 1 + .../spree/src/api/endpoints/login/index.ts | 1 + .../spree/src/api/endpoints/logout/index.ts | 1 + .../spree/src/api/endpoints/signup/index.ts | 1 + .../src/api/endpoints/wishlist/index.tsx | 1 + packages/spree/src/api/index.ts | 45 + .../spree/src/api/operations/get-all-pages.ts | 82 + .../api/operations/get-all-product-paths.ts | 97 + .../src/api/operations/get-all-products.ts | 92 + .../api/operations/get-customer-wishlist.ts | 6 + packages/spree/src/api/operations/get-page.ts | 81 + .../spree/src/api/operations/get-product.ts | 90 + .../spree/src/api/operations/get-site-info.ts | 138 + packages/spree/src/api/operations/index.ts | 6 + .../spree/src/api/utils/create-api-fetch.ts | 86 + packages/spree/src/api/utils/fetch.ts | 3 + packages/spree/src/auth/index.ts | 3 + packages/spree/src/auth/use-login.tsx | 86 + packages/spree/src/auth/use-logout.tsx | 81 + packages/spree/src/auth/use-signup.tsx | 96 + packages/spree/src/cart/index.ts | 4 + packages/spree/src/cart/use-add-item.tsx | 118 + packages/spree/src/cart/use-cart.tsx | 123 + packages/spree/src/cart/use-remove-item.tsx | 119 + packages/spree/src/cart/use-update-item.tsx | 148 + packages/spree/src/checkout/use-checkout.tsx | 19 + packages/spree/src/commerce.config.json | 10 + .../src/customer/address/use-add-item.tsx | 18 + .../spree/src/customer/card/use-add-item.tsx | 19 + packages/spree/src/customer/index.ts | 1 + packages/spree/src/customer/use-customer.tsx | 83 + packages/spree/src/errors/AccessTokenError.ts | 1 + .../spree/src/errors/MisconfigurationError.ts | 1 + .../errors/MissingConfigurationValueError.ts | 1 + .../src/errors/MissingLineItemVariantError.ts | 1 + .../src/errors/MissingOptionValueError.ts | 1 + .../src/errors/MissingPrimaryVariantError.ts | 1 + .../spree/src/errors/MissingProductError.ts | 1 + .../src/errors/MissingSlugVariableError.ts | 1 + .../spree/src/errors/MissingVariantError.ts | 1 + .../spree/src/errors/RefreshTokenError.ts | 1 + .../src/errors/SpreeResponseContentError.ts | 1 + .../SpreeSdkMethodFromEndpointPathError.ts | 1 + .../src/errors/TokensNotRejectedError.ts | 1 + .../src/errors/UserTokenResponseParseError.ts | 1 + packages/spree/src/fetcher.ts | 123 + packages/spree/src/index.tsx | 49 + packages/spree/src/isomorphic-config.ts | 81 + packages/spree/src/next.config.cjs | 16 + packages/spree/src/product/index.ts | 2 + packages/spree/src/product/use-price.tsx | 2 + packages/spree/src/product/use-search.tsx | 104 + packages/spree/src/provider.ts | 35 + packages/spree/src/types/index.ts | 164 + .../convert-spree-error-to-graph-ql-error.ts | 52 + .../utils/create-customized-fetch-fetcher.ts | 109 + packages/spree/src/utils/create-empty-cart.ts | 22 + .../utils/create-get-absolute-image-url.ts | 26 + packages/spree/src/utils/expand-options.ts | 103 + .../utils/force-isomorphic-config-values.ts | 43 + packages/spree/src/utils/get-image-url.ts | 44 + packages/spree/src/utils/get-media-gallery.ts | 25 + packages/spree/src/utils/get-product-path.ts | 7 + ...get-spree-sdk-method-from-endpoint-path.ts | 61 + .../spree/src/utils/handle-token-errors.ts | 14 + .../spree/src/utils/is-json-content-type.ts | 5 + packages/spree/src/utils/is-server.ts | 1 + packages/spree/src/utils/login.ts | 58 + .../utils/normalizations/normalize-cart.ts | 211 + .../utils/normalizations/normalize-page.ts | 42 + .../utils/normalizations/normalize-product.ts | 240 + .../utils/normalizations/normalize-user.ts | 16 + .../normalizations/normalize-wishlist.ts | 68 + .../utils/pretty-print-spree-sdk-errors.ts | 21 + packages/spree/src/utils/require-config.ts | 16 + packages/spree/src/utils/sort-option-types.ts | 11 + packages/spree/src/utils/tokens/cart-token.ts | 21 + .../tokens/ensure-fresh-user-access-token.ts | 51 + .../spree/src/utils/tokens/ensure-itoken.ts | 25 + .../spree/src/utils/tokens/is-logged-in.ts | 9 + .../src/utils/tokens/revoke-user-tokens.ts | 49 + .../src/utils/tokens/user-token-response.ts | 58 + .../validate-all-products-taxonomy-id.ts | 13 + .../validations/validate-cookie-expire.ts | 21 + .../validate-images-option-filter.ts | 15 + .../validations/validate-images-quality.ts | 23 + .../utils/validations/validate-images-size.ts | 13 + .../validate-placeholder-image-url.ts | 15 + .../validate-products-prerender-count.ts | 21 + packages/spree/src/wishlist/index.ts | 3 + packages/spree/src/wishlist/use-add-item.tsx | 88 + .../spree/src/wishlist/use-remove-item.tsx | 75 + packages/spree/src/wishlist/use-wishlist.tsx | 93 + packages/spree/taskfile.js | 20 + packages/spree/tsconfig.json | 21 + packages/swell/.env.template | 7 + packages/swell/.prettierignore | 2 + packages/swell/.prettierrc | 6 + packages/swell/package.json | 83 + packages/swell/schema.d.ts | 5002 ++++ packages/swell/schema.graphql | 9631 ++++++++ packages/swell/src/api/cart/index.ts | 1 + packages/swell/src/api/catalog/index.ts | 1 + packages/swell/src/api/catalog/products.ts | 1 + packages/swell/src/api/customer.ts | 1 + packages/swell/src/api/customers/index.ts | 1 + packages/swell/src/api/customers/logout.ts | 1 + packages/swell/src/api/customers/signup.ts | 1 + packages/swell/src/api/endpoints/cart.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../swell/src/api/endpoints/checkout/index.ts | 30 + .../src/api/endpoints/customer/address.ts | 1 + .../swell/src/api/endpoints/customer/card.ts | 1 + .../swell/src/api/endpoints/customer/index.ts | 1 + packages/swell/src/api/endpoints/login.ts | 1 + packages/swell/src/api/endpoints/logout.ts | 1 + packages/swell/src/api/endpoints/signup.ts | 1 + packages/swell/src/api/endpoints/wishlist.ts | 1 + packages/swell/src/api/index.ts | 53 + .../swell/src/api/operations/get-all-pages.ts | 44 + .../api/operations/get-all-product-paths.ts | 51 + .../src/api/operations/get-all-products.ts | 43 + packages/swell/src/api/operations/get-page.ts | 57 + .../swell/src/api/operations/get-product.ts | 33 + .../swell/src/api/operations/get-site-info.ts | 37 + packages/swell/src/api/operations/login.ts | 46 + .../swell/src/api/utils/fetch-swell-api.ts | 7 + packages/swell/src/api/utils/fetch.ts | 2 + .../swell/src/api/utils/is-allowed-method.ts | 28 + packages/swell/src/api/wishlist/index.tsx | 2 + packages/swell/src/auth/use-login.tsx | 76 + packages/swell/src/auth/use-logout.tsx | 39 + packages/swell/src/auth/use-signup.tsx | 61 + packages/swell/src/cart/index.ts | 3 + packages/swell/src/cart/use-add-item.tsx | 61 + packages/swell/src/cart/use-cart.tsx | 39 + packages/swell/src/cart/use-remove-item.tsx | 57 + packages/swell/src/cart/use-update-item.tsx | 101 + .../swell/src/cart/utils/checkout-create.ts | 28 + .../swell/src/cart/utils/checkout-to-cart.ts | 26 + packages/swell/src/cart/utils/index.ts | 2 + packages/swell/src/checkout/use-checkout.tsx | 16 + packages/swell/src/commerce.config.json | 6 + packages/swell/src/const.ts | 11 + .../src/customer/address/use-add-item.tsx | 17 + .../swell/src/customer/card/use-add-item.tsx | 17 + packages/swell/src/customer/index.ts | 1 + packages/swell/src/customer/use-customer.tsx | 31 + packages/swell/src/fetcher.ts | 26 + packages/swell/src/index.tsx | 12 + packages/swell/src/next.config.cjs | 8 + packages/swell/src/product/index.ts | 2 + packages/swell/src/product/use-price.tsx | 2 + packages/swell/src/product/use-search.tsx | 61 + packages/swell/src/provider.ts | 30 + packages/swell/src/swell.ts | 7 + packages/swell/src/types.ts | 112 + packages/swell/src/types/cart.ts | 1 + packages/swell/src/types/checkout.ts | 1 + packages/swell/src/types/common.ts | 1 + packages/swell/src/types/customer.ts | 1 + packages/swell/src/types/index.ts | 25 + packages/swell/src/types/login.ts | 11 + packages/swell/src/types/logout.ts | 1 + packages/swell/src/types/page.ts | 1 + packages/swell/src/types/product.ts | 1 + packages/swell/src/types/signup.ts | 1 + packages/swell/src/types/site.ts | 1 + packages/swell/src/types/wishlist.ts | 1 + packages/swell/src/utils/customer-token.ts | 21 + packages/swell/src/utils/get-categories.ts | 16 + packages/swell/src/utils/get-checkout-id.ts | 8 + .../swell/src/utils/get-search-variables.ts | 27 + .../swell/src/utils/get-sort-variables.ts | 32 + packages/swell/src/utils/get-vendors.ts | 27 + .../swell/src/utils/handle-fetch-response.ts | 19 + packages/swell/src/utils/handle-login.ts | 39 + packages/swell/src/utils/index.ts | 9 + packages/swell/src/utils/normalize.ts | 226 + packages/swell/src/utils/storage.ts | 13 + packages/swell/src/wishlist/use-add-item.tsx | 13 + .../swell/src/wishlist/use-remove-item.tsx | 17 + packages/swell/src/wishlist/use-wishlist.tsx | 46 + packages/swell/taskfile.js | 20 + packages/swell/tsconfig.json | 21 + packages/taskr-swc/.prettierrc | 6 + packages/taskr-swc/package.json | 16 + packages/taskr-swc/taskfile-swc.js | 123 + packages/vendure/.env.template | 4 + packages/vendure/.prettierignore | 2 + packages/vendure/.prettierrc | 6 + packages/vendure/README.md | 37 + packages/vendure/codegen.json | 28 + packages/vendure/package.json | 85 + packages/vendure/schema.d.ts | 3257 +++ packages/vendure/schema.graphql | 4162 ++++ .../vendure/src/api/endpoints/cart/index.ts | 1 + .../src/api/endpoints/catalog/index.ts | 1 + .../src/api/endpoints/catalog/products.ts | 1 + .../src/api/endpoints/checkout/index.ts | 58 + .../src/api/endpoints/customer/address.ts | 1 + .../src/api/endpoints/customer/card.ts | 1 + .../src/api/endpoints/customer/index.ts | 1 + .../vendure/src/api/endpoints/login/index.ts | 1 + .../vendure/src/api/endpoints/logout/index.ts | 1 + .../vendure/src/api/endpoints/signup/index.ts | 1 + .../src/api/endpoints/wishlist/index.tsx | 1 + packages/vendure/src/api/index.ts | 56 + .../src/api/operations/get-all-pages.ts | 40 + .../api/operations/get-all-product-paths.ts | 55 + .../src/api/operations/get-all-products.ts | 46 + .../api/operations/get-customer-wishlist.ts | 23 + .../vendure/src/api/operations/get-page.ts | 45 + .../vendure/src/api/operations/get-product.ts | 69 + .../src/api/operations/get-site-info.ts | 50 + packages/vendure/src/api/operations/login.ts | 60 + .../src/api/utils/fetch-graphql-api.ts | 36 + packages/vendure/src/api/utils/fetch.ts | 3 + packages/vendure/src/auth/index.ts | 3 + packages/vendure/src/auth/use-login.tsx | 53 + packages/vendure/src/auth/use-logout.tsx | 35 + packages/vendure/src/auth/use-signup.tsx | 71 + packages/vendure/src/cart/index.ts | 4 + packages/vendure/src/cart/use-add-item.tsx | 54 + packages/vendure/src/cart/use-cart.tsx | 46 + packages/vendure/src/cart/use-remove-item.tsx | 56 + packages/vendure/src/cart/use-update-item.tsx | 84 + .../vendure/src/checkout/use-checkout.tsx | 16 + packages/vendure/src/commerce.config.json | 6 + .../src/customer/address/use-add-item.tsx | 17 + .../src/customer/card/use-add-item.tsx | 17 + packages/vendure/src/customer/index.ts | 1 + .../vendure/src/customer/use-customer.tsx | 37 + packages/vendure/src/fetcher.ts | 53 + packages/vendure/src/index.tsx | 12 + packages/vendure/src/next.config.cjs | 8 + packages/vendure/src/product/index.ts | 2 + packages/vendure/src/product/use-price.tsx | 2 + packages/vendure/src/product/use-search.tsx | 64 + packages/vendure/src/provider.ts | 22 + packages/vendure/src/types/cart.ts | 1 + packages/vendure/src/types/checkout.ts | 1 + packages/vendure/src/types/common.ts | 1 + packages/vendure/src/types/customer.ts | 1 + packages/vendure/src/types/index.ts | 25 + packages/vendure/src/types/login.ts | 12 + packages/vendure/src/types/logout.ts | 1 + packages/vendure/src/types/page.ts | 1 + packages/vendure/src/types/product.ts | 1 + packages/vendure/src/types/signup.ts | 1 + packages/vendure/src/types/site.ts | 1 + packages/vendure/src/types/wishlist.ts | 1 + packages/vendure/src/utils/array-to-tree.ts | 67 + .../src/utils/fragments/cart-fragment.ts | 44 + .../utils/fragments/search-result-fragment.ts | 23 + .../mutations/add-item-to-order-mutation.ts | 15 + .../mutations/adjust-order-line-mutation.ts | 15 + .../src/utils/mutations/log-in-mutation.ts | 14 + .../src/utils/mutations/log-out-mutation.ts | 7 + .../mutations/remove-order-line-mutation.ts | 15 + .../src/utils/mutations/sign-up-mutation.ts | 14 + packages/vendure/src/utils/normalize.ts | 62 + .../utils/queries/active-customer-query.ts | 10 + .../queries/get-all-product-paths-query.ts | 9 + .../utils/queries/get-all-products-query.ts | 12 + .../src/utils/queries/get-cart-query.ts | 10 + .../utils/queries/get-collections-query.ts | 21 + .../src/utils/queries/get-product-query.ts | 45 + .../vendure/src/utils/queries/search-query.ts | 13 + .../vendure/src/wishlist/use-add-item.tsx | 13 + .../vendure/src/wishlist/use-remove-item.tsx | 17 + .../vendure/src/wishlist/use-wishlist.tsx | 46 + packages/vendure/taskfile.js | 20 + packages/vendure/tsconfig.json | 21 + site/.env.template | 56 + site/.eslintrc | 6 + site/.gitignore | 36 + site/.prettierignore | 3 + site/.prettierrc | 6 + site/assets/aboutpng.png | Bin 0 -> 174031 bytes site/assets/aboutteam01.png | Bin 0 -> 113618 bytes site/assets/aboutteam02.png | Bin 0 -> 104161 bytes site/assets/aboutteam03.png | Bin 0 -> 367365 bytes site/assets/arrow_down.png | Bin 0 -> 133 bytes site/assets/banner1.png | Bin 0 -> 259566 bytes site/assets/banner2.png | Bin 0 -> 408442 bytes site/assets/banner3.png | Bin 0 -> 1551816 bytes site/assets/bannerHome.png | Bin 0 -> 424309 bytes site/assets/banner_page.png | Bin 0 -> 33200 bytes site/assets/base.css | 121 + site/assets/bg-home1-newleter.jpg | Bin 0 -> 61089 bytes site/assets/bg-home1-newleter.png | Bin 0 -> 61089 bytes site/assets/chrome-bug.css | 12 + site/assets/components.css | 3 + site/assets/deals_of_day_1.jpg | Bin 0 -> 12646 bytes site/assets/deals_of_day_2.jpg | Bin 0 -> 14160 bytes site/assets/ebaylogo.png | Bin 0 -> 1645 bytes site/assets/enlang.jpg | Bin 0 -> 428 bytes site/assets/icon_menu.png | Bin 0 -> 325 bytes site/assets/image_1.png | Bin 0 -> 120263 bytes site/assets/image_2.png | Bin 0 -> 148723 bytes site/assets/image_3.png | Bin 0 -> 54507 bytes site/assets/image_4.png | Bin 0 -> 18289 bytes site/assets/image_5.png | Bin 0 -> 13467 bytes site/assets/image_6.png | Bin 0 -> 19147 bytes site/assets/image_7.png | Bin 0 -> 13887 bytes site/assets/imgWorking.jpg | Bin 0 -> 722331 bytes site/assets/logo1.png | Bin 0 -> 989 bytes site/assets/logo2.png | Bin 0 -> 1955 bytes site/assets/logo3.png | Bin 0 -> 1401 bytes site/assets/logo4.png | Bin 0 -> 3012 bytes site/assets/logo5.png | Bin 0 -> 2365 bytes site/assets/logo6.png | Bin 0 -> 2985 bytes site/assets/main.css | 7 + site/assets/payment.png | Bin 0 -> 1437 bytes site/assets/seller_1.png | Bin 0 -> 114215 bytes site/assets/seller_2.png | Bin 0 -> 99281 bytes site/assets/seller_3.png | Bin 0 -> 85191 bytes site/assets/seller_4.png | Bin 0 -> 102577 bytes site/assets/seller_5.png | Bin 0 -> 90040 bytes site/assets/seller_6.png | Bin 0 -> 78646 bytes site/assets/seller_7.png | Bin 0 -> 75369 bytes site/assets/seller_8.png | Bin 0 -> 59163 bytes site/assets/seller_9.png | Bin 0 -> 46111 bytes site/commerce-config.js | 106 + site/commerce.config.json | 9 + site/components/AddHead.js | 12 + site/components/Copyright.js | 66 + site/components/Countdown.js | 64 + site/components/DealsOfDay.js | 253 + site/components/Footer.js | 256 + site/components/HeaderCenter.js | 28 + site/components/HeaderMid.js | 250 + site/components/auth/ForgotPassword.tsx | 78 + site/components/auth/LoginView.tsx | 103 + site/components/auth/SignUpView.tsx | 114 + site/components/auth/index.ts | 3 + site/components/cart/AddToCartButton.js | 87 + site/components/cart/CartIcon.js | 57 + .../cart/CartItem/CartItem.module.css | 32 + site/components/cart/CartItem/CartItem.tsx | 159 + site/components/cart/CartItem/index.ts | 1 + .../CartSidebarView.module.css | 11 + .../cart/CartSidebarView/CartSidebarView.tsx | 131 + site/components/cart/CartSidebarView/index.ts | 1 + .../cart/cart-page/CartItemsContainer.js | 356 + site/components/cart/cart-page/Cartitem.js | 95 + site/components/cart/index.ts | 2 + .../CheckoutSidebarView.module.css | 7 + .../CheckoutSidebarView.tsx | 122 + .../checkout/CheckoutSidebarView/index.ts | 1 + .../PaymentMethodView.module.css | 17 + .../PaymentMethodView/PaymentMethodView.tsx | 130 + .../checkout/PaymentMethodView/index.ts | 1 + .../PaymentWidget/PaymentWidget.module.css | 4 + .../checkout/PaymentWidget/PaymentWidget.tsx | 28 + .../checkout/PaymentWidget/index.ts | 1 + .../ShippingView/ShippingView.module.css | 21 + .../checkout/ShippingView/ShippingView.tsx | 118 + .../components/checkout/ShippingView/index.ts | 1 + .../ShippingWidget/ShippingWidget.module.css | 4 + .../ShippingWidget/ShippingWidget.tsx | 31 + .../checkout/ShippingWidget/index.ts | 1 + site/components/checkout/context.tsx | 111 + site/components/collection.js | 117 + site/components/common/Avatar/Avatar.tsx | 24 + site/components/common/Avatar/index.ts | 1 + .../common/FeatureBar/FeatureBar.module.css | 6 + .../common/FeatureBar/FeatureBar.tsx | 39 + site/components/common/FeatureBar/index.ts | 1 + .../common/Footer/Footer.module.css | 13 + site/components/common/Footer/Footer.tsx | 117 + site/components/common/Footer/index.ts | 1 + site/components/common/Head/Head.tsx | 17 + site/components/common/Head/index.ts | 1 + .../HomeAllProductsGrid.module.css | 23 + .../HomeAllProductsGrid.tsx | 73 + .../common/HomeAllProductsGrid/index.ts | 1 + .../common/I18nWidget/I18nWidget.module.css | 48 + .../common/I18nWidget/I18nWidget.tsx | 101 + site/components/common/I18nWidget/index.ts | 1 + site/components/common/Layout/Layout.js | 30 + .../common/Navbar/Navbar.module.css | 35 + site/components/common/Navbar/Navbar.tsx | 56 + site/components/common/Navbar/NavbarRoot.tsx | 33 + site/components/common/Navbar/index.ts | 1 + site/components/common/SEO/SEO.tsx | 157 + site/components/common/SEO/index.ts | 1 + .../common/Searchbar/Searchbar.module.css | 29 + .../components/common/Searchbar/Searchbar.tsx | 60 + site/components/common/Searchbar/index.ts | 1 + .../SidebarLayout/SidebarLayout.module.css | 20 + .../common/SidebarLayout/SidebarLayout.tsx | 49 + site/components/common/SidebarLayout/index.ts | 1 + .../CustomerMenuContent.module.css | 31 + .../CustomerMenuContent.tsx | 86 + .../UserNav/CustomerMenuContent/index.ts | 1 + .../MenuSidebarView.module.css | 7 + .../MenuSidebarView/MenuSidebarView.tsx | 42 + .../common/UserNav/MenuSidebarView/index.ts | 5 + .../common/UserNav/UserNav.module.css | 59 + site/components/common/UserNav/UserNav.tsx | 103 + site/components/common/UserNav/index.ts | 3 + site/components/common/index.ts | 9 + site/components/countdowns.js | 34 + site/components/formEmail.js | 118 + site/components/icons/ArrowLeft.tsx | 27 + site/components/icons/ArrowRight.tsx | 28 + site/components/icons/Bag.tsx | 33 + site/components/icons/Check.tsx | 21 + site/components/icons/ChevronDown.tsx | 20 + site/components/icons/ChevronLeft.tsx | 20 + site/components/icons/ChevronRight.tsx | 20 + site/components/icons/ChevronUp.tsx | 20 + site/components/icons/CreditCard.tsx | 21 + site/components/icons/Cross.tsx | 21 + site/components/icons/DoubleChevron.tsx | 22 + site/components/icons/Github.tsx | 20 + site/components/icons/Heart.tsx | 22 + site/components/icons/Info.tsx | 22 + site/components/icons/MapPin.tsx | 20 + site/components/icons/Menu.tsx | 21 + site/components/icons/Minus.tsx | 15 + site/components/icons/Moon.tsx | 20 + site/components/icons/Plus.tsx | 22 + site/components/icons/Star.tsx | 16 + site/components/icons/Sun.tsx | 28 + site/components/icons/Trash.tsx | 43 + site/components/icons/Vercel.tsx | 40 + site/components/icons/index.ts | 23 + site/components/imglist.js | 191 + site/components/menu.js | 243 + site/components/menuPhu.js | 159 + site/components/newlistimg.js | 161 + site/components/product.js | 112 + .../ProductCard/ProductCard.module.css | 114 + .../product/ProductCard/ProductCard.tsx | 138 + site/components/product/ProductCard/index.ts | 1 + .../product/ProductOptions/ProductOptions.tsx | 52 + .../product/ProductOptions/index.ts | 1 + .../ProductSidebar/ProductSidebar.module.css | 84 + .../product/ProductSidebar/ProductSidebar.tsx | 89 + .../product/ProductSidebar/index.ts | 1 + .../ProductSlider/ProductSlider.module.css | 57 + .../product/ProductSlider/ProductSlider.tsx | 129 + .../components/product/ProductSlider/index.ts | 1 + .../ProductSliderControl.module.css | 29 + .../ProductSliderControl.tsx | 30 + .../product/ProductSliderControl/index.ts | 1 + .../product/ProductTag/ProductTag.module.css | 31 + .../product/ProductTag/ProductTag.tsx | 36 + site/components/product/ProductTag/index.ts | 1 + .../ProductView/ProductView.module.css | 59 + .../product/ProductView/ProductView.tsx | 113 + site/components/product/ProductView/index.ts | 1 + .../product/Swatch/Swatch.module.css | 54 + site/components/product/Swatch/Swatch.tsx | 62 + site/components/product/Swatch/index.ts | 1 + site/components/product/helpers.ts | 32 + site/components/product/index.ts | 5 + site/components/search.tsx | 439 + site/components/sidebar.js | 189 + .../categories-carousel/index.js | 93 + .../single-product/gallery-carousel/index.js | 100 + site/components/single-product/price/index.js | 75 + .../single-product/related-product/index.js | 77 + site/components/slider.js | 129 + site/components/tab.js | 140 + site/components/tabSeller.js | 133 + site/components/tabsLogo.js | 118 + site/components/ui/Button/Button.module.css | 57 + site/components/ui/Button/Button.tsx | 75 + site/components/ui/Button/index.ts | 2 + .../ui/Collapse/Collapse.module.css | 25 + site/components/ui/Collapse/Collapse.tsx | 46 + site/components/ui/Collapse/index.ts | 2 + site/components/ui/Container/Container.tsx | 27 + site/components/ui/Container/index.ts | 1 + .../ui/Dropdown/Dropdown.module.css | 32 + site/components/ui/Dropdown/Dropdown.tsx | 22 + site/components/ui/Grid/Grid.module.css | 135 + site/components/ui/Grid/Grid.tsx | 34 + site/components/ui/Grid/index.ts | 1 + site/components/ui/Hero/Hero.module.css | 30 + site/components/ui/Hero/Hero.tsx | 33 + site/components/ui/Hero/index.ts | 1 + site/components/ui/Input/Input.module.css | 7 + site/components/ui/Input/Input.tsx | 37 + site/components/ui/Input/index.ts | 1 + site/components/ui/Link/Link.tsx | 11 + site/components/ui/Link/index.ts | 1 + .../ui/LoadingDots/LoadingDots.module.css | 33 + .../components/ui/LoadingDots/LoadingDots.tsx | 13 + site/components/ui/LoadingDots/index.ts | 1 + site/components/ui/Logo/Logo.tsx | 21 + site/components/ui/Logo/index.ts | 1 + site/components/ui/Marquee/Marquee.module.css | 22 + site/components/ui/Marquee/Marquee.tsx | 39 + site/components/ui/Marquee/index.ts | 1 + site/components/ui/Modal/Modal.module.css | 17 + site/components/ui/Modal/Modal.tsx | 55 + site/components/ui/Modal/index.ts | 1 + .../ui/Quantity/Quantity.module.css | 27 + site/components/ui/Quantity/Quantity.tsx | 62 + site/components/ui/Quantity/index.ts | 2 + site/components/ui/README.md | 3 + site/components/ui/Rating/Rating.module.css | 0 site/components/ui/Rating/Rating.tsx | 25 + site/components/ui/Rating/index.ts | 2 + site/components/ui/Sidebar/Sidebar.module.css | 14 + site/components/ui/Sidebar/Sidebar.tsx | 57 + site/components/ui/Sidebar/index.ts | 1 + .../ui/Skeleton/Skeleton.module.css | 48 + site/components/ui/Skeleton/Skeleton.tsx | 57 + site/components/ui/Skeleton/index.ts | 1 + site/components/ui/Text/Text.module.css | 75 + site/components/ui/Text/Text.tsx | 70 + site/components/ui/Text/index.ts | 1 + site/components/ui/context.tsx | 216 + site/components/ui/index.ts | 17 + .../WishlistButton/WishlistButton.module.css | 33 + .../WishlistButton/WishlistButton.tsx | 84 + .../wishlist/WishlistButton/index.ts | 1 + .../WishlistCard/WishlistCard.module.css | 38 + .../wishlist/WishlistCard/WishlistCard.tsx | 108 + .../components/wishlist/WishlistCard/index.ts | 1 + site/components/wishlist/index.ts | 2 + site/config/seo_meta.json | 25 + site/global.d.ts | 2 + site/lib/addqueries/collections.js | 44 + site/lib/api/commerce.ts | 10 + site/lib/click-outside/click-outside.tsx | 83 + site/lib/click-outside/has-parent.js | 5 + site/lib/click-outside/index.ts | 1 + site/lib/click-outside/is-in-dom.js | 3 + site/lib/colors.ts | 206 + site/lib/context/AppContext.js | 25 + site/lib/focus-trap.tsx | 67 + site/lib/get-slug.ts | 5 + site/lib/hooks/useAcceptCookies.ts | 24 + site/lib/hooks/useUserAvatar.ts | 26 + site/lib/range-map.ts | 7 + site/lib/search-props.tsx | 27 + site/lib/search.tsx | 52 + site/lib/to-pixels.ts | 13 + site/lib/usage-warns.ts | 26 + site/next-env.d.ts | 5 + site/next.config.js | 41 + site/package.json | 117 + site/pages/404.tsx | 35 + site/pages/[...pages].tsx | 88 + site/pages/_app.js | 13 + site/pages/_document.js | 63 + site/pages/about.js | 456 + site/pages/api/cart.ts | 4 + site/pages/api/catalog/products.ts | 4 + site/pages/api/checkout.ts | 4 + site/pages/api/customer/address.ts | 4 + site/pages/api/customer/card.ts | 4 + site/pages/api/customer/index.ts | 4 + site/pages/api/login.ts | 4 + site/pages/api/logout.ts | 4 + site/pages/api/signup.ts | 4 + site/pages/api/wishlist.ts | 4 + site/pages/cart.js | 98 + site/pages/cart.tsx | 192 + site/pages/collection/[slug].js | 314 + site/pages/contact.js | 256 + site/pages/index.js | 149 + site/pages/myaccount.js | 294 + site/pages/orders.tsx | 42 + site/pages/product/[slug].js | 475 + site/pages/profile.js | 336 + site/pages/profile.tsx | 52 + site/pages/search.tsx | 9 + site/pages/search/[category].tsx | 16 + site/pages/search/designers/[name].tsx | 16 + .../search/designers/[name]/[category].tsx | 16 + site/pages/shop.js | 310 + site/pages/styles/Home.module.css | 116 + site/pages/styles/globals.css | 16 + site/pages/thankiu.js | 112 + site/pages/wishlist.tsx | 82 + site/postcss.config.js | 20 + site/public/assets/drop-shirt-0.png | Bin 0 -> 157663 bytes site/public/assets/drop-shirt-1.png | Bin 0 -> 260517 bytes site/public/assets/drop-shirt-2.png | Bin 0 -> 244812 bytes site/public/assets/drop-shirt.png | Bin 0 -> 157663 bytes site/public/assets/lightweight-jacket-0.png | Bin 0 -> 507021 bytes site/public/assets/lightweight-jacket-1.png | Bin 0 -> 476841 bytes site/public/assets/lightweight-jacket-2.png | Bin 0 -> 353198 bytes site/public/assets/t-shirt-0.png | Bin 0 -> 415845 bytes site/public/assets/t-shirt-1.png | Bin 0 -> 337401 bytes site/public/assets/t-shirt-2.png | Bin 0 -> 429830 bytes site/public/assets/t-shirt-3.png | Bin 0 -> 666930 bytes site/public/assets/t-shirt-4.png | Bin 0 -> 364452 bytes site/public/bg-products.svg | 7 + site/public/card.png | Bin 0 -> 6286 bytes site/public/cursor-left.png | Bin 0 -> 1162 bytes site/public/cursor-right.png | Bin 0 -> 1165 bytes site/public/favicon.ico | Bin 0 -> 535 bytes site/public/flag-en-us.svg | 1 + site/public/flag-es-ar.svg | 20 + site/public/flag-es-co.svg | 10 + site/public/flag-es.svg | 1 + site/public/icon-144x144.png | Bin 0 -> 4150 bytes site/public/icon-192x192.png | Bin 0 -> 6030 bytes site/public/icon-512x512.png | Bin 0 -> 10832 bytes site/public/icon.png | Bin 0 -> 1058 bytes site/public/product-img-placeholder.svg | 7 + site/public/site.webmanifest | 22 + site/public/slider-arrows.png | Bin 0 -> 1739 bytes site/public/vercel.svg | 9 + site/tailwind.config.js | 58 + site/tsconfig.json | 32 + turbo.json | 38 + yarn.lock | 8369 +++++++ 1416 files changed, 150595 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 ISSUE_TEMPLATE/1.core_bug_report.yml create mode 100644 ISSUE_TEMPLATE/2.provider_bug_report.yml create mode 100644 ISSUE_TEMPLATE/3.feature_request.yml create mode 100644 ISSUE_TEMPLATE/4.docs_request.yml create mode 100644 ISSUE_TEMPLATE/config.yml create mode 100644 README.md create mode 100644 license.md create mode 100644 package.json create mode 100644 packages/bigcommerce/.env.template create mode 100644 packages/bigcommerce/.prettierignore create mode 100644 packages/bigcommerce/.prettierrc create mode 100644 packages/bigcommerce/README.md create mode 100644 packages/bigcommerce/codegen.json create mode 100644 packages/bigcommerce/package.json create mode 100644 packages/bigcommerce/schema.d.ts create mode 100644 packages/bigcommerce/schema.graphql create mode 100644 packages/bigcommerce/scripts/generate-definitions.js create mode 100644 packages/bigcommerce/src/api/definitions/catalog.ts create mode 100644 packages/bigcommerce/src/api/definitions/store-content.ts create mode 100644 packages/bigcommerce/src/api/definitions/wishlist.ts create mode 100644 packages/bigcommerce/src/api/endpoints/cart/add-item.ts create mode 100644 packages/bigcommerce/src/api/endpoints/cart/get-cart.ts create mode 100644 packages/bigcommerce/src/api/endpoints/cart/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/cart/remove-item.ts create mode 100644 packages/bigcommerce/src/api/endpoints/cart/update-item.ts create mode 100644 packages/bigcommerce/src/api/endpoints/catalog/products/get-products.ts create mode 100644 packages/bigcommerce/src/api/endpoints/catalog/products/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/checkout/get-checkout.ts create mode 100644 packages/bigcommerce/src/api/endpoints/checkout/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/customer/address.ts create mode 100644 packages/bigcommerce/src/api/endpoints/customer/card.ts create mode 100644 packages/bigcommerce/src/api/endpoints/customer/get-logged-in-customer.ts create mode 100644 packages/bigcommerce/src/api/endpoints/customer/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/login/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/login/login.ts create mode 100644 packages/bigcommerce/src/api/endpoints/logout/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/logout/logout.ts create mode 100644 packages/bigcommerce/src/api/endpoints/signup/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/signup/signup.ts create mode 100644 packages/bigcommerce/src/api/endpoints/wishlist/add-item.ts create mode 100644 packages/bigcommerce/src/api/endpoints/wishlist/get-wishlist.ts create mode 100644 packages/bigcommerce/src/api/endpoints/wishlist/index.ts create mode 100644 packages/bigcommerce/src/api/endpoints/wishlist/remove-item.ts create mode 100644 packages/bigcommerce/src/api/fragments/category-tree.ts create mode 100644 packages/bigcommerce/src/api/fragments/product.ts create mode 100644 packages/bigcommerce/src/api/index.ts create mode 100644 packages/bigcommerce/src/api/operations/get-all-pages.ts create mode 100644 packages/bigcommerce/src/api/operations/get-all-product-paths.ts create mode 100644 packages/bigcommerce/src/api/operations/get-all-products.ts create mode 100644 packages/bigcommerce/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/bigcommerce/src/api/operations/get-page.ts create mode 100644 packages/bigcommerce/src/api/operations/get-product.ts create mode 100644 packages/bigcommerce/src/api/operations/get-site-info.ts create mode 100644 packages/bigcommerce/src/api/operations/login.ts create mode 100644 packages/bigcommerce/src/api/utils/concat-cookie.ts create mode 100644 packages/bigcommerce/src/api/utils/errors.ts create mode 100644 packages/bigcommerce/src/api/utils/fetch-graphql-api.ts create mode 100644 packages/bigcommerce/src/api/utils/fetch-store-api.ts create mode 100644 packages/bigcommerce/src/api/utils/fetch.ts create mode 100644 packages/bigcommerce/src/api/utils/filter-edges.ts create mode 100644 packages/bigcommerce/src/api/utils/get-cart-cookie.ts create mode 100644 packages/bigcommerce/src/api/utils/get-customer-id.ts create mode 100644 packages/bigcommerce/src/api/utils/parse-item.ts create mode 100644 packages/bigcommerce/src/api/utils/set-product-locale-meta.ts create mode 100644 packages/bigcommerce/src/api/utils/types.ts create mode 100644 packages/bigcommerce/src/auth/index.ts create mode 100644 packages/bigcommerce/src/auth/use-login.tsx create mode 100644 packages/bigcommerce/src/auth/use-logout.tsx create mode 100644 packages/bigcommerce/src/auth/use-signup.tsx create mode 100644 packages/bigcommerce/src/cart/index.ts create mode 100644 packages/bigcommerce/src/cart/use-add-item.tsx create mode 100644 packages/bigcommerce/src/cart/use-cart.tsx create mode 100644 packages/bigcommerce/src/cart/use-remove-item.tsx create mode 100644 packages/bigcommerce/src/cart/use-update-item.tsx create mode 100644 packages/bigcommerce/src/checkout/use-checkout.tsx create mode 100644 packages/bigcommerce/src/commerce.config.json create mode 100644 packages/bigcommerce/src/customer/address/use-add-item.tsx create mode 100644 packages/bigcommerce/src/customer/card/use-add-item.tsx create mode 100644 packages/bigcommerce/src/customer/index.ts create mode 100644 packages/bigcommerce/src/customer/use-customer.tsx create mode 100644 packages/bigcommerce/src/fetcher.ts create mode 100644 packages/bigcommerce/src/index.tsx create mode 100644 packages/bigcommerce/src/lib/get-slug.ts create mode 100644 packages/bigcommerce/src/lib/immutability.ts create mode 100644 packages/bigcommerce/src/lib/normalize.ts create mode 100644 packages/bigcommerce/src/next.config.cjs create mode 100644 packages/bigcommerce/src/product/index.ts create mode 100644 packages/bigcommerce/src/product/use-price.tsx create mode 100644 packages/bigcommerce/src/product/use-search.tsx create mode 100644 packages/bigcommerce/src/provider.ts create mode 100644 packages/bigcommerce/src/types/cart.ts create mode 100644 packages/bigcommerce/src/types/checkout.ts create mode 100644 packages/bigcommerce/src/types/common.ts create mode 100644 packages/bigcommerce/src/types/customer.ts create mode 100644 packages/bigcommerce/src/types/index.ts create mode 100644 packages/bigcommerce/src/types/login.ts create mode 100644 packages/bigcommerce/src/types/logout.ts create mode 100644 packages/bigcommerce/src/types/page.ts create mode 100644 packages/bigcommerce/src/types/product.ts create mode 100644 packages/bigcommerce/src/types/signup.ts create mode 100644 packages/bigcommerce/src/types/site.ts create mode 100644 packages/bigcommerce/src/types/wishlist.ts create mode 100644 packages/bigcommerce/src/wishlist/index.ts create mode 100644 packages/bigcommerce/src/wishlist/use-add-item.tsx create mode 100644 packages/bigcommerce/src/wishlist/use-remove-item.tsx create mode 100644 packages/bigcommerce/src/wishlist/use-wishlist.tsx create mode 100644 packages/bigcommerce/taskfile.js create mode 100644 packages/bigcommerce/tsconfig.json create mode 100644 packages/commerce/.prettierignore create mode 100644 packages/commerce/.prettierrc create mode 100644 packages/commerce/README.md create mode 100644 packages/commerce/fixup.mjs create mode 100644 packages/commerce/new-provider.md create mode 100644 packages/commerce/package.json create mode 100644 packages/commerce/src/api/endpoints/cart.ts create mode 100644 packages/commerce/src/api/endpoints/catalog/products.ts create mode 100644 packages/commerce/src/api/endpoints/checkout.ts create mode 100644 packages/commerce/src/api/endpoints/customer/address.ts create mode 100644 packages/commerce/src/api/endpoints/customer/card.ts create mode 100644 packages/commerce/src/api/endpoints/customer/index.ts create mode 100644 packages/commerce/src/api/endpoints/login.ts create mode 100644 packages/commerce/src/api/endpoints/logout.ts create mode 100644 packages/commerce/src/api/endpoints/signup.ts create mode 100644 packages/commerce/src/api/endpoints/wishlist.ts create mode 100644 packages/commerce/src/api/index.ts create mode 100644 packages/commerce/src/api/operations.ts create mode 100644 packages/commerce/src/api/utils/errors.ts create mode 100644 packages/commerce/src/api/utils/is-allowed-method.ts create mode 100644 packages/commerce/src/api/utils/is-allowed-operation.ts create mode 100644 packages/commerce/src/api/utils/types.ts create mode 100644 packages/commerce/src/auth/use-login.tsx create mode 100644 packages/commerce/src/auth/use-logout.tsx create mode 100644 packages/commerce/src/auth/use-signup.tsx create mode 100644 packages/commerce/src/cart/use-add-item.tsx create mode 100644 packages/commerce/src/cart/use-cart.tsx create mode 100644 packages/commerce/src/cart/use-remove-item.tsx create mode 100644 packages/commerce/src/cart/use-update-item.tsx create mode 100644 packages/commerce/src/checkout/use-checkout.ts create mode 100644 packages/commerce/src/checkout/use-submit-checkout.tsx create mode 100644 packages/commerce/src/config.cjs create mode 100644 packages/commerce/src/customer/address/use-add-item.tsx create mode 100644 packages/commerce/src/customer/address/use-addresses.tsx create mode 100644 packages/commerce/src/customer/address/use-remove-item.tsx create mode 100644 packages/commerce/src/customer/address/use-update-item.tsx create mode 100644 packages/commerce/src/customer/card/use-add-item.tsx create mode 100644 packages/commerce/src/customer/card/use-cards.tsx create mode 100644 packages/commerce/src/customer/card/use-remove-item.tsx create mode 100644 packages/commerce/src/customer/card/use-update-item.tsx create mode 100644 packages/commerce/src/customer/use-customer.tsx create mode 100644 packages/commerce/src/index.tsx create mode 100644 packages/commerce/src/product/use-price.tsx create mode 100644 packages/commerce/src/product/use-search.tsx create mode 100644 packages/commerce/src/types/cart.ts create mode 100644 packages/commerce/src/types/checkout.ts create mode 100644 packages/commerce/src/types/common.ts create mode 100644 packages/commerce/src/types/customer/address.ts create mode 100644 packages/commerce/src/types/customer/card.ts create mode 100644 packages/commerce/src/types/customer/index.ts create mode 100644 packages/commerce/src/types/index.ts create mode 100644 packages/commerce/src/types/login.ts create mode 100644 packages/commerce/src/types/logout.ts create mode 100644 packages/commerce/src/types/page.ts create mode 100644 packages/commerce/src/types/product.ts create mode 100644 packages/commerce/src/types/signup.ts create mode 100644 packages/commerce/src/types/site.ts create mode 100644 packages/commerce/src/types/wishlist.ts create mode 100644 packages/commerce/src/utils/default-fetcher.ts create mode 100644 packages/commerce/src/utils/define-property.ts create mode 100644 packages/commerce/src/utils/errors.ts create mode 100644 packages/commerce/src/utils/types.ts create mode 100644 packages/commerce/src/utils/use-data.tsx create mode 100644 packages/commerce/src/utils/use-hook.ts create mode 100644 packages/commerce/src/wishlist/index.ts create mode 100644 packages/commerce/src/wishlist/use-add-item.tsx create mode 100644 packages/commerce/src/wishlist/use-remove-item.tsx create mode 100644 packages/commerce/src/wishlist/use-wishlist.tsx create mode 100644 packages/commerce/taskfile.js create mode 100644 packages/commerce/tsconfig.json create mode 100644 packages/commercejs/.env.template create mode 100644 packages/commercejs/.prettierignore create mode 100644 packages/commercejs/.prettierrc create mode 100644 packages/commercejs/README.md create mode 100644 packages/commercejs/global.d.ts create mode 100644 packages/commercejs/package.json create mode 100644 packages/commercejs/src/api/endpoints/cart/index.ts create mode 100644 packages/commercejs/src/api/endpoints/catalog/index.ts create mode 100644 packages/commercejs/src/api/endpoints/catalog/products/index.ts create mode 100644 packages/commercejs/src/api/endpoints/checkout/get-checkout.ts create mode 100644 packages/commercejs/src/api/endpoints/checkout/index.ts create mode 100644 packages/commercejs/src/api/endpoints/checkout/submit-checkout.ts create mode 100644 packages/commercejs/src/api/endpoints/customer/address/index.ts create mode 100644 packages/commercejs/src/api/endpoints/customer/card/index.ts create mode 100644 packages/commercejs/src/api/endpoints/customer/index.ts create mode 100644 packages/commercejs/src/api/endpoints/login/index.ts create mode 100644 packages/commercejs/src/api/endpoints/login/login.ts create mode 100644 packages/commercejs/src/api/endpoints/logout/index.ts create mode 100644 packages/commercejs/src/api/endpoints/signup/index.ts create mode 100644 packages/commercejs/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/commercejs/src/api/index.ts create mode 100644 packages/commercejs/src/api/operations/get-all-pages.ts create mode 100644 packages/commercejs/src/api/operations/get-all-product-paths.ts create mode 100644 packages/commercejs/src/api/operations/get-all-products.ts create mode 100644 packages/commercejs/src/api/operations/get-page.ts create mode 100644 packages/commercejs/src/api/operations/get-product.ts create mode 100644 packages/commercejs/src/api/operations/get-site-info.ts create mode 100644 packages/commercejs/src/api/operations/index.ts create mode 100644 packages/commercejs/src/api/utils/graphql-fetch.ts create mode 100644 packages/commercejs/src/api/utils/sdk-fetch.ts create mode 100644 packages/commercejs/src/auth/index.ts create mode 100644 packages/commercejs/src/auth/use-login.tsx create mode 100644 packages/commercejs/src/auth/use-logout.tsx create mode 100644 packages/commercejs/src/auth/use-signup.tsx create mode 100644 packages/commercejs/src/cart/index.ts create mode 100644 packages/commercejs/src/cart/use-add-item.tsx create mode 100644 packages/commercejs/src/cart/use-cart.tsx create mode 100644 packages/commercejs/src/cart/use-remove-item.tsx create mode 100644 packages/commercejs/src/cart/use-update-item.tsx create mode 100644 packages/commercejs/src/checkout/index.ts create mode 100644 packages/commercejs/src/checkout/use-checkout.tsx create mode 100644 packages/commercejs/src/checkout/use-submit-checkout.tsx create mode 100644 packages/commercejs/src/commerce.config.json create mode 100644 packages/commercejs/src/constants.ts create mode 100644 packages/commercejs/src/customer/address/index.ts create mode 100644 packages/commercejs/src/customer/address/use-add-item.tsx create mode 100644 packages/commercejs/src/customer/address/use-addresses.tsx create mode 100644 packages/commercejs/src/customer/card/index.ts create mode 100644 packages/commercejs/src/customer/card/use-add-item.tsx create mode 100644 packages/commercejs/src/customer/card/use-cards.tsx create mode 100644 packages/commercejs/src/customer/index.ts create mode 100644 packages/commercejs/src/customer/use-customer.tsx create mode 100644 packages/commercejs/src/fetcher.ts create mode 100644 packages/commercejs/src/index.tsx create mode 100644 packages/commercejs/src/lib/commercejs.ts create mode 100644 packages/commercejs/src/next.config.cjs create mode 100644 packages/commercejs/src/product/index.ts create mode 100644 packages/commercejs/src/product/use-price.tsx create mode 100644 packages/commercejs/src/product/use-search.tsx create mode 100644 packages/commercejs/src/provider.ts create mode 100644 packages/commercejs/src/types/cart.ts create mode 100644 packages/commercejs/src/types/checkout.ts create mode 100644 packages/commercejs/src/types/common.ts create mode 100644 packages/commercejs/src/types/customer.ts create mode 100644 packages/commercejs/src/types/index.ts create mode 100644 packages/commercejs/src/types/login.ts create mode 100644 packages/commercejs/src/types/logout.ts create mode 100644 packages/commercejs/src/types/page.ts create mode 100644 packages/commercejs/src/types/product.ts create mode 100644 packages/commercejs/src/types/signup.ts create mode 100644 packages/commercejs/src/types/site.ts create mode 100644 packages/commercejs/src/types/wishlist.ts create mode 100644 packages/commercejs/src/utils/get-deployment-url.ts create mode 100644 packages/commercejs/src/utils/normalize-cart.ts create mode 100644 packages/commercejs/src/utils/normalize-category.ts create mode 100644 packages/commercejs/src/utils/normalize-checkout.ts create mode 100644 packages/commercejs/src/utils/normalize-product.ts create mode 100644 packages/commercejs/src/utils/product-search.ts create mode 100644 packages/commercejs/src/wishlist/use-add-item.tsx create mode 100644 packages/commercejs/src/wishlist/use-remove-item.tsx create mode 100644 packages/commercejs/src/wishlist/use-wishlist.tsx create mode 100644 packages/commercejs/taskfile.js create mode 100644 packages/commercejs/tsconfig.json create mode 100644 packages/kibocommerce/.env.template create mode 100644 packages/kibocommerce/.prettierignore create mode 100644 packages/kibocommerce/.prettierrc create mode 100644 packages/kibocommerce/README.md create mode 100644 packages/kibocommerce/codegen.json create mode 100644 packages/kibocommerce/package.json create mode 100644 packages/kibocommerce/schema.d.ts create mode 100644 packages/kibocommerce/schema.graphql create mode 100644 packages/kibocommerce/src/api/endpoints/cart/add-item.ts create mode 100644 packages/kibocommerce/src/api/endpoints/cart/get-cart.ts create mode 100644 packages/kibocommerce/src/api/endpoints/cart/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/cart/remove-item.ts create mode 100644 packages/kibocommerce/src/api/endpoints/cart/update-item.ts create mode 100644 packages/kibocommerce/src/api/endpoints/catalog/products/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/catalog/products/products.ts create mode 100644 packages/kibocommerce/src/api/endpoints/checkout/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/customer/address.ts create mode 100644 packages/kibocommerce/src/api/endpoints/customer/card.ts create mode 100644 packages/kibocommerce/src/api/endpoints/customer/customer.ts create mode 100644 packages/kibocommerce/src/api/endpoints/customer/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/login/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/login/login.ts create mode 100644 packages/kibocommerce/src/api/endpoints/logout/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/logout/logout.ts create mode 100644 packages/kibocommerce/src/api/endpoints/signup/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/signup/signup.ts create mode 100644 packages/kibocommerce/src/api/endpoints/wishlist/add-item.ts create mode 100644 packages/kibocommerce/src/api/endpoints/wishlist/get-wishlist.ts create mode 100644 packages/kibocommerce/src/api/endpoints/wishlist/index.ts create mode 100644 packages/kibocommerce/src/api/endpoints/wishlist/remove-item.ts create mode 100644 packages/kibocommerce/src/api/fragments/cartItemDetails.ts create mode 100644 packages/kibocommerce/src/api/fragments/category.ts create mode 100644 packages/kibocommerce/src/api/fragments/product.ts create mode 100644 packages/kibocommerce/src/api/fragments/productDetails.ts create mode 100644 packages/kibocommerce/src/api/fragments/search.ts create mode 100644 packages/kibocommerce/src/api/index.ts create mode 100644 packages/kibocommerce/src/api/mutations/addItemToWishlist-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/addToCart-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/create-wishlist-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/login-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/removeItemFromCart-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/removeItemFromWishlist-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/signup-mutation.ts create mode 100644 packages/kibocommerce/src/api/mutations/updateCartItemQuantity-mutation.ts create mode 100644 packages/kibocommerce/src/api/operations/get-all-pages.ts create mode 100644 packages/kibocommerce/src/api/operations/get-all-product-paths.ts create mode 100644 packages/kibocommerce/src/api/operations/get-all-products.ts create mode 100644 packages/kibocommerce/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/kibocommerce/src/api/operations/get-page.ts create mode 100644 packages/kibocommerce/src/api/operations/get-product.ts create mode 100644 packages/kibocommerce/src/api/operations/get-site-info.ts create mode 100644 packages/kibocommerce/src/api/operations/index.ts create mode 100644 packages/kibocommerce/src/api/queries/get-all-pages-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-all-products-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-anonymous-shopper-token-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-cart-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-categories-tree-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-customer-account-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-customer-wishlist-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-page-query.ts create mode 100644 packages/kibocommerce/src/api/queries/get-product-query.ts create mode 100644 packages/kibocommerce/src/api/queries/product-search-query.ts create mode 100644 packages/kibocommerce/src/api/utils/api-auth-helper.ts create mode 100644 packages/kibocommerce/src/api/utils/cookie-handler.ts create mode 100644 packages/kibocommerce/src/api/utils/fetch-graphql-api.ts create mode 100644 packages/kibocommerce/src/api/utils/fetch-local.ts create mode 100644 packages/kibocommerce/src/api/utils/fetch.ts create mode 100644 packages/kibocommerce/src/api/utils/get-anonymous-shopper-token.ts create mode 100644 packages/kibocommerce/src/api/utils/get-customer-id.ts create mode 100644 packages/kibocommerce/src/auth/index.ts create mode 100644 packages/kibocommerce/src/auth/use-login.tsx create mode 100644 packages/kibocommerce/src/auth/use-logout.tsx create mode 100644 packages/kibocommerce/src/auth/use-signup.tsx create mode 100644 packages/kibocommerce/src/cart/index.ts create mode 100644 packages/kibocommerce/src/cart/use-add-item.tsx create mode 100644 packages/kibocommerce/src/cart/use-cart.tsx create mode 100644 packages/kibocommerce/src/cart/use-remove-item.tsx create mode 100644 packages/kibocommerce/src/cart/use-update-item.tsx create mode 100644 packages/kibocommerce/src/checkout/use-checkout.tsx create mode 100644 packages/kibocommerce/src/commerce.config.json create mode 100644 packages/kibocommerce/src/customer/address/use-add-item.tsx create mode 100644 packages/kibocommerce/src/customer/card/use-add-item.tsx create mode 100644 packages/kibocommerce/src/customer/index.ts create mode 100644 packages/kibocommerce/src/customer/use-customer.tsx create mode 100644 packages/kibocommerce/src/fetcher.ts create mode 100644 packages/kibocommerce/src/index.tsx create mode 100644 packages/kibocommerce/src/lib/get-cookie-expiration-date.ts create mode 100644 packages/kibocommerce/src/lib/get-slug.ts create mode 100644 packages/kibocommerce/src/lib/normalize.ts create mode 100644 packages/kibocommerce/src/lib/prepare-set-cookie.ts create mode 100644 packages/kibocommerce/src/lib/product-search-vars.ts create mode 100644 packages/kibocommerce/src/lib/set-cookie.ts create mode 100644 packages/kibocommerce/src/next.config.cjs create mode 100644 packages/kibocommerce/src/product/index.ts create mode 100644 packages/kibocommerce/src/product/use-price.tsx create mode 100644 packages/kibocommerce/src/product/use-search.tsx create mode 100644 packages/kibocommerce/src/provider.ts create mode 100644 packages/kibocommerce/src/types/customer.ts create mode 100644 packages/kibocommerce/src/types/login.ts create mode 100644 packages/kibocommerce/src/types/logout.ts create mode 100644 packages/kibocommerce/src/types/page.ts create mode 100644 packages/kibocommerce/src/types/signup.ts create mode 100644 packages/kibocommerce/src/wishlist/index.ts create mode 100644 packages/kibocommerce/src/wishlist/use-add-item.tsx create mode 100644 packages/kibocommerce/src/wishlist/use-remove-item.tsx create mode 100644 packages/kibocommerce/src/wishlist/use-wishlist.tsx create mode 100644 packages/kibocommerce/taskfile.js create mode 100644 packages/kibocommerce/tsconfig.json create mode 100644 packages/local/.env.template create mode 100644 packages/local/.prettierignore create mode 100644 packages/local/.prettierrc create mode 100644 packages/local/README.md create mode 100644 packages/local/package.json create mode 100644 packages/local/src/api/endpoints/cart/index.ts create mode 100644 packages/local/src/api/endpoints/catalog/index.ts create mode 100644 packages/local/src/api/endpoints/catalog/products.ts create mode 100644 packages/local/src/api/endpoints/checkout/index.ts create mode 100644 packages/local/src/api/endpoints/customer/address.ts create mode 100644 packages/local/src/api/endpoints/customer/card.ts create mode 100644 packages/local/src/api/endpoints/customer/index.ts create mode 100644 packages/local/src/api/endpoints/login/index.ts create mode 100644 packages/local/src/api/endpoints/logout/index.ts create mode 100644 packages/local/src/api/endpoints/signup/index.ts create mode 100644 packages/local/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/local/src/api/index.ts create mode 100644 packages/local/src/api/operations/get-all-pages.ts create mode 100644 packages/local/src/api/operations/get-all-product-paths.ts create mode 100644 packages/local/src/api/operations/get-all-products.ts create mode 100644 packages/local/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/local/src/api/operations/get-page.ts create mode 100644 packages/local/src/api/operations/get-product.ts create mode 100644 packages/local/src/api/operations/get-site-info.ts create mode 100644 packages/local/src/api/operations/index.ts create mode 100644 packages/local/src/api/utils/fetch-local.ts create mode 100644 packages/local/src/api/utils/fetch.ts create mode 100644 packages/local/src/auth/index.ts create mode 100644 packages/local/src/auth/use-login.tsx create mode 100644 packages/local/src/auth/use-logout.tsx create mode 100644 packages/local/src/auth/use-signup.tsx create mode 100644 packages/local/src/cart/index.ts create mode 100644 packages/local/src/cart/use-add-item.tsx create mode 100644 packages/local/src/cart/use-cart.tsx create mode 100644 packages/local/src/cart/use-remove-item.tsx create mode 100644 packages/local/src/cart/use-update-item.tsx create mode 100644 packages/local/src/checkout/use-checkout.tsx create mode 100644 packages/local/src/commerce.config.json create mode 100644 packages/local/src/customer/address/use-add-item.tsx create mode 100644 packages/local/src/customer/card/use-add-item.tsx create mode 100644 packages/local/src/customer/index.ts create mode 100644 packages/local/src/customer/use-customer.tsx create mode 100644 packages/local/src/data.json create mode 100644 packages/local/src/fetcher.ts create mode 100644 packages/local/src/index.tsx create mode 100644 packages/local/src/next.config.cjs create mode 100644 packages/local/src/product/index.ts create mode 100644 packages/local/src/product/use-price.tsx create mode 100644 packages/local/src/product/use-search.tsx create mode 100644 packages/local/src/provider.ts create mode 100644 packages/local/src/wishlist/use-add-item.tsx create mode 100644 packages/local/src/wishlist/use-remove-item.tsx create mode 100644 packages/local/src/wishlist/use-wishlist.tsx create mode 100644 packages/local/taskfile.js create mode 100644 packages/local/tsconfig.json create mode 100644 packages/ordercloud/.env.template create mode 100644 packages/ordercloud/.prettierignore create mode 100644 packages/ordercloud/.prettierrc create mode 100644 packages/ordercloud/README.md create mode 100644 packages/ordercloud/package.json create mode 100644 packages/ordercloud/src/api/endpoints/cart/add-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/cart/get-cart.ts create mode 100644 packages/ordercloud/src/api/endpoints/cart/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/cart/remove-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/cart/update-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/catalog/products/get-products.ts create mode 100644 packages/ordercloud/src/api/endpoints/catalog/products/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/checkout/get-checkout.ts create mode 100644 packages/ordercloud/src/api/endpoints/checkout/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/checkout/submit-checkout.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/address/add-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/address/get-addresses.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/address/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/address/remove-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/address/update-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/card/add-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/card/get-cards.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/card/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/card/remove-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/card/update-item.ts create mode 100644 packages/ordercloud/src/api/endpoints/customer/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/login/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/logout/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/signup/index.ts create mode 100644 packages/ordercloud/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/ordercloud/src/api/index.ts create mode 100644 packages/ordercloud/src/api/operations/get-all-pages.ts create mode 100644 packages/ordercloud/src/api/operations/get-all-product-paths.ts create mode 100644 packages/ordercloud/src/api/operations/get-all-products.ts create mode 100644 packages/ordercloud/src/api/operations/get-page.ts create mode 100644 packages/ordercloud/src/api/operations/get-product.ts create mode 100644 packages/ordercloud/src/api/operations/get-site-info.ts create mode 100644 packages/ordercloud/src/api/operations/index.ts create mode 100644 packages/ordercloud/src/api/utils/cart.ts create mode 100644 packages/ordercloud/src/api/utils/fetch-graphql.ts create mode 100644 packages/ordercloud/src/api/utils/fetch-rest.ts create mode 100644 packages/ordercloud/src/auth/index.ts create mode 100644 packages/ordercloud/src/auth/use-login.tsx create mode 100644 packages/ordercloud/src/auth/use-logout.tsx create mode 100644 packages/ordercloud/src/auth/use-signup.tsx create mode 100644 packages/ordercloud/src/cart/index.ts create mode 100644 packages/ordercloud/src/cart/use-add-item.tsx create mode 100644 packages/ordercloud/src/cart/use-cart.tsx create mode 100644 packages/ordercloud/src/cart/use-remove-item.tsx create mode 100644 packages/ordercloud/src/cart/use-update-item.tsx create mode 100644 packages/ordercloud/src/checkout/index.ts create mode 100644 packages/ordercloud/src/checkout/use-checkout.tsx create mode 100644 packages/ordercloud/src/checkout/use-submit-checkout.tsx create mode 100644 packages/ordercloud/src/commerce.config.json create mode 100644 packages/ordercloud/src/constants.ts create mode 100644 packages/ordercloud/src/customer/address/index.ts create mode 100644 packages/ordercloud/src/customer/address/use-add-item.tsx create mode 100644 packages/ordercloud/src/customer/address/use-addresses.tsx create mode 100644 packages/ordercloud/src/customer/address/use-remove-item.tsx create mode 100644 packages/ordercloud/src/customer/address/use-update-item.tsx create mode 100644 packages/ordercloud/src/customer/card/index.ts create mode 100644 packages/ordercloud/src/customer/card/use-add-item.tsx create mode 100644 packages/ordercloud/src/customer/card/use-cards.tsx create mode 100644 packages/ordercloud/src/customer/card/use-remove-item.tsx create mode 100644 packages/ordercloud/src/customer/card/use-update-item.tsx create mode 100644 packages/ordercloud/src/customer/index.ts create mode 100644 packages/ordercloud/src/customer/use-customer.tsx create mode 100644 packages/ordercloud/src/fetcher.ts create mode 100644 packages/ordercloud/src/index.tsx create mode 100644 packages/ordercloud/src/next.config.cjs create mode 100644 packages/ordercloud/src/product/index.ts create mode 100644 packages/ordercloud/src/product/use-price.tsx create mode 100644 packages/ordercloud/src/product/use-search.tsx create mode 100644 packages/ordercloud/src/provider.ts create mode 100644 packages/ordercloud/src/types/cart.ts create mode 100644 packages/ordercloud/src/types/category.ts create mode 100644 packages/ordercloud/src/types/checkout.ts create mode 100644 packages/ordercloud/src/types/customer/address.ts create mode 100644 packages/ordercloud/src/types/customer/card.ts create mode 100644 packages/ordercloud/src/types/node.d.ts create mode 100644 packages/ordercloud/src/types/product.ts create mode 100644 packages/ordercloud/src/utils/product.ts create mode 100644 packages/ordercloud/src/wishlist/use-add-item.tsx create mode 100644 packages/ordercloud/src/wishlist/use-remove-item.tsx create mode 100644 packages/ordercloud/src/wishlist/use-wishlist.tsx create mode 100644 packages/ordercloud/taskfile.js create mode 100644 packages/ordercloud/tsconfig.json create mode 100644 packages/saleor/.env.template create mode 100644 packages/saleor/.prettierignore create mode 100644 packages/saleor/.prettierrc create mode 100644 packages/saleor/README.md create mode 100644 packages/saleor/codegen.json create mode 100644 packages/saleor/package.json create mode 100644 packages/saleor/schema.d.ts create mode 100644 packages/saleor/schema.graphql create mode 100644 packages/saleor/src/api/cart.ts create mode 100644 packages/saleor/src/api/catalog/products.ts create mode 100644 packages/saleor/src/api/checkout.ts create mode 100644 packages/saleor/src/api/customers/index.ts create mode 100644 packages/saleor/src/api/customers/login.ts create mode 100644 packages/saleor/src/api/customers/logout.ts create mode 100644 packages/saleor/src/api/customers/signup.ts create mode 100644 packages/saleor/src/api/endpoints/cart.ts create mode 100644 packages/saleor/src/api/endpoints/catalog/products.ts create mode 100644 packages/saleor/src/api/endpoints/checkout/index.ts create mode 100644 packages/saleor/src/api/endpoints/customer/address.ts create mode 100644 packages/saleor/src/api/endpoints/customer/card.ts create mode 100644 packages/saleor/src/api/endpoints/customer/index.ts create mode 100644 packages/saleor/src/api/endpoints/login.ts create mode 100644 packages/saleor/src/api/endpoints/logout.ts create mode 100644 packages/saleor/src/api/endpoints/signup.ts create mode 100644 packages/saleor/src/api/endpoints/wishlist.ts create mode 100644 packages/saleor/src/api/index.ts create mode 100644 packages/saleor/src/api/operations/get-all-pages.ts create mode 100644 packages/saleor/src/api/operations/get-all-product-paths.ts create mode 100644 packages/saleor/src/api/operations/get-all-products.ts create mode 100644 packages/saleor/src/api/operations/get-page.ts create mode 100644 packages/saleor/src/api/operations/get-product.ts create mode 100644 packages/saleor/src/api/operations/get-site-info.ts create mode 100644 packages/saleor/src/api/operations/index.ts create mode 100644 packages/saleor/src/api/operations/login.ts create mode 100644 packages/saleor/src/api/utils/fetch-all-products.ts create mode 100644 packages/saleor/src/api/utils/fetch-graphql-api.ts create mode 100644 packages/saleor/src/api/utils/fetch.ts create mode 100644 packages/saleor/src/api/utils/is-allowed-method.ts create mode 100644 packages/saleor/src/api/wishlist.ts create mode 100644 packages/saleor/src/auth/use-login.tsx create mode 100644 packages/saleor/src/auth/use-logout.tsx create mode 100644 packages/saleor/src/auth/use-signup.tsx create mode 100644 packages/saleor/src/cart/index.ts create mode 100644 packages/saleor/src/cart/use-add-item.tsx create mode 100644 packages/saleor/src/cart/use-cart.tsx create mode 100644 packages/saleor/src/cart/use-remove-item.tsx create mode 100644 packages/saleor/src/cart/use-update-item.tsx create mode 100644 packages/saleor/src/checkout/use-checkout.tsx create mode 100644 packages/saleor/src/commerce.config.json create mode 100644 packages/saleor/src/const.ts create mode 100644 packages/saleor/src/customer/address/use-add-item.tsx create mode 100644 packages/saleor/src/customer/card/use-add-item.tsx create mode 100644 packages/saleor/src/customer/index.ts create mode 100644 packages/saleor/src/customer/use-customer.tsx create mode 100644 packages/saleor/src/fetcher.ts create mode 100644 packages/saleor/src/index.tsx create mode 100644 packages/saleor/src/next.config.cjs create mode 100644 packages/saleor/src/product/use-price.tsx create mode 100644 packages/saleor/src/product/use-search.tsx create mode 100644 packages/saleor/src/provider.ts create mode 100644 packages/saleor/src/types.ts create mode 100644 packages/saleor/src/types/cart.ts create mode 100644 packages/saleor/src/utils/checkout-attach.ts create mode 100644 packages/saleor/src/utils/checkout-create.ts create mode 100644 packages/saleor/src/utils/checkout-to-cart.ts create mode 100644 packages/saleor/src/utils/customer-token.ts create mode 100644 packages/saleor/src/utils/fragments/checkout-details.ts create mode 100644 packages/saleor/src/utils/fragments/index.ts create mode 100644 packages/saleor/src/utils/fragments/product.ts create mode 100644 packages/saleor/src/utils/get-categories.ts create mode 100644 packages/saleor/src/utils/get-checkout-id.ts create mode 100644 packages/saleor/src/utils/get-search-variables.ts create mode 100644 packages/saleor/src/utils/get-sort-variables.ts create mode 100644 packages/saleor/src/utils/get-vendors.ts create mode 100644 packages/saleor/src/utils/handle-fetch-response.ts create mode 100644 packages/saleor/src/utils/handle-login.ts create mode 100644 packages/saleor/src/utils/index.ts create mode 100644 packages/saleor/src/utils/mutations/account-create.ts create mode 100644 packages/saleor/src/utils/mutations/checkout-attach.ts create mode 100644 packages/saleor/src/utils/mutations/checkout-create.ts create mode 100644 packages/saleor/src/utils/mutations/checkout-line-add.ts create mode 100644 packages/saleor/src/utils/mutations/checkout-line-remove.ts create mode 100644 packages/saleor/src/utils/mutations/checkout-line-update.ts create mode 100644 packages/saleor/src/utils/mutations/index.ts create mode 100644 packages/saleor/src/utils/mutations/session-create.ts create mode 100644 packages/saleor/src/utils/mutations/session-destroy.ts create mode 100644 packages/saleor/src/utils/normalize.ts create mode 100644 packages/saleor/src/utils/queries/checkout-one.ts create mode 100644 packages/saleor/src/utils/queries/collection-many.ts create mode 100644 packages/saleor/src/utils/queries/collection-one.ts create mode 100644 packages/saleor/src/utils/queries/customer-current.ts create mode 100644 packages/saleor/src/utils/queries/customer-one.ts create mode 100644 packages/saleor/src/utils/queries/get-all-product-vendors-query.ts create mode 100644 packages/saleor/src/utils/queries/get-all-products-paths-query.ts create mode 100644 packages/saleor/src/utils/queries/index.ts create mode 100644 packages/saleor/src/utils/queries/page-many.ts create mode 100644 packages/saleor/src/utils/queries/page-one.ts create mode 100644 packages/saleor/src/utils/queries/product-many.ts create mode 100644 packages/saleor/src/utils/queries/product-one-by-slug.ts create mode 100644 packages/saleor/src/utils/throw-user-errors.ts create mode 100644 packages/saleor/src/wishlist/use-add-item.tsx create mode 100644 packages/saleor/src/wishlist/use-remove-item.tsx create mode 100644 packages/saleor/src/wishlist/use-wishlist.tsx create mode 100644 packages/saleor/taskfile.js create mode 100644 packages/saleor/tsconfig.json create mode 100644 packages/sfcc/.env.template create mode 100644 packages/sfcc/.prettierignore create mode 100644 packages/sfcc/.prettierrc create mode 100644 packages/sfcc/README.md create mode 100644 packages/sfcc/package.json create mode 100644 packages/sfcc/src/api/endpoints/cart/index.ts create mode 100644 packages/sfcc/src/api/endpoints/catalog/products/get-products.ts create mode 100644 packages/sfcc/src/api/endpoints/catalog/products/index.ts create mode 100644 packages/sfcc/src/api/endpoints/checkout/index.ts create mode 100644 packages/sfcc/src/api/endpoints/customer/address.ts create mode 100644 packages/sfcc/src/api/endpoints/customer/card.ts create mode 100644 packages/sfcc/src/api/endpoints/customer/index.ts create mode 100644 packages/sfcc/src/api/endpoints/login/index.ts create mode 100644 packages/sfcc/src/api/endpoints/logout/index.ts create mode 100644 packages/sfcc/src/api/endpoints/signup/index.ts create mode 100644 packages/sfcc/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/sfcc/src/api/index.ts create mode 100644 packages/sfcc/src/api/operations/get-all-pages.ts create mode 100644 packages/sfcc/src/api/operations/get-all-product-paths.ts create mode 100644 packages/sfcc/src/api/operations/get-all-products.ts create mode 100644 packages/sfcc/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/sfcc/src/api/operations/get-page.ts create mode 100644 packages/sfcc/src/api/operations/get-product.ts create mode 100644 packages/sfcc/src/api/operations/get-site-info.ts create mode 100644 packages/sfcc/src/api/operations/index.ts create mode 100644 packages/sfcc/src/api/utils/fetch-local.ts create mode 100644 packages/sfcc/src/api/utils/fetch.ts create mode 100644 packages/sfcc/src/api/utils/get-auth-token.ts create mode 100644 packages/sfcc/src/api/utils/normalise-product.ts create mode 100644 packages/sfcc/src/api/utils/sfcc-sdk.ts create mode 100644 packages/sfcc/src/auth/index.ts create mode 100644 packages/sfcc/src/auth/use-login.tsx create mode 100644 packages/sfcc/src/auth/use-logout.tsx create mode 100644 packages/sfcc/src/auth/use-signup.tsx create mode 100644 packages/sfcc/src/cart/index.ts create mode 100644 packages/sfcc/src/cart/use-add-item.tsx create mode 100644 packages/sfcc/src/cart/use-cart.tsx create mode 100644 packages/sfcc/src/cart/use-remove-item.tsx create mode 100644 packages/sfcc/src/cart/use-update-item.tsx create mode 100644 packages/sfcc/src/checkout/use-checkout.tsx create mode 100644 packages/sfcc/src/commerce.config.json create mode 100644 packages/sfcc/src/customer/address/use-add-item.tsx create mode 100644 packages/sfcc/src/customer/card/use-add-item.tsx create mode 100644 packages/sfcc/src/customer/index.ts create mode 100644 packages/sfcc/src/customer/use-customer.tsx create mode 100644 packages/sfcc/src/fetcher.ts create mode 100644 packages/sfcc/src/index.tsx create mode 100644 packages/sfcc/src/next.config.cjs create mode 100644 packages/sfcc/src/product/index.ts create mode 100644 packages/sfcc/src/product/use-price.tsx create mode 100644 packages/sfcc/src/product/use-search.tsx create mode 100644 packages/sfcc/src/provider.ts create mode 100644 packages/sfcc/src/wishlist/use-add-item.tsx create mode 100644 packages/sfcc/src/wishlist/use-remove-item.tsx create mode 100644 packages/sfcc/src/wishlist/use-wishlist.tsx create mode 100644 packages/sfcc/taskfile.js create mode 100644 packages/sfcc/tsconfig.json create mode 100644 packages/shopify/.env.template create mode 100644 packages/shopify/.prettierignore create mode 100644 packages/shopify/.prettierrc create mode 100644 packages/shopify/README.md create mode 100644 packages/shopify/codegen.json create mode 100644 packages/shopify/package.json create mode 100644 packages/shopify/schema.d.ts create mode 100644 packages/shopify/schema.graphql create mode 100644 packages/shopify/src/api/endpoints/cart.ts create mode 100644 packages/shopify/src/api/endpoints/catalog/products.ts create mode 100644 packages/shopify/src/api/endpoints/checkout/get-checkout.ts create mode 100644 packages/shopify/src/api/endpoints/checkout/index.ts create mode 100644 packages/shopify/src/api/endpoints/customer/address.ts create mode 100644 packages/shopify/src/api/endpoints/customer/card.ts create mode 100644 packages/shopify/src/api/endpoints/customer/index.ts create mode 100644 packages/shopify/src/api/endpoints/login.ts create mode 100644 packages/shopify/src/api/endpoints/logout.ts create mode 100644 packages/shopify/src/api/endpoints/signup.ts create mode 100644 packages/shopify/src/api/endpoints/wishlist.ts create mode 100644 packages/shopify/src/api/index.ts create mode 100644 packages/shopify/src/api/operations/get-all-pages.ts create mode 100644 packages/shopify/src/api/operations/get-all-product-paths.ts create mode 100644 packages/shopify/src/api/operations/get-all-products.ts create mode 100644 packages/shopify/src/api/operations/get-page.ts create mode 100644 packages/shopify/src/api/operations/get-product.ts create mode 100644 packages/shopify/src/api/operations/get-site-info.ts create mode 100644 packages/shopify/src/api/operations/index.ts create mode 100644 packages/shopify/src/api/operations/login.ts create mode 100644 packages/shopify/src/api/utils/fetch-graphql-api.ts create mode 100644 packages/shopify/src/api/utils/fetch.ts create mode 100644 packages/shopify/src/auth/use-login.tsx create mode 100644 packages/shopify/src/auth/use-logout.tsx create mode 100644 packages/shopify/src/auth/use-signup.tsx create mode 100644 packages/shopify/src/cart/index.ts create mode 100644 packages/shopify/src/cart/use-add-item.tsx create mode 100644 packages/shopify/src/cart/use-cart.tsx create mode 100644 packages/shopify/src/cart/use-remove-item.tsx create mode 100644 packages/shopify/src/cart/use-update-item.tsx create mode 100644 packages/shopify/src/checkout/use-checkout.tsx create mode 100644 packages/shopify/src/commerce.config.json create mode 100644 packages/shopify/src/const.ts create mode 100644 packages/shopify/src/customer/address/use-add-item.tsx create mode 100644 packages/shopify/src/customer/card/use-add-item.tsx create mode 100644 packages/shopify/src/customer/index.ts create mode 100644 packages/shopify/src/customer/use-customer.tsx create mode 100644 packages/shopify/src/fetcher.ts create mode 100644 packages/shopify/src/index.tsx create mode 100644 packages/shopify/src/next.config.cjs create mode 100644 packages/shopify/src/product/use-price.tsx create mode 100644 packages/shopify/src/product/use-search.tsx create mode 100644 packages/shopify/src/provider.ts create mode 100644 packages/shopify/src/types/cart.ts create mode 100644 packages/shopify/src/types/checkout.ts create mode 100644 packages/shopify/src/types/common.ts create mode 100644 packages/shopify/src/types/customer.ts create mode 100644 packages/shopify/src/types/index.ts create mode 100644 packages/shopify/src/types/login.ts create mode 100644 packages/shopify/src/types/logout.ts create mode 100644 packages/shopify/src/types/page.ts create mode 100644 packages/shopify/src/types/product.ts create mode 100644 packages/shopify/src/types/signup.ts create mode 100644 packages/shopify/src/types/site.ts create mode 100644 packages/shopify/src/types/wishlist.ts create mode 100644 packages/shopify/src/utils/checkout-create.ts create mode 100644 packages/shopify/src/utils/checkout-to-cart.ts create mode 100644 packages/shopify/src/utils/colors.ts create mode 100644 packages/shopify/src/utils/customer-token.ts create mode 100644 packages/shopify/src/utils/get-brands.ts create mode 100644 packages/shopify/src/utils/get-categories.ts create mode 100644 packages/shopify/src/utils/get-checkout-id.ts create mode 100644 packages/shopify/src/utils/get-search-variables.ts create mode 100644 packages/shopify/src/utils/get-sort-variables.ts create mode 100644 packages/shopify/src/utils/handle-account-activation.ts create mode 100644 packages/shopify/src/utils/handle-fetch-response.ts create mode 100644 packages/shopify/src/utils/handle-login.ts create mode 100644 packages/shopify/src/utils/index.ts create mode 100644 packages/shopify/src/utils/mutations/associate-customer-with-checkout.ts create mode 100644 packages/shopify/src/utils/mutations/checkout-create.ts create mode 100644 packages/shopify/src/utils/mutations/checkout-line-item-add.ts create mode 100644 packages/shopify/src/utils/mutations/checkout-line-item-remove.ts create mode 100644 packages/shopify/src/utils/mutations/checkout-line-item-update.ts create mode 100644 packages/shopify/src/utils/mutations/customer-access-token-create.ts create mode 100644 packages/shopify/src/utils/mutations/customer-access-token-delete.ts create mode 100644 packages/shopify/src/utils/mutations/customer-activate-by-url.ts create mode 100644 packages/shopify/src/utils/mutations/customer-activate.ts create mode 100644 packages/shopify/src/utils/mutations/customer-create.ts create mode 100644 packages/shopify/src/utils/mutations/index.ts create mode 100644 packages/shopify/src/utils/normalize.ts create mode 100644 packages/shopify/src/utils/queries/get-all-collections-query.ts create mode 100644 packages/shopify/src/utils/queries/get-all-pages-query.ts create mode 100644 packages/shopify/src/utils/queries/get-all-product-vendors-query.ts create mode 100644 packages/shopify/src/utils/queries/get-all-products-paths-query.ts create mode 100644 packages/shopify/src/utils/queries/get-all-products-query.ts create mode 100644 packages/shopify/src/utils/queries/get-checkout-query.ts create mode 100644 packages/shopify/src/utils/queries/get-collection-products-query.ts create mode 100644 packages/shopify/src/utils/queries/get-customer-id-query.ts create mode 100644 packages/shopify/src/utils/queries/get-customer-query.ts create mode 100644 packages/shopify/src/utils/queries/get-page-query.ts create mode 100644 packages/shopify/src/utils/queries/get-product-query.ts create mode 100644 packages/shopify/src/utils/queries/get-site-info-query.ts create mode 100644 packages/shopify/src/utils/queries/index.ts create mode 100644 packages/shopify/src/utils/throw-user-errors.ts create mode 100644 packages/shopify/src/wishlist/use-add-item.tsx create mode 100644 packages/shopify/src/wishlist/use-remove-item.tsx create mode 100644 packages/shopify/src/wishlist/use-wishlist.tsx create mode 100644 packages/shopify/taskfile.js create mode 100644 packages/shopify/tsconfig.json create mode 100644 packages/spree/.env.template create mode 100644 packages/spree/.prettierignore create mode 100644 packages/spree/.prettierrc create mode 100644 packages/spree/README-assets/screenshots.png create mode 100644 packages/spree/README.md create mode 100644 packages/spree/package.json create mode 100644 packages/spree/src/api/endpoints/cart/index.ts create mode 100644 packages/spree/src/api/endpoints/catalog/index.ts create mode 100644 packages/spree/src/api/endpoints/catalog/products.ts create mode 100644 packages/spree/src/api/endpoints/checkout/get-checkout.ts create mode 100644 packages/spree/src/api/endpoints/checkout/index.ts create mode 100644 packages/spree/src/api/endpoints/customer/address.ts create mode 100644 packages/spree/src/api/endpoints/customer/card.ts create mode 100644 packages/spree/src/api/endpoints/customer/index.ts create mode 100644 packages/spree/src/api/endpoints/login/index.ts create mode 100644 packages/spree/src/api/endpoints/logout/index.ts create mode 100644 packages/spree/src/api/endpoints/signup/index.ts create mode 100644 packages/spree/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/spree/src/api/index.ts create mode 100644 packages/spree/src/api/operations/get-all-pages.ts create mode 100644 packages/spree/src/api/operations/get-all-product-paths.ts create mode 100644 packages/spree/src/api/operations/get-all-products.ts create mode 100644 packages/spree/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/spree/src/api/operations/get-page.ts create mode 100644 packages/spree/src/api/operations/get-product.ts create mode 100644 packages/spree/src/api/operations/get-site-info.ts create mode 100644 packages/spree/src/api/operations/index.ts create mode 100644 packages/spree/src/api/utils/create-api-fetch.ts create mode 100644 packages/spree/src/api/utils/fetch.ts create mode 100644 packages/spree/src/auth/index.ts create mode 100644 packages/spree/src/auth/use-login.tsx create mode 100644 packages/spree/src/auth/use-logout.tsx create mode 100644 packages/spree/src/auth/use-signup.tsx create mode 100644 packages/spree/src/cart/index.ts create mode 100644 packages/spree/src/cart/use-add-item.tsx create mode 100644 packages/spree/src/cart/use-cart.tsx create mode 100644 packages/spree/src/cart/use-remove-item.tsx create mode 100644 packages/spree/src/cart/use-update-item.tsx create mode 100644 packages/spree/src/checkout/use-checkout.tsx create mode 100644 packages/spree/src/commerce.config.json create mode 100644 packages/spree/src/customer/address/use-add-item.tsx create mode 100644 packages/spree/src/customer/card/use-add-item.tsx create mode 100644 packages/spree/src/customer/index.ts create mode 100644 packages/spree/src/customer/use-customer.tsx create mode 100644 packages/spree/src/errors/AccessTokenError.ts create mode 100644 packages/spree/src/errors/MisconfigurationError.ts create mode 100644 packages/spree/src/errors/MissingConfigurationValueError.ts create mode 100644 packages/spree/src/errors/MissingLineItemVariantError.ts create mode 100644 packages/spree/src/errors/MissingOptionValueError.ts create mode 100644 packages/spree/src/errors/MissingPrimaryVariantError.ts create mode 100644 packages/spree/src/errors/MissingProductError.ts create mode 100644 packages/spree/src/errors/MissingSlugVariableError.ts create mode 100644 packages/spree/src/errors/MissingVariantError.ts create mode 100644 packages/spree/src/errors/RefreshTokenError.ts create mode 100644 packages/spree/src/errors/SpreeResponseContentError.ts create mode 100644 packages/spree/src/errors/SpreeSdkMethodFromEndpointPathError.ts create mode 100644 packages/spree/src/errors/TokensNotRejectedError.ts create mode 100644 packages/spree/src/errors/UserTokenResponseParseError.ts create mode 100644 packages/spree/src/fetcher.ts create mode 100644 packages/spree/src/index.tsx create mode 100644 packages/spree/src/isomorphic-config.ts create mode 100644 packages/spree/src/next.config.cjs create mode 100644 packages/spree/src/product/index.ts create mode 100644 packages/spree/src/product/use-price.tsx create mode 100644 packages/spree/src/product/use-search.tsx create mode 100644 packages/spree/src/provider.ts create mode 100644 packages/spree/src/types/index.ts create mode 100644 packages/spree/src/utils/convert-spree-error-to-graph-ql-error.ts create mode 100644 packages/spree/src/utils/create-customized-fetch-fetcher.ts create mode 100644 packages/spree/src/utils/create-empty-cart.ts create mode 100644 packages/spree/src/utils/create-get-absolute-image-url.ts create mode 100644 packages/spree/src/utils/expand-options.ts create mode 100644 packages/spree/src/utils/force-isomorphic-config-values.ts create mode 100644 packages/spree/src/utils/get-image-url.ts create mode 100644 packages/spree/src/utils/get-media-gallery.ts create mode 100644 packages/spree/src/utils/get-product-path.ts create mode 100644 packages/spree/src/utils/get-spree-sdk-method-from-endpoint-path.ts create mode 100644 packages/spree/src/utils/handle-token-errors.ts create mode 100644 packages/spree/src/utils/is-json-content-type.ts create mode 100644 packages/spree/src/utils/is-server.ts create mode 100644 packages/spree/src/utils/login.ts create mode 100644 packages/spree/src/utils/normalizations/normalize-cart.ts create mode 100644 packages/spree/src/utils/normalizations/normalize-page.ts create mode 100644 packages/spree/src/utils/normalizations/normalize-product.ts create mode 100644 packages/spree/src/utils/normalizations/normalize-user.ts create mode 100644 packages/spree/src/utils/normalizations/normalize-wishlist.ts create mode 100644 packages/spree/src/utils/pretty-print-spree-sdk-errors.ts create mode 100644 packages/spree/src/utils/require-config.ts create mode 100644 packages/spree/src/utils/sort-option-types.ts create mode 100644 packages/spree/src/utils/tokens/cart-token.ts create mode 100644 packages/spree/src/utils/tokens/ensure-fresh-user-access-token.ts create mode 100644 packages/spree/src/utils/tokens/ensure-itoken.ts create mode 100644 packages/spree/src/utils/tokens/is-logged-in.ts create mode 100644 packages/spree/src/utils/tokens/revoke-user-tokens.ts create mode 100644 packages/spree/src/utils/tokens/user-token-response.ts create mode 100644 packages/spree/src/utils/validations/validate-all-products-taxonomy-id.ts create mode 100644 packages/spree/src/utils/validations/validate-cookie-expire.ts create mode 100644 packages/spree/src/utils/validations/validate-images-option-filter.ts create mode 100644 packages/spree/src/utils/validations/validate-images-quality.ts create mode 100644 packages/spree/src/utils/validations/validate-images-size.ts create mode 100644 packages/spree/src/utils/validations/validate-placeholder-image-url.ts create mode 100644 packages/spree/src/utils/validations/validate-products-prerender-count.ts create mode 100644 packages/spree/src/wishlist/index.ts create mode 100644 packages/spree/src/wishlist/use-add-item.tsx create mode 100644 packages/spree/src/wishlist/use-remove-item.tsx create mode 100644 packages/spree/src/wishlist/use-wishlist.tsx create mode 100644 packages/spree/taskfile.js create mode 100644 packages/spree/tsconfig.json create mode 100644 packages/swell/.env.template create mode 100644 packages/swell/.prettierignore create mode 100644 packages/swell/.prettierrc create mode 100644 packages/swell/package.json create mode 100644 packages/swell/schema.d.ts create mode 100644 packages/swell/schema.graphql create mode 100644 packages/swell/src/api/cart/index.ts create mode 100644 packages/swell/src/api/catalog/index.ts create mode 100644 packages/swell/src/api/catalog/products.ts create mode 100644 packages/swell/src/api/customer.ts create mode 100644 packages/swell/src/api/customers/index.ts create mode 100644 packages/swell/src/api/customers/logout.ts create mode 100644 packages/swell/src/api/customers/signup.ts create mode 100644 packages/swell/src/api/endpoints/cart.ts create mode 100644 packages/swell/src/api/endpoints/catalog/products.ts create mode 100644 packages/swell/src/api/endpoints/checkout/index.ts create mode 100644 packages/swell/src/api/endpoints/customer/address.ts create mode 100644 packages/swell/src/api/endpoints/customer/card.ts create mode 100644 packages/swell/src/api/endpoints/customer/index.ts create mode 100644 packages/swell/src/api/endpoints/login.ts create mode 100644 packages/swell/src/api/endpoints/logout.ts create mode 100644 packages/swell/src/api/endpoints/signup.ts create mode 100644 packages/swell/src/api/endpoints/wishlist.ts create mode 100644 packages/swell/src/api/index.ts create mode 100644 packages/swell/src/api/operations/get-all-pages.ts create mode 100644 packages/swell/src/api/operations/get-all-product-paths.ts create mode 100644 packages/swell/src/api/operations/get-all-products.ts create mode 100644 packages/swell/src/api/operations/get-page.ts create mode 100644 packages/swell/src/api/operations/get-product.ts create mode 100644 packages/swell/src/api/operations/get-site-info.ts create mode 100644 packages/swell/src/api/operations/login.ts create mode 100644 packages/swell/src/api/utils/fetch-swell-api.ts create mode 100644 packages/swell/src/api/utils/fetch.ts create mode 100644 packages/swell/src/api/utils/is-allowed-method.ts create mode 100644 packages/swell/src/api/wishlist/index.tsx create mode 100644 packages/swell/src/auth/use-login.tsx create mode 100644 packages/swell/src/auth/use-logout.tsx create mode 100644 packages/swell/src/auth/use-signup.tsx create mode 100644 packages/swell/src/cart/index.ts create mode 100644 packages/swell/src/cart/use-add-item.tsx create mode 100644 packages/swell/src/cart/use-cart.tsx create mode 100644 packages/swell/src/cart/use-remove-item.tsx create mode 100644 packages/swell/src/cart/use-update-item.tsx create mode 100644 packages/swell/src/cart/utils/checkout-create.ts create mode 100644 packages/swell/src/cart/utils/checkout-to-cart.ts create mode 100644 packages/swell/src/cart/utils/index.ts create mode 100644 packages/swell/src/checkout/use-checkout.tsx create mode 100644 packages/swell/src/commerce.config.json create mode 100644 packages/swell/src/const.ts create mode 100644 packages/swell/src/customer/address/use-add-item.tsx create mode 100644 packages/swell/src/customer/card/use-add-item.tsx create mode 100644 packages/swell/src/customer/index.ts create mode 100644 packages/swell/src/customer/use-customer.tsx create mode 100644 packages/swell/src/fetcher.ts create mode 100644 packages/swell/src/index.tsx create mode 100644 packages/swell/src/next.config.cjs create mode 100644 packages/swell/src/product/index.ts create mode 100644 packages/swell/src/product/use-price.tsx create mode 100644 packages/swell/src/product/use-search.tsx create mode 100644 packages/swell/src/provider.ts create mode 100644 packages/swell/src/swell.ts create mode 100644 packages/swell/src/types.ts create mode 100644 packages/swell/src/types/cart.ts create mode 100644 packages/swell/src/types/checkout.ts create mode 100644 packages/swell/src/types/common.ts create mode 100644 packages/swell/src/types/customer.ts create mode 100644 packages/swell/src/types/index.ts create mode 100644 packages/swell/src/types/login.ts create mode 100644 packages/swell/src/types/logout.ts create mode 100644 packages/swell/src/types/page.ts create mode 100644 packages/swell/src/types/product.ts create mode 100644 packages/swell/src/types/signup.ts create mode 100644 packages/swell/src/types/site.ts create mode 100644 packages/swell/src/types/wishlist.ts create mode 100644 packages/swell/src/utils/customer-token.ts create mode 100644 packages/swell/src/utils/get-categories.ts create mode 100644 packages/swell/src/utils/get-checkout-id.ts create mode 100644 packages/swell/src/utils/get-search-variables.ts create mode 100644 packages/swell/src/utils/get-sort-variables.ts create mode 100644 packages/swell/src/utils/get-vendors.ts create mode 100644 packages/swell/src/utils/handle-fetch-response.ts create mode 100644 packages/swell/src/utils/handle-login.ts create mode 100644 packages/swell/src/utils/index.ts create mode 100644 packages/swell/src/utils/normalize.ts create mode 100644 packages/swell/src/utils/storage.ts create mode 100644 packages/swell/src/wishlist/use-add-item.tsx create mode 100644 packages/swell/src/wishlist/use-remove-item.tsx create mode 100644 packages/swell/src/wishlist/use-wishlist.tsx create mode 100644 packages/swell/taskfile.js create mode 100644 packages/swell/tsconfig.json create mode 100644 packages/taskr-swc/.prettierrc create mode 100644 packages/taskr-swc/package.json create mode 100644 packages/taskr-swc/taskfile-swc.js create mode 100644 packages/vendure/.env.template create mode 100644 packages/vendure/.prettierignore create mode 100644 packages/vendure/.prettierrc create mode 100644 packages/vendure/README.md create mode 100644 packages/vendure/codegen.json create mode 100644 packages/vendure/package.json create mode 100644 packages/vendure/schema.d.ts create mode 100644 packages/vendure/schema.graphql create mode 100644 packages/vendure/src/api/endpoints/cart/index.ts create mode 100644 packages/vendure/src/api/endpoints/catalog/index.ts create mode 100644 packages/vendure/src/api/endpoints/catalog/products.ts create mode 100644 packages/vendure/src/api/endpoints/checkout/index.ts create mode 100644 packages/vendure/src/api/endpoints/customer/address.ts create mode 100644 packages/vendure/src/api/endpoints/customer/card.ts create mode 100644 packages/vendure/src/api/endpoints/customer/index.ts create mode 100644 packages/vendure/src/api/endpoints/login/index.ts create mode 100644 packages/vendure/src/api/endpoints/logout/index.ts create mode 100644 packages/vendure/src/api/endpoints/signup/index.ts create mode 100644 packages/vendure/src/api/endpoints/wishlist/index.tsx create mode 100644 packages/vendure/src/api/index.ts create mode 100644 packages/vendure/src/api/operations/get-all-pages.ts create mode 100644 packages/vendure/src/api/operations/get-all-product-paths.ts create mode 100644 packages/vendure/src/api/operations/get-all-products.ts create mode 100644 packages/vendure/src/api/operations/get-customer-wishlist.ts create mode 100644 packages/vendure/src/api/operations/get-page.ts create mode 100644 packages/vendure/src/api/operations/get-product.ts create mode 100644 packages/vendure/src/api/operations/get-site-info.ts create mode 100644 packages/vendure/src/api/operations/login.ts create mode 100644 packages/vendure/src/api/utils/fetch-graphql-api.ts create mode 100644 packages/vendure/src/api/utils/fetch.ts create mode 100644 packages/vendure/src/auth/index.ts create mode 100644 packages/vendure/src/auth/use-login.tsx create mode 100644 packages/vendure/src/auth/use-logout.tsx create mode 100644 packages/vendure/src/auth/use-signup.tsx create mode 100644 packages/vendure/src/cart/index.ts create mode 100644 packages/vendure/src/cart/use-add-item.tsx create mode 100644 packages/vendure/src/cart/use-cart.tsx create mode 100644 packages/vendure/src/cart/use-remove-item.tsx create mode 100644 packages/vendure/src/cart/use-update-item.tsx create mode 100644 packages/vendure/src/checkout/use-checkout.tsx create mode 100644 packages/vendure/src/commerce.config.json create mode 100644 packages/vendure/src/customer/address/use-add-item.tsx create mode 100644 packages/vendure/src/customer/card/use-add-item.tsx create mode 100644 packages/vendure/src/customer/index.ts create mode 100644 packages/vendure/src/customer/use-customer.tsx create mode 100644 packages/vendure/src/fetcher.ts create mode 100644 packages/vendure/src/index.tsx create mode 100644 packages/vendure/src/next.config.cjs create mode 100644 packages/vendure/src/product/index.ts create mode 100644 packages/vendure/src/product/use-price.tsx create mode 100644 packages/vendure/src/product/use-search.tsx create mode 100644 packages/vendure/src/provider.ts create mode 100644 packages/vendure/src/types/cart.ts create mode 100644 packages/vendure/src/types/checkout.ts create mode 100644 packages/vendure/src/types/common.ts create mode 100644 packages/vendure/src/types/customer.ts create mode 100644 packages/vendure/src/types/index.ts create mode 100644 packages/vendure/src/types/login.ts create mode 100644 packages/vendure/src/types/logout.ts create mode 100644 packages/vendure/src/types/page.ts create mode 100644 packages/vendure/src/types/product.ts create mode 100644 packages/vendure/src/types/signup.ts create mode 100644 packages/vendure/src/types/site.ts create mode 100644 packages/vendure/src/types/wishlist.ts create mode 100644 packages/vendure/src/utils/array-to-tree.ts create mode 100644 packages/vendure/src/utils/fragments/cart-fragment.ts create mode 100644 packages/vendure/src/utils/fragments/search-result-fragment.ts create mode 100644 packages/vendure/src/utils/mutations/add-item-to-order-mutation.ts create mode 100644 packages/vendure/src/utils/mutations/adjust-order-line-mutation.ts create mode 100644 packages/vendure/src/utils/mutations/log-in-mutation.ts create mode 100644 packages/vendure/src/utils/mutations/log-out-mutation.ts create mode 100644 packages/vendure/src/utils/mutations/remove-order-line-mutation.ts create mode 100644 packages/vendure/src/utils/mutations/sign-up-mutation.ts create mode 100644 packages/vendure/src/utils/normalize.ts create mode 100644 packages/vendure/src/utils/queries/active-customer-query.ts create mode 100644 packages/vendure/src/utils/queries/get-all-product-paths-query.ts create mode 100644 packages/vendure/src/utils/queries/get-all-products-query.ts create mode 100644 packages/vendure/src/utils/queries/get-cart-query.ts create mode 100644 packages/vendure/src/utils/queries/get-collections-query.ts create mode 100644 packages/vendure/src/utils/queries/get-product-query.ts create mode 100644 packages/vendure/src/utils/queries/search-query.ts create mode 100644 packages/vendure/src/wishlist/use-add-item.tsx create mode 100644 packages/vendure/src/wishlist/use-remove-item.tsx create mode 100644 packages/vendure/src/wishlist/use-wishlist.tsx create mode 100644 packages/vendure/taskfile.js create mode 100644 packages/vendure/tsconfig.json create mode 100644 site/.env.template create mode 100644 site/.eslintrc create mode 100644 site/.gitignore create mode 100644 site/.prettierignore create mode 100644 site/.prettierrc create mode 100644 site/assets/aboutpng.png create mode 100644 site/assets/aboutteam01.png create mode 100644 site/assets/aboutteam02.png create mode 100644 site/assets/aboutteam03.png create mode 100644 site/assets/arrow_down.png create mode 100644 site/assets/banner1.png create mode 100644 site/assets/banner2.png create mode 100644 site/assets/banner3.png create mode 100644 site/assets/bannerHome.png create mode 100644 site/assets/banner_page.png create mode 100644 site/assets/base.css create mode 100644 site/assets/bg-home1-newleter.jpg create mode 100644 site/assets/bg-home1-newleter.png create mode 100644 site/assets/chrome-bug.css create mode 100644 site/assets/components.css create mode 100644 site/assets/deals_of_day_1.jpg create mode 100644 site/assets/deals_of_day_2.jpg create mode 100644 site/assets/ebaylogo.png create mode 100644 site/assets/enlang.jpg create mode 100644 site/assets/icon_menu.png create mode 100644 site/assets/image_1.png create mode 100644 site/assets/image_2.png create mode 100644 site/assets/image_3.png create mode 100644 site/assets/image_4.png create mode 100644 site/assets/image_5.png create mode 100644 site/assets/image_6.png create mode 100644 site/assets/image_7.png create mode 100644 site/assets/imgWorking.jpg create mode 100644 site/assets/logo1.png create mode 100644 site/assets/logo2.png create mode 100644 site/assets/logo3.png create mode 100644 site/assets/logo4.png create mode 100644 site/assets/logo5.png create mode 100644 site/assets/logo6.png create mode 100644 site/assets/main.css create mode 100644 site/assets/payment.png create mode 100644 site/assets/seller_1.png create mode 100644 site/assets/seller_2.png create mode 100644 site/assets/seller_3.png create mode 100644 site/assets/seller_4.png create mode 100644 site/assets/seller_5.png create mode 100644 site/assets/seller_6.png create mode 100644 site/assets/seller_7.png create mode 100644 site/assets/seller_8.png create mode 100644 site/assets/seller_9.png create mode 100644 site/commerce-config.js create mode 100644 site/commerce.config.json create mode 100644 site/components/AddHead.js create mode 100644 site/components/Copyright.js create mode 100644 site/components/Countdown.js create mode 100644 site/components/DealsOfDay.js create mode 100644 site/components/Footer.js create mode 100644 site/components/HeaderCenter.js create mode 100644 site/components/HeaderMid.js create mode 100644 site/components/auth/ForgotPassword.tsx create mode 100644 site/components/auth/LoginView.tsx create mode 100644 site/components/auth/SignUpView.tsx create mode 100644 site/components/auth/index.ts create mode 100644 site/components/cart/AddToCartButton.js create mode 100644 site/components/cart/CartIcon.js create mode 100644 site/components/cart/CartItem/CartItem.module.css create mode 100644 site/components/cart/CartItem/CartItem.tsx create mode 100644 site/components/cart/CartItem/index.ts create mode 100644 site/components/cart/CartSidebarView/CartSidebarView.module.css create mode 100644 site/components/cart/CartSidebarView/CartSidebarView.tsx create mode 100644 site/components/cart/CartSidebarView/index.ts create mode 100644 site/components/cart/cart-page/CartItemsContainer.js create mode 100644 site/components/cart/cart-page/Cartitem.js create mode 100644 site/components/cart/index.ts create mode 100644 site/components/checkout/CheckoutSidebarView/CheckoutSidebarView.module.css create mode 100644 site/components/checkout/CheckoutSidebarView/CheckoutSidebarView.tsx create mode 100644 site/components/checkout/CheckoutSidebarView/index.ts create mode 100644 site/components/checkout/PaymentMethodView/PaymentMethodView.module.css create mode 100644 site/components/checkout/PaymentMethodView/PaymentMethodView.tsx create mode 100644 site/components/checkout/PaymentMethodView/index.ts create mode 100644 site/components/checkout/PaymentWidget/PaymentWidget.module.css create mode 100644 site/components/checkout/PaymentWidget/PaymentWidget.tsx create mode 100644 site/components/checkout/PaymentWidget/index.ts create mode 100644 site/components/checkout/ShippingView/ShippingView.module.css create mode 100644 site/components/checkout/ShippingView/ShippingView.tsx create mode 100644 site/components/checkout/ShippingView/index.ts create mode 100644 site/components/checkout/ShippingWidget/ShippingWidget.module.css create mode 100644 site/components/checkout/ShippingWidget/ShippingWidget.tsx create mode 100644 site/components/checkout/ShippingWidget/index.ts create mode 100644 site/components/checkout/context.tsx create mode 100644 site/components/collection.js create mode 100644 site/components/common/Avatar/Avatar.tsx create mode 100644 site/components/common/Avatar/index.ts create mode 100644 site/components/common/FeatureBar/FeatureBar.module.css create mode 100644 site/components/common/FeatureBar/FeatureBar.tsx create mode 100644 site/components/common/FeatureBar/index.ts create mode 100644 site/components/common/Footer/Footer.module.css create mode 100644 site/components/common/Footer/Footer.tsx create mode 100644 site/components/common/Footer/index.ts create mode 100644 site/components/common/Head/Head.tsx create mode 100644 site/components/common/Head/index.ts create mode 100644 site/components/common/HomeAllProductsGrid/HomeAllProductsGrid.module.css create mode 100644 site/components/common/HomeAllProductsGrid/HomeAllProductsGrid.tsx create mode 100644 site/components/common/HomeAllProductsGrid/index.ts create mode 100644 site/components/common/I18nWidget/I18nWidget.module.css create mode 100644 site/components/common/I18nWidget/I18nWidget.tsx create mode 100644 site/components/common/I18nWidget/index.ts create mode 100644 site/components/common/Layout/Layout.js create mode 100644 site/components/common/Navbar/Navbar.module.css create mode 100644 site/components/common/Navbar/Navbar.tsx create mode 100644 site/components/common/Navbar/NavbarRoot.tsx create mode 100644 site/components/common/Navbar/index.ts create mode 100644 site/components/common/SEO/SEO.tsx create mode 100644 site/components/common/SEO/index.ts create mode 100644 site/components/common/Searchbar/Searchbar.module.css create mode 100644 site/components/common/Searchbar/Searchbar.tsx create mode 100644 site/components/common/Searchbar/index.ts create mode 100644 site/components/common/SidebarLayout/SidebarLayout.module.css create mode 100644 site/components/common/SidebarLayout/SidebarLayout.tsx create mode 100644 site/components/common/SidebarLayout/index.ts create mode 100644 site/components/common/UserNav/CustomerMenuContent/CustomerMenuContent.module.css create mode 100644 site/components/common/UserNav/CustomerMenuContent/CustomerMenuContent.tsx create mode 100644 site/components/common/UserNav/CustomerMenuContent/index.ts create mode 100644 site/components/common/UserNav/MenuSidebarView/MenuSidebarView.module.css create mode 100644 site/components/common/UserNav/MenuSidebarView/MenuSidebarView.tsx create mode 100644 site/components/common/UserNav/MenuSidebarView/index.ts create mode 100644 site/components/common/UserNav/UserNav.module.css create mode 100644 site/components/common/UserNav/UserNav.tsx create mode 100644 site/components/common/UserNav/index.ts create mode 100644 site/components/common/index.ts create mode 100644 site/components/countdowns.js create mode 100644 site/components/formEmail.js create mode 100644 site/components/icons/ArrowLeft.tsx create mode 100644 site/components/icons/ArrowRight.tsx create mode 100644 site/components/icons/Bag.tsx create mode 100644 site/components/icons/Check.tsx create mode 100644 site/components/icons/ChevronDown.tsx create mode 100644 site/components/icons/ChevronLeft.tsx create mode 100644 site/components/icons/ChevronRight.tsx create mode 100644 site/components/icons/ChevronUp.tsx create mode 100644 site/components/icons/CreditCard.tsx create mode 100644 site/components/icons/Cross.tsx create mode 100644 site/components/icons/DoubleChevron.tsx create mode 100644 site/components/icons/Github.tsx create mode 100644 site/components/icons/Heart.tsx create mode 100644 site/components/icons/Info.tsx create mode 100644 site/components/icons/MapPin.tsx create mode 100644 site/components/icons/Menu.tsx create mode 100644 site/components/icons/Minus.tsx create mode 100644 site/components/icons/Moon.tsx create mode 100644 site/components/icons/Plus.tsx create mode 100644 site/components/icons/Star.tsx create mode 100644 site/components/icons/Sun.tsx create mode 100644 site/components/icons/Trash.tsx create mode 100644 site/components/icons/Vercel.tsx create mode 100644 site/components/icons/index.ts create mode 100644 site/components/imglist.js create mode 100644 site/components/menu.js create mode 100644 site/components/menuPhu.js create mode 100644 site/components/newlistimg.js create mode 100644 site/components/product.js create mode 100644 site/components/product/ProductCard/ProductCard.module.css create mode 100644 site/components/product/ProductCard/ProductCard.tsx create mode 100644 site/components/product/ProductCard/index.ts create mode 100644 site/components/product/ProductOptions/ProductOptions.tsx create mode 100644 site/components/product/ProductOptions/index.ts create mode 100644 site/components/product/ProductSidebar/ProductSidebar.module.css create mode 100644 site/components/product/ProductSidebar/ProductSidebar.tsx create mode 100644 site/components/product/ProductSidebar/index.ts create mode 100644 site/components/product/ProductSlider/ProductSlider.module.css create mode 100644 site/components/product/ProductSlider/ProductSlider.tsx create mode 100644 site/components/product/ProductSlider/index.ts create mode 100644 site/components/product/ProductSliderControl/ProductSliderControl.module.css create mode 100644 site/components/product/ProductSliderControl/ProductSliderControl.tsx create mode 100644 site/components/product/ProductSliderControl/index.ts create mode 100644 site/components/product/ProductTag/ProductTag.module.css create mode 100644 site/components/product/ProductTag/ProductTag.tsx create mode 100644 site/components/product/ProductTag/index.ts create mode 100644 site/components/product/ProductView/ProductView.module.css create mode 100644 site/components/product/ProductView/ProductView.tsx create mode 100644 site/components/product/ProductView/index.ts create mode 100644 site/components/product/Swatch/Swatch.module.css create mode 100644 site/components/product/Swatch/Swatch.tsx create mode 100644 site/components/product/Swatch/index.ts create mode 100644 site/components/product/helpers.ts create mode 100644 site/components/product/index.ts create mode 100644 site/components/search.tsx create mode 100644 site/components/sidebar.js create mode 100644 site/components/single-product/categories-carousel/index.js create mode 100644 site/components/single-product/gallery-carousel/index.js create mode 100644 site/components/single-product/price/index.js create mode 100644 site/components/single-product/related-product/index.js create mode 100644 site/components/slider.js create mode 100644 site/components/tab.js create mode 100644 site/components/tabSeller.js create mode 100644 site/components/tabsLogo.js create mode 100644 site/components/ui/Button/Button.module.css create mode 100644 site/components/ui/Button/Button.tsx create mode 100644 site/components/ui/Button/index.ts create mode 100644 site/components/ui/Collapse/Collapse.module.css create mode 100644 site/components/ui/Collapse/Collapse.tsx create mode 100644 site/components/ui/Collapse/index.ts create mode 100644 site/components/ui/Container/Container.tsx create mode 100644 site/components/ui/Container/index.ts create mode 100644 site/components/ui/Dropdown/Dropdown.module.css create mode 100644 site/components/ui/Dropdown/Dropdown.tsx create mode 100644 site/components/ui/Grid/Grid.module.css create mode 100644 site/components/ui/Grid/Grid.tsx create mode 100644 site/components/ui/Grid/index.ts create mode 100644 site/components/ui/Hero/Hero.module.css create mode 100644 site/components/ui/Hero/Hero.tsx create mode 100644 site/components/ui/Hero/index.ts create mode 100644 site/components/ui/Input/Input.module.css create mode 100644 site/components/ui/Input/Input.tsx create mode 100644 site/components/ui/Input/index.ts create mode 100644 site/components/ui/Link/Link.tsx create mode 100644 site/components/ui/Link/index.ts create mode 100644 site/components/ui/LoadingDots/LoadingDots.module.css create mode 100644 site/components/ui/LoadingDots/LoadingDots.tsx create mode 100644 site/components/ui/LoadingDots/index.ts create mode 100644 site/components/ui/Logo/Logo.tsx create mode 100644 site/components/ui/Logo/index.ts create mode 100644 site/components/ui/Marquee/Marquee.module.css create mode 100644 site/components/ui/Marquee/Marquee.tsx create mode 100644 site/components/ui/Marquee/index.ts create mode 100644 site/components/ui/Modal/Modal.module.css create mode 100644 site/components/ui/Modal/Modal.tsx create mode 100644 site/components/ui/Modal/index.ts create mode 100644 site/components/ui/Quantity/Quantity.module.css create mode 100644 site/components/ui/Quantity/Quantity.tsx create mode 100644 site/components/ui/Quantity/index.ts create mode 100644 site/components/ui/README.md create mode 100644 site/components/ui/Rating/Rating.module.css create mode 100644 site/components/ui/Rating/Rating.tsx create mode 100644 site/components/ui/Rating/index.ts create mode 100644 site/components/ui/Sidebar/Sidebar.module.css create mode 100644 site/components/ui/Sidebar/Sidebar.tsx create mode 100644 site/components/ui/Sidebar/index.ts create mode 100644 site/components/ui/Skeleton/Skeleton.module.css create mode 100644 site/components/ui/Skeleton/Skeleton.tsx create mode 100644 site/components/ui/Skeleton/index.ts create mode 100644 site/components/ui/Text/Text.module.css create mode 100644 site/components/ui/Text/Text.tsx create mode 100644 site/components/ui/Text/index.ts create mode 100644 site/components/ui/context.tsx create mode 100644 site/components/ui/index.ts create mode 100644 site/components/wishlist/WishlistButton/WishlistButton.module.css create mode 100644 site/components/wishlist/WishlistButton/WishlistButton.tsx create mode 100644 site/components/wishlist/WishlistButton/index.ts create mode 100644 site/components/wishlist/WishlistCard/WishlistCard.module.css create mode 100644 site/components/wishlist/WishlistCard/WishlistCard.tsx create mode 100644 site/components/wishlist/WishlistCard/index.ts create mode 100644 site/components/wishlist/index.ts create mode 100644 site/config/seo_meta.json create mode 100644 site/global.d.ts create mode 100644 site/lib/addqueries/collections.js create mode 100644 site/lib/api/commerce.ts create mode 100644 site/lib/click-outside/click-outside.tsx create mode 100644 site/lib/click-outside/has-parent.js create mode 100644 site/lib/click-outside/index.ts create mode 100644 site/lib/click-outside/is-in-dom.js create mode 100644 site/lib/colors.ts create mode 100644 site/lib/context/AppContext.js create mode 100644 site/lib/focus-trap.tsx create mode 100644 site/lib/get-slug.ts create mode 100644 site/lib/hooks/useAcceptCookies.ts create mode 100644 site/lib/hooks/useUserAvatar.ts create mode 100644 site/lib/range-map.ts create mode 100644 site/lib/search-props.tsx create mode 100644 site/lib/search.tsx create mode 100644 site/lib/to-pixels.ts create mode 100644 site/lib/usage-warns.ts create mode 100644 site/next-env.d.ts create mode 100644 site/next.config.js create mode 100644 site/package.json create mode 100644 site/pages/404.tsx create mode 100644 site/pages/[...pages].tsx create mode 100644 site/pages/_app.js create mode 100644 site/pages/_document.js create mode 100644 site/pages/about.js create mode 100644 site/pages/api/cart.ts create mode 100644 site/pages/api/catalog/products.ts create mode 100644 site/pages/api/checkout.ts create mode 100644 site/pages/api/customer/address.ts create mode 100644 site/pages/api/customer/card.ts create mode 100644 site/pages/api/customer/index.ts create mode 100644 site/pages/api/login.ts create mode 100644 site/pages/api/logout.ts create mode 100644 site/pages/api/signup.ts create mode 100644 site/pages/api/wishlist.ts create mode 100644 site/pages/cart.js create mode 100644 site/pages/cart.tsx create mode 100644 site/pages/collection/[slug].js create mode 100644 site/pages/contact.js create mode 100644 site/pages/index.js create mode 100644 site/pages/myaccount.js create mode 100644 site/pages/orders.tsx create mode 100644 site/pages/product/[slug].js create mode 100644 site/pages/profile.js create mode 100644 site/pages/profile.tsx create mode 100644 site/pages/search.tsx create mode 100644 site/pages/search/[category].tsx create mode 100644 site/pages/search/designers/[name].tsx create mode 100644 site/pages/search/designers/[name]/[category].tsx create mode 100644 site/pages/shop.js create mode 100644 site/pages/styles/Home.module.css create mode 100644 site/pages/styles/globals.css create mode 100644 site/pages/thankiu.js create mode 100644 site/pages/wishlist.tsx create mode 100644 site/postcss.config.js create mode 100644 site/public/assets/drop-shirt-0.png create mode 100644 site/public/assets/drop-shirt-1.png create mode 100644 site/public/assets/drop-shirt-2.png create mode 100644 site/public/assets/drop-shirt.png create mode 100644 site/public/assets/lightweight-jacket-0.png create mode 100644 site/public/assets/lightweight-jacket-1.png create mode 100644 site/public/assets/lightweight-jacket-2.png create mode 100644 site/public/assets/t-shirt-0.png create mode 100644 site/public/assets/t-shirt-1.png create mode 100644 site/public/assets/t-shirt-2.png create mode 100644 site/public/assets/t-shirt-3.png create mode 100644 site/public/assets/t-shirt-4.png create mode 100644 site/public/bg-products.svg create mode 100644 site/public/card.png create mode 100644 site/public/cursor-left.png create mode 100644 site/public/cursor-right.png create mode 100644 site/public/favicon.ico create mode 100644 site/public/flag-en-us.svg create mode 100644 site/public/flag-es-ar.svg create mode 100644 site/public/flag-es-co.svg create mode 100644 site/public/flag-es.svg create mode 100644 site/public/icon-144x144.png create mode 100644 site/public/icon-192x192.png create mode 100644 site/public/icon-512x512.png create mode 100644 site/public/icon.png create mode 100644 site/public/product-img-placeholder.svg create mode 100644 site/public/site.webmanifest create mode 100644 site/public/slider-arrows.png create mode 100644 site/public/vercel.svg create mode 100644 site/tailwind.config.js create mode 100644 site/tsconfig.json create mode 100644 turbo.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..11ebf4e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +tab_width = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.js] +quote_type = single + +[{*.c,*.cc,*.h,*.hh,*.cpp,*.hpp,*.m,*.mm,*.mpp,*.js,*.java,*.go,*.rs,*.php,*.ng,*.jsx,*.ts,*.d,*.cs,*.swift}] +curly_bracket_next_line = false +spaces_around_operators = true +spaces_around_brackets = outside +# close enough to 1TB +indent_brace_style = K&R diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b7301fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +.pnp +.pnp.js + +# testing +coverage + +# next.js +.next +out + +# production +build +dist + +# misc +.DS_Store +*.pem +.idea + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel + +# Turborepo +.turbo diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1c8b279 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +# Every package defines its prettier config +node_modules +dist +.next +public diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..60907f7 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "esbenp.prettier-vscode", + "csstools.postcss", + "bradlc.vscode-tailwindcss", + "ms-vscode.vscode-typescript-next" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9bf4d12 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true +} diff --git a/ISSUE_TEMPLATE/1.core_bug_report.yml b/ISSUE_TEMPLATE/1.core_bug_report.yml new file mode 100644 index 0000000..6d38488 --- /dev/null +++ b/ISSUE_TEMPLATE/1.core_bug_report.yml @@ -0,0 +1,55 @@ +name: Core package Bug Report +description: Create a bug report for the Next.js commerce core package +labels: 'template: core bug' +body: + - type: markdown + attributes: + value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible. + - type: checkboxes + attributes: + label: Verify latest commit + description: `main` is the latest version of Next.js Commerce. + options: + - label: I verified that the issue exists on `main` + required: true + - type: textarea + attributes: + label: Provide environment information + description: Please run `npx --no-install next info` in the root directory of your project and paste the results. + validations: + required: true + - type: input + attributes: + label: What browser are you using? (if relevant) + description: 'Please specify the exact version. For example: Chrome 100.0.4878.0' + - type: input + attributes: + label: How are you deploying your application? (if relevant) + description: 'For example: next start, next export, Vercel, Other platform' + - type: textarea + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: To Reproduce + description: Steps to reproduce the behavior, please provide a clear code snippets that always reproduces the issue or a GitHub repository. Screenshots can be provided in the issue body below. + validations: + required: true + - type: markdown + attributes: + value: Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear. + - type: markdown + attributes: + value: Contributors should be able to follow the steps provided in order to reproduce the bug. + - type: markdown + attributes: + value: These steps are used to add integration tests to ensure the same issue does not happen again. Thanks in advance! diff --git a/ISSUE_TEMPLATE/2.provider_bug_report.yml b/ISSUE_TEMPLATE/2.provider_bug_report.yml new file mode 100644 index 0000000..a600c37 --- /dev/null +++ b/ISSUE_TEMPLATE/2.provider_bug_report.yml @@ -0,0 +1,59 @@ +name: Provider package Bug Report +description: Create a bug report for the Next.js commerce core package +labels: 'template: provider bug' +body: + - type: markdown + attributes: + value: Thanks for taking the time to file a bug report! Please fill out this form as completely as possible. + - type: checkboxes + attributes: + label: Verify latest commit + description: `main` is the latest version of Next.js Commerce. + options: + - label: I verified that the issue exists on `main` + required: true + - type: textarea + attributes: + label: Provide environment information + description: Please run `npx --no-install next info` in the root directory of your project and paste the results. + validations: + required: true + - type: input + attributes: + label: What Provider are you using? + description: 'Please specify the provider package name. For example: `bigcommerce`' + - type: input + attributes: + label: What browser are you using? (if relevant) + description: 'Please specify the exact version. For example: Chrome 100.0.4878.0' + - type: input + attributes: + label: How are you deploying your application? (if relevant) + description: 'For example: next start, next export, Vercel, Other platform' + - type: textarea + attributes: + label: Describe the Bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: Expected Behavior + description: A clear and concise description of what you expected to happen. + validations: + required: true + - type: textarea + attributes: + label: To Reproduce + description: Steps to reproduce the behavior, please provide a clear code snippets that always reproduces the issue or a GitHub repository. Screenshots can be provided in the issue body below. + validations: + required: true + - type: markdown + attributes: + value: Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear. + - type: markdown + attributes: + value: Contributors should be able to follow the steps provided in order to reproduce the bug. + - type: markdown + attributes: + value: These steps are used to add integration tests to ensure the same issue does not happen again. Thanks in advance! diff --git a/ISSUE_TEMPLATE/3.feature_request.yml b/ISSUE_TEMPLATE/3.feature_request.yml new file mode 100644 index 0000000..2655aff --- /dev/null +++ b/ISSUE_TEMPLATE/3.feature_request.yml @@ -0,0 +1,28 @@ +name: Feature Request +description: Create a feature request for the Next.js core +labels: 'template: story' +body: + - type: markdown + attributes: + value: Thanks for taking the time to file a feature request! Please fill out this form as completely as possible. + - type: markdown + attributes: + value: 'Feature requests will be converted to the GitHub Discussions "Ideas" section.' + - type: textarea + attributes: + label: Describe the feature you'd like to request + description: A clear and concise description of what you want and what your use case is. + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: true diff --git a/ISSUE_TEMPLATE/4.docs_request.yml b/ISSUE_TEMPLATE/4.docs_request.yml new file mode 100644 index 0000000..72acd89 --- /dev/null +++ b/ISSUE_TEMPLATE/4.docs_request.yml @@ -0,0 +1,18 @@ +name: 'Docs Request for an Update or Improvement' +description: A request to update or improve Next.js Commerce documentation +title: 'Docs: ' +labels: + - 'template: documentation' +body: + - type: textarea + attributes: + label: What is the improvement or update you wish to see? + description: 'Example: I would like to see more examples of how to use hooks.' + validations: + required: true + - type: textarea + attributes: + label: Is there any context that might help us understand? + description: A clear description of any added context that might help us understand. + validations: + required: true \ No newline at end of file diff --git a/ISSUE_TEMPLATE/config.yml b/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..dcefd31 --- /dev/null +++ b/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ask a question + url: https://github.com/vercel/commerce/discussions + about: Ask questions and discuss with other community members diff --git a/README.md b/README.md new file mode 100644 index 0000000..1050201 --- /dev/null +++ b/README.md @@ -0,0 +1,198 @@ +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fcommerce&project-name=commerce&repo-name=commerce&demo-title=Next.js%20Commerce&demo-description=An%20all-in-one%20starter%20kit%20for%20high-performance%20e-commerce%20sites.&demo-url=https%3A%2F%2Fdemo.vercel.store&demo-image=https%3A%2F%2Fbigcommerce-demo-asset-ksvtgfvnd.vercel.app%2Fbigcommerce.png&integration-ids=oac_MuWZiE4jtmQ2ejZQaQ7ncuDT,oac_9HSKtXld74NG0srzdxSiBGty&skippable-integrations=1&root-directory=site&build-command=cd%20..%20%26%26%20yarn%20build) + +# Next.js Commerce + +The all-in-one starter kit for high-performance e-commerce sites. With a few clicks, Next.js developers can clone, deploy and fully customize their own store. +Start right now at [nextjs.org/commerce](https://nextjs.org/commerce) + +Demo live at: [demo.vercel.store](https://demo.vercel.store/) + +- Shopify Demo: https://shopify.vercel.store/ +- Swell Demo: https://swell.vercel.store/ +- BigCommerce Demo: https://bigcommerce.vercel.store/ +- Vendure Demo: https://vendure.vercel.store +- Saleor Demo: https://saleor.vercel.store/ +- Ordercloud Demo: https://ordercloud.vercel.store/ +- Spree Demo: https://spree.vercel.store/ +- Kibo Commerce Demo: https://kibocommerce.vercel.store/ +- Commerce.js Demo: https://commercejs.vercel.store/ +- SalesForce Cloud Commerce Demo: https://salesforce-cloud-commerce.vercel.store/ + +## Run minimal version locally + +> To run a minimal version of Next.js Commerce you can start with the default local provider `@vercel/commerce-local` that has disabled all features (cart, auth) and use static files for the backend + +```bash +yarn # run this command in root folder of the mono repo +yarn dev +``` + +> If you encounter any problems while installing and running for the first time, please see the Troubleshoot section + +## Features + +- Performant by default +- SEO Ready +- Internationalization +- Responsive +- UI Components +- Theming +- Standardized Data Hooks +- Integrations - Integrate seamlessly with the most common ecommerce platforms. +- Dark Mode Support + +## Integrations + +Next.js Commerce integrates out-of-the-box with BigCommerce, Shopify, Swell, Saleor, Vendure, Spree and Commerce.js. We plan to support all major ecommerce backends. + +## Considerations + +- `packages/commerce` contains all types, helpers and functions to be used as base to build a new **provider**. +- **Providers** live under `packages`'s root folder and they will extend Next.js Commerce types and functionality (`packages/commerce`). +- We have a **Features API** to ensure feature parity between the UI and the Provider. The UI should update accordingly and no extra code should be bundled. All extra configuration for features will live under `features` in `commerce.config.json` and if needed it can also be accessed programatically. +- Each **provider** should add its corresponding `next.config.js` and `commerce.config.json` adding specific data related to the provider. For example in case of BigCommerce, the images CDN and additional API routes. + +## Configuration + +### How to change providers + +Open `site/.env.local` and change the value of `COMMERCE_PROVIDER` to the provider you would like to use, then set the environment variables for that provider (use `site/.env.template` as the base). + +The setup for Shopify would look like this for example: + +``` +COMMERCE_PROVIDER=@vercel/commerce-shopify +NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxx +NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN=xxxxxxx.myshopify.com +``` + +### Features + +Every provider defines the features that it supports under `packages/{provider}/src/commerce.config.json` + +#### Features Available + +The following features can be enabled or disabled. This means that the UI will remove all code related to the feature. +For example: Turning `cart` off will disable Cart capabilities. + +- cart +- search +- wishlist +- customerAuth +- customCheckout + +#### How to turn Features on and off + +> NOTE: The selected provider should support the feature that you are toggling. (This means that you can't turn wishlist on if the provider doesn't support this functionality out the box) + +- Open `site/commerce.config.json` +- You'll see a config file like this: + ```json + { + "features": { + "wishlist": false, + "customCheckout": true + } + } + ``` +- Turn `wishlist` on by setting `wishlist` to `true`. +- Run the app and the wishlist functionality should be back on. + +### How to create a new provider + +Follow our docs for [Adding a new Commerce Provider](packages/commerce/new-provider.md). + +If you succeeded building a provider, submit a PR with a valid demo and we'll review it asap. + +## Contribute + +Our commitment to Open Source can be found [here](https://vercel.com/oss). + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device. +2. Create a new branch `git checkout -b MY_BRANCH_NAME` +3. Install the dependencies: `yarn` +4. Duplicate `site/.env.template` and rename it to `site/.env.local` +5. Add proper store values to `site/.env.local` +6. Run `cd site` and `yarn dev` to build and watch for code changes +7. Run `yarn turbo run build` to check the build after your changes + +## Work in progress + +We're using Github Projects to keep track of issues in progress and todo's. Here is our [Board](https://github.com/vercel/commerce/projects/1) + +People actively working on this project: @okbel, @lfades, @dominiksipowicz, @gbibeaul. + +## Troubleshoot + +
+I already own a BigCommerce store. What should I do? +
+First thing you do is: set your environment variables +
+
+.env.local + +```sh +BIGCOMMERCE_STOREFRONT_API_URL=<> +BIGCOMMERCE_STOREFRONT_API_TOKEN=<> +BIGCOMMERCE_STORE_API_URL=<> +BIGCOMMERCE_STORE_API_TOKEN=<> +BIGCOMMERCE_STORE_API_CLIENT_ID=<> +BIGCOMMERCE_CHANNEL_ID=<> +``` + +If your project was started with a "Deploy with Vercel" button, you can use Vercel's CLI to retrieve these credentials. + +1. Install Vercel CLI: `npm i -g vercel` +2. Link local instance with Vercel and Github accounts (creates .vercel file): `vercel link` +3. Download your environment variables: `vercel env pull .env.local` + +Next, you're free to customize the starter. More updates coming soon. Stay tuned.. + +
+ +
+BigCommerce shows a Coming Soon page and requests a Preview Code +
+After Email confirmation, Checkout should be manually enabled through BigCommerce platform. Look for "Review & test your store" section through BigCommerce's dashboard. +
+
+BigCommerce team has been notified and they plan to add more details about this subject. +
+ +
+When run locally I get `Error: Cannot find module '...@vercel/commerce/dist/config'` + +```bash +commerce/site +❯ yarn dev +yarn run v1.22.17 +$ next dev +ready - started server on 0.0.0.0:3000, url: http://localhost:3000 +info - Loaded env from /commerce/site/.env.local +error - Failed to load next.config.js, see more info here https://nextjs.org/docs/messages/next-config-error +Error: Cannot find module '/Users/dom/work/vercel/commerce/node_modules/@vercel/commerce/dist/config.cjs' + at createEsmNotFoundErr (node:internal/modules/cjs/loader:960:15) + at finalizeEsmResolution (node:internal/modules/cjs/loader:953:15) + at resolveExports (node:internal/modules/cjs/loader:482:14) + at Function.Module._findPath (node:internal/modules/cjs/loader:522:31) + at Function.Module._resolveFilename (node:internal/modules/cjs/loader:919:27) + at Function.mod._resolveFilename (/Users/dom/work/vercel/commerce/node_modules/next/dist/build/webpack/require-hook.js:179:28) + at Function.Module._load (node:internal/modules/cjs/loader:778:27) + at Module.require (node:internal/modules/cjs/loader:1005:19) + at require (node:internal/modules/cjs/helpers:102:18) + at Object. (/Users/dom/work/vercel/commerce/site/commerce-config.js:9:14) { + code: 'MODULE_NOT_FOUND', + path: '/Users/dom/work/vercel/commerce/node_modules/@vercel/commerce/package.json' +} +error Command failed with exit code 1. +info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command. +``` + +The error usually occurs when running yarn dev inside of the `/site/` folder after installing a fresh repository. + +In order to fix this, run `yarn dev` in the monorepo root folder first. + +> Using `yarn dev` from the root is recommended for developing, which will run watch mode on all packages. + +
diff --git a/license.md b/license.md new file mode 100644 index 0000000..fa5d39b --- /dev/null +++ b/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Vercel, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package.json b/package.json new file mode 100644 index 0000000..fc97f30 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "commerce", + "license": "MIT", + "private": true, + "workspaces": [ + "site", + "packages/*" + ], + "scripts": { + "build": "turbo run build --scope=next-commerce --include-dependencies --no-deps", + "dev": "turbo run dev", + "start": "turbo run start", + "types": "turbo run types", + "prettier-fix": "prettier --write ." + }, + "devDependencies": { + "husky": "^7.0.4", + "prettier": "^2.5.1", + "turbo": "^1.1.2" + }, + "husky": { + "hooks": { + "pre-commit": "turbo run lint" + } + }, + "packageManager": "yarn@1.22.17" +} diff --git a/packages/bigcommerce/.env.template b/packages/bigcommerce/.env.template new file mode 100644 index 0000000..b5d12f5 --- /dev/null +++ b/packages/bigcommerce/.env.template @@ -0,0 +1,8 @@ +COMMERCE_PROVIDER=@vercel/commerce-bigcommerce + +BIGCOMMERCE_STOREFRONT_API_URL= +BIGCOMMERCE_STOREFRONT_API_TOKEN= +BIGCOMMERCE_STORE_API_URL= +BIGCOMMERCE_STORE_API_TOKEN= +BIGCOMMERCE_STORE_API_CLIENT_ID= +BIGCOMMERCE_CHANNEL_ID= diff --git a/packages/bigcommerce/.prettierignore b/packages/bigcommerce/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/bigcommerce/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/bigcommerce/.prettierrc b/packages/bigcommerce/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/bigcommerce/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/bigcommerce/README.md b/packages/bigcommerce/README.md new file mode 100644 index 0000000..1e8c6cb --- /dev/null +++ b/packages/bigcommerce/README.md @@ -0,0 +1,59 @@ +# Bigcommerce Provider + +**Demo:** https://bigcommerce.demo.vercel.store/ + +With the deploy button below you'll be able to have a [BigCommerce](https://www.bigcommerce.com/) account and a store that works with this starter: + +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fcommerce&project-name=commerce&repo-name=commerce&demo-title=Next.js%20Commerce&demo-description=An%20all-in-one%20starter%20kit%20for%20high-performance%20e-commerce%20sites.&demo-url=https%3A%2F%2Fdemo.vercel.store&demo-image=https%3A%2F%2Fbigcommerce-demo-asset-ksvtgfvnd.vercel.app%2Fbigcommerce.png&integration-ids=oac_MuWZiE4jtmQ2ejZQaQ7ncuDT) + +If you already have a BigCommerce account and want to use your current store, then copy the `.env.template` file in this directory to `.env.local` in the main directory (which will be ignored by Git): + +```bash +cp packages/bigcommerce/.env.template .env.local +``` + +Then, set the environment variables in `.env.local` to match the ones from your store. + +## Contribute + +Our commitment to Open Source can be found [here](https://vercel.com/oss). + +If you find an issue with the provider or want a new feature, feel free to open a PR or [create a new issue](https://github.com/vercel/commerce/issues). + +## Troubleshoot + +
+I already own a BigCommerce store. What should I do? +
+First thing you do is: set your environment variables +
+
+.env.local + +```sh +BIGCOMMERCE_STOREFRONT_API_URL=<> +BIGCOMMERCE_STOREFRONT_API_TOKEN=<> +BIGCOMMERCE_STORE_API_URL=<> +BIGCOMMERCE_STORE_API_TOKEN=<> +BIGCOMMERCE_STORE_API_CLIENT_ID=<> +BIGCOMMERCE_CHANNEL_ID=<> +``` + +If your project was started with a "Deploy with Vercel" button, you can use Vercel's CLI to retrieve these credentials. + +1. Install Vercel CLI: `npm i -g vercel` +2. Link local instance with Vercel and Github accounts (creates .vercel file): `vercel link` +3. Download your environment variables: `vercel env pull .env.local` + +Next, you're free to customize the starter. More updates coming soon. Stay tuned. + +
+ +
+BigCommerce shows a Coming Soon page and requests a Preview Code +
+After Email confirmation, Checkout should be manually enabled through BigCommerce platform. Look for "Review & test your store" section through BigCommerce's dashboard. +
+
+BigCommerce team has been notified and they plan to add more detailed about this subject. +
diff --git a/packages/bigcommerce/codegen.json b/packages/bigcommerce/codegen.json new file mode 100644 index 0000000..7346508 --- /dev/null +++ b/packages/bigcommerce/codegen.json @@ -0,0 +1,27 @@ +{ + "schema": { + "https://buybutton.store/graphql": { + "headers": { + "Authorization": "Bearer xzy" + } + } + }, + "documents": [ + { + "./src/api/**/*.ts": { + "noRequire": true + } + } + ], + "generates": { + "./schema.d.ts": { + "plugins": ["typescript", "typescript-operations"] + }, + "./schema.graphql": { + "plugins": ["schema-ast"] + } + }, + "hooks": { + "afterAllFileWrite": ["prettier --write"] + } +} diff --git a/packages/bigcommerce/package.json b/packages/bigcommerce/package.json new file mode 100644 index 0000000..34b8ac6 --- /dev/null +++ b/packages/bigcommerce/package.json @@ -0,0 +1,86 @@ +{ + "name": "@vercel/commerce-bigcommerce", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "generate:definitions": "node scripts/generate-definitions.js" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/fetch": "^6.1.1", + "cookie": "^0.4.1", + "immutability-helper": "^3.1.1", + "jsonwebtoken": "^8.5.1", + "lodash.debounce": "^4.0.8", + "uuidv4": "^6.2.12" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/cookie": "^0.4.1", + "@types/jsonwebtoken": "^8.5.7", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/bigcommerce/schema.d.ts b/packages/bigcommerce/schema.d.ts new file mode 100644 index 0000000..04824e2 --- /dev/null +++ b/packages/bigcommerce/schema.d.ts @@ -0,0 +1,2064 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + DateTime: any + /** The `BigDecimal` scalar type represents signed fractional values with arbitrary precision. */ + BigDecimal: any + /** The `Long` scalar type represents non-fractional signed whole numeric values. Long can represent values between -(2^63) and 2^63 - 1. */ + Long: any +} + +/** Login result */ +export type LoginResult = { + __typename?: 'LoginResult' + /** The result of a login */ + result: Scalars['String'] +} + +/** Logout result */ +export type LogoutResult = { + __typename?: 'LogoutResult' + /** The result of a logout */ + result: Scalars['String'] +} + +export type Mutation = { + __typename?: 'Mutation' + login: LoginResult + logout: LogoutResult +} + +export type MutationLoginArgs = { + email: Scalars['String'] + password: Scalars['String'] +} + +/** Aggregated */ +export type Aggregated = { + __typename?: 'Aggregated' + /** Number of available products in stock. This can be 'null' if inventory is not set orif the store's Inventory Settings disable displaying stock levels on the storefront. */ + availableToSell: Scalars['Long'] + /** Indicates a threshold low-stock level. This can be 'null' if the inventory warning level is not set or if the store's Inventory Settings disable displaying stock levels on the storefront. */ + warningLevel: Scalars['Int'] +} + +/** Aggregated Product Inventory */ +export type AggregatedInventory = { + __typename?: 'AggregatedInventory' + /** Number of available products in stock. This can be 'null' if inventory is not set orif the store's Inventory Settings disable displaying stock levels on the storefront. */ + availableToSell: Scalars['Int'] + /** Indicates a threshold low-stock level. This can be 'null' if the inventory warning level is not set or if the store's Inventory Settings disable displaying stock levels on the storefront. */ + warningLevel: Scalars['Int'] +} + +/** Brand */ +export type Brand = Node & { + __typename?: 'Brand' + /** The ID of an object */ + id: Scalars['ID'] + /** Id of the brand. */ + entityId: Scalars['Int'] + /** Name of the brand. */ + name: Scalars['String'] + /** Default image for brand. */ + defaultImage?: Maybe + /** Page title for the brand. */ + pageTitle: Scalars['String'] + /** Meta description for the brand. */ + metaDesc: Scalars['String'] + /** Meta keywords for the brand. */ + metaKeywords: Array + /** Search keywords for the brand. */ + searchKeywords: Array + /** Path for the brand page. */ + path: Scalars['String'] + products: ProductConnection + /** Metafield data related to a brand. */ + metafields: MetafieldConnection +} + +/** Brand */ +export type BrandProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Brand */ +export type BrandMetafieldsArgs = { + namespace: Scalars['String'] + keys?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A connection to a list of items. */ +export type BrandConnection = { + __typename?: 'BrandConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type BrandEdge = { + __typename?: 'BrandEdge' + /** The item at the end of the edge. */ + node: Brand + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Breadcrumb */ +export type Breadcrumb = { + __typename?: 'Breadcrumb' + /** Category id. */ + entityId: Scalars['Int'] + /** Name of the category. */ + name: Scalars['String'] +} + +/** A connection to a list of items. */ +export type BreadcrumbConnection = { + __typename?: 'BreadcrumbConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type BreadcrumbEdge = { + __typename?: 'BreadcrumbEdge' + /** The item at the end of the edge. */ + node: Breadcrumb + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Bulk pricing tier that sets a fixed price for the product or variant. */ +export type BulkPricingFixedPriceDiscount = BulkPricingTier & { + __typename?: 'BulkPricingFixedPriceDiscount' + /** This price will override the current product price. */ + price: Scalars['BigDecimal'] + /** Minimum item quantity that applies to this bulk pricing tier. */ + minimumQuantity: Scalars['Int'] + /** Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. */ + maximumQuantity?: Maybe +} + +/** Bulk pricing tier that reduces the price of the product or variant by a percentage. */ +export type BulkPricingPercentageDiscount = BulkPricingTier & { + __typename?: 'BulkPricingPercentageDiscount' + /** The percentage that will be removed from the product price. */ + percentOff: Scalars['BigDecimal'] + /** Minimum item quantity that applies to this bulk pricing tier. */ + minimumQuantity: Scalars['Int'] + /** Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. */ + maximumQuantity?: Maybe +} + +/** Bulk pricing tier that will subtract an amount from the price of the product or variant. */ +export type BulkPricingRelativePriceDiscount = BulkPricingTier & { + __typename?: 'BulkPricingRelativePriceDiscount' + /** The price of the product/variant will be reduced by this priceAdjustment. */ + priceAdjustment: Scalars['BigDecimal'] + /** Minimum item quantity that applies to this bulk pricing tier. */ + minimumQuantity: Scalars['Int'] + /** Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. */ + maximumQuantity?: Maybe +} + +/** A set of bulk pricing tiers that define price discounts which apply when purchasing specified quantities of a product or variant. */ +export type BulkPricingTier = { + /** Minimum item quantity that applies to this bulk pricing tier. */ + minimumQuantity: Scalars['Int'] + /** Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. */ + maximumQuantity?: Maybe +} + +/** Product Option */ +export type CatalogProductOption = { + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** Product Option Value */ +export type CatalogProductOptionValue = { + /** Unique ID for the option value. */ + entityId: Scalars['Int'] + /** Label for the option value. */ + label: Scalars['String'] + /** Indicates whether this value is the chosen default selected value. */ + isDefault: Scalars['Boolean'] +} + +/** Category */ +export type Category = Node & { + __typename?: 'Category' + /** The ID of an object */ + id: Scalars['ID'] + /** Unique ID for the category. */ + entityId: Scalars['Int'] + /** Category name. */ + name: Scalars['String'] + /** Category path. */ + path: Scalars['String'] + /** Default image for the category. */ + defaultImage?: Maybe + /** Category description. */ + description: Scalars['String'] + /** Category breadcrumbs. */ + breadcrumbs: BreadcrumbConnection + products: ProductConnection + /** Metafield data related to a category. */ + metafields: MetafieldConnection +} + +/** Category */ +export type CategoryBreadcrumbsArgs = { + depth: Scalars['Int'] + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Category */ +export type CategoryProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Category */ +export type CategoryMetafieldsArgs = { + namespace: Scalars['String'] + keys?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A connection to a list of items. */ +export type CategoryConnection = { + __typename?: 'CategoryConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type CategoryEdge = { + __typename?: 'CategoryEdge' + /** The item at the end of the edge. */ + node: Category + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** An item in a tree of categories. */ +export type CategoryTreeItem = { + __typename?: 'CategoryTreeItem' + /** The id category. */ + entityId: Scalars['Int'] + /** The name of category. */ + name: Scalars['String'] + /** Path assigned to this category */ + path: Scalars['String'] + /** The description of this category. */ + description: Scalars['String'] + /** The number of products in this category. */ + productCount: Scalars['Int'] + /** Subcategories of this category */ + children: Array +} + +/** A simple yes/no question represented by a checkbox. */ +export type CheckboxOption = CatalogProductOption & { + __typename?: 'CheckboxOption' + /** Indicates the default checked status. */ + checkedByDefault: Scalars['Boolean'] + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** Contact field */ +export type ContactField = { + __typename?: 'ContactField' + /** Store address line. */ + address: Scalars['String'] + /** Store country. */ + country: Scalars['String'] + /** Store address type. */ + addressType: Scalars['String'] + /** Store email. */ + email: Scalars['String'] + /** Store phone number. */ + phone: Scalars['String'] +} + +/** Custom field */ +export type CustomField = { + __typename?: 'CustomField' + /** Custom field id. */ + entityId: Scalars['Int'] + /** Name of the custom field. */ + name: Scalars['String'] + /** Value of the custom field. */ + value: Scalars['String'] +} + +/** A connection to a list of items. */ +export type CustomFieldConnection = { + __typename?: 'CustomFieldConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type CustomFieldEdge = { + __typename?: 'CustomFieldEdge' + /** The item at the end of the edge. */ + node: CustomField + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** A customer that shops on a store */ +export type Customer = { + __typename?: 'Customer' + /** The ID of the customer. */ + entityId: Scalars['Int'] + /** The company name of the customer. */ + company: Scalars['String'] + /** The customer group id of the customer. */ + customerGroupId: Scalars['Int'] + /** The email address of the customer. */ + email: Scalars['String'] + /** The first name of the customer. */ + firstName: Scalars['String'] + /** The last name of the customer. */ + lastName: Scalars['String'] + /** The notes of the customer. */ + notes: Scalars['String'] + /** The phone number of the customer. */ + phone: Scalars['String'] + /** The tax exempt category of the customer. */ + taxExemptCategory: Scalars['String'] + /** Customer addresses count. */ + addressCount: Scalars['Int'] + /** Customer attributes count. */ + attributeCount: Scalars['Int'] + /** Customer store credit. */ + storeCredit: Array + /** Customer attributes. */ + attributes: CustomerAttributes +} + +/** A custom, store-specific attribute for a customer */ +export type CustomerAttribute = { + __typename?: 'CustomerAttribute' + /** The ID of the custom customer attribute */ + entityId: Scalars['Int'] + /** The value of the custom customer attribute */ + value?: Maybe + /** The name of the custom customer attribute */ + name: Scalars['String'] +} + +/** Custom, store-specific customer attributes */ +export type CustomerAttributes = { + __typename?: 'CustomerAttributes' + attribute: CustomerAttribute +} + +/** Custom, store-specific customer attributes */ +export type CustomerAttributesAttributeArgs = { + entityId: Scalars['Int'] +} + +/** A calendar for allowing selection of a date. */ +export type DateFieldOption = CatalogProductOption & { + __typename?: 'DateFieldOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** Date Time Extended */ +export type DateTimeExtended = { + __typename?: 'DateTimeExtended' + /** ISO-8601 formatted date in UTC */ + utc: Scalars['DateTime'] +} + +/** Display field */ +export type DisplayField = { + __typename?: 'DisplayField' + /** Short date format. */ + shortDateFormat: Scalars['String'] + /** Extended date format. */ + extendedDateFormat: Scalars['String'] +} + +/** A form allowing selection and uploading of a file from the user's local computer. */ +export type FileUploadFieldOption = CatalogProductOption & { + __typename?: 'FileUploadFieldOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** Image */ +export type Image = { + __typename?: 'Image' + /** Absolute path to image using store CDN. */ + url: Scalars['String'] + /** Absolute path to original image using store CDN. */ + urlOriginal: Scalars['String'] + /** Text description of an image that can be used for SEO and/or accessibility purposes. */ + altText: Scalars['String'] + /** Indicates whether this is the primary image. */ + isDefault: Scalars['Boolean'] +} + +/** Image */ +export type ImageUrlArgs = { + width: Scalars['Int'] + height?: Maybe +} + +/** A connection to a list of items. */ +export type ImageConnection = { + __typename?: 'ImageConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type ImageEdge = { + __typename?: 'ImageEdge' + /** The item at the end of the edge. */ + node: Image + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** An inventory */ +export type Inventory = { + __typename?: 'Inventory' + /** Locations */ + locations: LocationConnection +} + +/** An inventory */ +export type InventoryLocationsArgs = { + entityIds?: Maybe> + codes?: Maybe> + typeIds?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Inventory By Locations */ +export type InventoryByLocations = { + __typename?: 'InventoryByLocations' + /** Location id. */ + locationEntityId: Scalars['Long'] + /** Number of available products in stock. */ + availableToSell: Scalars['Long'] + /** Indicates a threshold low-stock level. */ + warningLevel: Scalars['Int'] + /** Indicates whether this product is in stock. */ + isInStock: Scalars['Boolean'] +} + +/** A connection to a list of items. */ +export type LocationConnection = { + __typename?: 'LocationConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type LocationEdge = { + __typename?: 'LocationEdge' + /** The item at the end of the edge. */ + node: InventoryByLocations + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Logo field */ +export type LogoField = { + __typename?: 'LogoField' + /** Logo title. */ + title: Scalars['String'] + /** Store logo image. */ + image: Image +} + +/** Measurement */ +export type Measurement = { + __typename?: 'Measurement' + /** Unformatted weight measurement value. */ + value: Scalars['Float'] + /** Unit of measurement. */ + unit: Scalars['String'] +} + +/** A connection to a list of items. */ +export type MetafieldConnection = { + __typename?: 'MetafieldConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type MetafieldEdge = { + __typename?: 'MetafieldEdge' + /** The item at the end of the edge. */ + node: Metafields + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Key/Value pairs of data attached tied to a resource entity (product, brand, category, etc.) */ +export type Metafields = { + __typename?: 'Metafields' + /** The ID of an object */ + id: Scalars['ID'] + /** The ID of the metafield when referencing via our backend API. */ + entityId: Scalars['Int'] + /** A label for identifying a metafield data value. */ + key: Scalars['String'] + /** A metafield value. */ + value: Scalars['String'] +} + +/** A money object - includes currency code and a money amount */ +export type Money = { + __typename?: 'Money' + /** Currency code of the current money. */ + currencyCode: Scalars['String'] + /** The amount of money. */ + value: Scalars['BigDecimal'] +} + +/** A min and max pair of money objects */ +export type MoneyRange = { + __typename?: 'MoneyRange' + /** Minimum money object. */ + min: Money + /** Maximum money object. */ + max: Money +} + +/** A multi-line text input field, aka a text box. */ +export type MultiLineTextFieldOption = CatalogProductOption & { + __typename?: 'MultiLineTextFieldOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** An option type that has a fixed list of values. */ +export type MultipleChoiceOption = CatalogProductOption & { + __typename?: 'MultipleChoiceOption' + /** The chosen display style for this multiple choice option. */ + displayStyle: Scalars['String'] + /** List of option values. */ + values: ProductOptionValueConnection + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** An option type that has a fixed list of values. */ +export type MultipleChoiceOptionValuesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A simple multiple choice value comprised of an id and a label. */ +export type MultipleChoiceOptionValue = CatalogProductOptionValue & { + __typename?: 'MultipleChoiceOptionValue' + /** Unique ID for the option value. */ + entityId: Scalars['Int'] + /** Label for the option value. */ + label: Scalars['String'] + /** Indicates whether this value is the chosen default selected value. */ + isDefault: Scalars['Boolean'] +} + +/** An object with an ID */ +export type Node = { + /** The id of the object. */ + id: Scalars['ID'] +} + +/** A single line text input field that only accepts numbers. */ +export type NumberFieldOption = CatalogProductOption & { + __typename?: 'NumberFieldOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** A connection to a list of items. */ +export type OptionConnection = { + __typename?: 'OptionConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type OptionEdge = { + __typename?: 'OptionEdge' + /** The item at the end of the edge. */ + node: ProductOption + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** A connection to a list of items. */ +export type OptionValueConnection = { + __typename?: 'OptionValueConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type OptionValueEdge = { + __typename?: 'OptionValueEdge' + /** The item at the end of the edge. */ + node: ProductOptionValue + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type OptionValueId = { + optionEntityId: Scalars['Int'] + valueEntityId: Scalars['Int'] +} + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: 'PageInfo' + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars['Boolean'] + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars['Boolean'] + /** When paginating backwards, the cursor to continue. */ + startCursor?: Maybe + /** When paginating forwards, the cursor to continue. */ + endCursor?: Maybe +} + +/** The min and max range of prices that apply to this product. */ +export type PriceRanges = { + __typename?: 'PriceRanges' + /** Product price min/max range. */ + priceRange: MoneyRange + /** Product retail price min/max range. */ + retailPriceRange?: Maybe +} + +/** The various prices that can be set on a product. */ +export type Prices = { + __typename?: 'Prices' + /** Calculated price of the product. */ + price: Money + /** Sale price of the product. */ + salePrice?: Maybe + /** Original price of the product. */ + basePrice?: Maybe + /** Retail price of the product. */ + retailPrice?: Maybe + /** Minimum advertised price of the product. */ + mapPrice?: Maybe + /** Product price min/max range. */ + priceRange: MoneyRange + /** Product retail price min/max range. */ + retailPriceRange?: Maybe + /** The difference between the retail price (MSRP) and the current price, which can be presented to the shopper as their savings. */ + saved?: Maybe + /** List of bulk pricing tiers applicable to a product or variant. */ + bulkPricing: Array +} + +/** Product */ +export type Product = Node & { + __typename?: 'Product' + /** The ID of an object */ + id: Scalars['ID'] + /** Id of the product. */ + entityId: Scalars['Int'] + /** Default product variant when no options are selected. */ + sku: Scalars['String'] + /** Relative URL path to product page. */ + path: Scalars['String'] + /** Name of the product. */ + name: Scalars['String'] + /** Description of the product. */ + description: Scalars['String'] + /** Description of the product in plain text. */ + plainTextDescription: Scalars['String'] + /** Warranty information of the product. */ + warranty: Scalars['String'] + /** Minimum purchasable quantity for this product in a single order. */ + minPurchaseQuantity?: Maybe + /** Maximum purchasable quantity for this product in a single order. */ + maxPurchaseQuantity?: Maybe + /** Absolute URL path for adding a product to cart. */ + addToCartUrl: Scalars['String'] + /** Absolute URL path for adding a product to customer's wishlist. */ + addToWishlistUrl: Scalars['String'] + /** Prices object determined by supplied product ID, variant ID, and selected option IDs. */ + prices?: Maybe + /** + * The minimum and maximum price of this product based on variant pricing and/or modifier price rules. + * @deprecated Use priceRanges inside prices node instead. + */ + priceRanges?: Maybe + /** Weight of the product. */ + weight?: Maybe + /** Height of the product. */ + height?: Maybe + /** Width of the product. */ + width?: Maybe + /** Depth of the product. */ + depth?: Maybe + /** Product options. */ + options: OptionConnection + /** Product options. */ + productOptions: ProductOptionConnection + /** Summary of the product reviews, includes the total number of reviews submitted and summation of the ratings on the reviews (ratings range from 0-5 per review). */ + reviewSummary: Reviews + /** Type of product, ex: physical, digital */ + type: Scalars['String'] + /** + * The availability state of the product. + * @deprecated Use status inside availabilityV2 instead. + */ + availability: Scalars['String'] + /** + * A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + * @deprecated Use description inside availabilityV2 instead. + */ + availabilityDescription: Scalars['String'] + /** The availability state of the product. */ + availabilityV2: ProductAvailability + /** List of categories associated with the product. */ + categories: CategoryConnection + /** Brand associated with the product. */ + brand?: Maybe + /** Variants associated with the product. */ + variants: VariantConnection + /** Custom fields of the product. */ + customFields: CustomFieldConnection + /** A list of the images for a product. */ + images: ImageConnection + /** Default image for a product. */ + defaultImage?: Maybe + /** Related products for this product. */ + relatedProducts: RelatedProductsConnection + /** Inventory information of the product. */ + inventory: ProductInventory + /** Metafield data related to a product. */ + metafields: MetafieldConnection + /** + * Product creation date + * @deprecated Alpha version. Do not use in production. + */ + createdAt: DateTimeExtended +} + +/** Product */ +export type ProductPlainTextDescriptionArgs = { + characterLimit?: Maybe +} + +/** Product */ +export type ProductPricesArgs = { + includeTax?: Maybe + currencyCode?: Maybe +} + +/** Product */ +export type ProductPriceRangesArgs = { + includeTax?: Maybe +} + +/** Product */ +export type ProductOptionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductProductOptionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductCategoriesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductVariantsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe + entityIds?: Maybe> + optionValueIds?: Maybe> +} + +/** Product */ +export type ProductCustomFieldsArgs = { + names?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductImagesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductRelatedProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product */ +export type ProductMetafieldsArgs = { + namespace: Scalars['String'] + keys?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Product availability */ +export type ProductAvailability = { + /** The availability state of the product. */ + status: ProductAvailabilityStatus + /** A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. */ + description: Scalars['String'] +} + +/** Product availability status */ +export enum ProductAvailabilityStatus { + Available = 'Available', + Preorder = 'Preorder', + Unavailable = 'Unavailable', +} + +/** Available Product */ +export type ProductAvailable = ProductAvailability & { + __typename?: 'ProductAvailable' + /** The availability state of the product. */ + status: ProductAvailabilityStatus + /** A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. */ + description: Scalars['String'] +} + +/** A connection to a list of items. */ +export type ProductConnection = { + __typename?: 'ProductConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type ProductEdge = { + __typename?: 'ProductEdge' + /** The item at the end of the edge. */ + node: Product + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Product Inventory Information */ +export type ProductInventory = { + __typename?: 'ProductInventory' + /** Indicates whether this product is in stock. */ + isInStock: Scalars['Boolean'] + /** Indicates whether this product's inventory is being tracked on variant level. If true, you may wish to check the variants node to understand the true inventory of each individual variant, rather than relying on this product-level aggregate to understand how many items may be added to cart. */ + hasVariantInventory: Scalars['Boolean'] + /** Aggregated product inventory information. This data may not be available if not set or if the store's Inventory Settings have disabled displaying stock levels on the storefront. */ + aggregated?: Maybe +} + +/** Product Option */ +export type ProductOption = { + __typename?: 'ProductOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] + /** Option values. */ + values: OptionValueConnection +} + +/** Product Option */ +export type ProductOptionValuesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A connection to a list of items. */ +export type ProductOptionConnection = { + __typename?: 'ProductOptionConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type ProductOptionEdge = { + __typename?: 'ProductOptionEdge' + /** The item at the end of the edge. */ + node: CatalogProductOption + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Product Option Value */ +export type ProductOptionValue = { + __typename?: 'ProductOptionValue' + /** Unique ID for the option value. */ + entityId: Scalars['Int'] + /** Label for the option value. */ + label: Scalars['String'] +} + +/** A connection to a list of items. */ +export type ProductOptionValueConnection = { + __typename?: 'ProductOptionValueConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type ProductOptionValueEdge = { + __typename?: 'ProductOptionValueEdge' + /** The item at the end of the edge. */ + node: CatalogProductOptionValue + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** A Product PickList Value - a product to be mapped to the base product if selected. */ +export type ProductPickListOptionValue = CatalogProductOptionValue & { + __typename?: 'ProductPickListOptionValue' + /** The ID of the product associated with this option value. */ + productId: Scalars['Int'] + /** Unique ID for the option value. */ + entityId: Scalars['Int'] + /** Label for the option value. */ + label: Scalars['String'] + /** Indicates whether this value is the chosen default selected value. */ + isDefault: Scalars['Boolean'] +} + +/** PreOrder Product */ +export type ProductPreOrder = ProductAvailability & { + __typename?: 'ProductPreOrder' + /** The message to be shown in the store when a product is put into the pre-order availability state, e.g. "Expected release date is %%DATE%%" */ + message?: Maybe + /** Product release date */ + willBeReleasedAt?: Maybe + /** The availability state of the product. */ + status: ProductAvailabilityStatus + /** A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. */ + description: Scalars['String'] +} + +/** Unavailable Product */ +export type ProductUnavailable = ProductAvailability & { + __typename?: 'ProductUnavailable' + /** The message to be shown in the store when "Call for pricing" is enabled for this product, e.g. "Contact us at 555-5555" */ + message?: Maybe + /** The availability state of the product. */ + status: ProductAvailabilityStatus + /** A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. */ + description: Scalars['String'] +} + +export type Query = { + __typename?: 'Query' + site: Site + /** The currently logged in customer. */ + customer?: Maybe + /** Fetches an object given its ID */ + node?: Maybe + /** @deprecated Alpha version. Do not use in production. */ + inventory: Inventory +} + +export type QueryNodeArgs = { + id: Scalars['ID'] +} + +/** A connection to a list of items. */ +export type RelatedProductsConnection = { + __typename?: 'RelatedProductsConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type RelatedProductsEdge = { + __typename?: 'RelatedProductsEdge' + /** The item at the end of the edge. */ + node: Product + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Review Rating Summary */ +export type Reviews = { + __typename?: 'Reviews' + /** Total number of reviews on product. */ + numberOfReviews: Scalars['Int'] + /** Summation of rating scores from each review. */ + summationOfRatings: Scalars['Int'] +} + +/** route */ +export type Route = { + __typename?: 'Route' + /** node */ + node?: Maybe +} + +/** Store settings information from the control panel. */ +export type Settings = { + __typename?: 'Settings' + /** The name of the store. */ + storeName: Scalars['String'] + /** The hash of the store. */ + storeHash: Scalars['String'] + /** The current store status. */ + status: StorefrontStatusType + /** Logo information for the store. */ + logo: LogoField + /** Contact information for the store. */ + contact?: Maybe + /** Store urls. */ + url: UrlField + /** Store display format information. */ + display: DisplayField + /** Channel ID. */ + channelId: Scalars['Long'] +} + +/** A site */ +export type Site = { + __typename?: 'Site' + categoryTree: Array + /** Details of the brand. */ + brands: BrandConnection + /** Details of the products. */ + products: ProductConnection + /** Details of the newest products. */ + newestProducts: ProductConnection + /** Details of the best selling products. */ + bestSellingProducts: ProductConnection + /** Details of the featured products. */ + featuredProducts: ProductConnection + /** A single product object with variant pricing overlay capabilities. */ + product?: Maybe + /** Route for a node */ + route: Route + /** Store settings. */ + settings?: Maybe +} + +/** A site */ +export type SiteBrandsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe + productEntityIds?: Maybe> +} + +/** A site */ +export type SiteProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe + ids?: Maybe> + entityIds?: Maybe> +} + +/** A site */ +export type SiteNewestProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A site */ +export type SiteBestSellingProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A site */ +export type SiteFeaturedProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A site */ +export type SiteProductArgs = { + id?: Maybe + entityId?: Maybe + variantEntityId?: Maybe + optionValueIds?: Maybe> + sku?: Maybe +} + +/** A site */ +export type SiteRouteArgs = { + path: Scalars['String'] +} + +/** Storefront Mode */ +export enum StorefrontStatusType { + Launched = 'LAUNCHED', + Maintenance = 'MAINTENANCE', + PreLaunch = 'PRE_LAUNCH', + Hibernation = 'HIBERNATION', +} + +/** A swatch option value - swatch values can be associated with a list of hexidecimal colors or an image. */ +export type SwatchOptionValue = CatalogProductOptionValue & { + __typename?: 'SwatchOptionValue' + /** List of up to 3 hex encoded colors to associate with a swatch value. */ + hexColors: Array + /** Absolute path of a swatch texture image. */ + imageUrl?: Maybe + /** Unique ID for the option value. */ + entityId: Scalars['Int'] + /** Label for the option value. */ + label: Scalars['String'] + /** Indicates whether this value is the chosen default selected value. */ + isDefault: Scalars['Boolean'] +} + +/** A swatch option value - swatch values can be associated with a list of hexidecimal colors or an image. */ +export type SwatchOptionValueImageUrlArgs = { + width: Scalars['Int'] + height?: Maybe +} + +/** A single line text input field. */ +export type TextFieldOption = CatalogProductOption & { + __typename?: 'TextFieldOption' + /** Unique ID for the option. */ + entityId: Scalars['Int'] + /** Display name for the option. */ + displayName: Scalars['String'] + /** One of the option values is required to be selected for the checkout. */ + isRequired: Scalars['Boolean'] +} + +/** Url field */ +export type UrlField = { + __typename?: 'UrlField' + /** Store url. */ + vanityUrl: Scalars['String'] + /** CDN url to fetch assets. */ + cdnUrl: Scalars['String'] +} + +/** Variant */ +export type Variant = Node & { + __typename?: 'Variant' + /** The ID of an object */ + id: Scalars['ID'] + /** Id of the variant. */ + entityId: Scalars['Int'] + /** Sku of the variant. */ + sku: Scalars['String'] + /** The variant's weight. If a weight was not explicitly specified on the variant, this will be the product's weight. */ + weight?: Maybe + /** The variant's height. If a height was not explicitly specified on the variant, this will be the product's height. */ + height?: Maybe + /** The variant's width. If a width was not explicitly specified on the variant, this will be the product's width. */ + width?: Maybe + /** The variant's depth. If a depth was not explicitly specified on the variant, this will be the product's depth. */ + depth?: Maybe + /** The options which define a variant. */ + options: OptionConnection + /** Product options that compose this variant. */ + productOptions: ProductOptionConnection + /** Default image for a variant. */ + defaultImage?: Maybe + /** Variant prices */ + prices?: Maybe + /** Variant inventory */ + inventory?: Maybe + /** Metafield data related to a variant. */ + metafields: MetafieldConnection +} + +/** Variant */ +export type VariantOptionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Variant */ +export type VariantProductOptionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Variant */ +export type VariantPricesArgs = { + includeTax?: Maybe + currencyCode?: Maybe +} + +/** Variant */ +export type VariantMetafieldsArgs = { + namespace: Scalars['String'] + keys?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** A connection to a list of items. */ +export type VariantConnection = { + __typename?: 'VariantConnection' + /** Information to aid in pagination. */ + pageInfo: PageInfo + /** A list of edges. */ + edges?: Maybe>> +} + +/** An edge in a connection. */ +export type VariantEdge = { + __typename?: 'VariantEdge' + /** The item at the end of the edge. */ + node: Variant + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Variant Inventory */ +export type VariantInventory = { + __typename?: 'VariantInventory' + /** Aggregated product variant inventory information. This data may not be available if not set or if the store's Inventory Settings have disabled displaying stock levels on the storefront. */ + aggregated?: Maybe + /** Indicates whether this product is in stock. */ + isInStock: Scalars['Boolean'] + /** Inventory by locations. */ + byLocation?: Maybe +} + +/** Variant Inventory */ +export type VariantInventoryByLocationArgs = { + locationEntityIds?: Maybe> + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Please select a currency */ +export enum CurrencyCode { + Adp = 'ADP', + Aed = 'AED', + Afa = 'AFA', + Afn = 'AFN', + Alk = 'ALK', + All = 'ALL', + Amd = 'AMD', + Ang = 'ANG', + Aoa = 'AOA', + Aok = 'AOK', + Aon = 'AON', + Aor = 'AOR', + Ara = 'ARA', + Arl = 'ARL', + Arm = 'ARM', + Arp = 'ARP', + Ars = 'ARS', + Ats = 'ATS', + Aud = 'AUD', + Awg = 'AWG', + Azm = 'AZM', + Azn = 'AZN', + Bad = 'BAD', + Bam = 'BAM', + Ban = 'BAN', + Bbd = 'BBD', + Bdt = 'BDT', + Bec = 'BEC', + Bef = 'BEF', + Bel = 'BEL', + Bgl = 'BGL', + Bgm = 'BGM', + Bgn = 'BGN', + Bgo = 'BGO', + Bhd = 'BHD', + Bif = 'BIF', + Bmd = 'BMD', + Bnd = 'BND', + Bob = 'BOB', + Bol = 'BOL', + Bop = 'BOP', + Bov = 'BOV', + Brb = 'BRB', + Brc = 'BRC', + Bre = 'BRE', + Brl = 'BRL', + Brn = 'BRN', + Brr = 'BRR', + Brz = 'BRZ', + Bsd = 'BSD', + Btn = 'BTN', + Buk = 'BUK', + Bwp = 'BWP', + Byb = 'BYB', + Byr = 'BYR', + Bzd = 'BZD', + Cad = 'CAD', + Cdf = 'CDF', + Che = 'CHE', + Chf = 'CHF', + Chw = 'CHW', + Cle = 'CLE', + Clf = 'CLF', + Clp = 'CLP', + Cnx = 'CNX', + Cny = 'CNY', + Cop = 'COP', + Cou = 'COU', + Crc = 'CRC', + Csd = 'CSD', + Csk = 'CSK', + Cve = 'CVE', + Cyp = 'CYP', + Czk = 'CZK', + Ddm = 'DDM', + Dem = 'DEM', + Djf = 'DJF', + Dkk = 'DKK', + Dop = 'DOP', + Dzd = 'DZD', + Ecs = 'ECS', + Ecv = 'ECV', + Eek = 'EEK', + Egp = 'EGP', + Ern = 'ERN', + Esa = 'ESA', + Esb = 'ESB', + Esp = 'ESP', + Etb = 'ETB', + Eur = 'EUR', + Fim = 'FIM', + Fjd = 'FJD', + Fkp = 'FKP', + Frf = 'FRF', + Gbp = 'GBP', + Gek = 'GEK', + Gel = 'GEL', + Ghc = 'GHC', + Ghs = 'GHS', + Gip = 'GIP', + Gmd = 'GMD', + Gnf = 'GNF', + Gns = 'GNS', + Gqe = 'GQE', + Grd = 'GRD', + Gtq = 'GTQ', + Gwe = 'GWE', + Gwp = 'GWP', + Gyd = 'GYD', + Hkd = 'HKD', + Hnl = 'HNL', + Hrd = 'HRD', + Hrk = 'HRK', + Htg = 'HTG', + Huf = 'HUF', + Idr = 'IDR', + Iep = 'IEP', + Ilp = 'ILP', + Ilr = 'ILR', + Ils = 'ILS', + Inr = 'INR', + Iqd = 'IQD', + Isj = 'ISJ', + Isk = 'ISK', + Itl = 'ITL', + Jmd = 'JMD', + Jod = 'JOD', + Jpy = 'JPY', + Kes = 'KES', + Kgs = 'KGS', + Khr = 'KHR', + Kmf = 'KMF', + Krh = 'KRH', + Kro = 'KRO', + Krw = 'KRW', + Kwd = 'KWD', + Kyd = 'KYD', + Kzt = 'KZT', + Lak = 'LAK', + Lbp = 'LBP', + Lkr = 'LKR', + Lrd = 'LRD', + Lsl = 'LSL', + Ltl = 'LTL', + Ltt = 'LTT', + Luc = 'LUC', + Luf = 'LUF', + Lul = 'LUL', + Lvl = 'LVL', + Lvr = 'LVR', + Lyd = 'LYD', + Mad = 'MAD', + Maf = 'MAF', + Mcf = 'MCF', + Mdc = 'MDC', + Mdl = 'MDL', + Mga = 'MGA', + Mgf = 'MGF', + Mkd = 'MKD', + Mkn = 'MKN', + Mlf = 'MLF', + Mmk = 'MMK', + Mnt = 'MNT', + Mop = 'MOP', + Mro = 'MRO', + Mtl = 'MTL', + Mtp = 'MTP', + Mur = 'MUR', + Mvp = 'MVP', + Mvr = 'MVR', + Mwk = 'MWK', + Mxn = 'MXN', + Mxp = 'MXP', + Mxv = 'MXV', + Myr = 'MYR', + Mze = 'MZE', + Mzm = 'MZM', + Mzn = 'MZN', + Nad = 'NAD', + Ngn = 'NGN', + Nic = 'NIC', + Nio = 'NIO', + Nlg = 'NLG', + Nok = 'NOK', + Npr = 'NPR', + Nzd = 'NZD', + Omr = 'OMR', + Pab = 'PAB', + Pei = 'PEI', + Pen = 'PEN', + Pes = 'PES', + Pgk = 'PGK', + Php = 'PHP', + Pkr = 'PKR', + Pln = 'PLN', + Plz = 'PLZ', + Pte = 'PTE', + Pyg = 'PYG', + Qar = 'QAR', + Rhd = 'RHD', + Rol = 'ROL', + Ron = 'RON', + Rsd = 'RSD', + Rub = 'RUB', + Rur = 'RUR', + Rwf = 'RWF', + Sar = 'SAR', + Sbd = 'SBD', + Scr = 'SCR', + Sdd = 'SDD', + Sdg = 'SDG', + Sdp = 'SDP', + Sek = 'SEK', + Sgd = 'SGD', + Shp = 'SHP', + Sit = 'SIT', + Skk = 'SKK', + Sll = 'SLL', + Sos = 'SOS', + Srd = 'SRD', + Srg = 'SRG', + Ssp = 'SSP', + Std = 'STD', + Sur = 'SUR', + Svc = 'SVC', + Syp = 'SYP', + Szl = 'SZL', + Thb = 'THB', + Tjr = 'TJR', + Tjs = 'TJS', + Tmm = 'TMM', + Tmt = 'TMT', + Tnd = 'TND', + Top = 'TOP', + Tpe = 'TPE', + Trl = 'TRL', + Try = 'TRY', + Ttd = 'TTD', + Twd = 'TWD', + Tzs = 'TZS', + Uah = 'UAH', + Uak = 'UAK', + Ugs = 'UGS', + Ugx = 'UGX', + Usd = 'USD', + Usn = 'USN', + Uss = 'USS', + Uyi = 'UYI', + Uyp = 'UYP', + Uyu = 'UYU', + Uzs = 'UZS', + Veb = 'VEB', + Vef = 'VEF', + Vnd = 'VND', + Vnn = 'VNN', + Vuv = 'VUV', + Wst = 'WST', + Xaf = 'XAF', + Xcd = 'XCD', + Xeu = 'XEU', + Xfo = 'XFO', + Xfu = 'XFU', + Xof = 'XOF', + Xpf = 'XPF', + Xre = 'XRE', + Ydd = 'YDD', + Yer = 'YER', + Yud = 'YUD', + Yum = 'YUM', + Yun = 'YUN', + Yur = 'YUR', + Zal = 'ZAL', + Zar = 'ZAR', + Zmk = 'ZMK', + Zmw = 'ZMW', + Zrn = 'ZRN', + Zrz = 'ZRZ', + Zwd = 'ZWD', + Zwl = 'ZWL', + Zwr = 'ZWR', +} + +export type GetLoggedInCustomerQueryVariables = Exact<{ [key: string]: never }> + +export type GetLoggedInCustomerQuery = { __typename?: 'Query' } & { + customer?: Maybe< + { __typename?: 'Customer' } & Pick< + Customer, + | 'entityId' + | 'firstName' + | 'lastName' + | 'email' + | 'company' + | 'customerGroupId' + | 'notes' + | 'phone' + | 'addressCount' + | 'attributeCount' + > & { + storeCredit: Array< + { __typename?: 'Money' } & Pick + > + } + > +} + +export type CategoryTreeItemFragment = { + __typename?: 'CategoryTreeItem' +} & Pick< + CategoryTreeItem, + 'entityId' | 'name' | 'path' | 'description' | 'productCount' +> + +export type ProductPricesFragment = { __typename?: 'Prices' } & { + price: { __typename?: 'Money' } & Pick + salePrice?: Maybe< + { __typename?: 'Money' } & Pick + > + retailPrice?: Maybe< + { __typename?: 'Money' } & Pick + > +} + +export type SwatchOptionFragment = { __typename?: 'SwatchOptionValue' } & Pick< + SwatchOptionValue, + 'isDefault' | 'hexColors' +> + +export type MultipleChoiceOptionFragment = { + __typename?: 'MultipleChoiceOption' +} & { + values: { __typename?: 'ProductOptionValueConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ProductOptionValueEdge' } & { + node: + | ({ __typename?: 'MultipleChoiceOptionValue' } & Pick< + MultipleChoiceOptionValue, + 'label' + >) + | ({ __typename?: 'ProductPickListOptionValue' } & Pick< + ProductPickListOptionValue, + 'label' + >) + | ({ __typename?: 'SwatchOptionValue' } & Pick< + SwatchOptionValue, + 'label' + > & + SwatchOptionFragment) + } + > + > + > + } +} + +export type ProductInfoFragment = { __typename?: 'Product' } & Pick< + Product, + 'entityId' | 'name' | 'path' | 'description' +> & { + brand?: Maybe<{ __typename?: 'Brand' } & Pick> + prices?: Maybe<{ __typename?: 'Prices' } & ProductPricesFragment> + images: { __typename?: 'ImageConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ImageEdge' } & { + node: { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' | 'isDefault' + > + } + > + > + > + } + variants: { __typename?: 'VariantConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'VariantEdge' } & { + node: { __typename?: 'Variant' } & Pick & { + defaultImage?: Maybe< + { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' | 'isDefault' + > + > + } + } + > + > + > + } + productOptions: { __typename?: 'ProductOptionConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ProductOptionEdge' } & { + node: + | ({ __typename: 'CheckboxOption' } & Pick< + CheckboxOption, + 'entityId' | 'displayName' + >) + | ({ __typename: 'DateFieldOption' } & Pick< + DateFieldOption, + 'entityId' | 'displayName' + >) + | ({ __typename: 'FileUploadFieldOption' } & Pick< + FileUploadFieldOption, + 'entityId' | 'displayName' + >) + | ({ __typename: 'MultiLineTextFieldOption' } & Pick< + MultiLineTextFieldOption, + 'entityId' | 'displayName' + >) + | ({ __typename: 'MultipleChoiceOption' } & Pick< + MultipleChoiceOption, + 'entityId' | 'displayName' + > & + MultipleChoiceOptionFragment) + | ({ __typename: 'NumberFieldOption' } & Pick< + NumberFieldOption, + 'entityId' | 'displayName' + >) + | ({ __typename: 'TextFieldOption' } & Pick< + TextFieldOption, + 'entityId' | 'displayName' + >) + } + > + > + > + } + localeMeta: { __typename?: 'MetafieldConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'MetafieldEdge' } & { + node: { __typename?: 'Metafields' } & Pick< + Metafields, + 'key' | 'value' + > + } + > + > + > + } + } + +export type ProductConnnectionFragment = { + __typename?: 'ProductConnection' +} & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'startCursor' | 'endCursor' + > + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ProductEdge' } & Pick & { + node: { __typename?: 'Product' } & ProductInfoFragment + } + > + > + > +} + +export type GetAllProductPathsQueryVariables = Exact<{ + first?: Maybe +}> + +export type GetAllProductPathsQuery = { __typename?: 'Query' } & { + site: { __typename?: 'Site' } & { + products: { __typename?: 'ProductConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ProductEdge' } & { + node: { __typename?: 'Product' } & Pick + } + > + > + > + } + } +} + +export type GetAllProductsQueryVariables = Exact<{ + hasLocale?: Maybe + locale?: Maybe + entityIds?: Maybe> + first?: Maybe + products?: Maybe + featuredProducts?: Maybe + bestSellingProducts?: Maybe + newestProducts?: Maybe +}> + +export type GetAllProductsQuery = { __typename?: 'Query' } & { + site: { __typename?: 'Site' } & { + products: { __typename?: 'ProductConnection' } & ProductConnnectionFragment + featuredProducts: { + __typename?: 'ProductConnection' + } & ProductConnnectionFragment + bestSellingProducts: { + __typename?: 'ProductConnection' + } & ProductConnnectionFragment + newestProducts: { + __typename?: 'ProductConnection' + } & ProductConnnectionFragment + } +} + +export type GetCustomerIdQueryVariables = Exact<{ [key: string]: never }> + +export type GetCustomerIdQuery = { __typename?: 'Query' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> +} + +export type GetProductQueryVariables = Exact<{ + hasLocale?: Maybe + locale?: Maybe + path: Scalars['String'] +}> + +export type GetProductQuery = { __typename?: 'Query' } & { + site: { __typename?: 'Site' } & { + route: { __typename?: 'Route' } & { + node?: Maybe< + | { __typename: 'Brand' } + | { __typename: 'Category' } + | ({ __typename: 'Product' } & { + variants: { __typename?: 'VariantConnection' } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'VariantEdge' } & { + node: { __typename?: 'Variant' } & Pick< + Variant, + 'entityId' + > & { + defaultImage?: Maybe< + { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' | 'isDefault' + > + > + prices?: Maybe< + { __typename?: 'Prices' } & ProductPricesFragment + > + inventory?: Maybe< + { __typename?: 'VariantInventory' } & Pick< + VariantInventory, + 'isInStock' + > & { + aggregated?: Maybe< + { __typename?: 'Aggregated' } & Pick< + Aggregated, + 'availableToSell' | 'warningLevel' + > + > + } + > + productOptions: { + __typename?: 'ProductOptionConnection' + } & { + edges?: Maybe< + Array< + Maybe< + { __typename?: 'ProductOptionEdge' } & { + node: + | ({ + __typename: 'CheckboxOption' + } & Pick< + CheckboxOption, + 'entityId' | 'displayName' + >) + | ({ + __typename: 'DateFieldOption' + } & Pick< + DateFieldOption, + 'entityId' | 'displayName' + >) + | ({ + __typename: 'FileUploadFieldOption' + } & Pick< + FileUploadFieldOption, + 'entityId' | 'displayName' + >) + | ({ + __typename: 'MultiLineTextFieldOption' + } & Pick< + MultiLineTextFieldOption, + 'entityId' | 'displayName' + >) + | ({ + __typename: 'MultipleChoiceOption' + } & Pick< + MultipleChoiceOption, + 'entityId' | 'displayName' + > & + MultipleChoiceOptionFragment) + | ({ + __typename: 'NumberFieldOption' + } & Pick< + NumberFieldOption, + 'entityId' | 'displayName' + >) + | ({ + __typename: 'TextFieldOption' + } & Pick< + TextFieldOption, + 'entityId' | 'displayName' + >) + } + > + > + > + } + } + } + > + > + > + } + } & ProductInfoFragment) + | { __typename: 'Variant' } + > + } + } +} + +export type GetSiteInfoQueryVariables = Exact<{ [key: string]: never }> + +export type GetSiteInfoQuery = { __typename?: 'Query' } & { + site: { __typename?: 'Site' } & { + categoryTree: Array< + { __typename?: 'CategoryTreeItem' } & { + children: Array< + { __typename?: 'CategoryTreeItem' } & { + children: Array< + { __typename?: 'CategoryTreeItem' } & CategoryTreeItemFragment + > + } & CategoryTreeItemFragment + > + } & CategoryTreeItemFragment + > + brands: { __typename?: 'BrandConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'startCursor' | 'endCursor' + > + edges?: Maybe< + Array< + Maybe< + { __typename?: 'BrandEdge' } & Pick & { + node: { __typename?: 'Brand' } & Pick< + Brand, + | 'entityId' + | 'name' + | 'pageTitle' + | 'metaDesc' + | 'metaKeywords' + | 'searchKeywords' + | 'path' + > & { + defaultImage?: Maybe< + { __typename?: 'Image' } & Pick< + Image, + 'urlOriginal' | 'altText' + > + > + } + } + > + > + > + } + } +} + +export type LoginMutationVariables = Exact<{ + email: Scalars['String'] + password: Scalars['String'] +}> + +export type LoginMutation = { __typename?: 'Mutation' } & { + login: { __typename?: 'LoginResult' } & Pick +} diff --git a/packages/bigcommerce/schema.graphql b/packages/bigcommerce/schema.graphql new file mode 100644 index 0000000..79de347 --- /dev/null +++ b/packages/bigcommerce/schema.graphql @@ -0,0 +1,2422 @@ +""" +Login result +""" +type LoginResult { + """ + The result of a login + """ + result: String! +} + +""" +Logout result +""" +type LogoutResult { + """ + The result of a logout + """ + result: String! +} + +type Mutation { + login(email: String!, password: String!): LoginResult! + logout: LogoutResult! +} + +""" +Aggregated +""" +type Aggregated { + """ + Number of available products in stock. This can be 'null' if inventory is not set orif the store's Inventory Settings disable displaying stock levels on the storefront. + """ + availableToSell: Long! + + """ + Indicates a threshold low-stock level. This can be 'null' if the inventory warning level is not set or if the store's Inventory Settings disable displaying stock levels on the storefront. + """ + warningLevel: Int! +} + +""" +Aggregated Product Inventory +""" +type AggregatedInventory { + """ + Number of available products in stock. This can be 'null' if inventory is not set orif the store's Inventory Settings disable displaying stock levels on the storefront. + """ + availableToSell: Int! + + """ + Indicates a threshold low-stock level. This can be 'null' if the inventory warning level is not set or if the store's Inventory Settings disable displaying stock levels on the storefront. + """ + warningLevel: Int! +} + +""" +Brand +""" +type Brand implements Node { + """ + The ID of an object + """ + id: ID! + + """ + Id of the brand. + """ + entityId: Int! + + """ + Name of the brand. + """ + name: String! + + """ + Default image for brand. + """ + defaultImage: Image + + """ + Page title for the brand. + """ + pageTitle: String! + + """ + Meta description for the brand. + """ + metaDesc: String! + + """ + Meta keywords for the brand. + """ + metaKeywords: [String!]! + + """ + Search keywords for the brand. + """ + searchKeywords: [String!]! + + """ + Path for the brand page. + """ + path: String! + products( + before: String + after: String + first: Int + last: Int + ): ProductConnection! + + """ + Metafield data related to a brand. + """ + metafields( + namespace: String! + keys: [String!] = [] + before: String + after: String + first: Int + last: Int + ): MetafieldConnection! +} + +""" +A connection to a list of items. +""" +type BrandConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [BrandEdge] +} + +""" +An edge in a connection. +""" +type BrandEdge { + """ + The item at the end of the edge. + """ + node: Brand! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Breadcrumb +""" +type Breadcrumb { + """ + Category id. + """ + entityId: Int! + + """ + Name of the category. + """ + name: String! +} + +""" +A connection to a list of items. +""" +type BreadcrumbConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [BreadcrumbEdge] +} + +""" +An edge in a connection. +""" +type BreadcrumbEdge { + """ + The item at the end of the edge. + """ + node: Breadcrumb! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Bulk pricing tier that sets a fixed price for the product or variant. +""" +type BulkPricingFixedPriceDiscount implements BulkPricingTier { + """ + This price will override the current product price. + """ + price: BigDecimal! + + """ + Minimum item quantity that applies to this bulk pricing tier. + """ + minimumQuantity: Int! + + """ + Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. + """ + maximumQuantity: Int +} + +""" +Bulk pricing tier that reduces the price of the product or variant by a percentage. +""" +type BulkPricingPercentageDiscount implements BulkPricingTier { + """ + The percentage that will be removed from the product price. + """ + percentOff: BigDecimal! + + """ + Minimum item quantity that applies to this bulk pricing tier. + """ + minimumQuantity: Int! + + """ + Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. + """ + maximumQuantity: Int +} + +""" +Bulk pricing tier that will subtract an amount from the price of the product or variant. +""" +type BulkPricingRelativePriceDiscount implements BulkPricingTier { + """ + The price of the product/variant will be reduced by this priceAdjustment. + """ + priceAdjustment: BigDecimal! + + """ + Minimum item quantity that applies to this bulk pricing tier. + """ + minimumQuantity: Int! + + """ + Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. + """ + maximumQuantity: Int +} + +""" +A set of bulk pricing tiers that define price discounts which apply when purchasing specified quantities of a product or variant. +""" +interface BulkPricingTier { + """ + Minimum item quantity that applies to this bulk pricing tier. + """ + minimumQuantity: Int! + + """ + Maximum item quantity that applies to this bulk pricing tier - if not defined then the tier does not have an upper bound. + """ + maximumQuantity: Int +} + +""" +Product Option +""" +interface CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +Product Option Value +""" +interface CatalogProductOptionValue { + """ + Unique ID for the option value. + """ + entityId: Int! + + """ + Label for the option value. + """ + label: String! + + """ + Indicates whether this value is the chosen default selected value. + """ + isDefault: Boolean! +} + +""" +Category +""" +type Category implements Node { + """ + The ID of an object + """ + id: ID! + + """ + Unique ID for the category. + """ + entityId: Int! + + """ + Category name. + """ + name: String! + + """ + Category path. + """ + path: String! + + """ + Default image for the category. + """ + defaultImage: Image + + """ + Category description. + """ + description: String! + + """ + Category breadcrumbs. + """ + breadcrumbs( + depth: Int! + before: String + after: String + first: Int + last: Int + ): BreadcrumbConnection! + products( + before: String + after: String + first: Int + last: Int + ): ProductConnection! + + """ + Metafield data related to a category. + """ + metafields( + namespace: String! + keys: [String!] = [] + before: String + after: String + first: Int + last: Int + ): MetafieldConnection! +} + +""" +A connection to a list of items. +""" +type CategoryConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [CategoryEdge] +} + +""" +An edge in a connection. +""" +type CategoryEdge { + """ + The item at the end of the edge. + """ + node: Category! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +An item in a tree of categories. +""" +type CategoryTreeItem { + """ + The id category. + """ + entityId: Int! + + """ + The name of category. + """ + name: String! + + """ + Path assigned to this category + """ + path: String! + + """ + The description of this category. + """ + description: String! + + """ + The number of products in this category. + """ + productCount: Int! + + """ + Subcategories of this category + """ + children: [CategoryTreeItem!]! +} + +""" +A simple yes/no question represented by a checkbox. +""" +type CheckboxOption implements CatalogProductOption { + """ + Indicates the default checked status. + """ + checkedByDefault: Boolean! + + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +Contact field +""" +type ContactField { + """ + Store address line. + """ + address: String! + + """ + Store country. + """ + country: String! + + """ + Store address type. + """ + addressType: String! + + """ + Store email. + """ + email: String! + + """ + Store phone number. + """ + phone: String! +} + +""" +Custom field +""" +type CustomField { + """ + Custom field id. + """ + entityId: Int! + + """ + Name of the custom field. + """ + name: String! + + """ + Value of the custom field. + """ + value: String! +} + +""" +A connection to a list of items. +""" +type CustomFieldConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [CustomFieldEdge] +} + +""" +An edge in a connection. +""" +type CustomFieldEdge { + """ + The item at the end of the edge. + """ + node: CustomField! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +A customer that shops on a store +""" +type Customer { + """ + The ID of the customer. + """ + entityId: Int! + + """ + The company name of the customer. + """ + company: String! + + """ + The customer group id of the customer. + """ + customerGroupId: Int! + + """ + The email address of the customer. + """ + email: String! + + """ + The first name of the customer. + """ + firstName: String! + + """ + The last name of the customer. + """ + lastName: String! + + """ + The notes of the customer. + """ + notes: String! + + """ + The phone number of the customer. + """ + phone: String! + + """ + The tax exempt category of the customer. + """ + taxExemptCategory: String! + + """ + Customer addresses count. + """ + addressCount: Int! + + """ + Customer attributes count. + """ + attributeCount: Int! + + """ + Customer store credit. + """ + storeCredit: [Money!]! + + """ + Customer attributes. + """ + attributes: CustomerAttributes! +} + +""" +A custom, store-specific attribute for a customer +""" +type CustomerAttribute { + """ + The ID of the custom customer attribute + """ + entityId: Int! + + """ + The value of the custom customer attribute + """ + value: String + + """ + The name of the custom customer attribute + """ + name: String! +} + +""" +Custom, store-specific customer attributes +""" +type CustomerAttributes { + attribute( + """ + The ID of the customer attribute + """ + entityId: Int! + ): CustomerAttribute! +} + +""" +A calendar for allowing selection of a date. +""" +type DateFieldOption implements CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +scalar DateTime + +""" +Date Time Extended +""" +type DateTimeExtended { + """ + ISO-8601 formatted date in UTC + """ + utc: DateTime! +} + +""" +Display field +""" +type DisplayField { + """ + Short date format. + """ + shortDateFormat: String! + + """ + Extended date format. + """ + extendedDateFormat: String! +} + +""" +A form allowing selection and uploading of a file from the user's local computer. +""" +type FileUploadFieldOption implements CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +Image +""" +type Image { + """ + Absolute path to image using store CDN. + """ + url(width: Int!, height: Int): String! + + """ + Absolute path to original image using store CDN. + """ + urlOriginal: String! + + """ + Text description of an image that can be used for SEO and/or accessibility purposes. + """ + altText: String! + + """ + Indicates whether this is the primary image. + """ + isDefault: Boolean! +} + +""" +A connection to a list of items. +""" +type ImageConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [ImageEdge] +} + +""" +An edge in a connection. +""" +type ImageEdge { + """ + The item at the end of the edge. + """ + node: Image! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +An inventory +""" +type Inventory { + """ + Locations + """ + locations( + entityIds: [Int!] + codes: [String!] + typeIds: [String!] + before: String + after: String + first: Int + last: Int + ): LocationConnection! +} + +""" +Inventory By Locations +""" +type InventoryByLocations { + """ + Location id. + """ + locationEntityId: Long! + + """ + Number of available products in stock. + """ + availableToSell: Long! + + """ + Indicates a threshold low-stock level. + """ + warningLevel: Int! + + """ + Indicates whether this product is in stock. + """ + isInStock: Boolean! +} + +""" +A connection to a list of items. +""" +type LocationConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [LocationEdge] +} + +""" +An edge in a connection. +""" +type LocationEdge { + """ + The item at the end of the edge. + """ + node: InventoryByLocations! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Logo field +""" +type LogoField { + """ + Logo title. + """ + title: String! + + """ + Store logo image. + """ + image: Image! +} + +""" +Measurement +""" +type Measurement { + """ + Unformatted weight measurement value. + """ + value: Float! + + """ + Unit of measurement. + """ + unit: String! +} + +""" +A connection to a list of items. +""" +type MetafieldConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [MetafieldEdge] +} + +""" +An edge in a connection. +""" +type MetafieldEdge { + """ + The item at the end of the edge. + """ + node: Metafields! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Key/Value pairs of data attached tied to a resource entity (product, brand, category, etc.) +""" +type Metafields { + """ + The ID of an object + """ + id: ID! + + """ + The ID of the metafield when referencing via our backend API. + """ + entityId: Int! + + """ + A label for identifying a metafield data value. + """ + key: String! + + """ + A metafield value. + """ + value: String! +} + +""" +A money object - includes currency code and a money amount +""" +type Money { + """ + Currency code of the current money. + """ + currencyCode: String! + + """ + The amount of money. + """ + value: BigDecimal! +} + +""" +A min and max pair of money objects +""" +type MoneyRange { + """ + Minimum money object. + """ + min: Money! + + """ + Maximum money object. + """ + max: Money! +} + +""" +A multi-line text input field, aka a text box. +""" +type MultiLineTextFieldOption implements CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +An option type that has a fixed list of values. +""" +type MultipleChoiceOption implements CatalogProductOption { + """ + The chosen display style for this multiple choice option. + """ + displayStyle: String! + + """ + List of option values. + """ + values( + before: String + after: String + first: Int + last: Int + ): ProductOptionValueConnection! + + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +A simple multiple choice value comprised of an id and a label. +""" +type MultipleChoiceOptionValue implements CatalogProductOptionValue { + """ + Unique ID for the option value. + """ + entityId: Int! + + """ + Label for the option value. + """ + label: String! + + """ + Indicates whether this value is the chosen default selected value. + """ + isDefault: Boolean! +} + +""" +An object with an ID +""" +interface Node { + """ + The id of the object. + """ + id: ID! +} + +""" +A single line text input field that only accepts numbers. +""" +type NumberFieldOption implements CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +A connection to a list of items. +""" +type OptionConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [OptionEdge] +} + +""" +An edge in a connection. +""" +type OptionEdge { + """ + The item at the end of the edge. + """ + node: ProductOption! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +A connection to a list of items. +""" +type OptionValueConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [OptionValueEdge] +} + +""" +An edge in a connection. +""" +type OptionValueEdge { + """ + The item at the end of the edge. + """ + node: ProductOptionValue! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +input OptionValueId { + optionEntityId: Int! + valueEntityId: Int! +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + """ + When paginating backwards, the cursor to continue. + """ + startCursor: String + + """ + When paginating forwards, the cursor to continue. + """ + endCursor: String +} + +""" +The min and max range of prices that apply to this product. +""" +type PriceRanges { + """ + Product price min/max range. + """ + priceRange: MoneyRange! + + """ + Product retail price min/max range. + """ + retailPriceRange: MoneyRange +} + +""" +The various prices that can be set on a product. +""" +type Prices { + """ + Calculated price of the product. + """ + price: Money! + + """ + Sale price of the product. + """ + salePrice: Money + + """ + Original price of the product. + """ + basePrice: Money + + """ + Retail price of the product. + """ + retailPrice: Money + + """ + Minimum advertised price of the product. + """ + mapPrice: Money + + """ + Product price min/max range. + """ + priceRange: MoneyRange! + + """ + Product retail price min/max range. + """ + retailPriceRange: MoneyRange + + """ + The difference between the retail price (MSRP) and the current price, which can be presented to the shopper as their savings. + """ + saved: Money + + """ + List of bulk pricing tiers applicable to a product or variant. + """ + bulkPricing: [BulkPricingTier!]! +} + +""" +Product +""" +type Product implements Node { + """ + The ID of an object + """ + id: ID! + + """ + Id of the product. + """ + entityId: Int! + + """ + Default product variant when no options are selected. + """ + sku: String! + + """ + Relative URL path to product page. + """ + path: String! + + """ + Name of the product. + """ + name: String! + + """ + Description of the product. + """ + description: String! + + """ + Description of the product in plain text. + """ + plainTextDescription(characterLimit: Int = 120): String! + + """ + Warranty information of the product. + """ + warranty: String! + + """ + Minimum purchasable quantity for this product in a single order. + """ + minPurchaseQuantity: Int + + """ + Maximum purchasable quantity for this product in a single order. + """ + maxPurchaseQuantity: Int + + """ + Absolute URL path for adding a product to cart. + """ + addToCartUrl: String! + + """ + Absolute URL path for adding a product to customer's wishlist. + """ + addToWishlistUrl: String! + + """ + Prices object determined by supplied product ID, variant ID, and selected option IDs. + """ + prices(includeTax: Boolean = false, currencyCode: currencyCode): Prices + + """ + The minimum and maximum price of this product based on variant pricing and/or modifier price rules. + """ + priceRanges(includeTax: Boolean = false): PriceRanges + @deprecated(reason: "Use priceRanges inside prices node instead.") + + """ + Weight of the product. + """ + weight: Measurement + + """ + Height of the product. + """ + height: Measurement + + """ + Width of the product. + """ + width: Measurement + + """ + Depth of the product. + """ + depth: Measurement + + """ + Product options. + """ + options( + before: String + after: String + first: Int + last: Int + ): OptionConnection! + + """ + Product options. + """ + productOptions( + before: String + after: String + first: Int + last: Int + ): ProductOptionConnection! + + """ + Summary of the product reviews, includes the total number of reviews submitted and summation of the ratings on the reviews (ratings range from 0-5 per review). + """ + reviewSummary: Reviews! + + """ + Type of product, ex: physical, digital + """ + type: String! + + """ + The availability state of the product. + """ + availability: String! + @deprecated(reason: "Use status inside availabilityV2 instead.") + + """ + A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + """ + availabilityDescription: String! + @deprecated(reason: "Use description inside availabilityV2 instead.") + + """ + The availability state of the product. + """ + availabilityV2: ProductAvailability! + + """ + List of categories associated with the product. + """ + categories( + before: String + after: String + first: Int + last: Int + ): CategoryConnection! + + """ + Brand associated with the product. + """ + brand: Brand + + """ + Variants associated with the product. + """ + variants( + before: String + after: String + first: Int + last: Int + entityIds: [Int!] = [] + optionValueIds: [OptionValueId!] = [] + ): VariantConnection! + + """ + Custom fields of the product. + """ + customFields( + names: [String!] = [] + before: String + after: String + first: Int + last: Int + ): CustomFieldConnection! + + """ + A list of the images for a product. + """ + images(before: String, after: String, first: Int, last: Int): ImageConnection! + + """ + Default image for a product. + """ + defaultImage: Image + + """ + Related products for this product. + """ + relatedProducts( + before: String + after: String + first: Int + last: Int + ): RelatedProductsConnection! + + """ + Inventory information of the product. + """ + inventory: ProductInventory! + + """ + Metafield data related to a product. + """ + metafields( + namespace: String! + keys: [String!] = [] + before: String + after: String + first: Int + last: Int + ): MetafieldConnection! + + """ + Product creation date + """ + createdAt: DateTimeExtended! + @deprecated(reason: "Alpha version. Do not use in production.") +} + +""" +Product availability +""" +interface ProductAvailability { + """ + The availability state of the product. + """ + status: ProductAvailabilityStatus! + + """ + A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + """ + description: String! +} + +""" +Product availability status +""" +enum ProductAvailabilityStatus { + Available + Preorder + Unavailable +} + +""" +Available Product +""" +type ProductAvailable implements ProductAvailability { + """ + The availability state of the product. + """ + status: ProductAvailabilityStatus! + + """ + A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + """ + description: String! +} + +""" +A connection to a list of items. +""" +type ProductConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [ProductEdge] +} + +""" +An edge in a connection. +""" +type ProductEdge { + """ + The item at the end of the edge. + """ + node: Product! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Product Inventory Information +""" +type ProductInventory { + """ + Indicates whether this product is in stock. + """ + isInStock: Boolean! + + """ + Indicates whether this product's inventory is being tracked on variant level. If true, you may wish to check the variants node to understand the true inventory of each individual variant, rather than relying on this product-level aggregate to understand how many items may be added to cart. + """ + hasVariantInventory: Boolean! + + """ + Aggregated product inventory information. This data may not be available if not set or if the store's Inventory Settings have disabled displaying stock levels on the storefront. + """ + aggregated: AggregatedInventory +} + +""" +Product Option +""" +type ProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! + + """ + Option values. + """ + values( + before: String + after: String + first: Int + last: Int + ): OptionValueConnection! +} + +""" +A connection to a list of items. +""" +type ProductOptionConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [ProductOptionEdge] +} + +""" +An edge in a connection. +""" +type ProductOptionEdge { + """ + The item at the end of the edge. + """ + node: CatalogProductOption! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Product Option Value +""" +type ProductOptionValue { + """ + Unique ID for the option value. + """ + entityId: Int! + + """ + Label for the option value. + """ + label: String! +} + +""" +A connection to a list of items. +""" +type ProductOptionValueConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [ProductOptionValueEdge] +} + +""" +An edge in a connection. +""" +type ProductOptionValueEdge { + """ + The item at the end of the edge. + """ + node: CatalogProductOptionValue! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +A Product PickList Value - a product to be mapped to the base product if selected. +""" +type ProductPickListOptionValue implements CatalogProductOptionValue { + """ + The ID of the product associated with this option value. + """ + productId: Int! + + """ + Unique ID for the option value. + """ + entityId: Int! + + """ + Label for the option value. + """ + label: String! + + """ + Indicates whether this value is the chosen default selected value. + """ + isDefault: Boolean! +} + +""" +PreOrder Product +""" +type ProductPreOrder implements ProductAvailability { + """ + The message to be shown in the store when a product is put into the pre-order availability state, e.g. "Expected release date is %%DATE%%" + """ + message: String + + """ + Product release date + """ + willBeReleasedAt: DateTimeExtended + + """ + The availability state of the product. + """ + status: ProductAvailabilityStatus! + + """ + A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + """ + description: String! +} + +""" +Unavailable Product +""" +type ProductUnavailable implements ProductAvailability { + """ + The message to be shown in the store when "Call for pricing" is enabled for this product, e.g. "Contact us at 555-5555" + """ + message: String + + """ + The availability state of the product. + """ + status: ProductAvailabilityStatus! + + """ + A few words telling the customer how long it will normally take to ship this product, such as 'Usually ships in 24 hours'. + """ + description: String! +} + +type Query { + site: Site! + + """ + The currently logged in customer. + """ + customer: Customer + + """ + Fetches an object given its ID + """ + node( + """ + The ID of an object + """ + id: ID! + ): Node + inventory: Inventory! + @deprecated(reason: "Alpha version. Do not use in production.") +} + +""" +A connection to a list of items. +""" +type RelatedProductsConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [RelatedProductsEdge] +} + +""" +An edge in a connection. +""" +type RelatedProductsEdge { + """ + The item at the end of the edge. + """ + node: Product! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Review Rating Summary +""" +type Reviews { + """ + Total number of reviews on product. + """ + numberOfReviews: Int! + + """ + Summation of rating scores from each review. + """ + summationOfRatings: Int! +} + +""" +route +""" +type Route { + """ + node + """ + node: Node +} + +""" +Store settings information from the control panel. +""" +type Settings { + """ + The name of the store. + """ + storeName: String! + + """ + The hash of the store. + """ + storeHash: String! + + """ + The current store status. + """ + status: StorefrontStatusType! + + """ + Logo information for the store. + """ + logo: LogoField! + + """ + Contact information for the store. + """ + contact: ContactField + + """ + Store urls. + """ + url: UrlField! + + """ + Store display format information. + """ + display: DisplayField! + + """ + Channel ID. + """ + channelId: Long! +} + +""" +A site +""" +type Site { + categoryTree: [CategoryTreeItem!]! + + """ + Details of the brand. + """ + brands( + before: String + after: String + first: Int + last: Int + productEntityIds: [Int!] = [] + ): BrandConnection! + + """ + Details of the products. + """ + products( + before: String + after: String + first: Int + last: Int + ids: [ID!] = [] + entityIds: [Int!] = [] + ): ProductConnection! + + """ + Details of the newest products. + """ + newestProducts( + before: String + after: String + first: Int + last: Int + ): ProductConnection! + + """ + Details of the best selling products. + """ + bestSellingProducts( + before: String + after: String + first: Int + last: Int + ): ProductConnection! + + """ + Details of the featured products. + """ + featuredProducts( + before: String + after: String + first: Int + last: Int + ): ProductConnection! + + """ + A single product object with variant pricing overlay capabilities. + """ + product( + id: ID + entityId: Int + variantEntityId: Int + optionValueIds: [OptionValueId!] = [] + sku: String + ): Product + + """ + Route for a node + """ + route(path: String!): Route! + + """ + Store settings. + """ + settings: Settings +} + +""" +Storefront Mode +""" +enum StorefrontStatusType { + LAUNCHED + MAINTENANCE + PRE_LAUNCH + HIBERNATION +} + +""" +A swatch option value - swatch values can be associated with a list of hexidecimal colors or an image. +""" +type SwatchOptionValue implements CatalogProductOptionValue { + """ + List of up to 3 hex encoded colors to associate with a swatch value. + """ + hexColors: [String!]! + + """ + Absolute path of a swatch texture image. + """ + imageUrl(width: Int!, height: Int): String + + """ + Unique ID for the option value. + """ + entityId: Int! + + """ + Label for the option value. + """ + label: String! + + """ + Indicates whether this value is the chosen default selected value. + """ + isDefault: Boolean! +} + +""" +A single line text input field. +""" +type TextFieldOption implements CatalogProductOption { + """ + Unique ID for the option. + """ + entityId: Int! + + """ + Display name for the option. + """ + displayName: String! + + """ + One of the option values is required to be selected for the checkout. + """ + isRequired: Boolean! +} + +""" +Url field +""" +type UrlField { + """ + Store url. + """ + vanityUrl: String! + + """ + CDN url to fetch assets. + """ + cdnUrl: String! +} + +""" +Variant +""" +type Variant implements Node { + """ + The ID of an object + """ + id: ID! + + """ + Id of the variant. + """ + entityId: Int! + + """ + Sku of the variant. + """ + sku: String! + + """ + The variant's weight. If a weight was not explicitly specified on the variant, this will be the product's weight. + """ + weight: Measurement + + """ + The variant's height. If a height was not explicitly specified on the variant, this will be the product's height. + """ + height: Measurement + + """ + The variant's width. If a width was not explicitly specified on the variant, this will be the product's width. + """ + width: Measurement + + """ + The variant's depth. If a depth was not explicitly specified on the variant, this will be the product's depth. + """ + depth: Measurement + + """ + The options which define a variant. + """ + options( + before: String + after: String + first: Int + last: Int + ): OptionConnection! + + """ + Product options that compose this variant. + """ + productOptions( + before: String + after: String + first: Int + last: Int + ): ProductOptionConnection! + + """ + Default image for a variant. + """ + defaultImage: Image + + """ + Variant prices + """ + prices(includeTax: Boolean = false, currencyCode: currencyCode): Prices + + """ + Variant inventory + """ + inventory: VariantInventory + + """ + Metafield data related to a variant. + """ + metafields( + namespace: String! + keys: [String!] = [] + before: String + after: String + first: Int + last: Int + ): MetafieldConnection! +} + +""" +A connection to a list of items. +""" +type VariantConnection { + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! + + """ + A list of edges. + """ + edges: [VariantEdge] +} + +""" +An edge in a connection. +""" +type VariantEdge { + """ + The item at the end of the edge. + """ + node: Variant! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Variant Inventory +""" +type VariantInventory { + """ + Aggregated product variant inventory information. This data may not be available if not set or if the store's Inventory Settings have disabled displaying stock levels on the storefront. + """ + aggregated: Aggregated + + """ + Indicates whether this product is in stock. + """ + isInStock: Boolean! + + """ + Inventory by locations. + """ + byLocation( + locationEntityIds: [Int!] = [] + before: String + after: String + first: Int + last: Int + ): LocationConnection +} + +""" +Please select a currency +""" +enum currencyCode { + ADP + AED + AFA + AFN + ALK + ALL + AMD + ANG + AOA + AOK + AON + AOR + ARA + ARL + ARM + ARP + ARS + ATS + AUD + AWG + AZM + AZN + BAD + BAM + BAN + BBD + BDT + BEC + BEF + BEL + BGL + BGM + BGN + BGO + BHD + BIF + BMD + BND + BOB + BOL + BOP + BOV + BRB + BRC + BRE + BRL + BRN + BRR + BRZ + BSD + BTN + BUK + BWP + BYB + BYR + BZD + CAD + CDF + CHE + CHF + CHW + CLE + CLF + CLP + CNX + CNY + COP + COU + CRC + CSD + CSK + CVE + CYP + CZK + DDM + DEM + DJF + DKK + DOP + DZD + ECS + ECV + EEK + EGP + ERN + ESA + ESB + ESP + ETB + EUR + FIM + FJD + FKP + FRF + GBP + GEK + GEL + GHC + GHS + GIP + GMD + GNF + GNS + GQE + GRD + GTQ + GWE + GWP + GYD + HKD + HNL + HRD + HRK + HTG + HUF + IDR + IEP + ILP + ILR + ILS + INR + IQD + ISJ + ISK + ITL + JMD + JOD + JPY + KES + KGS + KHR + KMF + KRH + KRO + KRW + KWD + KYD + KZT + LAK + LBP + LKR + LRD + LSL + LTL + LTT + LUC + LUF + LUL + LVL + LVR + LYD + MAD + MAF + MCF + MDC + MDL + MGA + MGF + MKD + MKN + MLF + MMK + MNT + MOP + MRO + MTL + MTP + MUR + MVP + MVR + MWK + MXN + MXP + MXV + MYR + MZE + MZM + MZN + NAD + NGN + NIC + NIO + NLG + NOK + NPR + NZD + OMR + PAB + PEI + PEN + PES + PGK + PHP + PKR + PLN + PLZ + PTE + PYG + QAR + RHD + ROL + RON + RSD + RUB + RUR + RWF + SAR + SBD + SCR + SDD + SDG + SDP + SEK + SGD + SHP + SIT + SKK + SLL + SOS + SRD + SRG + SSP + STD + SUR + SVC + SYP + SZL + THB + TJR + TJS + TMM + TMT + TND + TOP + TPE + TRL + TRY + TTD + TWD + TZS + UAH + UAK + UGS + UGX + USD + USN + USS + UYI + UYP + UYU + UZS + VEB + VEF + VND + VNN + VUV + WST + XAF + XCD + XEU + XFO + XFU + XOF + XPF + XRE + YDD + YER + YUD + YUM + YUN + YUR + ZAL + ZAR + ZMK + ZMW + ZRN + ZRZ + ZWD + ZWL + ZWR +} + +""" +The `BigDecimal` scalar type represents signed fractional values with arbitrary precision. +""" +scalar BigDecimal + +""" +The `Long` scalar type represents non-fractional signed whole numeric values. Long can represent values between -(2^63) and 2^63 - 1. +""" +scalar Long diff --git a/packages/bigcommerce/scripts/generate-definitions.js b/packages/bigcommerce/scripts/generate-definitions.js new file mode 100644 index 0000000..a2b830d --- /dev/null +++ b/packages/bigcommerce/scripts/generate-definitions.js @@ -0,0 +1,49 @@ +/** + * Generates definitions for REST API endpoints that are being + * used by ../api using https://github.com/drwpow/swagger-to-ts + */ +const { readFileSync, promises } = require('fs') +const path = require('path') +const fetch = require('node-fetch') +const swaggerToTS = require('@manifoldco/swagger-to-ts').default + +async function getSchema(filename) { + const url = `https://next-api.stoplight.io/projects/8433/files/${filename}` + const res = await fetch(url) + + if (!res.ok) { + throw new Error(`Request failed with ${res.status}: ${res.statusText}`) + } + + return res.json() +} + +const schemas = Object.entries({ + '../api/definitions/catalog.ts': + 'BigCommerce_Catalog_API.oas2.yml?ref=version%2F20.930', + '../api/definitions/store-content.ts': + 'BigCommerce_Store_Content_API.oas2.yml?ref=version%2F20.930', + '../api/definitions/wishlist.ts': + 'BigCommerce_Wishlist_API.oas2.yml?ref=version%2F20.930', + // swagger-to-ts is not working for the schema of the cart API + // '../api/definitions/cart.ts': + // 'BigCommerce_Server_to_Server_Cart_API.oas2.yml', +}) + +async function writeDefinitions() { + const ops = schemas.map(async ([dest, filename]) => { + const destination = path.join(__dirname, dest) + const schema = await getSchema(filename) + const definition = swaggerToTS(schema.content, { + prettierConfig: 'package.json', + }) + + await promises.writeFile(destination, definition) + + console.log(`✔️ Added definitions for: ${dest}`) + }) + + await Promise.all(ops) +} + +writeDefinitions() diff --git a/packages/bigcommerce/src/api/definitions/catalog.ts b/packages/bigcommerce/src/api/definitions/catalog.ts new file mode 100644 index 0000000..2c483f7 --- /dev/null +++ b/packages/bigcommerce/src/api/definitions/catalog.ts @@ -0,0 +1,2993 @@ +/** + * This file was auto-generated by swagger-to-ts. + * Do not make direct changes to the file. + */ + +export interface definitions { + /** + * Common Modifier properties. + */ + productModifier_Base: { + /** + * BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. + */ + type: + | 'date' + | 'checkbox' + | 'file' + | 'text' + | 'multi_line_text' + | 'numbers_only_text' + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + /** + * Whether or not this modifer is required or not at checkout. Required in a /POST. + */ + required: boolean + /** + * The order the modifiers display on the product detail page. + */ + sort_order?: number + config?: definitions['config_Full'] + /** + * The name of the option shown on the storefront. + */ + display_name?: string + } + /** + * Product Modifier + */ + productModifier_Full: definitions['productModifier_Base'] & { + /** + * The unique numeric ID of the modifier; increments sequentially. + */ + id?: number + /** + * The unique numeric ID of the product to which the option belongs. + */ + product_id?: number + /** + * The unique option name. Auto-generated from the display name, a timestamp, and the product ID. + */ + name?: string + option_values?: definitions['productModifierOptionValue_Full'][] + } + /** + * The model for a POST to create a modifier on a product. + */ + productModifier_Post: { + /** + * BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. + */ + type: + | 'date' + | 'checkbox' + | 'file' + | 'text' + | 'multi_line_text' + | 'numbers_only_text' + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + /** + * Whether or not this modifer is required or not at checkout. Required in a /POST. + */ + required: boolean + /** + * The order the modifiers display on the product detail page. + */ + sort_order?: number + /** + * The values for option config can vary based on the Modifier created. + */ + config?: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + option_values?: (({ + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + adjusters?: { + /** + * Adjuster for Complex Rules. + */ + price?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * Adjuster for Complex Rules. + */ + weight?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. + */ + image_url?: string + purchasing_disabled?: { + /** + * Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + */ + status?: boolean + /** + * The message displayed on the storefront when the purchasing disabled status is `true`. + */ + message?: string + } + } + }) & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + })[] + } & { + /** + * The name of the option shown on the storefront. + */ + display_name: string + } + /** + * The model for a PUT to update a modifier on a product. + */ + productModifier_Put: { + /** + * BigCommerce API, which determines how it will display on the storefront. Acceptable values: `date`, `checkbox`, `file`, `text`, `multi_line_text`, `numbers_only_text`, `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. Required in a /POST. + */ + type: + | 'date' + | 'checkbox' + | 'file' + | 'text' + | 'multi_line_text' + | 'numbers_only_text' + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + /** + * Whether or not this modifer is required or not at checkout. Required in a /POST. + */ + required: boolean + /** + * The order the modifiers display on the product detail page. + */ + sort_order?: number + /** + * The values for option config can vary based on the Modifier created. + */ + config?: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + option_values?: (({ + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + adjusters?: { + /** + * Adjuster for Complex Rules. + */ + price?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * Adjuster for Complex Rules. + */ + weight?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. + */ + image_url?: string + purchasing_disabled?: { + /** + * Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + */ + status?: boolean + /** + * The message displayed on the storefront when the purchasing disabled status is `true`. + */ + message?: string + } + } + }) & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + })[] + } + /** + * Common Product Modifer `option_value` properties. + */ + productModifierOptionValue_Base: { + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. If no data is available, returns `null`. + */ + value_data?: { [key: string]: any } + adjusters?: definitions['adjusters_Full'] + } + /** + * Product Modifer `option_value`. + */ + productModifierOptionValue_Full: definitions['productModifierOptionValue_Base'] & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + option_id?: number + } + /** + * The model for a POST to create a modifier value on a product. + */ + productModifierOptionValue_Post: { + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + adjusters?: { + /** + * Adjuster for Complex Rules. + */ + price?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * Adjuster for Complex Rules. + */ + weight?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. + */ + image_url?: string + purchasing_disabled?: { + /** + * Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + */ + status?: boolean + /** + * The message displayed on the storefront when the purchasing disabled status is `true`. + */ + message?: string + } + } + } + /** + * The model for a PUT to update a modifier value on a product. + */ + productModifierOptionValue_Put: ({ + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + adjusters?: { + /** + * Adjuster for Complex Rules. + */ + price?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * Adjuster for Complex Rules. + */ + weight?: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. + */ + image_url?: string + purchasing_disabled?: { + /** + * Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + */ + status?: boolean + /** + * The message displayed on the storefront when the purchasing disabled status is `true`. + */ + message?: string + } + } + }) & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + } + resp_productionOption: { + data?: definitions['productOption_Full'] + /** + * Empty meta object; may be used later. + */ + meta?: { ''?: string } + } + /** + * Common Option properties. + */ + productOption_Base: { + /** + * The unique numerical ID of the option, increments sequentially. + */ + id?: number + /** + * The unique numerical ID of the product to which the option belongs. + */ + product_id?: number + /** + * The name of the option shown on the storefront. + */ + display_name?: string + /** + * The type of option, which determines how it will display on the storefront. Acceptable values: `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. For reference, the former v2 API values are: RB = radio_buttons, RT = rectangles, S = dropdown, P = product_list, PI = product_list_with_images, CS = swatch. + */ + type?: + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + config?: definitions['productOptionConfig_Full'] + /** + * Order in which the option is displayed on the storefront. + */ + sort_order?: number + option_values?: definitions['productOptionOptionValue_Full'] + } + productOption_Full: definitions['productOption_Base'] & { + /** + * The unique option name, auto-generated from the display name, a timestamp, and the product ID. + */ + name?: string + } + /** + * The model for a POST to create options on a product. + */ + productOption_Post: { + /** + * The unique numerical ID of the option, increments sequentially. + */ + id?: number + /** + * The unique numerical ID of the product to which the option belongs. + */ + product_id?: number + /** + * The name of the option shown on the storefront. + */ + display_name?: string + /** + * The type of option, which determines how it will display on the storefront. Acceptable values: `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. For reference, the former v2 API values are: RB = radio_buttons, RT = rectangles, S = dropdown, P = product_list, PI = product_list_with_images, CS = swatch. + */ + type?: + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + /** + * The values for option config can vary based on the Modifier created. + */ + config?: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + /** + * Order in which the option is displayed on the storefront. + */ + sort_order?: number + option_values?: ({ + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + })[] + /** + * Publicly available image url + */ + image_url?: string + } + /** + * The model for a PUT to update options on a product. + */ + productOption_Put: { + /** + * The unique numerical ID of the option, increments sequentially. + */ + id?: number + /** + * The unique numerical ID of the product to which the option belongs. + */ + product_id?: number + /** + * The name of the option shown on the storefront. + */ + display_name?: string + /** + * The type of option, which determines how it will display on the storefront. Acceptable values: `radio_buttons`, `rectangles`, `dropdown`, `product_list`, `product_list_with_images`, `swatch`. For reference, the former v2 API values are: RB = radio_buttons, RT = rectangles, S = dropdown, P = product_list, PI = product_list_with_images, CS = swatch. + */ + type?: + | 'radio_buttons' + | 'rectangles' + | 'dropdown' + | 'product_list' + | 'product_list_with_images' + | 'swatch' + /** + * The values for option config can vary based on the Modifier created. + */ + config?: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + /** + * Order in which the option is displayed on the storefront. + */ + sort_order?: number + option_values?: ({ + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + })[] + /** + * Publicly available image url + */ + image_url?: string + } + /** + * Returns the categories tree, a nested lineage of the categories with parent->child relationship. The Category objects returned are simplified versions of the category objects returned in the rest of this API. + */ + categoriesTree_Resp: { + data?: definitions['categoriesTreeNode_Full'][] + meta?: definitions['metaEmpty_Full'] + } + /** + * Used to reflect parent <> child category relationships. Used by Category Tree. + */ + categoriesTreeNode_Full: { + /** + * The unique numeric ID of the category; increments sequentially. + */ + id?: number + /** + * The unique numeric ID of the category's parent. This field controls where the category sits in the tree of categories that organize the catalog. + */ + parent_id?: number + /** + * The name displayed for the category. Name is unique with respect to the category's siblings. + */ + name?: string + /** + * Flag to determine whether the product should be displayed to customers browsing the store. If `true`, the category will be displayed. If `false`, the category will be hidden from view. + */ + is_visible?: boolean + /** + * The custom URL for the category on the storefront. + */ + url?: string + /** + * The list of children of the category. + */ + children?: definitions['categoriesTreeNode_Full'][] + } + /** + * Common Category object properties. + */ + category_Full: { + /** + * Unique ID of the *Category*. Increments sequentially. + * Read-Only. + */ + id?: number + /** + * The unique numeric ID of the category's parent. This field controls where the category sits in the tree of categories that organize the catalog. + * Required in a POST if creating a child category. + */ + parent_id: number + /** + * The name displayed for the category. Name is unique with respect to the category's siblings. + * Required in a POST. + */ + name: string + /** + * The product description, which can include HTML formatting. + */ + description?: string + /** + * Number of views the category has on the storefront. + */ + views?: number + /** + * Priority this category will be given when included in the menu and category pages. The lower the number, the closer to the top of the results the category will be. + */ + sort_order?: number + /** + * Custom title for the category page. If not defined, the category name will be used as the meta title. + */ + page_title?: string + /** + * A comma-separated list of keywords that can be used to locate the category when searching the store. + */ + search_keywords?: string + /** + * Custom meta keywords for the category page. If not defined, the store's default keywords will be used. Must post as an array like: ["awesome","sauce"]. + */ + meta_keywords?: string[] + /** + * Custom meta description for the category page. If not defined, the store's default meta description will be used. + */ + meta_description?: string + /** + * A valid layout file. (Please refer to [this article](https://support.bigcommerce.com/articles/Public/Creating-Custom-Template-Files/) on creating category files.) This field is writable only for stores with a Blueprint theme applied. + */ + layout_file?: string + /** + * Flag to determine whether the product should be displayed to customers browsing the store. If `true`, the category will be displayed. If `false`, the category will be hidden from view. + */ + is_visible?: boolean + /** + * Determines how the products are sorted on category page load. + */ + default_product_sort?: + | 'use_store_settings' + | 'featured' + | 'newest' + | 'best_selling' + | 'alpha_asc' + | 'alpha_desc' + | 'avg_customer_review' + | 'price_asc' + | 'price_desc' + /** + * Image URL used for this category on the storefront. Images can be uploaded via form file post to `/categories/{categoryId}/image`, or by providing a publicly accessible URL in this field. + */ + image_url?: string + custom_url?: definitions['customUrl_Full'] + } + /** + * Common Brand properties. + */ + brand_Full: { + /** + * Unique ID of the *Brand*. Read-Only. + */ + id?: number + /** + * The name of the brand. Must be unique. + * Required in POST. + */ + name: string + /** + * The title shown in the browser while viewing the brand. + */ + page_title?: string + /** + * Comma-separated list of meta keywords to include in the HTML. + */ + meta_keywords?: string[] + /** + * A meta description to include. + */ + meta_description?: string + /** + * A comma-separated list of keywords that can be used to locate this brand. + */ + search_keywords?: string + /** + * Image URL used for this category on the storefront. Images can be uploaded via form file post to `/brands/{brandId}/image`, or by providing a publicly accessible URL in this field. + */ + image_url?: string + custom_url?: definitions['customUrl_Full'] + } + /** + * Common Variant properties. + */ + productVariant_Base: { + /** + * The cost price of the variant. Not affected by Price List prices. + */ + cost_price?: number + /** + * This variant's base price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is `null`, the product's default price (set in the Product resource's `price` field) will be used as the base price. + */ + price?: number + /** + * This variant's sale price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's sale price (set in the Product resource's `price` field) will be used as the sale price. + */ + sale_price?: number + /** + * This variant's retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's retail price (set in the Product resource's `price` field) will be used as the retail price. + */ + retail_price?: number + /** + * This variant's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. + */ + weight?: number + /** + * Width of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default width (set in the Product resource's `width` field) will be used as the base width. + */ + width?: number + /** + * Height of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default height (set in the Product resource's `height` field) will be used as the base height. + */ + height?: number + /** + * Depth of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default depth (set in the Product resource's `depth` field) will be used as the base depth. + */ + depth?: number + /** + * Flag used to indicate whether the variant has free shipping. If `true`, the shipping cost for the variant will be zero. + */ + is_free_shipping?: boolean + /** + * A fixed shipping cost for the variant. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * If `true`, this variant will not be purchasable on the storefront. + */ + purchasing_disabled?: boolean + /** + * If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected. + */ + purchasing_disabled_message?: string + /** + * The UPC code used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * Inventory level for the variant, which is used when the product's inventory_tracking is set to `variant`. + */ + inventory_level?: number + /** + * When the variant hits this inventory level, it is considered low stock. + */ + inventory_warning_level?: number + /** + * Identifies where in a warehouse the variant is located. + */ + bin_picking_number?: string + } + productVariant_Full: definitions['productVariant_Base'] & { + id?: number + product_id?: number + sku?: string + /** + * Read-only reference to v2 API's SKU ID. Null if it is a base variant. + */ + sku_id?: number + /** + * Array of option and option values IDs that make up this variant. Will be empty if the variant is the product's base variant. + */ + option_values?: definitions['productVariantOptionValue_Base'][] + /** + * The price of the variant as seen on the storefront. This price takes into account `sale_price` and any price adjustment rules that are applicable to this variant. + */ + calculated_price?: number + } + /** + * The model for a POST to create variants on a product. + */ + productVariant_Post: { + /** + * The cost price of the variant. Not affected by Price List prices. + */ + cost_price?: number + /** + * This variant's base price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is `null`, the product's default price (set in the Product resource's `price` field) will be used as the base price. + */ + price?: number + /** + * This variant's sale price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's sale price (set in the Product resource's `price` field) will be used as the sale price. + */ + sale_price?: number + /** + * This variant's retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's retail price (set in the Product resource's `price` field) will be used as the retail price. + */ + retail_price?: number + /** + * This variant's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. + */ + weight?: number + /** + * Width of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default width (set in the Product resource's `width` field) will be used as the base width. + */ + width?: number + /** + * Height of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default height (set in the Product resource's `height` field) will be used as the base height. + */ + height?: number + /** + * Depth of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default depth (set in the Product resource's `depth` field) will be used as the base depth. + */ + depth?: number + /** + * Flag used to indicate whether the variant has free shipping. If `true`, the shipping cost for the variant will be zero. + */ + is_free_shipping?: boolean + /** + * A fixed shipping cost for the variant. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * If `true`, this variant will not be purchasable on the storefront. + */ + purchasing_disabled?: boolean + /** + * If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected. + */ + purchasing_disabled_message?: string + /** + * The UPC code used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * Inventory level for the variant, which is used when the product's inventory_tracking is set to `variant`. + */ + inventory_level?: number + /** + * When the variant hits this inventory level, it is considered low stock. + */ + inventory_warning_level?: number + /** + * Identifies where in a warehouse the variant is located. + */ + bin_picking_number?: string + } & { + product_id?: number + sku?: string + /** + * Array of option and option values IDs that make up this variant. Will be empty if the variant is the product's base variant. + */ + option_values?: { id?: number; option_id?: number }[] + } + variantCollection_Put: definitions['productVariant_Full'][] + /** + * The model for a PUT to update variants on a product. + */ + variant_Put: { + /** + * The cost price of the variant. Not affected by Price List prices. + */ + cost_price?: number + /** + * This variant's base price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is `null`, the product's default price (set in the Product resource's `price` field) will be used as the base price. + */ + price?: number + /** + * This variant's sale price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's sale price (set in the Product resource's `price` field) will be used as the sale price. + */ + sale_price?: number + /** + * This variant's retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's retail price (set in the Product resource's `price` field) will be used as the retail price. + */ + retail_price?: number + /** + * This variant's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. + */ + weight?: number + /** + * Width of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default width (set in the Product resource's `width` field) will be used as the base width. + */ + width?: number + /** + * Height of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default height (set in the Product resource's `height` field) will be used as the base height. + */ + height?: number + /** + * Depth of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default depth (set in the Product resource's `depth` field) will be used as the base depth. + */ + depth?: number + /** + * Flag used to indicate whether the variant has free shipping. If `true`, the shipping cost for the variant will be zero. + */ + is_free_shipping?: boolean + /** + * A fixed shipping cost for the variant. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * If `true`, this variant will not be purchasable on the storefront. + */ + purchasing_disabled?: boolean + /** + * If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected. + */ + purchasing_disabled_message?: string + /** + * The UPC code used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * Inventory level for the variant, which is used when the product's inventory_tracking is set to `variant`. + */ + inventory_level?: number + /** + * When the variant hits this inventory level, it is considered low stock. + */ + inventory_warning_level?: number + /** + * Identifies where in a warehouse the variant is located. + */ + bin_picking_number?: string + } & { id?: number } + /** + * The model for a POST to create variants on a product. + */ + productVariant_Post_Product: definitions['productVariant_Base'] & { + sku?: string + option_values?: { + /** + * The name of the option. + */ + option_display_name?: string + /** + * The label of the option value. + */ + label?: string + }[] + } + /** + * The model for a PUT to update variants on a product. + */ + productVariant_Put_Product: { + /** + * The cost price of the variant. Not affected by Price List prices. + */ + cost_price?: number + /** + * This variant's base price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is `null`, the product's default price (set in the Product resource's `price` field) will be used as the base price. + */ + price?: number + /** + * This variant's sale price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's sale price (set in the Product resource's `price` field) will be used as the sale price. + */ + sale_price?: number + /** + * This variant's retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's retail price (set in the Product resource's `price` field) will be used as the retail price. + */ + retail_price?: number + /** + * This variant's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. + */ + weight?: number + /** + * Width of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default width (set in the Product resource's `width` field) will be used as the base width. + */ + width?: number + /** + * Height of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default height (set in the Product resource's `height` field) will be used as the base height. + */ + height?: number + /** + * Depth of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default depth (set in the Product resource's `depth` field) will be used as the base depth. + */ + depth?: number + /** + * Flag used to indicate whether the variant has free shipping. If `true`, the shipping cost for the variant will be zero. + */ + is_free_shipping?: boolean + /** + * A fixed shipping cost for the variant. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * If `true`, this variant will not be purchasable on the storefront. + */ + purchasing_disabled?: boolean + /** + * If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected. + */ + purchasing_disabled_message?: string + /** + * The UPC code used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * Inventory level for the variant, which is used when the product's inventory_tracking is set to `variant`. + */ + inventory_level?: number + /** + * When the variant hits this inventory level, it is considered low stock. + */ + inventory_warning_level?: number + /** + * Identifies where in a warehouse the variant is located. + */ + bin_picking_number?: string + product_id?: number + sku?: string + } + productVariantOptionValue_Full: { + /** + * The name of the option. + */ + option_display_name?: string + /** + * The label of the option value. + */ + label?: string + } & definitions['productVariantOptionValue_Base'] + /** + * The model for a POST to create option values on a product. + */ + productOptionValue_Post_Product: { + /** + * The name of the option. + */ + option_display_name?: string + /** + * The label of the option value. + */ + label?: string + } + /** + * Common Product Variant Option properties. + */ + productVariantOptionValue_Base: { id?: number; option_id?: number } + /** + * The model for a POST to create option values on a variant. + */ + productVariantOptionValue_Post: { id?: number; option_id?: number } + resp_productOptionValue: { + data?: definitions['productOptionOptionValue_Full'] + /** + * Empty meta object; may be used later. + */ + meta?: { ''?: string } + } + /** + * Common Product Option `option_value` properties. + */ + productOptionOptionValue_Base: { + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. If no data is available, returns `null`. + */ + value_data?: { [key: string]: any } + } + /** + * Product Option `option_value`. + */ + productOptionOptionValue_Full: definitions['productOptionOptionValue_Base'] & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + } + /** + * The model for a POST to create option values on a product. + */ + productOptionValue_Post: { + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } + /** + * The model for a PUT to update option values on a product. + */ + productOptionValue_Put: { + /** + * The flag for preselecting a value as the default on the storefront. This field is not supported for swatch options/modifiers. + */ + is_default?: boolean + /** + * The text display identifying the value on the storefront. Required in a /POST. + */ + label: string + /** + * The order in which the value will be displayed on the product page. Required in a /POST. + */ + sort_order: number + /** + * Extra data describing the value, based on the type of option or modifier with which the value is associated. The `swatch` type option can accept an array of `colors`, with up to three hexidecimal color keys; or an `image_url`, which is a full image URL path including protocol. The `product list` type option requires a `product_id`. The `checkbox` type option requires a boolean flag, called `checked_value`, to determine which value is considered to be the checked state. + */ + value_data?: { [key: string]: any } + } & { + /** + * The unique numeric ID of the value; increments sequentially. + */ + id?: number + } + /** + * Common ProductImage properties. + */ + productImage_Base: { + /** + * The local path to the original image file uploaded to BigCommerce. + */ + image_file?: string + /** + * Flag for identifying whether the image is used as the product's thumbnail. + */ + is_thumbnail?: boolean + /** + * The order in which the image will be displayed on the product page. Higher integers give the image a lower priority. When updating, if the image is given a lower priority, all images with a `sort_order` the same as or greater than the image's new `sort_order` value will have their `sort_order`s reordered. + */ + sort_order?: number + /** + * The description for the image. + */ + description?: string + /** + * Must be a fully qualified URL path, including protocol. Limit of 8MB per file. + */ + image_url?: string + } + /** + * The model for a POST to create an image on a product. + */ + productImage_Post: { + /** + * The unique numeric ID of the image; increments sequentially. + */ + id?: number + /** + * The unique numeric identifier for the product with which the image is associated. + */ + product_id?: number + /** + * The local path to the original image file uploaded to BigCommerce. + */ + image_file?: string + /** + * The zoom URL for this image. By default, this is used as the zoom image on product pages when zoom images are enabled. + */ + url_zoom?: string + /** + * The standard URL for this image. By default, this is used for product-page images. + */ + url_standard?: string + /** + * The thumbnail URL for this image. By default, this is the image size used on the category page and in side panels. + */ + url_thumbnail?: string + /** + * The tiny URL for this image. By default, this is the image size used for thumbnails beneath the product image on a product page. + */ + url_tiny?: string + /** + * The date on which the product image was modified. + */ + date_modified?: string + /** + * Flag for identifying whether the image is used as the product's thumbnail. + */ + is_thumbnail?: boolean + /** + * The order in which the image will be displayed on the product page. Higher integers give the image a lower priority. When updating, if the image is given a lower priority, all images with a `sort_order` the same as or greater than the image's new `sort_order` value will have their `sort_order`s reordered. + */ + sort_order?: number + /** + * The description for the image. + */ + description?: string + } & { + /** + * Must be a fully qualified URL path, including protocol. Limit of 8MB per file. + */ + image_url?: string + /** + * Must be sent as a multipart/form-data field in the request body. + */ + image_file?: string + } + /** + * The model for a PUT to update applicable Product Image fields. + */ + productImage_Put: { + /** + * The unique numeric ID of the image; increments sequentially. + */ + id?: number + /** + * The unique numeric identifier for the product with which the image is associated. + */ + product_id?: number + /** + * The local path to the original image file uploaded to BigCommerce. + */ + image_file?: string + /** + * The zoom URL for this image. By default, this is used as the zoom image on product pages when zoom images are enabled. + */ + url_zoom?: string + /** + * The standard URL for this image. By default, this is used for product-page images. + */ + url_standard?: string + /** + * The thumbnail URL for this image. By default, this is the image size used on the category page and in side panels. + */ + url_thumbnail?: string + /** + * The tiny URL for this image. By default, this is the image size used for thumbnails beneath the product image on a product page. + */ + url_tiny?: string + /** + * The date on which the product image was modified. + */ + date_modified?: string + /** + * Flag for identifying whether the image is used as the product's thumbnail. + */ + is_thumbnail?: boolean + /** + * The order in which the image will be displayed on the product page. Higher integers give the image a lower priority. When updating, if the image is given a lower priority, all images with a `sort_order` the same as or greater than the image's new `sort_order` value will have their `sort_order`s reordered. + */ + sort_order?: number + /** + * The description for the image. + */ + description?: string + } + /** + * The model for a POST to create a video on a product. + */ + productVideo_Base: { + /** + * The title for the video. If left blank, this will be filled in according to data on a host site. + */ + title?: string + /** + * The description for the video. If left blank, this will be filled in according to data on a host site. + */ + description?: string + /** + * The order in which the video will be displayed on the product page. Higher integers give the video a lower priority. When updating, if the video is given a lower priority, all videos with a `sort_order` the same as or greater than the video's new `sort_order` value will have their `sort_order`s reordered. + */ + sort_order?: number + /** + * The video type (a short name of a host site). + */ + type?: 'youtube' + /** + * The ID of the video on a host site. + */ + video_id?: string + } + /** + * A product video model. + */ + productVideo_Full: definitions['productVideo_Base'] & { + /** + * The unique numeric ID of the product video; increments sequentially. + */ + id?: number + /** + * The unique numeric identifier for the product with which the image is associated. + */ + product_id?: number + /** + * Length of the video. This will be filled in according to data on a host site. + */ + length?: string + } + /** + * The model for a POST to create a video on a product. + */ + productVideo_Post: definitions['productVideo_Base'] + /** + * The model for a PUT to update a video on a product. + */ + productVideo_Put: definitions['productVideo_Base'] & { + /** + * The unique numeric ID of the product video; increments sequentially. + */ + id?: number + } + productReview_Base: { + /** + * The title for the product review. + * Required in /POST. + */ + title: string + /** + * The text for the product review. + */ + text?: string + /** + * The status of the product review. Must be one of `approved`, `disapproved` or `pending`. + */ + status?: string + /** + * The rating of the product review. Must be one of 0, 1, 2, 3, 4, 5. + */ + rating?: number + /** + * The email of the reviewer. Must be a valid email, or an empty string. + */ + email?: string + /** + * The name of the reviewer. + */ + name?: string + /** + * Date the product was reviewed. Required in /POST. + */ + date_reviewed: string + } + /** + * A product review model. + */ + productReview_Full: definitions['productReview_Base'] & { + /** + * The unique numeric ID of the product review; increments sequentially. + */ + id?: number + /** + * The unique numeric identifier for the product with which the review is associated. + */ + product_id?: number + /** + * Date the product review was created. + */ + date_created?: string + /** + * Date the product review was modified. + */ + date_modified?: string + } + /** + * The model for a POST to create a product review. + */ + productReview_Post: { + /** + * The title for the product review. + * Required in /POST. + */ + title: string + /** + * The text for the product review. + */ + text?: string + /** + * The status of the product review. Must be one of `approved`, `disapproved` or `pending`. + */ + status?: string + /** + * The rating of the product review. Must be one of 0, 1, 2, 3, 4, 5. + */ + rating?: number + /** + * The email of the reviewer. Must be a valid email, or an empty string. + */ + email?: string + /** + * The name of the reviewer. + */ + name?: string + /** + * Date the product was reviewed. Required in /POST. + */ + date_reviewed: string + } + /** + * The model for a PUT to update a product review. + */ + productReview_Put: { + /** + * The title for the product review. + * Required in /POST. + */ + title: string + /** + * The text for the product review. + */ + text?: string + /** + * The status of the product review. Must be one of `approved`, `disapproved` or `pending`. + */ + status?: string + /** + * The rating of the product review. Must be one of 0, 1, 2, 3, 4, 5. + */ + rating?: number + /** + * The email of the reviewer. Must be a valid email, or an empty string. + */ + email?: string + /** + * The name of the reviewer. + */ + name?: string + /** + * Date the product was reviewed. Required in /POST. + */ + date_reviewed: string + } + /** + * Image Response returns for: + * * Create Variant Image + * * Create Modifier Image + * * Create Category Image + * * Create Brand Image + */ + resp_productImage: { + data?: definitions['productImage_Full'] + /** + * Empty meta object; may be used later. + */ + meta?: { [key: string]: any } + } + /** + * An object containing a publicly accessible image URL, or a form post that contains an image file. + */ + resourceImage_Full: { + /** + * A public URL for a GIF, JPEG, or PNG image. Limit of 8MB per file. + */ + image_url?: string + } + product_Post: definitions['product_Base'] & { + variants?: definitions['productVariant_Post_Product'] + } + /** + * The model for a PUT to update a product. + */ + product_Put: { + /** + * The unique numerical ID of the product; increments sequentially. + */ + id?: number + } & definitions['product_Base'] & { + variants?: definitions['productVariant_Put_Product'] + } + /** + * Catalog Summary object describes a lightweight summary of the catalog. + */ + catalogSummary_Full: { + /** + * A count of all inventory items in the catalog. + */ + inventory_count?: number + /** + * Total value of store's inventory. + */ + inventory_value?: number + /** + * ID of the category containing the most products. + */ + primary_category_id?: number + /** + * Name of the category containing the most products. + */ + primary_category_name?: string + /** + * Total number of variants + */ + variant_count?: number + /** + * Highest priced variant + */ + highest_variant_price?: number + /** + * Average price of all variants + */ + average_variant_price?: number + /** + * Lowest priced variant in the store + */ + lowest_variant_price?: string + oldest_variant_date?: string + newest_variant_date?: string + } + /** + * Metafield for products, categories, variants, and brands. The max number of metafields allowed on each product, category, variant, or brand is fifty. For more information, see [Platform Limits](https://support.bigcommerce.com/s/article/Platform-Limits) in the Help Center. + */ + metafield_Base: { + /** + * Unique ID of the *Metafield*. Read-Only. + */ + id?: number + /** + * Determines the visibility and writeability of the field by other API consumers. + * + * |Value|Description + * |-|-| + * |`app_only`|Private to the app that owns the field| + * |`read`|Visible to other API consumers| + * |`write`|Open for reading and writing by other API consumers| + * |`read_and_sf_access`|Visible to other API consumers, including on storefront| + * |`write_and_sf_access`|Open for reading and writing by other API consumers, including on storefront| + */ + permission_set: + | 'app_only' + | 'read' + | 'write' + | 'read_and_sf_access' + | 'write_and_sf_access' + /** + * Namespace for the metafield, for organizational purposes. This is set set by the developer. Required for POST. + */ + namespace: string + /** + * The name of the field, for example: `location_id`, `color`. Required for POST. + */ + key: string + /** + * The value of the field, for example: `1`, `blue`. Required for POST. + */ + value: string + /** + * Description for the metafields. + */ + description?: string + /** + * The type of resource with which the metafield is associated. + */ + resource_type?: 'category' | 'brand' | 'product' | 'variant' + /** + * The ID for the resource with which the metafield is associated. + */ + resource_id?: number + /** + * Date and time of the metafield's creation. Read-Only. + */ + date_created?: string + /** + * Date and time when the metafield was last updated. Read-Only. + */ + date_modified?: string + } + /** + * Common ComplexRule properties. + */ + complexRule_Base: { + /** + * The unique numeric ID of the rule; increments sequentially. + * Read-Only + */ + id?: number + /** + * The unique numeric ID of the product with which the rule is associated; increments sequentially. + */ + product_id?: number + /** + * The priority to give this rule when making adjustments to the product properties. + */ + sort_order?: number + /** + * Flag for determining whether the rule is to be used when adjusting a product's price, weight, image, or availabilty. + */ + enabled?: boolean + /** + * Flag for determining whether other rules should not be applied after this rule has been applied. + */ + stop?: boolean + /** + * Flag for determining whether the rule should disable purchasing of a product when the conditions are applied. + */ + purchasing_disabled?: boolean + /** + * Message displayed on the storefront when a rule disables the purchasing of a product. + */ + purchasing_disabled_message?: string + /** + * Flag for determining whether the rule should hide purchasing of a product when the conditions are applied. + */ + purchasing_hidden?: boolean + /** + * The URL for an image displayed on the storefront when the conditions are applied. Limit of 8MB per file. + */ + image_url?: string + price_adjuster?: definitions['adjuster_Full'] + weight_adjuster?: definitions['adjuster_Full'] + conditions?: definitions['complexRuleConditionBase'][] + } + /** + * Gets custom fields associated with a product. These allow you to specify additional information that will appear on the product's page, such as a book's ISBN or a DVD's release date. + */ + productCustomField_Base: { + /** + * The unique numeric ID of the custom field; increments sequentially. + * Read-Only + */ + id?: number + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + name: string + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + value: string + } + /** + * The model for a POST to create a custom field on a product. + */ + productCustomField_Post: { + /** + * The unique numeric ID of the custom field; increments sequentially. + * Read-Only + */ + id?: number + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + name: string + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + value: string + } + /** + * The model for a PUT to update a custom field on a product. + */ + productCustomField_Put: { + /** + * The unique numeric ID of the custom field; increments sequentially. + * Read-Only + */ + id?: number + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + name: string + /** + * The name of the field, shown on the storefront, orders, etc. Required for /POST + */ + value: string + } + /** + * Complex rules may return with conditions that apply to one or more variants, or with a single modifier value (if the rules were created using the v2 API or the control panel). Complex rules created or updated in the v3 API must have conditions that either reference multiple `modifier_value_id`'s, or else reference a `modifier_value_id` and a `variant_id`. + */ + complexRuleConditionBase: { + /** + * The unique numeric ID of the rule condition; increments sequentially. Read-Only + */ + id?: number + /** + * The unique numeric ID of the rule with which the condition is associated. + * Read-Only + */ + rule_id?: number + /** + * The unique numeric ID of the modifier with which the rule condition is associated. + * Required in /POST. + */ + modifier_id: number + /** + * The unique numeric ID of the modifier value with which the rule condition is associated. + * Required in /POST. + */ + modifier_value_id: number + /** + * The unique numeric ID of the variant with which the rule condition is associated. + * Required in /POST. + */ + variant_id: number + /** + * (READ-ONLY:) The unique numeric ID of the SKU (v2 API), or Combination, with which the rule condition is associated. This is to maintain cross-compatibility between v2 and v3. + */ + combination_id?: number + } + /** + * The custom URL for the category on the storefront. + */ + customUrl_Full: { + /** + * Category URL on the storefront. + */ + url?: string + /** + * Returns `true` if the URL has been changed from its default state (the auto-assigned URL that BigCommerce provides). + */ + is_customized?: boolean + } + /** + * Common Bulk Pricing Rule properties + */ + bulkPricingRule_Full: { + /** + * Unique ID of the *Bulk Pricing Rule*. Read-Only. + */ + id?: number + /** + * The minimum inclusive quantity of a product to satisfy this rule. Must be greater than or equal to zero. + * Required in /POST. + */ + quantity_min: number + /** + * The maximum inclusive quantity of a product to satisfy this rule. Must be greater than the `quantity_min` value – unless this field has a value of 0 (zero), in which case there will be no maximum bound for this rule. + * Required in /POST. + */ + quantity_max: number + /** + * The type of adjustment that is made. Values: `price` - the adjustment amount per product; `percent` - the adjustment as a percentage of the original price; `fixed` - the adjusted absolute price of the product. + * Required in /POST. + */ + type: 'price' | 'percent' | 'fixed' + /** + * The discount can be a fixed dollar amount or a percentage. For a fixed dollar amount enter it as an integer and the response will return as an integer. For percentage enter the amount as the percentage divided by 100 using string format. For example 10% percent would be “.10”. The response will return as an integer. + * Required in /POST. + */ + amount: number + } + /** + * The values for option config can vary based on the Modifier created. + */ + productOptionConfig_Full: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + /** + * Adjuster for Complex Rules. + */ + adjuster_Full: { + /** + * The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster?: 'relative' | 'percentage' + /** + * The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront. + */ + adjuster_value?: number + } + /** + * Errors during batch usage for the BigCommerce API. + */ + resp_variantBatchError: { + batch_errors?: (definitions['error_Base'] & { + errors?: { additionalProperties?: string } + })[] + } + /** + * Data about the response, including pagination and collection totals. + */ + metaCollection_Full: { pagination?: definitions['pagination_Full'] } + /** + * Data about the response, including pagination and collection totals. + */ + pagination_Full: { + /** + * Total number of items in the result set. + */ + total?: number + /** + * Total number of items in the collection response. + */ + count?: number + /** + * The amount of items returned in the collection per page, controlled by the limit parameter. + */ + per_page?: number + /** + * The page you are currently on within the collection. + */ + current_page?: number + /** + * The total number of pages in the collection. + */ + total_pages?: number + /** + * Pagination links for the previous and next parts of the whole collection. + */ + links?: { + /** + * Link to the previous page returned in the response. + */ + previous?: string + /** + * Link to the current page returned in the response. + */ + current?: string + /** + * Link to the next page returned in the response. + */ + next?: string + } + } + /** + * Empty meta object; may be used later. + */ + metaEmpty_Full: { [key: string]: any } + errorResponse_Full: definitions['error_Base'] & { + errors?: definitions['detailedErrors'] + } + /** + * Error payload for the BigCommerce API. + */ + error_Base: { + /** + * The HTTP status code. + */ + status?: number + /** + * The error title describing the particular error. + */ + title?: string + type?: string + instance?: string + } + /** + * Error payload for the BigCommerce API. + */ + errorNotFound: { + /** + * 404 HTTP status code. + */ + status?: number + /** + * The error title describing the particular error. + */ + title?: string + type?: string + instance?: string + } + /** + * A gift-certificate model. + */ + giftCertificate_Full: { + /** + * The gift-certificate code. + */ + code?: string + /** + * The balance on a gift certificate when it was purchased. + */ + original_balance?: number + /** + * The balance on a gift certificate at the time of this purchase. + */ + starting_balance?: number + /** + * The remaining balance on a gift certificate. + */ + remaining_balance?: number + /** + * The status of a gift certificate: `active` - gift certificate is active; `pending` - gift certificate purchase is pending; `disabled` - gift certificate is disabled; `expired` - gift certificate is expired. + */ + status?: 'active' | 'pending' | 'disabled' | 'expired' + } + /** + * No-content response for the BigCommerce API. + */ + errorNoContent: { + /** + * 204 HTTP status code. + */ + status?: number + /** + * The error title describing the situation. + */ + title?: string + type?: string + instance?: string + } + detailedErrors: { additionalProperties?: string } + product_Full: definitions['product_Base'] & { + /** + * The date on which the product was created. + */ + date_created?: string + /** + * The date on which the product was modified. + */ + date_modified?: string + /** + * ID of the product. Read Only. + */ + id?: number + /** + * The unique identifier of the base variant associated with a simple product. This value is `null` for complex products. + */ + base_variant_id?: number + /** + * The price of the product as seen on the storefront. It will be equal to the `sale_price`, if set, and the `price` if there is not a `sale_price`. + */ + calculated_price?: number + options?: definitions['productOption_Base'][] + modifiers?: definitions['productModifier_Full'][] + /** + * Minimum Advertised Price. + */ + map_price?: number + /** + * Indicates that the product is in an Option Set (legacy V2 concept). + */ + option_set_id?: number + /** + * Legacy template setting which controls if the option set shows up to the side of or below the product image and description. + */ + option_set_display?: string + } & { variants?: definitions['productVariant_Full'] } + /** + * Common ProductImage properties. + */ + productImage_Full: definitions['productImage_Base'] & { + /** + * The unique numeric ID of the image; increments sequentially. + */ + id?: number + /** + * The unique numeric identifier for the product with which the image is associated. + */ + product_id?: number + /** + * The zoom URL for this image. By default, this is used as the zoom image on product pages when zoom images are enabled. + */ + url_zoom?: string + /** + * The standard URL for this image. By default, this is used for product-page images. + */ + url_standard?: string + /** + * The thumbnail URL for this image. By default, this is the image size used on the category page and in side panels. + */ + url_thumbnail?: string + /** + * The tiny URL for this image. By default, this is the image size used for thumbnails beneath the product image on a product page. + */ + url_tiny?: string + /** + * The date on which the product image was modified. + */ + date_modified?: string + } + metafield_Post: definitions['metafield_Base'] + /** + * The model for batch updating products. + */ + product_Put_Collection: ({ + /** + * The unique numerical ID of the product; increments sequentially. Required on batch product `PUT` requests. + */ + id: number + } & definitions['product_Base'])[] + /** + * The values for option config can vary based on the Modifier created. + */ + config_Full: { + /** + * (date, text, multi_line_text, numbers_only_text) The default value. Shown on a date option as an ISO-8601–formatted string, or on a text option as a string. + */ + default_value?: string + /** + * (checkbox) Flag for setting the checkbox to be checked by default. + */ + checked_by_default?: boolean + /** + * (checkbox) Label displayed for the checkbox option. + */ + checkbox_label?: string + /** + * (date) Flag to limit the dates allowed to be entered on a date option. + */ + date_limited?: boolean + /** + * (date) The type of limit that is allowed to be entered on a date option. + */ + date_limit_mode?: 'earliest' | 'range' | 'latest' + /** + * (date) The earliest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_earliest_value?: string + /** + * (date) The latest date allowed to be entered on the date option, as an ISO-8601 formatted string. + */ + date_latest_value?: string + /** + * (file) The kind of restriction on the file types that can be uploaded with a file upload option. Values: `specific` - restricts uploads to particular file types; `all` - allows all file types. + */ + file_types_mode?: 'specific' | 'all' + /** + * (file) The type of files allowed to be uploaded if the `file_type_option` is set to `specific`. Values: + * `images` - Allows upload of image MIME types (`bmp`, `gif`, `jpg`, `jpeg`, `jpe`, `jif`, `jfif`, `jfi`, `png`, `wbmp`, `xbm`, `tiff`). `documents` - Allows upload of document MIME types (`txt`, `pdf`, `rtf`, `doc`, `docx`, `xls`, `xlsx`, `accdb`, `mdb`, `one`, `pps`, `ppsx`, `ppt`, `pptx`, `pub`, `odt`, `ods`, `odp`, `odg`, `odf`). + * `other` - Allows file types defined in the `file_types_other` array. + */ + file_types_supported?: string[] + /** + * (file) A list of other file types allowed with the file upload option. + */ + file_types_other?: string[] + /** + * (file) The maximum size for a file that can be used with the file upload option. This will still be limited by the server. + */ + file_max_size?: number + /** + * (text, multi_line_text) Flag to validate the length of a text or multi-line text input. + */ + text_characters_limited?: boolean + /** + * (text, multi_line_text) The minimum length allowed for a text or multi-line text option. + */ + text_min_length?: number + /** + * (text, multi_line_text) The maximum length allowed for a text or multi line text option. + */ + text_max_length?: number + /** + * (multi_line_text) Flag to validate the maximum number of lines allowed on a multi-line text input. + */ + text_lines_limited?: boolean + /** + * (multi_line_text) The maximum number of lines allowed on a multi-line text input. + */ + text_max_lines?: number + /** + * (numbers_only_text) Flag to limit the value of a number option. + */ + number_limited?: boolean + /** + * (numbers_only_text) The type of limit on values entered for a number option. + */ + number_limit_mode?: 'lowest' | 'highest' | 'range' + /** + * (numbers_only_text) The lowest allowed value for a number option if `number_limited` is true. + */ + number_lowest_value?: number + /** + * (numbers_only_text) The highest allowed value for a number option if `number_limited` is true. + */ + number_highest_value?: number + /** + * (numbers_only_text) Flag to limit the input on a number option to whole numbers only. + */ + number_integers_only?: boolean + /** + * (product_list, product_list_with_images) Flag for automatically adjusting inventory on a product included in the list. + */ + product_list_adjusts_inventory?: boolean + /** + * (product_list, product_list_with_images) Flag to add the optional product's price to the main product's price. + */ + product_list_adjusts_pricing?: boolean + /** + * (product_list, product_list_with_images) How to factor the optional product's weight and package dimensions into the shipping quote. Values: `none` - don't adjust; `weight` - use shipping weight only; `package` - use weight and dimensions. + */ + product_list_shipping_calc?: 'none' | 'weight' | 'package' + } + adjusters_Full: { + price?: definitions['adjuster_Full'] + weight?: definitions['adjuster_Full'] + /** + * The URL for an image displayed on the storefront when the modifier value is selected.Limit of 8MB per file. + */ + image_url?: string + purchasing_disabled?: { + /** + * Flag for whether the modifier value disables purchasing when selected on the storefront. This can be used for temporarily disabling a particular modifier value. + */ + status?: boolean + /** + * The message displayed on the storefront when the purchasing disabled status is `true`. + */ + message?: string + } + } + /** + * Variant properties used on: + * * `/catalog/products/variants` + * * `/catalog/variants` + */ + variant_Base: { + /** + * The cost price of the variant. Not affected by Price List prices. + */ + cost_price?: number + /** + * This variant's base price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is `null`, the product's default price (set in the Product resource's `price` field) will be used as the base price. + */ + price?: number + /** + * This variant's sale price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's sale price (set in the Product resource's `price` field) will be used as the sale price. + */ + sale_price?: number + /** + * This variant's retail price on the storefront. If a Price List ID is used, the Price List value will be used. If a Price List ID is not used, and this value is null, the product's retail price (set in the Product resource's `price` field) will be used as the retail price. + */ + retail_price?: number + /** + * This variant's base weight on the storefront. If this value is null, the product's default weight (set in the Product resource's weight field) will be used as the base weight. + */ + weight?: number + /** + * Width of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default width (set in the Product resource's `width` field) will be used as the base width. + */ + width?: number + /** + * Height of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default height (set in the Product resource's `height` field) will be used as the base height. + */ + height?: number + /** + * Depth of the variant, which can be used when calculating shipping costs. If this value is `null`, the product's default depth (set in the Product resource's `depth` field) will be used as the base depth. + */ + depth?: number + /** + * Flag used to indicate whether the variant has free shipping. If `true`, the shipping cost for the variant will be zero. + */ + is_free_shipping?: boolean + /** + * A fixed shipping cost for the variant. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * If `true`, this variant will not be purchasable on the storefront. + */ + purchasing_disabled?: boolean + /** + * If `purchasing_disabled` is `true`, this message should show on the storefront when the variant is selected. + */ + purchasing_disabled_message?: string + /** + * The UPC code used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * Inventory level for the variant, which is used when the product's inventory_tracking is set to `variant`. + */ + inventory_level?: number + /** + * When the variant hits this inventory level, it is considered low stock. + */ + inventory_warning_level?: number + /** + * Identifies where in a warehouse the variant is located. + */ + bin_picking_number?: string + } + /** + * Shared `Product` properties used in: + * * `POST` + * * `PUT` + * * `GET` + */ + product_Base: { + /** + * The product name. + */ + name?: string + /** + * The product type. One of: `physical` - a physical stock unit, `digital` - a digital download. + */ + type?: 'physical' | 'digital' + /** + * User defined product code/stock keeping unit (SKU). + */ + sku?: string + /** + * The product description, which can include HTML formatting. + */ + description?: string + /** + * Weight of the product, which can be used when calculating shipping costs. This is based on the unit set on the store + */ + weight?: number + /** + * Width of the product, which can be used when calculating shipping costs. + */ + width?: number + /** + * Depth of the product, which can be used when calculating shipping costs. + */ + depth?: number + /** + * Height of the product, which can be used when calculating shipping costs. + */ + height?: number + /** + * The price of the product. The price should include or exclude tax, based on the store settings. + */ + price?: number + /** + * The cost price of the product. Stored for reference only; it is not used or displayed anywhere on the store. + */ + cost_price?: number + /** + * The retail cost of the product. If entered, the retail cost price will be shown on the product page. + */ + retail_price?: number + /** + * If entered, the sale price will be used instead of value in the price field when calculating the product's cost. + */ + sale_price?: number + /** + * The ID of the tax class applied to the product. (NOTE: Value ignored if automatic tax is enabled.) + */ + tax_class_id?: number + /** + * Accepts AvaTax System Tax Codes, which identify products and services that fall into special sales-tax categories. By using these codes, merchants who subscribe to BigCommerce's Avalara Premium integration can calculate sales taxes more accurately. Stores without Avalara Premium will ignore the code when calculating sales tax. Do not pass more than one code. The codes are case-sensitive. For details, please see Avalara's documentation. + */ + product_tax_code?: string + /** + * An array of IDs for the categories to which this product belongs. When updating a product, if an array of categories is supplied, all product categories will be overwritten. Does not accept more than 1,000 ID values. + */ + categories?: number[] + /** + * A product can be added to an existing brand during a product /PUT or /POST. + */ + brand_id?: number + /** + * Current inventory level of the product. Simple inventory tracking must be enabled (See the `inventory_tracking` field) for this to take any effect. + */ + inventory_level?: number + /** + * Inventory warning level for the product. When the product's inventory level drops below the warning level, the store owner will be informed. Simple inventory tracking must be enabled (see the `inventory_tracking` field) for this to take any effect. + */ + inventory_warning_level?: number + /** + * The type of inventory tracking for the product. Values are: `none` - inventory levels will not be tracked; `product` - inventory levels will be tracked using the `inventory_level` and `inventory_warning_level` fields; `variant` - inventory levels will be tracked based on variants, which maintain their own warning levels and inventory levels. + */ + inventory_tracking?: 'none' | 'product' | 'variant' + /** + * A fixed shipping cost for the product. If defined, this value will be used during checkout instead of normal shipping-cost calculation. + */ + fixed_cost_shipping_price?: number + /** + * Flag used to indicate whether the product has free shipping. If `true`, the shipping cost for the product will be zero. + */ + is_free_shipping?: boolean + /** + * Flag to determine whether the product should be displayed to customers browsing the store. If `true`, the product will be displayed. If `false`, the product will be hidden from view. + */ + is_visible?: boolean + /** + * Flag to determine whether the product should be included in the `featured products` panel when viewing the store. + */ + is_featured?: boolean + /** + * An array of IDs for the related products. + */ + related_products?: number[] + /** + * Warranty information displayed on the product page. Can include HTML formatting. + */ + warranty?: string + /** + * The BIN picking number for the product. + */ + bin_picking_number?: string + /** + * The layout template file used to render this product category. This field is writable only for stores with a Blueprint theme applied. + */ + layout_file?: string + /** + * The product UPC code, which is used in feeds for shopping comparison sites and external channel integrations. + */ + upc?: string + /** + * A comma-separated list of keywords that can be used to locate the product when searching the store. + */ + search_keywords?: string + /** + * Availability of the product. Availability options are: `available` - the product can be purchased on the storefront; `disabled` - the product is listed in the storefront, but cannot be purchased; `preorder` - the product is listed for pre-orders. + */ + availability?: 'available' | 'disabled' | 'preorder' + /** + * Availability text displayed on the checkout page, under the product title. Tells the customer how long it will normally take to ship this product, such as: 'Usually ships in 24 hours.' + */ + availability_description?: string + /** + * Type of gift-wrapping options. Values: `any` - allow any gift-wrapping options in the store; `none` - disallow gift-wrapping on the product; `list` – provide a list of IDs in the `gift_wrapping_options_list` field. + */ + gift_wrapping_options_type?: 'any' | 'none' | 'list' + /** + * A list of gift-wrapping option IDs. + */ + gift_wrapping_options_list?: number[] + /** + * Priority to give this product when included in product lists on category pages and in search results. Lower integers will place the product closer to the top of the results. + */ + sort_order?: number + /** + * The product condition. Will be shown on the product page if the `is_condition_shown` field's value is `true`. Possible values: `New`, `Used`, `Refurbished`. + */ + condition?: 'New' | 'Used' | 'Refurbished' + /** + * Flag used to determine whether the product condition is shown to the customer on the product page. + */ + is_condition_shown?: boolean + /** + * The minimum quantity an order must contain, to be eligible to purchase this product. + */ + order_quantity_minimum?: number + /** + * The maximum quantity an order can contain when purchasing the product. + */ + order_quantity_maximum?: number + /** + * Custom title for the product page. If not defined, the product name will be used as the meta title. + */ + page_title?: string + /** + * Custom meta keywords for the product page. If not defined, the store's default keywords will be used. + */ + meta_keywords?: string[] + /** + * Custom meta description for the product page. If not defined, the store's default meta description will be used. + */ + meta_description?: string + /** + * The number of times the product has been viewed. + */ + view_count?: number + /** + * Pre-order release date. See the `availability` field for details on setting a product's availability to accept pre-orders. + */ + preorder_release_date?: string + /** + * Custom expected-date message to display on the product page. If undefined, the message defaults to the storewide setting. Can contain the `%%DATE%%` placeholder, which will be substituted for the release date. + */ + preorder_message?: string + /** + * If set to true then on the preorder release date the preorder status will automatically be removed. + * If set to false, then on the release date the preorder status **will not** be removed. It will need to be changed manually either in the + * control panel or using the API. Using the API set `availability` to `available`. + */ + is_preorder_only?: boolean + /** + * False by default, indicating that this product's price should be shown on the product page. If set to `true`, the price is hidden. (NOTE: To successfully set `is_price_hidden` to `true`, the `availability` value must be `disabled`.) + */ + is_price_hidden?: boolean + /** + * By default, an empty string. If `is_price_hidden` is `true`, the value of `price_hidden_label` is displayed instead of the price. (NOTE: To successfully set a non-empty string value with `is_price_hidden` set to `true`, the `availability` value must be `disabled`.) + */ + price_hidden_label?: string + custom_url?: definitions['customUrl_Full'] + /** + * Type of product, defaults to `product`. + */ + open_graph_type?: + | 'product' + | 'album' + | 'book' + | 'drink' + | 'food' + | 'game' + | 'movie' + | 'song' + | 'tv_show' + /** + * Title of the product, if not specified the product name will be used instead. + */ + open_graph_title?: string + /** + * Description to use for the product, if not specified then the meta_description will be used instead. + */ + open_graph_description?: string + /** + * Flag to determine if product description or open graph description is used. + */ + open_graph_use_meta_description?: boolean + /** + * Flag to determine if product name or open graph name is used. + */ + open_graph_use_product_name?: boolean + /** + * Flag to determine if product image or open graph image is used. + */ + open_graph_use_image?: boolean + /** + * The brand can be created during a product PUT or POST request. If the brand already exists then the product will be added. If not the brand will be created and the product added. If using `brand_name` it performs a fuzzy match and adds the brand. eg. "Common Good" and "Common good" are the same. Brand name does not return as part of a product response. Only the `brand_id`. + */ + 'brand_name or brand_id'?: string + /** + * Global Trade Item Number + */ + gtin?: string + /** + * Manufacturer Part Number + */ + mpn?: string + /** + * The total rating for the product. + */ + reviews_rating_sum?: number + /** + * The number of times the product has been rated. + */ + reviews_count?: number + /** + * The total quantity of this product sold. + */ + total_sold?: number + custom_fields?: definitions['productCustomField_Put'][] + bulk_pricing_rules?: definitions['bulkPricingRule_Full'][] + images?: definitions['productImage_Full'][] + primary_image?: definitions['productImage_Full'] + videos?: definitions['productVideo_Full'][] + } + /** + * Properties for updating metafields. + */ + metafield_Put: { + /** + * Unique ID of the *Metafield*. Read-Only. + */ + id?: number + } & definitions['metafield_Base'] + metafield_Full: definitions['metafield_Put'] & { + /** + * Date and time of the metafield's creation. Read-Only. + */ + date_created?: string + /** + * Date and time when the metafield was last updated. Read-Only. + */ + date_modified?: string + } + /** + * The model for a PUT to update variants on a product. + */ + productVariant_Put: definitions['productVariant_Base'] & { + product_id?: number + sku?: string + } +} diff --git a/packages/bigcommerce/src/api/definitions/store-content.ts b/packages/bigcommerce/src/api/definitions/store-content.ts new file mode 100644 index 0000000..f00c288 --- /dev/null +++ b/packages/bigcommerce/src/api/definitions/store-content.ts @@ -0,0 +1,329 @@ +/** + * This file was auto-generated by swagger-to-ts. + * Do not make direct changes to the file. + */ + +export interface definitions { + blogPost_Full: { + /** + * ID of this blog post. (READ-ONLY) + */ + id?: number + } & definitions['blogPost_Base'] + addresses: { + /** + * Full URL of where the resource is located. + */ + url?: string + /** + * Resource being accessed. + */ + resource?: string + } + formField: { + /** + * Name of the form field + */ + name?: string + /** + * Value of the form field + */ + value?: string + } + page_Full: { + /** + * ID of the page. + */ + id?: number + } & definitions['page_Base'] + redirect: { + /** + * Numeric ID of the redirect. + */ + id?: number + /** + * The path from which to redirect. + */ + path: string + forward: definitions['forward'] + /** + * URL of the redirect. READ-ONLY + */ + url?: string + } + forward: { + /** + * The type of redirect. If it is a `manual` redirect then type will always be manual. Dynamic redirects will have the type of the page. Such as product or category. + */ + type?: string + /** + * Reference of the redirect. Dynamic redirects will have the category or product number. Manual redirects will have the url that is being directed to. + */ + ref?: number + } + customer_Full: { + /** + * Unique numeric ID of this customer. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + */ + id?: number + /** + * Not returned in any responses, but accepts up to two fields allowing you to set the customer’s password. If a password is not supplied, it is generated automatically. For further information about using this object, please see the Customers resource documentation. + */ + _authentication?: { + force_reset?: string + password?: string + password_confirmation?: string + } + /** + * The name of the company for which the customer works. + */ + company?: string + /** + * First name of the customer. + */ + first_name: string + /** + * Last name of the customer. + */ + last_name: string + /** + * Email address of the customer. + */ + email: string + /** + * Phone number of the customer. + */ + phone?: string + /** + * Date on which the customer registered from the storefront or was created in the control panel. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + */ + date_created?: string + /** + * Date on which the customer updated their details in the storefront or was updated in the control panel. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + */ + date_modified?: string + /** + * The amount of credit the customer has. (Float, Float as String, Integer) + */ + store_credit?: string + /** + * The customer’s IP address when they signed up. + */ + registration_ip_address?: string + /** + * The group to which the customer belongs. + */ + customer_group_id?: number + /** + * Store-owner notes on the customer. + */ + notes?: string + /** + * Used to identify customers who fall into special sales-tax categories – in particular, those who are fully or partially exempt from paying sales tax. Can be blank, or can contain a single AvaTax code. (The codes are case-sensitive.) Stores that subscribe to BigCommerce’s Avalara Premium integration will use this code to determine how/whether to apply sales tax. Does not affect sales-tax calculations for stores that do not subscribe to Avalara Premium. + */ + tax_exempt_category?: string + /** + * Records whether the customer would like to receive marketing content from this store. READ-ONLY.This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + */ + accepts_marketing?: boolean + addresses?: definitions['addresses'] + /** + * Array of custom fields. This is a READ-ONLY field; do not set or modify its value in a POST or PUT request. + */ + form_fields?: definitions['formField'][] + /** + * Force a password change on next login. + */ + reset_pass_on_login?: boolean + } + categoryAccessLevel: { + /** + * + `all` - Customers can access all categories + * + `specific` - Customers can access a specific list of categories + * + `none` - Customers are prevented from viewing any of the categories in this group. + */ + type?: 'all' | 'specific' | 'none' + /** + * Is an array of category IDs and should be supplied only if `type` is specific. + */ + categories?: string[] + } + timeZone: { + /** + * a string identifying the time zone, in the format: /. + */ + name?: string + /** + * a negative or positive number, identifying the offset from UTC/GMT, in seconds, during winter/standard time. + */ + raw_offset?: number + /** + * "-/+" offset from UTC/GMT, in seconds, during summer/daylight saving time. + */ + dst_offset?: number + /** + * a boolean indicating whether this time zone observes daylight saving time. + */ + dst_correction?: boolean + date_format?: definitions['dateFormat'] + } + count_Response: { count?: number } + dateFormat: { + /** + * string that defines dates’ display format, in the pattern: M jS Y + */ + display?: string + /** + * string that defines the CSV export format for orders, customers, and products, in the pattern: M jS Y + */ + export?: string + /** + * string that defines dates’ extended-display format, in the pattern: M jS Y @ g:i A. + */ + extended_display?: string + } + blogTags: { tag?: string; post_ids?: number[] }[] + blogPost_Base: { + /** + * Title of this blog post. + */ + title: string + /** + * URL for the public blog post. + */ + url?: string + /** + * URL to preview the blog post. (READ-ONLY) + */ + preview_url?: string + /** + * Text body of the blog post. + */ + body: string + /** + * Tags to characterize the blog post. + */ + tags?: string[] + /** + * Summary of the blog post. (READ-ONLY) + */ + summary?: string + /** + * Whether the blog post is published. + */ + is_published?: boolean + published_date?: definitions['publishedDate'] + /** + * Published date in `ISO 8601` format. + */ + published_date_iso8601?: string + /** + * Description text for this blog post’s `` element. + */ + meta_description?: string + /** + * Keywords for this blog post’s `` element. + */ + meta_keywords?: string + /** + * Name of the blog post’s author. + */ + author?: string + /** + * Local path to a thumbnail uploaded to `product_images/` via [WebDav](https://support.bigcommerce.com/s/article/File-Access-WebDAV). + */ + thumbnail_path?: string + } + publishedDate: { timezone_type?: string; date?: string; timezone?: string } + /** + * Not returned in any responses, but accepts up to two fields allowing you to set the customer’s password. If a password is not supplied, it is generated automatically. For further information about using this object, please see the Customers resource documentation. + */ + authentication: { + force_reset?: string + password?: string + password_confirmation?: string + } + customer_Base: { [key: string]: any } + page_Base: { + /** + * ID of any parent Web page. + */ + parent_id?: number + /** + * `page`: free-text page + * `link`: link to another web address + * `rss_feed`: syndicated content from an RSS feed + * `contact_form`: When the store's contact form is used. + */ + type: 'page' | 'rss_feed' | 'contact_form' | 'raw' | 'link' + /** + * Where the page’s type is a contact form: object whose members are the fields enabled (in the control panel) for storefront display. Possible members are:`fullname`: full name of the customer submitting the form; `phone`: customer’s phone number, as submitted on the form; `companyname`: customer’s submitted company name; `orderno`: customer’s submitted order number; `rma`: customer’s submitted RMA (Return Merchandise Authorization) number. + */ + contact_fields?: string + /** + * Where the page’s type is a contact form: email address that receives messages sent via the form. + */ + email?: string + /** + * Page name, as displayed on the storefront. + */ + name: string + /** + * Relative URL on the storefront for this page. + */ + url?: string + /** + * Description contained within this page’s `` element. + */ + meta_description?: string + /** + * HTML or variable that populates this page’s `` element, in default/desktop view. Required in POST if page type is `raw`. + */ + body: string + /** + * HTML to use for this page's body when viewed in the mobile template (deprecated). + */ + mobile_body?: string + /** + * If true, this page has a mobile version. + */ + has_mobile_version?: boolean + /** + * If true, this page appears in the storefront’s navigation menu. + */ + is_visible?: boolean + /** + * If true, this page is the storefront’s home page. + */ + is_homepage?: boolean + /** + * Text specified for this page’s `` element. (If empty, the value of the name property is used.) + */ + meta_title?: string + /** + * Layout template for this page. This field is writable only for stores with a Blueprint theme applied. + */ + layout_file?: string + /** + * Order in which this page should display on the storefront. (Lower integers specify earlier display.) + */ + sort_order?: number + /** + * Comma-separated list of keywords that shoppers can use to locate this page when searching the store. + */ + search_keywords?: string + /** + * Comma-separated list of SEO-relevant keywords to include in the page’s `<meta/>` element. + */ + meta_keywords?: string + /** + * If page type is `rss_feed` the n this field is visisble. Required in POST required for `rss page` type. + */ + feed: string + /** + * If page type is `link` this field is returned. Required in POST to create a `link` page. + */ + link: string + content_type?: 'application/json' | 'text/javascript' | 'text/html' + } +} diff --git a/packages/bigcommerce/src/api/definitions/wishlist.ts b/packages/bigcommerce/src/api/definitions/wishlist.ts new file mode 100644 index 0000000..6ec21c1 --- /dev/null +++ b/packages/bigcommerce/src/api/definitions/wishlist.ts @@ -0,0 +1,142 @@ +/** + * This file was auto-generated by swagger-to-ts. + * Do not make direct changes to the file. + */ + +export interface definitions { + wishlist_Post: { + /** + * The customer id. + */ + customer_id: number + /** + * Whether the wishlist is available to the public. + */ + is_public?: boolean + /** + * The title of the wishlist. + */ + name?: string + /** + * Array of Wishlist items. + */ + items?: { + /** + * The ID of the product. + */ + product_id?: number + /** + * The variant ID of the product. + */ + variant_id?: number + }[] + } + wishlist_Put: { + /** + * The customer id. + */ + customer_id: number + /** + * Whether the wishlist is available to the public. + */ + is_public?: boolean + /** + * The title of the wishlist. + */ + name?: string + /** + * Array of Wishlist items. + */ + items?: { + /** + * The ID of the item + */ + id?: number + /** + * The ID of the product. + */ + product_id?: number + /** + * The variant ID of the item. + */ + variant_id?: number + }[] + } + wishlist_Full: { + /** + * Wishlist ID, provided after creating a wishlist with a POST. + */ + id?: number + /** + * The ID the customer to which the wishlist belongs. + */ + customer_id?: number + /** + * The Wishlist's name. + */ + name?: string + /** + * Whether the Wishlist is available to the public. + */ + is_public?: boolean + /** + * The token of the Wishlist. This is created internally within BigCommerce. The Wishlist ID is to be used for external apps. Read-Only + */ + token?: string + /** + * Array of Wishlist items + */ + items?: definitions['wishlistItem_Full'][] + } + wishlistItem_Full: { + /** + * The ID of the item + */ + id?: number + /** + * The ID of the product. + */ + product_id?: number + /** + * The variant ID of the item. + */ + variant_id?: number + } + wishlistItem_Post: { + /** + * The ID of the product. + */ + product_id?: number + /** + * The variant ID of the product. + */ + variant_id?: number + } + /** + * Data about the response, including pagination and collection totals. + */ + pagination: { + /** + * Total number of items in the result set. + */ + total?: number + /** + * Total number of items in the collection response. + */ + count?: number + /** + * The amount of items returned in the collection per page, controlled by the limit parameter. + */ + per_page?: number + /** + * The page you are currently on within the collection. + */ + current_page?: number + /** + * The total number of pages in the collection. + */ + total_pages?: number + } + error: { status?: number; title?: string; type?: string } + metaCollection: { pagination?: definitions['pagination'] } +} diff --git a/packages/bigcommerce/src/api/endpoints/cart/add-item.ts b/packages/bigcommerce/src/api/endpoints/cart/add-item.ts new file mode 100644 index 0000000..d2bb7ad --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/cart/add-item.ts @@ -0,0 +1,46 @@ +import { normalizeCart } from '../../../lib/normalize' +import { parseCartItem } from '../../utils/parse-item' +import getCartCookie from '../../utils/get-cart-cookie' +import type { CartEndpoint } from '.' + +const addItem: CartEndpoint['handlers']['addItem'] = async ({ + res, + body: { cartId, item }, + config, +}) => { + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + if (!item.quantity) item.quantity = 1 + + const options = { + method: 'POST', + body: JSON.stringify({ + line_items: [parseCartItem(item)], + ...(!cartId && config.storeChannelId + ? { channel_id: config.storeChannelId } + : {}), + }), + } + const { data } = cartId + ? await config.storeApiFetch( + `/v3/carts/${cartId}/items?include=line_items.physical_items.options,line_items.digital_items.options`, + options + ) + : await config.storeApiFetch( + '/v3/carts?include=line_items.physical_items.options,line_items.digital_items.options', + options + ) + + // Create or update the cart cookie + res.setHeader( + 'Set-Cookie', + getCartCookie(config.cartCookie, data.id, config.cartCookieMaxAge) + ) + res.status(200).json({ data: normalizeCart(data) }) +} + +export default addItem diff --git a/packages/bigcommerce/src/api/endpoints/cart/get-cart.ts b/packages/bigcommerce/src/api/endpoints/cart/get-cart.ts new file mode 100644 index 0000000..b6a7d88 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/cart/get-cart.ts @@ -0,0 +1,35 @@ +import { normalizeCart } from '../../../lib/normalize' +import { BigcommerceApiError } from '../../utils/errors' +import getCartCookie from '../../utils/get-cart-cookie' +import type { BigcommerceCart } from '../../../types/cart' +import type { CartEndpoint } from '.' + +// Return current cart info +const getCart: CartEndpoint['handlers']['getCart'] = async ({ + res, + body: { cartId }, + config, +}) => { + let result: { data?: BigcommerceCart } = {} + + if (cartId) { + try { + result = await config.storeApiFetch( + `/v3/carts/${cartId}?include=line_items.physical_items.options,line_items.digital_items.options` + ) + } catch (error) { + if (error instanceof BigcommerceApiError && error.status === 404) { + // Remove the cookie if it exists but the cart wasn't found + res.setHeader('Set-Cookie', getCartCookie(config.cartCookie)) + } else { + throw error + } + } + } + + res.status(200).json({ + data: result.data ? normalizeCart(result.data) : null, + }) +} + +export default getCart diff --git a/packages/bigcommerce/src/api/endpoints/cart/index.ts b/packages/bigcommerce/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..3766511 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/cart/index.ts @@ -0,0 +1,26 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import cartEndpoint from '@vercel/commerce/api/endpoints/cart' +import type { CartSchema } from '../../../types/cart' +import type { BigcommerceAPI } from '../..' +import getCart from './get-cart' +import addItem from './add-item' +import updateItem from './update-item' +import removeItem from './remove-item' + +export type CartAPI = GetAPISchema<BigcommerceAPI, CartSchema> + +export type CartEndpoint = CartAPI['endpoint'] + +export const handlers: CartEndpoint['handlers'] = { + getCart, + addItem, + updateItem, + removeItem, +} + +const cartApi = createEndpoint<CartAPI>({ + handler: cartEndpoint, + handlers, +}) + +export default cartApi diff --git a/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts b/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts new file mode 100644 index 0000000..baf10c8 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/cart/remove-item.ts @@ -0,0 +1,34 @@ +import { normalizeCart } from '../../../lib/normalize' +import getCartCookie from '../../utils/get-cart-cookie' +import type { CartEndpoint } from '.' + +const removeItem: CartEndpoint['handlers']['removeItem'] = async ({ + res, + body: { cartId, itemId }, + config, +}) => { + if (!cartId || !itemId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + const result = await config.storeApiFetch<{ data: any } | null>( + `/v3/carts/${cartId}/items/${itemId}?include=line_items.physical_items.options`, + { method: 'DELETE' } + ) + const data = result?.data ?? null + + res.setHeader( + 'Set-Cookie', + data + ? // Update the cart cookie + getCartCookie(config.cartCookie, cartId, config.cartCookieMaxAge) + : // Remove the cart cookie if the cart was removed (empty items) + getCartCookie(config.cartCookie) + ) + res.status(200).json({ data: data && normalizeCart(data) }) +} + +export default removeItem diff --git a/packages/bigcommerce/src/api/endpoints/cart/update-item.ts b/packages/bigcommerce/src/api/endpoints/cart/update-item.ts new file mode 100644 index 0000000..113553f --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/cart/update-item.ts @@ -0,0 +1,36 @@ +import { normalizeCart } from '../../../lib/normalize' +import { parseCartItem } from '../../utils/parse-item' +import getCartCookie from '../../utils/get-cart-cookie' +import type { CartEndpoint } from '.' + +const updateItem: CartEndpoint['handlers']['updateItem'] = async ({ + res, + body: { cartId, itemId, item }, + config, +}) => { + if (!cartId || !itemId || !item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + const { data } = await config.storeApiFetch( + `/v3/carts/${cartId}/items/${itemId}?include=line_items.physical_items.options`, + { + method: 'PUT', + body: JSON.stringify({ + line_item: parseCartItem(item), + }), + } + ) + + // Update the cart cookie + res.setHeader( + 'Set-Cookie', + getCartCookie(config.cartCookie, cartId, config.cartCookieMaxAge) + ) + res.status(200).json({ data: normalizeCart(data) }) +} + +export default updateItem diff --git a/packages/bigcommerce/src/api/endpoints/catalog/products/get-products.ts b/packages/bigcommerce/src/api/endpoints/catalog/products/get-products.ts new file mode 100644 index 0000000..f88a231 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/catalog/products/get-products.ts @@ -0,0 +1,79 @@ +import { Product } from '@vercel/commerce/types/product' +import { ProductsEndpoint } from '.' + +const SORT: { [key: string]: string | undefined } = { + latest: 'id', + trending: 'total_sold', + price: 'price', +} + +const LIMIT = 12 + +// Return current cart info +const getProducts: ProductsEndpoint['handlers']['getProducts'] = async ({ + res, + body: { search, categoryId, brandId, sort }, + config, + commerce, +}) => { + // Use a dummy base as we only care about the relative path + const url = new URL('/v3/catalog/products', 'http://a') + + url.searchParams.set('is_visible', 'true') + url.searchParams.set('limit', String(LIMIT)) + + if (search) url.searchParams.set('keyword', search) + + if (categoryId && Number.isInteger(Number(categoryId))) + url.searchParams.set('categories:in', String(categoryId)) + + if (brandId && Number.isInteger(Number(brandId))) + url.searchParams.set('brand_id', String(brandId)) + + if (sort) { + const [_sort, direction] = sort.split('-') + const sortValue = SORT[_sort] + + if (sortValue && direction) { + url.searchParams.set('sort', sortValue) + url.searchParams.set('direction', direction) + } + } + + // We only want the id of each product + url.searchParams.set('include_fields', 'id') + + const { data } = await config.storeApiFetch<{ data: { id: number }[] }>( + url.pathname + url.search + ) + + const ids = data.map((p) => String(p.id)) + const found = ids.length > 0 + + // We want the GraphQL version of each product + const graphqlData = await commerce.getAllProducts({ + variables: { first: LIMIT, ids }, + config, + }) + + // Put the products in an object that we can use to get them by id + const productsById = graphqlData.products.reduce<{ + [k: string]: Product + }>((prods, p) => { + prods[Number(p.id)] = p + return prods + }, {}) + + const products: Product[] = found ? [] : graphqlData.products + + // Populate the products array with the graphql products, in the order + // assigned by the list of entity ids + ids.forEach((id) => { + const product = productsById[id] + if (product) products.push(product) + }) + + res.status(200).json({ data: { products, found } }) +} + +export default getProducts diff --git a/packages/bigcommerce/src/api/endpoints/catalog/products/index.ts b/packages/bigcommerce/src/api/endpoints/catalog/products/index.ts new file mode 100644 index 0000000..2447243 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/catalog/products/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import productsEndpoint from '@vercel/commerce/api/endpoints/catalog/products' +import type { ProductsSchema } from '../../../../types/product' +import type { BigcommerceAPI } from '../../..' +import getProducts from './get-products' + +export type ProductsAPI = GetAPISchema<BigcommerceAPI, ProductsSchema> + +export type ProductsEndpoint = ProductsAPI['endpoint'] + +export const handlers: ProductsEndpoint['handlers'] = { getProducts } + +const productsApi = createEndpoint<ProductsAPI>({ + handler: productsEndpoint, + handlers, +}) + +export default productsApi diff --git a/packages/bigcommerce/src/api/endpoints/checkout/get-checkout.ts b/packages/bigcommerce/src/api/endpoints/checkout/get-checkout.ts new file mode 100644 index 0000000..e98e6ca --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/checkout/get-checkout.ts @@ -0,0 +1,90 @@ +import type { CheckoutEndpoint } from '.' +import getCustomerId from '../../utils/get-customer-id' +import jwt from 'jsonwebtoken' +import { uuid } from 'uuidv4' + +const fullCheckout = true + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ + req, + res, + config, +}) => { + const { cookies } = req + const cartId = cookies[config.cartCookie] + const customerToken = cookies[config.customerCookie] + if (!cartId) { + res.redirect('/cart') + return + } + const { data } = await config.storeApiFetch( + `/v3/carts/${cartId}/redirect_urls`, + { + method: 'POST', + } + ) + const customerId = + customerToken && (await getCustomerId({ customerToken, config })) + + //if there is a customer create a jwt token + if (!customerId) { + if (fullCheckout) { + res.redirect(data.checkout_url) + return + } + } else { + const dateCreated = Math.round(new Date().getTime() / 1000) + const payload = { + iss: config.storeApiClientId, + iat: dateCreated, + jti: uuid(), + operation: 'customer_login', + store_hash: config.storeHash, + customer_id: customerId, + channel_id: config.storeChannelId, + redirect_to: data.checkout_url.replace(config.storeUrl, ""), + } + let token = jwt.sign(payload, config.storeApiClientSecret!, { + algorithm: 'HS256', + }) + let checkouturl = `${config.storeUrl}/login/token/${token}` + console.log('checkouturl', checkouturl) + if (fullCheckout) { + res.redirect(checkouturl) + return + } + } + + // TODO: make the embedded checkout work too! + const html = ` + <!DOCTYPE html> + <html lang="en"> + <head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Checkout + + + + +
+ + + ` + + res.status(200) + res.setHeader('Content-Type', 'text/html') + res.write(html) + res.end() +} + +export default getCheckout diff --git a/packages/bigcommerce/src/api/endpoints/checkout/index.ts b/packages/bigcommerce/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..83bc4ae --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/checkout/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' +import type { CheckoutSchema } from '../../../types/checkout' +import type { BigcommerceAPI } from '../..' +import getCheckout from './get-checkout' + +export type CheckoutAPI = GetAPISchema + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/bigcommerce/src/api/endpoints/customer/address.ts b/packages/bigcommerce/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/bigcommerce/src/api/endpoints/customer/card.ts b/packages/bigcommerce/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/bigcommerce/src/api/endpoints/customer/get-logged-in-customer.ts b/packages/bigcommerce/src/api/endpoints/customer/get-logged-in-customer.ts new file mode 100644 index 0000000..4c93730 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/customer/get-logged-in-customer.ts @@ -0,0 +1,56 @@ +import type { GetLoggedInCustomerQuery } from '../../../../schema' +import type { CustomerEndpoint } from '.' + +export const getLoggedInCustomerQuery = /* GraphQL */ ` + query getLoggedInCustomer { + customer { + entityId + firstName + lastName + email + company + customerGroupId + notes + phone + addressCount + attributeCount + storeCredit { + value + currencyCode + } + } + } +` + +export type Customer = NonNullable + +const getLoggedInCustomer: CustomerEndpoint['handlers']['getLoggedInCustomer'] = + async ({ req, res, config }) => { + const token = req.cookies[config.customerCookie] + + if (token) { + const { data } = await config.fetch( + getLoggedInCustomerQuery, + undefined, + { + headers: { + cookie: `${config.customerCookie}=${token}`, + }, + } + ) + const { customer } = data + + if (!customer) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Customer not found', code: 'not_found' }], + }) + } + + return res.status(200).json({ data: { customer } }) + } + + res.status(200).json({ data: null }) + } + +export default getLoggedInCustomer diff --git a/packages/bigcommerce/src/api/endpoints/customer/index.ts b/packages/bigcommerce/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..5efff39 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/customer/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import customerEndpoint from '@vercel/commerce/api/endpoints/customer' +import type { CustomerSchema } from '../../../types/customer' +import type { BigcommerceAPI } from '../..' +import getLoggedInCustomer from './get-logged-in-customer' + +export type CustomerAPI = GetAPISchema + +export type CustomerEndpoint = CustomerAPI['endpoint'] + +export const handlers: CustomerEndpoint['handlers'] = { getLoggedInCustomer } + +const customerApi = createEndpoint({ + handler: customerEndpoint, + handlers, +}) + +export default customerApi diff --git a/packages/bigcommerce/src/api/endpoints/login/index.ts b/packages/bigcommerce/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..1ad6f71 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/login/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import loginEndpoint from '@vercel/commerce/api/endpoints/login' +import type { LoginSchema } from '../../../types/login' +import type { BigcommerceAPI } from '../..' +import login from './login' + +export type LoginAPI = GetAPISchema + +export type LoginEndpoint = LoginAPI['endpoint'] + +export const handlers: LoginEndpoint['handlers'] = { login } + +const loginApi = createEndpoint({ + handler: loginEndpoint, + handlers, +}) + +export default loginApi diff --git a/packages/bigcommerce/src/api/endpoints/login/login.ts b/packages/bigcommerce/src/api/endpoints/login/login.ts new file mode 100644 index 0000000..0ebc5b1 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/login/login.ts @@ -0,0 +1,49 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { LoginEndpoint } from '.' + +const invalidCredentials = /invalid credentials/i + +const login: LoginEndpoint['handlers']['login'] = async ({ + res, + body: { email, password }, + config, + commerce, +}) => { + // TODO: Add proper validations with something like Ajv + if (!(email && password)) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + // TODO: validate the password and email + // Passwords must be at least 7 characters and contain both alphabetic + // and numeric characters. + + try { + await commerce.login({ variables: { email, password }, config, res }) + } catch (error) { + // Check if the email and password didn't match an existing account + if ( + error instanceof FetcherError && + invalidCredentials.test(error.message) + ) { + return res.status(401).json({ + data: null, + errors: [ + { + message: + 'Cannot find an account that matches the provided credentials', + code: 'invalid_credentials', + }, + ], + }) + } + + throw error + } + + res.status(200).json({ data: null }) +} + +export default login diff --git a/packages/bigcommerce/src/api/endpoints/logout/index.ts b/packages/bigcommerce/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..94a246f --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/logout/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import logoutEndpoint from '@vercel/commerce/api/endpoints/logout' +import type { LogoutSchema } from '../../../types/logout' +import type { BigcommerceAPI } from '../..' +import logout from './logout' + +export type LogoutAPI = GetAPISchema + +export type LogoutEndpoint = LogoutAPI['endpoint'] + +export const handlers: LogoutEndpoint['handlers'] = { logout } + +const logoutApi = createEndpoint({ + handler: logoutEndpoint, + handlers, +}) + +export default logoutApi diff --git a/packages/bigcommerce/src/api/endpoints/logout/logout.ts b/packages/bigcommerce/src/api/endpoints/logout/logout.ts new file mode 100644 index 0000000..b90a8c3 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/logout/logout.ts @@ -0,0 +1,23 @@ +import { serialize } from 'cookie' +import type { LogoutEndpoint } from '.' + +const logout: LogoutEndpoint['handlers']['logout'] = async ({ + res, + body: { redirectTo }, + config, +}) => { + // Remove the cookie + res.setHeader( + 'Set-Cookie', + serialize(config.customerCookie, '', { maxAge: -1, path: '/' }) + ) + + // Only allow redirects to a relative URL + if (redirectTo?.startsWith('/')) { + res.redirect(redirectTo) + } else { + res.status(200).json({ data: null }) + } +} + +export default logout diff --git a/packages/bigcommerce/src/api/endpoints/signup/index.ts b/packages/bigcommerce/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..64521f9 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/signup/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import signupEndpoint from '@vercel/commerce/api/endpoints/signup' +import type { SignupSchema } from '../../../types/signup' +import type { BigcommerceAPI } from '../..' +import signup from './signup' + +export type SignupAPI = GetAPISchema + +export type SignupEndpoint = SignupAPI['endpoint'] + +export const handlers: SignupEndpoint['handlers'] = { signup } + +const singupApi = createEndpoint({ + handler: signupEndpoint, + handlers, +}) + +export default singupApi diff --git a/packages/bigcommerce/src/api/endpoints/signup/signup.ts b/packages/bigcommerce/src/api/endpoints/signup/signup.ts new file mode 100644 index 0000000..46c071b --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/signup/signup.ts @@ -0,0 +1,62 @@ +import { BigcommerceApiError } from '../../utils/errors' +import type { SignupEndpoint } from '.' + +const signup: SignupEndpoint['handlers']['signup'] = async ({ + res, + body: { firstName, lastName, email, password }, + config, + commerce, +}) => { + // TODO: Add proper validations with something like Ajv + if (!(firstName && lastName && email && password)) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + // TODO: validate the password and email + // Passwords must be at least 7 characters and contain both alphabetic + // and numeric characters. + + try { + await config.storeApiFetch('/v3/customers', { + method: 'POST', + body: JSON.stringify([ + { + first_name: firstName, + last_name: lastName, + email, + authentication: { + new_password: password, + }, + }, + ]), + }) + } catch (error) { + if (error instanceof BigcommerceApiError && error.status === 422) { + const hasEmailError = '0.email' in error.data?.errors + + // If there's an error with the email, it most likely means it's duplicated + if (hasEmailError) { + return res.status(400).json({ + data: null, + errors: [ + { + message: 'The email is already in use', + code: 'duplicated_email', + }, + ], + }) + } + } + + throw error + } + + // Login the customer right after creating it + await commerce.login({ variables: { email, password }, res, config }) + + res.status(200).json({ data: null }) +} + +export default signup diff --git a/packages/bigcommerce/src/api/endpoints/wishlist/add-item.ts b/packages/bigcommerce/src/api/endpoints/wishlist/add-item.ts new file mode 100644 index 0000000..734a644 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/wishlist/add-item.ts @@ -0,0 +1,67 @@ +import getCustomerWishlist from '../../operations/get-customer-wishlist' +import { parseWishlistItem } from '../../utils/parse-item' +import getCustomerId from '../../utils/get-customer-id' +import type { WishlistEndpoint } from '.' + +const addItem: WishlistEndpoint['handlers']['addItem'] = async ({ + res, + body: { customerToken, item }, + config, + commerce, +}) => { + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + try { + const customerId = + customerToken && (await getCustomerId({ customerToken, config })) + + if (!customerId) { + throw new Error('Invalid request. No CustomerId') + } + + let { wishlist } = await commerce.getCustomerWishlist({ + variables: { customerId }, + config, + }) + + if (!wishlist) { + // If user has no wishlist, then let's create one with new item + const { data } = await config.storeApiFetch('/v3/wishlists', { + method: 'POST', + body: JSON.stringify({ + name: 'Next.js Commerce Wishlist', + is_public: false, + customer_id: Number(customerId), + items: [parseWishlistItem(item)], + }), + }) + return res.status(200).json(data) + } + + // Existing Wishlist, let's add Item to Wishlist + const { data } = await config.storeApiFetch( + `/v3/wishlists/${wishlist.id}/items`, + { + method: 'POST', + body: JSON.stringify({ + items: [parseWishlistItem(item)], + }), + } + ) + + // Returns Wishlist + return res.status(200).json(data) + } catch (err: any) { + res.status(500).json({ + data: null, + errors: [{ message: err.message }], + }) + } +} + +export default addItem diff --git a/packages/bigcommerce/src/api/endpoints/wishlist/get-wishlist.ts b/packages/bigcommerce/src/api/endpoints/wishlist/get-wishlist.ts new file mode 100644 index 0000000..479a67c --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/wishlist/get-wishlist.ts @@ -0,0 +1,39 @@ +import type { Wishlist } from '../../../types/wishlist' +import type { WishlistEndpoint } from '.' +import getCustomerId from '../../utils/get-customer-id' +import getCustomerWishlist from '../../operations/get-customer-wishlist' + +// Return wishlist info +const getWishlist: WishlistEndpoint['handlers']['getWishlist'] = async ({ + res, + body: { customerToken, includeProducts }, + config, + commerce, +}) => { + let result: { data?: Wishlist } = {} + + if (customerToken) { + const customerId = + customerToken && (await getCustomerId({ customerToken, config })) + + if (!customerId) { + // If the customerToken is invalid, then this request is too + return res.status(404).json({ + data: null, + errors: [{ message: 'Wishlist not found' }], + }) + } + + const { wishlist } = await commerce.getCustomerWishlist({ + variables: { customerId }, + includeProducts, + config, + }) + + result = { data: wishlist } + } + + res.status(200).json({ data: result.data ?? null }) +} + +export default getWishlist diff --git a/packages/bigcommerce/src/api/endpoints/wishlist/index.ts b/packages/bigcommerce/src/api/endpoints/wishlist/index.ts new file mode 100644 index 0000000..8772822 --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/wishlist/index.ts @@ -0,0 +1,24 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import wishlistEndpoint from '@vercel/commerce/api/endpoints/wishlist' +import type { WishlistSchema } from '../../../types/wishlist' +import type { BigcommerceAPI } from '../..' +import getWishlist from './get-wishlist' +import addItem from './add-item' +import removeItem from './remove-item' + +export type WishlistAPI = GetAPISchema + +export type WishlistEndpoint = WishlistAPI['endpoint'] + +export const handlers: WishlistEndpoint['handlers'] = { + getWishlist, + addItem, + removeItem, +} + +const wishlistApi = createEndpoint({ + handler: wishlistEndpoint, + handlers, +}) + +export default wishlistApi diff --git a/packages/bigcommerce/src/api/endpoints/wishlist/remove-item.ts b/packages/bigcommerce/src/api/endpoints/wishlist/remove-item.ts new file mode 100644 index 0000000..9b19d9b --- /dev/null +++ b/packages/bigcommerce/src/api/endpoints/wishlist/remove-item.ts @@ -0,0 +1,39 @@ +import type { Wishlist } from '../../../types/wishlist' +import getCustomerWishlist from '../../operations/get-customer-wishlist' +import getCustomerId from '../../utils/get-customer-id' +import type { WishlistEndpoint } from '.' + +// Return wishlist info +const removeItem: WishlistEndpoint['handlers']['removeItem'] = async ({ + res, + body: { customerToken, itemId }, + config, + commerce, +}) => { + const customerId = + customerToken && (await getCustomerId({ customerToken, config })) + const { wishlist } = + (customerId && + (await commerce.getCustomerWishlist({ + variables: { customerId }, + config, + }))) || + {} + + if (!wishlist || !itemId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + const result = await config.storeApiFetch<{ data: Wishlist } | null>( + `/v3/wishlists/${wishlist.id}/items/${itemId}`, + { method: 'DELETE' } + ) + const data = result?.data ?? null + + res.status(200).json({ data }) +} + +export default removeItem diff --git a/packages/bigcommerce/src/api/fragments/category-tree.ts b/packages/bigcommerce/src/api/fragments/category-tree.ts new file mode 100644 index 0000000..e26f171 --- /dev/null +++ b/packages/bigcommerce/src/api/fragments/category-tree.ts @@ -0,0 +1,9 @@ +export const categoryTreeItemFragment = /* GraphQL */ ` + fragment categoryTreeItem on CategoryTreeItem { + entityId + name + path + description + productCount + } +` diff --git a/packages/bigcommerce/src/api/fragments/product.ts b/packages/bigcommerce/src/api/fragments/product.ts new file mode 100644 index 0000000..734e0ab --- /dev/null +++ b/packages/bigcommerce/src/api/fragments/product.ts @@ -0,0 +1,113 @@ +export const productPrices = /* GraphQL */ ` + fragment productPrices on Prices { + price { + value + currencyCode + } + salePrice { + value + currencyCode + } + retailPrice { + value + currencyCode + } + } +` + +export const swatchOptionFragment = /* GraphQL */ ` + fragment swatchOption on SwatchOptionValue { + isDefault + hexColors + } +` + +export const multipleChoiceOptionFragment = /* GraphQL */ ` + fragment multipleChoiceOption on MultipleChoiceOption { + values { + edges { + node { + label + ...swatchOption + } + } + } + } + + ${swatchOptionFragment} +` + +export const productInfoFragment = /* GraphQL */ ` + fragment productInfo on Product { + entityId + name + path + brand { + entityId + } + description + prices { + ...productPrices + } + images { + edges { + node { + urlOriginal + altText + isDefault + } + } + } + variants(first: 250) { + edges { + node { + entityId + defaultImage { + urlOriginal + altText + isDefault + } + } + } + } + productOptions { + edges { + node { + __typename + entityId + displayName + ...multipleChoiceOption + } + } + } + localeMeta: metafields(namespace: $locale, keys: ["name", "description"]) + @include(if: $hasLocale) { + edges { + node { + key + value + } + } + } + } + + ${productPrices} + ${multipleChoiceOptionFragment} +` + +export const productConnectionFragment = /* GraphQL */ ` + fragment productConnnection on ProductConnection { + pageInfo { + startCursor + endCursor + } + edges { + cursor + node { + ...productInfo + } + } + } + + ${productInfoFragment} +` diff --git a/packages/bigcommerce/src/api/index.ts b/packages/bigcommerce/src/api/index.ts new file mode 100644 index 0000000..bd5fcb3 --- /dev/null +++ b/packages/bigcommerce/src/api/index.ts @@ -0,0 +1,120 @@ +import type { RequestInit } from '@vercel/fetch' +import { + CommerceAPI, + CommerceAPIConfig, + getCommerceApi as commerceApi, +} from '@vercel/commerce/api' +import createFetchGraphqlApi from './utils/fetch-graphql-api' +import createFetchStoreApi from './utils/fetch-store-api' + +import type { CartAPI } from './endpoints/cart' +import type { CustomerAPI } from './endpoints/customer' +import type { LoginAPI } from './endpoints/login' +import type { LogoutAPI } from './endpoints/logout' +import type { SignupAPI } from './endpoints/signup' +import type { ProductsAPI } from './endpoints/catalog/products' +import type { WishlistAPI } from './endpoints/wishlist' + +import login from './operations/login' +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface BigcommerceConfig extends CommerceAPIConfig { + // Indicates if the returned metadata with translations should be applied to the + // data or returned as it is + applyLocale?: boolean + storeApiUrl: string + storeApiToken: string + storeApiClientId: string + storeChannelId?: string + storeUrl?: string + storeApiClientSecret?: string + storeHash?: string + storeApiFetch(endpoint: string, options?: RequestInit): Promise +} + +const API_URL = process.env.BIGCOMMERCE_STOREFRONT_API_URL // GraphAPI +const API_TOKEN = process.env.BIGCOMMERCE_STOREFRONT_API_TOKEN +const STORE_API_URL = process.env.BIGCOMMERCE_STORE_API_URL // REST API +const STORE_API_TOKEN = process.env.BIGCOMMERCE_STORE_API_TOKEN +const STORE_API_CLIENT_ID = process.env.BIGCOMMERCE_STORE_API_CLIENT_ID +const STORE_CHANNEL_ID = process.env.BIGCOMMERCE_CHANNEL_ID +const STORE_URL = process.env.BIGCOMMERCE_STORE_URL +const CLIENT_SECRET = process.env.BIGCOMMERCE_STORE_API_CLIENT_SECRET +const STOREFRONT_HASH = process.env.BIGCOMMERCE_STORE_API_STORE_HASH + +if (!API_URL) { + throw new Error( + `The environment variable BIGCOMMERCE_STOREFRONT_API_URL is missing and it's required to access your store` + ) +} + +if (!API_TOKEN) { + throw new Error( + `The environment variable BIGCOMMERCE_STOREFRONT_API_TOKEN is missing and it's required to access your store` + ) +} + +if (!(STORE_API_URL && STORE_API_TOKEN && STORE_API_CLIENT_ID)) { + throw new Error( + `The environment variables BIGCOMMERCE_STORE_API_URL, BIGCOMMERCE_STORE_API_TOKEN, BIGCOMMERCE_STORE_API_CLIENT_ID have to be set in order to access the REST API of your store` + ) +} + +const ONE_DAY = 60 * 60 * 24 + +const config: BigcommerceConfig = { + commerceUrl: API_URL, + apiToken: API_TOKEN, + customerCookie: 'SHOP_TOKEN', + cartCookie: process.env.BIGCOMMERCE_CART_COOKIE ?? 'bc_cartId', + cartCookieMaxAge: ONE_DAY * 30, + fetch: createFetchGraphqlApi(() => getCommerceApi().getConfig()), + applyLocale: true, + // REST API only + storeApiUrl: STORE_API_URL, + storeApiToken: STORE_API_TOKEN, + storeApiClientId: STORE_API_CLIENT_ID, + storeChannelId: STORE_CHANNEL_ID, + storeUrl: STORE_URL, + storeApiClientSecret: CLIENT_SECRET, + storeHash: STOREFRONT_HASH, + storeApiFetch: createFetchStoreApi(() => getCommerceApi().getConfig()), +} + +const operations = { + login, + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider + +export type APIs = + | CartAPI + | CustomerAPI + | LoginAPI + | LogoutAPI + | SignupAPI + | ProductsAPI + | WishlistAPI + +export type BigcommerceAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): BigcommerceAPI

{ + return commerceApi(customProvider) +} diff --git a/packages/bigcommerce/src/api/operations/get-all-pages.ts b/packages/bigcommerce/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..3117b73 --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-all-pages.ts @@ -0,0 +1,46 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { Page, GetAllPagesOperation } from '../../types/page' +import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import { BigcommerceConfig, Provider } from '..' + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllPages({ + config, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + const cfg = commerce.getConfig(config) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `url` + const { data } = await cfg.storeApiFetch< + RecursivePartial<{ data: Page[] }> + >('/v3/content/pages') + const pages = (data as RecursiveRequired) ?? [] + + return { + pages: preview ? pages : pages.filter((p) => p.is_visible), + } + } + + return getAllPages +} diff --git a/packages/bigcommerce/src/api/operations/get-all-product-paths.ts b/packages/bigcommerce/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..90cdab6 --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,66 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetAllProductPathsQuery } from '../../../schema' +import type { GetAllProductPathsOperation } from '../../types/product' +import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import filterEdges from '../utils/filter-edges' +import { BigcommerceConfig, Provider } from '..' + +export const getAllProductPathsQuery = /* GraphQL */ ` + query getAllProductPaths($first: Int = 100) { + site { + products(first: $first) { + edges { + node { + path + } + } + } + } + } +` + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: BigcommerceConfig + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: BigcommerceConfig + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + query = getAllProductPathsQuery, + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: BigcommerceConfig + } = {}): Promise { + config = commerce.getConfig(config) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { data } = await config.fetch< + RecursivePartial + >(query, { variables }) + const products = data.site?.products?.edges + + return { + products: filterEdges(products as RecursiveRequired).map( + ({ node }) => node + ), + } + } + return getAllProductPaths +} diff --git a/packages/bigcommerce/src/api/operations/get-all-products.ts b/packages/bigcommerce/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..2833ffc --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-all-products.ts @@ -0,0 +1,135 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { + GetAllProductsQuery, + GetAllProductsQueryVariables, +} from '../../../schema' +import type { GetAllProductsOperation } from '../../types/product' +import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import filterEdges from '../utils/filter-edges' +import setProductLocaleMeta from '../utils/set-product-locale-meta' +import { productConnectionFragment } from '../fragments/product' +import { BigcommerceConfig, Provider } from '..' +import { normalizeProduct } from '../../lib/normalize' + +export const getAllProductsQuery = /* GraphQL */ ` + query getAllProducts( + $hasLocale: Boolean = false + $locale: String = "null" + $entityIds: [Int!] + $first: Int = 10 + $products: Boolean = false + $featuredProducts: Boolean = false + $bestSellingProducts: Boolean = false + $newestProducts: Boolean = false + ) { + site { + products(first: $first, entityIds: $entityIds) @include(if: $products) { + ...productConnnection + } + featuredProducts(first: $first) @include(if: $featuredProducts) { + ...productConnnection + } + bestSellingProducts(first: $first) @include(if: $bestSellingProducts) { + ...productConnnection + } + newestProducts(first: $first) @include(if: $newestProducts) { + ...productConnnection + } + } + } + + ${productConnectionFragment} +` + +export type ProductEdge = NonNullable< + NonNullable[0] +> + +export type ProductNode = ProductEdge['node'] + +export type GetAllProductsResult< + T extends Record = { + products: ProductEdge[] + } +> = T + +function getProductsType( + relevance?: GetAllProductsOperation['variables']['relevance'] +) { + switch (relevance) { + case 'featured': + return 'featuredProducts' + case 'best_selling': + return 'bestSellingProducts' + case 'newest': + return 'newestProducts' + default: + return 'products' + } +} + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getAllProducts( + opts: { + variables?: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllProducts({ + query = getAllProductsQuery, + variables: vars = {}, + config: cfg, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + const { locale } = config + const field = getProductsType(vars.relevance) + const variables: GetAllProductsQueryVariables = { + locale, + hasLocale: !!locale, + } + + variables[field] = true + + if (vars.first) variables.first = vars.first + if (vars.ids) variables.entityIds = vars.ids.map((id) => Number(id)) + + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { data } = await config.fetch>( + query, + { variables } + ) + const edges = data.site?.[field]?.edges + const products = filterEdges(edges as RecursiveRequired) + + if (locale && config.applyLocale) { + products.forEach((product: RecursivePartial) => { + if (product.node) setProductLocaleMeta(product.node) + }) + } + + return { + products: products.map(({ node }) => normalizeProduct(node as any)), + } + } + + return getAllProducts +} diff --git a/packages/bigcommerce/src/api/operations/get-customer-wishlist.ts b/packages/bigcommerce/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..25e2157 --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,82 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { + GetCustomerWishlistOperation, + Wishlist, +} from '../../types/wishlist' +import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import { BigcommerceConfig, Provider } from '..' +import getAllProducts, { ProductEdge } from './get-all-products' + +export default function getCustomerWishlistOperation({ + commerce, +}: OperationContext) { + async function getCustomerWishlist< + T extends GetCustomerWishlistOperation + >(opts: { + variables: T['variables'] + config?: BigcommerceConfig + includeProducts?: boolean + }): Promise + + async function getCustomerWishlist( + opts: { + variables: T['variables'] + config?: BigcommerceConfig + includeProducts?: boolean + } & OperationOptions + ): Promise + + async function getCustomerWishlist({ + config, + variables, + includeProducts, + }: { + url?: string + variables: T['variables'] + config?: BigcommerceConfig + includeProducts?: boolean + }): Promise { + config = commerce.getConfig(config) + + const { data = [] } = await config.storeApiFetch< + RecursivePartial<{ data: Wishlist[] }> + >(`/v3/wishlists?customer_id=${variables.customerId}`) + + const wishlist = data[0] + + if (includeProducts && wishlist?.items?.length) { + const ids = wishlist.items + ?.map((item) => (item?.product_id ? String(item?.product_id) : null)) + .filter((id): id is string => !!id) + + if (ids?.length) { + const graphqlData = await commerce.getAllProducts({ + variables: { first: 50, ids }, + config, + }) + // Put the products in an object that we can use to get them by id + const productsById = graphqlData.products.reduce<{ + [k: number]: ProductEdge + }>((prods, p) => { + prods[Number(p.id)] = p as any + return prods + }, {}) + // Populate the wishlist items with the graphql products + wishlist.items.forEach((item) => { + const product = item && productsById[item.product_id!] + if (item && product) { + // @ts-ignore Fix this type when the wishlist type is properly defined + item.product = product + } + }) + } + } + + return { wishlist: wishlist as RecursiveRequired } + } + + return getCustomerWishlist +} diff --git a/packages/bigcommerce/src/api/operations/get-page.ts b/packages/bigcommerce/src/api/operations/get-page.ts new file mode 100644 index 0000000..dc38e50 --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-page.ts @@ -0,0 +1,54 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetPageOperation, Page } from '../../types/page' +import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import type { BigcommerceConfig, Provider } from '..' +import { normalizePage } from '../../lib/normalize' + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getPage( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getPage({ + url, + variables, + config, + preview, + }: { + url?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + const cfg = commerce.getConfig(config) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `url` + const { data } = await cfg.storeApiFetch< + RecursivePartial<{ data: Page[] }> + >(url || `/v3/content/pages?id=${variables.id}&include=body`) + const firstPage = data?.[0] + const page = firstPage as RecursiveRequired + + if (preview || page?.is_visible) { + return { page: normalizePage(page as any) } + } + return {} + } + + return getPage +} diff --git a/packages/bigcommerce/src/api/operations/get-product.ts b/packages/bigcommerce/src/api/operations/get-product.ts new file mode 100644 index 0000000..c7457de --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-product.ts @@ -0,0 +1,119 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetProductOperation } from '../../types/product' +import type { GetProductQuery, GetProductQueryVariables } from '../../../schema' +import setProductLocaleMeta from '../utils/set-product-locale-meta' +import { productInfoFragment } from '../fragments/product' +import { BigcommerceConfig, Provider } from '..' +import { normalizeProduct } from '../../lib/normalize' + +export const getProductQuery = /* GraphQL */ ` + query getProduct( + $hasLocale: Boolean = false + $locale: String = "null" + $path: String! + ) { + site { + route(path: $path) { + node { + __typename + ... on Product { + ...productInfo + variants(first: 250) { + edges { + node { + entityId + defaultImage { + urlOriginal + altText + isDefault + } + prices { + ...productPrices + } + inventory { + aggregated { + availableToSell + warningLevel + } + isInStock + } + productOptions { + edges { + node { + __typename + entityId + displayName + ...multipleChoiceOption + } + } + } + } + } + } + } + } + } + } + } + + ${productInfoFragment} +` + +// TODO: See if this type is useful for defining the Product type +// export type ProductNode = Extract< +// GetProductQuery['site']['route']['node'], +// { __typename: 'Product' } +// > + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getProduct(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getProduct( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getProduct({ + query = getProductQuery, + variables: { slug, ...vars }, + config: cfg, + }: { + query?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + const { locale } = config + const variables: GetProductQueryVariables = { + locale, + hasLocale: !!locale, + path: slug ? `/${slug}/` : vars.path!, + } + const { data } = await config.fetch(query, { variables }) + const product = data.site?.route?.node + + if (product?.__typename === 'Product') { + if (locale && config.applyLocale) { + setProductLocaleMeta(product) + } + + return { product: normalizeProduct(product as any) } + } + + return {} + } + return getProduct +} diff --git a/packages/bigcommerce/src/api/operations/get-site-info.ts b/packages/bigcommerce/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..ad0dd5e --- /dev/null +++ b/packages/bigcommerce/src/api/operations/get-site-info.ts @@ -0,0 +1,87 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetSiteInfoOperation } from '../../types/site' +import type { GetSiteInfoQuery } from '../../../schema' +import filterEdges from '../utils/filter-edges' +import type { BigcommerceConfig, Provider } from '..' +import { categoryTreeItemFragment } from '../fragments/category-tree' +import { normalizeCategory } from '../../lib/normalize' + +// Get 3 levels of categories +export const getSiteInfoQuery = /* GraphQL */ ` + query getSiteInfo { + site { + categoryTree { + ...categoryTreeItem + children { + ...categoryTreeItem + children { + ...categoryTreeItem + } + } + } + brands { + pageInfo { + startCursor + endCursor + } + edges { + cursor + node { + entityId + name + defaultImage { + urlOriginal + altText + } + pageTitle + metaDesc + metaKeywords + searchKeywords + path + } + } + } + } + } + ${categoryTreeItemFragment} +` + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getSiteInfo( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getSiteInfo({ + query = getSiteInfoQuery, + config, + }: { + query?: string + config?: Partial + preview?: boolean + } = {}): Promise { + const cfg = commerce.getConfig(config) + const { data } = await cfg.fetch(query) + const categories = data.site.categoryTree.map(normalizeCategory) + const brands = data.site?.brands?.edges + + return { + categories: categories ?? [], + brands: filterEdges(brands), + } + } + + return getSiteInfo +} diff --git a/packages/bigcommerce/src/api/operations/login.ts b/packages/bigcommerce/src/api/operations/login.ts new file mode 100644 index 0000000..f534999 --- /dev/null +++ b/packages/bigcommerce/src/api/operations/login.ts @@ -0,0 +1,79 @@ +import type { ServerResponse } from 'http' +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { LoginOperation } from '../../types/login' +import type { LoginMutation } from '../../../schema' +import type { RecursivePartial } from '../utils/types' +import concatHeader from '../utils/concat-cookie' +import type { BigcommerceConfig, Provider } from '..' + +export const loginMutation = /* GraphQL */ ` + mutation login($email: String!, $password: String!) { + login(email: $email, password: $password) { + result + } + } +` + +export default function loginOperation({ + commerce, +}: OperationContext) { + async function login(opts: { + variables: T['variables'] + config?: BigcommerceConfig + res: ServerResponse + }): Promise + + async function login( + opts: { + variables: T['variables'] + config?: BigcommerceConfig + res: ServerResponse + } & OperationOptions + ): Promise + + async function login({ + query = loginMutation, + variables, + res: response, + config, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: BigcommerceConfig + }): Promise { + config = commerce.getConfig(config) + + const { data, res } = await config.fetch>( + query, + { variables } + ) + // Bigcommerce returns a Set-Cookie header with the auth cookie + let cookie = res.headers.get('Set-Cookie') + + if (cookie && typeof cookie === 'string') { + // In development, don't set a secure cookie or the browser will ignore it + if (process.env.NODE_ENV !== 'production') { + cookie = cookie.replace('; Secure', '') + // SameSite=none can't be set unless the cookie is Secure + // bc seems to sometimes send back SameSite=None rather than none so make + // this case insensitive + cookie = cookie.replace(/; SameSite=none/gi, '; SameSite=lax') + } + + response.setHeader( + 'Set-Cookie', + concatHeader(response.getHeader('Set-Cookie'), cookie)! + ) + } + + return { + result: data.login?.result, + } + } + + return login +} diff --git a/packages/bigcommerce/src/api/utils/concat-cookie.ts b/packages/bigcommerce/src/api/utils/concat-cookie.ts new file mode 100644 index 0000000..362e12e --- /dev/null +++ b/packages/bigcommerce/src/api/utils/concat-cookie.ts @@ -0,0 +1,14 @@ +type Header = string | number | string[] | undefined + +export default function concatHeader(prev: Header, val: Header) { + if (!val) return prev + if (!prev) return val + + if (Array.isArray(prev)) return prev.concat(String(val)) + + prev = String(prev) + + if (Array.isArray(val)) return [prev].concat(val) + + return [prev, String(val)] +} diff --git a/packages/bigcommerce/src/api/utils/errors.ts b/packages/bigcommerce/src/api/utils/errors.ts new file mode 100644 index 0000000..77e2007 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/errors.ts @@ -0,0 +1,25 @@ +import type { Response } from '@vercel/fetch' + +// Used for GraphQL errors +export class BigcommerceGraphQLError extends Error {} + +export class BigcommerceApiError extends Error { + status: number + res: Response + data: any + + constructor(msg: string, res: Response, data?: any) { + super(msg) + this.name = 'BigcommerceApiError' + this.status = res.status + this.res = res + this.data = data + } +} + +export class BigcommerceNetworkError extends Error { + constructor(msg: string) { + super(msg) + this.name = 'BigcommerceNetworkError' + } +} diff --git a/packages/bigcommerce/src/api/utils/fetch-graphql-api.ts b/packages/bigcommerce/src/api/utils/fetch-graphql-api.ts new file mode 100644 index 0000000..ad385fe --- /dev/null +++ b/packages/bigcommerce/src/api/utils/fetch-graphql-api.ts @@ -0,0 +1,36 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { BigcommerceConfig } from '../index' +import fetch from './fetch' + +const fetchGraphqlApi: (getConfig: () => BigcommerceConfig) => GraphQLFetcher = + (getConfig) => + async (query: string, { variables, preview } = {}, fetchOptions) => { + // log.warn(query) + const config = getConfig() + const res = await fetch(config.commerceUrl + (preview ? '/preview' : ''), { + ...fetchOptions, + method: 'POST', + headers: { + Authorization: `Bearer ${config.apiToken}`, + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch Bigcommerce API' }], + status: res.status, + }) + } + + return { data: json.data, res } + } + +export default fetchGraphqlApi diff --git a/packages/bigcommerce/src/api/utils/fetch-store-api.ts b/packages/bigcommerce/src/api/utils/fetch-store-api.ts new file mode 100644 index 0000000..a44e895 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/fetch-store-api.ts @@ -0,0 +1,71 @@ +import type { FetchOptions, Response } from '@vercel/fetch' +import type { BigcommerceConfig } from '../index' +import { BigcommerceApiError, BigcommerceNetworkError } from './errors' +import fetch from './fetch' + +const fetchStoreApi = + (getConfig: () => BigcommerceConfig) => + async (endpoint: string, options?: FetchOptions): Promise => { + const config = getConfig() + let res: Response + + try { + res = await fetch(config.storeApiUrl + endpoint, { + ...options, + headers: { + ...options?.headers, + 'Content-Type': 'application/json', + 'X-Auth-Token': config.storeApiToken, + 'X-Auth-Client': config.storeApiClientId, + }, + }) + } catch (error: any) { + throw new BigcommerceNetworkError( + `Fetch to Bigcommerce failed: ${error.message}` + ) + } + + const contentType = res.headers.get('Content-Type') + const isJSON = contentType?.includes('application/json') + + if (!res.ok) { + const data = isJSON ? await res.json() : await getTextOrNull(res) + const headers = getRawHeaders(res) + const msg = `Big Commerce API error (${ + res.status + }) \nHeaders: ${JSON.stringify(headers, null, 2)}\n${ + typeof data === 'string' ? data : JSON.stringify(data, null, 2) + }` + + throw new BigcommerceApiError(msg, res, data) + } + + if (res.status !== 204 && !isJSON) { + throw new BigcommerceApiError( + `Fetch to Bigcommerce API failed, expected JSON content but found: ${contentType}`, + res + ) + } + + // If something was removed, the response will be empty + return res.status === 204 ? null : await res.json() + } +export default fetchStoreApi + +function getRawHeaders(res: Response) { + const headers: { [key: string]: string } = {} + + res.headers.forEach((value, key) => { + headers[key] = value + }) + + return headers +} + +function getTextOrNull(res: Response) { + try { + return res.text() + } catch (err) { + return null + } +} diff --git a/packages/bigcommerce/src/api/utils/fetch.ts b/packages/bigcommerce/src/api/utils/fetch.ts new file mode 100644 index 0000000..26f9ab6 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import vercelFetch from '@vercel/fetch' + +export default vercelFetch() diff --git a/packages/bigcommerce/src/api/utils/filter-edges.ts b/packages/bigcommerce/src/api/utils/filter-edges.ts new file mode 100644 index 0000000..09cd206 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/filter-edges.ts @@ -0,0 +1,5 @@ +export default function filterEdges( + edges: (T | null | undefined)[] | null | undefined +) { + return edges?.filter((edge): edge is T => !!edge) ?? [] +} diff --git a/packages/bigcommerce/src/api/utils/get-cart-cookie.ts b/packages/bigcommerce/src/api/utils/get-cart-cookie.ts new file mode 100644 index 0000000..7ca6cd5 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/get-cart-cookie.ts @@ -0,0 +1,20 @@ +import { serialize, CookieSerializeOptions } from 'cookie' + +export default function getCartCookie( + name: string, + cartId?: string, + maxAge?: number +) { + const options: CookieSerializeOptions = + cartId && maxAge + ? { + maxAge, + expires: new Date(Date.now() + maxAge * 1000), + secure: process.env.NODE_ENV === 'production', + path: '/', + sameSite: 'lax', + } + : { maxAge: -1, path: '/' } // Removes the cookie + + return serialize(name, cartId || '', options) +} diff --git a/packages/bigcommerce/src/api/utils/get-customer-id.ts b/packages/bigcommerce/src/api/utils/get-customer-id.ts new file mode 100644 index 0000000..7344e01 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/get-customer-id.ts @@ -0,0 +1,32 @@ +import type { GetCustomerIdQuery } from '../../../schema' +import type { BigcommerceConfig } from '../' + +export const getCustomerIdQuery = /* GraphQL */ ` + query getCustomerId { + customer { + entityId + } + } +` + +async function getCustomerId({ + customerToken, + config, +}: { + customerToken: string + config: BigcommerceConfig +}): Promise { + const { data } = await config.fetch( + getCustomerIdQuery, + undefined, + { + headers: { + cookie: `${config.customerCookie}=${customerToken}`, + }, + } + ) + + return String(data?.customer?.entityId) +} + +export default getCustomerId diff --git a/packages/bigcommerce/src/api/utils/parse-item.ts b/packages/bigcommerce/src/api/utils/parse-item.ts new file mode 100644 index 0000000..bb59a6e --- /dev/null +++ b/packages/bigcommerce/src/api/utils/parse-item.ts @@ -0,0 +1,28 @@ +import type { WishlistItemBody } from '../../types/wishlist' +import type { CartItemBody, OptionSelections } from '../../types/cart' + +type BCWishlistItemBody = { + product_id: number + variant_id: number +} + +type BCCartItemBody = { + product_id: number + variant_id: number + quantity?: number + option_selections?: OptionSelections[] +} + +export const parseWishlistItem = ( + item: WishlistItemBody +): BCWishlistItemBody => ({ + product_id: Number(item.productId), + variant_id: Number(item.variantId), +}) + +export const parseCartItem = (item: CartItemBody): BCCartItemBody => ({ + quantity: item.quantity, + product_id: Number(item.productId), + variant_id: Number(item.variantId), + option_selections: item.optionSelections, +}) diff --git a/packages/bigcommerce/src/api/utils/set-product-locale-meta.ts b/packages/bigcommerce/src/api/utils/set-product-locale-meta.ts new file mode 100644 index 0000000..7672864 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/set-product-locale-meta.ts @@ -0,0 +1,21 @@ +import type { ProductNode } from '../operations/get-all-products' +import type { RecursivePartial } from './types' + +export default function setProductLocaleMeta( + node: RecursivePartial +) { + if (node.localeMeta?.edges) { + node.localeMeta.edges = node.localeMeta.edges.filter((edge) => { + const { key, value } = edge?.node ?? {} + if (key && key in node) { + ;(node as any)[key] = value + return false + } + return true + }) + + if (!node.localeMeta.edges.length) { + delete node.localeMeta + } + } +} diff --git a/packages/bigcommerce/src/api/utils/types.ts b/packages/bigcommerce/src/api/utils/types.ts new file mode 100644 index 0000000..56f9c17 --- /dev/null +++ b/packages/bigcommerce/src/api/utils/types.ts @@ -0,0 +1,7 @@ +export type RecursivePartial = { + [P in keyof T]?: RecursivePartial +} + +export type RecursiveRequired = { + [P in keyof T]-?: RecursiveRequired +} diff --git a/packages/bigcommerce/src/auth/index.ts b/packages/bigcommerce/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/bigcommerce/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/bigcommerce/src/auth/use-login.tsx b/packages/bigcommerce/src/auth/use-login.tsx new file mode 100644 index 0000000..a71f159 --- /dev/null +++ b/packages/bigcommerce/src/auth/use-login.tsx @@ -0,0 +1,41 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import type { LoginHook } from '../types/login' +import useCustomer from '../customer/use-customer' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/login', + method: 'POST', + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'An email and password are required to login', + }) + } + + return fetch({ + ...options, + body: { email, password }, + }) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/bigcommerce/src/auth/use-logout.tsx b/packages/bigcommerce/src/auth/use-logout.tsx new file mode 100644 index 0000000..bc5c3a4 --- /dev/null +++ b/packages/bigcommerce/src/auth/use-logout.tsx @@ -0,0 +1,28 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import type { LogoutHook } from '../types/logout' +import useCustomer from '../customer/use-customer' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/logout', + method: 'GET', + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/bigcommerce/src/auth/use-signup.tsx b/packages/bigcommerce/src/auth/use-signup.tsx new file mode 100644 index 0000000..b06126d --- /dev/null +++ b/packages/bigcommerce/src/auth/use-signup.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import type { SignupHook } from '../types/signup' +import useCustomer from '../customer/use-customer' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/signup', + method: 'POST', + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } + + return fetch({ + ...options, + body: { firstName, lastName, email, password }, + }) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/bigcommerce/src/cart/index.ts b/packages/bigcommerce/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/bigcommerce/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/bigcommerce/src/cart/use-add-item.tsx b/packages/bigcommerce/src/cart/use-add-item.tsx new file mode 100644 index 0000000..f65e82b --- /dev/null +++ b/packages/bigcommerce/src/cart/use-add-item.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { AddItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/cart', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/bigcommerce/src/cart/use-cart.tsx b/packages/bigcommerce/src/cart/use-cart.tsx new file mode 100644 index 0000000..f8c4691 --- /dev/null +++ b/packages/bigcommerce/src/cart/use-cart.tsx @@ -0,0 +1,33 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' +import type { GetCartHook } from '@vercel/commerce/types/cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/cart', + method: 'GET', + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/bigcommerce/src/cart/use-remove-item.tsx b/packages/bigcommerce/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..8bea34f --- /dev/null +++ b/packages/bigcommerce/src/cart/use-remove-item.tsx @@ -0,0 +1,54 @@ +import { useCallback } from 'react' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' + +export type RemoveItemFn = T extends LineItem + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends LineItem + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + url: '/api/cart', + method: 'DELETE', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ ...options, body: { itemId } }) + }, + useHook: + ({ fetch }: MutationHookContext) => + (ctx: { item?: T } = {}) => { + const { item } = ctx + const { mutate } = useCart() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + await mutate(data, false) + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/bigcommerce/src/cart/use-update-item.tsx b/packages/bigcommerce/src/cart/use-update-item.tsx new file mode 100644 index 0000000..b15690e --- /dev/null +++ b/packages/bigcommerce/src/cart/use-update-item.tsx @@ -0,0 +1,84 @@ +import { useCallback } from 'react' +import debounce from 'lodash.debounce' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import type { LineItem, UpdateItemHook } from '@vercel/commerce/types/cart' +import { handler as removeItemHandler } from './use-remove-item' +import useCart from './use-cart' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler = { + fetchOptions: { + url: '/api/cart', + method: 'PUT', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + + return await fetch({ + ...options, + body: { itemId, item }, + }) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + itemId, + item: { productId, variantId, quantity: input.quantity }, + }, + }) + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/bigcommerce/src/checkout/use-checkout.tsx b/packages/bigcommerce/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..cab52bb --- /dev/null +++ b/packages/bigcommerce/src/checkout/use-checkout.tsx @@ -0,0 +1,14 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { UseCheckout } from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/bigcommerce/src/commerce.config.json b/packages/bigcommerce/src/commerce.config.json new file mode 100644 index 0000000..89ce562 --- /dev/null +++ b/packages/bigcommerce/src/commerce.config.json @@ -0,0 +1,7 @@ +{ + "provider": "bigcommerce", + "features": { + "wishlist": true, + "customerAuth": true + } +} diff --git a/packages/bigcommerce/src/customer/address/use-add-item.tsx b/packages/bigcommerce/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..fabd11b --- /dev/null +++ b/packages/bigcommerce/src/customer/address/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/bigcommerce/src/customer/card/use-add-item.tsx b/packages/bigcommerce/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..938e6cd --- /dev/null +++ b/packages/bigcommerce/src/customer/card/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/bigcommerce/src/customer/index.ts b/packages/bigcommerce/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/bigcommerce/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/bigcommerce/src/customer/use-customer.tsx b/packages/bigcommerce/src/customer/use-customer.tsx new file mode 100644 index 0000000..36bf886 --- /dev/null +++ b/packages/bigcommerce/src/customer/use-customer.tsx @@ -0,0 +1,26 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' +import type { CustomerHook } from '../types/customer' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/customer', + method: 'GET', + }, + async fetcher({ options, fetch }) { + const data = await fetch(options) + return data?.customer ?? null + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/bigcommerce/src/fetcher.ts b/packages/bigcommerce/src/fetcher.ts new file mode 100644 index 0000000..bc8a6b9 --- /dev/null +++ b/packages/bigcommerce/src/fetcher.ts @@ -0,0 +1,41 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { Fetcher } from '@vercel/commerce/utils/types' + +async function getText(res: Response) { + try { + return (await res.text()) || res.statusText + } catch (error) { + return res.statusText + } +} + +async function getError(res: Response) { + if (res.headers.get('Content-Type')?.includes('application/json')) { + const data = await res.json() + return new FetcherError({ errors: data.errors, status: res.status }) + } + return new FetcherError({ message: await getText(res), status: res.status }) +} + +const fetcher: Fetcher = async ({ + url, + method = 'GET', + variables, + body: bodyObj, +}) => { + const hasBody = Boolean(variables || bodyObj) + const body = hasBody + ? JSON.stringify(variables ? { variables } : bodyObj) + : undefined + const headers = hasBody ? { 'Content-Type': 'application/json' } : undefined + const res = await fetch(url!, { method, body, headers }) + + if (res.ok) { + const { data } = await res.json() + return data + } + + throw await getError(res) +} + +export default fetcher diff --git a/packages/bigcommerce/src/index.tsx b/packages/bigcommerce/src/index.tsx new file mode 100644 index 0000000..a7de609 --- /dev/null +++ b/packages/bigcommerce/src/index.tsx @@ -0,0 +1,9 @@ +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' +import { bigcommerceProvider, BigcommerceProvider } from './provider' + +export { bigcommerceProvider } +export type { BigcommerceProvider } + +export const CommerceProvider = getCommerceProvider(bigcommerceProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/bigcommerce/src/lib/get-slug.ts b/packages/bigcommerce/src/lib/get-slug.ts new file mode 100644 index 0000000..329c5a2 --- /dev/null +++ b/packages/bigcommerce/src/lib/get-slug.ts @@ -0,0 +1,5 @@ +// Remove trailing and leading slash, usually included in nodes +// returned by the BigCommerce API +const getSlug = (path: string) => path.replace(/^\/|\/$/g, '') + +export default getSlug diff --git a/packages/bigcommerce/src/lib/immutability.ts b/packages/bigcommerce/src/lib/immutability.ts new file mode 100644 index 0000000..488d357 --- /dev/null +++ b/packages/bigcommerce/src/lib/immutability.ts @@ -0,0 +1,13 @@ +import update, { Context } from 'immutability-helper' + +const c = new Context() + +c.extend('$auto', function (value, object) { + return object ? c.update(object, value) : c.update({}, value) +}) + +c.extend('$autoArray', function (value, object) { + return object ? c.update(object, value) : c.update([], value) +}) + +export default c.update diff --git a/packages/bigcommerce/src/lib/normalize.ts b/packages/bigcommerce/src/lib/normalize.ts new file mode 100644 index 0000000..059e3f8 --- /dev/null +++ b/packages/bigcommerce/src/lib/normalize.ts @@ -0,0 +1,136 @@ +import type { Product } from '../types/product' +import type { Cart, BigcommerceCart, LineItem } from '../types/cart' +import type { Page } from '../types/page' +import type { BCCategory, Category } from '../types/site' +import { definitions } from '../api/definitions/store-content' +import update from './immutability' +import getSlug from './get-slug' + +function normalizeProductOption(productOption: any) { + const { + node: { entityId, values: { edges = [] } = {}, ...rest }, + } = productOption + + return { + id: entityId, + values: edges?.map(({ node }: any) => node), + ...rest, + } +} + +export function normalizeProduct(productNode: any): Product { + const { + entityId: id, + productOptions, + prices, + path, + id: _, + options: _0, + } = productNode + + return update(productNode, { + id: { $set: String(id) }, + images: { + $apply: ({ edges }: any) => + edges?.map(({ node: { urlOriginal, altText, ...rest } }: any) => ({ + url: urlOriginal, + alt: altText, + ...rest, + })), + }, + variants: { + $apply: ({ edges }: any) => + edges?.map(({ node: { entityId, productOptions, ...rest } }: any) => ({ + id: entityId, + options: productOptions?.edges + ? productOptions.edges.map(normalizeProductOption) + : [], + ...rest, + })), + }, + options: { + $set: productOptions.edges + ? productOptions?.edges.map(normalizeProductOption) + : [], + }, + brand: { + $apply: (brand: any) => (brand?.entityId ? brand?.entityId : null), + }, + slug: { + $set: path?.replace(/^\/+|\/+$/g, ''), + }, + price: { + $set: { + value: prices?.price.value, + currencyCode: prices?.price.currencyCode, + }, + }, + $unset: ['entityId'], + }) +} + +export function normalizePage(page: definitions['page_Full']): Page { + return { + id: String(page.id), + name: page.name, + is_visible: page.is_visible, + sort_order: page.sort_order, + body: page.body, + } +} + +export function normalizeCart(data: BigcommerceCart): Cart { + return { + id: data.id, + customerId: String(data.customer_id), + email: data.email, + createdAt: data.created_time, + currency: data.currency, + taxesIncluded: data.tax_included, + lineItems: [ + ...data.line_items.physical_items.map(normalizeLineItem), + ...data.line_items.digital_items.map(normalizeLineItem), + ], + lineItemsSubtotalPrice: data.base_amount, + subtotalPrice: data.base_amount + data.discount_amount, + totalPrice: data.cart_amount, + discounts: data.discounts?.map((discount) => ({ + value: discount.discounted_amount, + })), + } +} + +function normalizeLineItem(item: any): LineItem { + return { + id: item.id, + variantId: String(item.variant_id), + productId: String(item.product_id), + name: item.name, + quantity: item.quantity, + variant: { + id: String(item.variant_id), + sku: item.sku, + name: item.name, + image: { + url: item.image_url, + }, + requiresShipping: item.is_require_shipping, + price: item.sale_price, + listPrice: item.list_price, + }, + options: item.options, + path: item.url.split('/')[3], + discounts: item.discounts.map((discount: any) => ({ + value: discount.discounted_amount, + })), + } +} + +export function normalizeCategory(category: BCCategory): Category { + return { + id: `${category.entityId}`, + name: category.name, + slug: getSlug(category.path), + path: category.path, + } +} diff --git a/packages/bigcommerce/src/next.config.cjs b/packages/bigcommerce/src/next.config.cjs new file mode 100644 index 0000000..f33b166 --- /dev/null +++ b/packages/bigcommerce/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['cdn11.bigcommerce.com'], + }, +} diff --git a/packages/bigcommerce/src/product/index.ts b/packages/bigcommerce/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/bigcommerce/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/bigcommerce/src/product/use-price.tsx b/packages/bigcommerce/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/bigcommerce/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/bigcommerce/src/product/use-search.tsx b/packages/bigcommerce/src/product/use-search.tsx new file mode 100644 index 0000000..fd918e3 --- /dev/null +++ b/packages/bigcommerce/src/product/use-search.tsx @@ -0,0 +1,52 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import type { SearchProductsHook } from '../types/product' + +export default useSearch as UseSearch + +export type SearchProductsInput = { + search?: string + categoryId?: number | string + brandId?: number + sort?: string + locale?: string +} + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/catalog/products', + method: 'GET', + }, + fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (search) url.searchParams.set('search', search) + if (Number.isInteger(Number(categoryId))) + url.searchParams.set('categoryId', String(categoryId)) + if (Number.isInteger(brandId)) + url.searchParams.set('brandId', String(brandId)) + if (sort) url.searchParams.set('sort', sort) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/bigcommerce/src/provider.ts b/packages/bigcommerce/src/provider.ts new file mode 100644 index 0000000..1968554 --- /dev/null +++ b/packages/bigcommerce/src/provider.ts @@ -0,0 +1,34 @@ +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useWishlist } from './wishlist/use-wishlist' +import { handler as useWishlistAddItem } from './wishlist/use-add-item' +import { handler as useWishlistRemoveItem } from './wishlist/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import fetcher from './fetcher' + +export const bigcommerceProvider = { + locale: 'en-us', + cartCookie: 'bc_cartId', + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + wishlist: { + useWishlist, + useAddItem: useWishlistAddItem, + useRemoveItem: useWishlistRemoveItem, + }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type BigcommerceProvider = typeof bigcommerceProvider diff --git a/packages/bigcommerce/src/types/cart.ts b/packages/bigcommerce/src/types/cart.ts new file mode 100644 index 0000000..3b5d828 --- /dev/null +++ b/packages/bigcommerce/src/types/cart.ts @@ -0,0 +1,66 @@ +import * as Core from '@vercel/commerce/types/cart' + +export * from '@vercel/commerce/types/cart' + +// TODO: this type should match: +// https://developer.bigcommerce.com/api-reference/cart-checkout/server-server-cart-api/cart/getacart#responses +export type BigcommerceCart = { + id: string + parent_id?: string + customer_id: number + email: string + currency: { code: string } + tax_included: boolean + base_amount: number + discount_amount: number + cart_amount: number + line_items: { + custom_items: any[] + digital_items: any[] + gift_certificates: any[] + physical_items: any[] + } + created_time: string + discounts?: { id: number; discounted_amount: number }[] + // TODO: add missing fields +} + +/** + * Extend core cart types + */ + +export type Cart = Core.Cart & { + lineItems: Core.LineItem[] +} + +export type OptionSelections = { + option_id: number + option_value: number | string +} + +export type CartItemBody = Core.CartItemBody & { + productId: string // The product id is always required for BC + optionSelections?: OptionSelections[] +} + +export type CartTypes = { + cart: Cart + item: Core.LineItem + itemBody: CartItemBody +} + +export type CartHooks = Core.CartHooks + +export type GetCartHook = CartHooks['getCart'] +export type AddItemHook = CartHooks['addItem'] +export type UpdateItemHook = CartHooks['updateItem'] +export type RemoveItemHook = CartHooks['removeItem'] + +export type CartSchema = Core.CartSchema + +export type CartHandlers = Core.CartHandlers + +export type GetCartHandler = CartHandlers['getCart'] +export type AddItemHandler = CartHandlers['addItem'] +export type UpdateItemHandler = CartHandlers['updateItem'] +export type RemoveItemHandler = CartHandlers['removeItem'] diff --git a/packages/bigcommerce/src/types/checkout.ts b/packages/bigcommerce/src/types/checkout.ts new file mode 100644 index 0000000..d139db6 --- /dev/null +++ b/packages/bigcommerce/src/types/checkout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/checkout' diff --git a/packages/bigcommerce/src/types/common.ts b/packages/bigcommerce/src/types/common.ts new file mode 100644 index 0000000..23b8daa --- /dev/null +++ b/packages/bigcommerce/src/types/common.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/common' diff --git a/packages/bigcommerce/src/types/customer.ts b/packages/bigcommerce/src/types/customer.ts new file mode 100644 index 0000000..6e66366 --- /dev/null +++ b/packages/bigcommerce/src/types/customer.ts @@ -0,0 +1,5 @@ +import * as Core from '@vercel/commerce/types/customer' + +export * from '@vercel/commerce/types/customer' + +export type CustomerSchema = Core.CustomerSchema diff --git a/packages/bigcommerce/src/types/index.ts b/packages/bigcommerce/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/bigcommerce/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/bigcommerce/src/types/login.ts b/packages/bigcommerce/src/types/login.ts new file mode 100644 index 0000000..eff27ca --- /dev/null +++ b/packages/bigcommerce/src/types/login.ts @@ -0,0 +1,8 @@ +import * as Core from '@vercel/commerce/types/login' +import type { LoginMutationVariables } from '../../schema' + +export * from '@vercel/commerce/types/login' + +export type LoginOperation = Core.LoginOperation & { + variables: LoginMutationVariables +} diff --git a/packages/bigcommerce/src/types/logout.ts b/packages/bigcommerce/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/bigcommerce/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/bigcommerce/src/types/page.ts b/packages/bigcommerce/src/types/page.ts new file mode 100644 index 0000000..ccbc29f --- /dev/null +++ b/packages/bigcommerce/src/types/page.ts @@ -0,0 +1,11 @@ +import * as Core from '@vercel/commerce/types/page' +export * from '@vercel/commerce/types/page' + +export type Page = Core.Page + +export type PageTypes = { + page: Page +} + +export type GetAllPagesOperation = Core.GetAllPagesOperation +export type GetPageOperation = Core.GetPageOperation diff --git a/packages/bigcommerce/src/types/product.ts b/packages/bigcommerce/src/types/product.ts new file mode 100644 index 0000000..72ca02f --- /dev/null +++ b/packages/bigcommerce/src/types/product.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/product' diff --git a/packages/bigcommerce/src/types/signup.ts b/packages/bigcommerce/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/bigcommerce/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/bigcommerce/src/types/site.ts b/packages/bigcommerce/src/types/site.ts new file mode 100644 index 0000000..5c3074c --- /dev/null +++ b/packages/bigcommerce/src/types/site.ts @@ -0,0 +1,19 @@ +import * as Core from '@vercel/commerce/types/site' +import type { GetSiteInfoQuery, GetSiteInfoQueryVariables } from '../../schema' + +export * from '@vercel/commerce/types/site' + +export type BCCategory = NonNullable< + GetSiteInfoQuery['site']['categoryTree'] +>[0] + +export type Brand = NonNullable< + NonNullable[0] +> + +export type SiteTypes = { + category: Core.Category + brand: Brand +} + +export type GetSiteInfoOperation = Core.GetSiteInfoOperation diff --git a/packages/bigcommerce/src/types/wishlist.ts b/packages/bigcommerce/src/types/wishlist.ts new file mode 100644 index 0000000..67cf58c --- /dev/null +++ b/packages/bigcommerce/src/types/wishlist.ts @@ -0,0 +1,24 @@ +import * as Core from '@vercel/commerce/types/wishlist' +import { definitions } from '../api/definitions/wishlist' +import type { ProductEdge } from '../api/operations/get-all-products' + +export * from '@vercel/commerce/types/wishlist' + +export type WishlistItem = NonNullable< + definitions['wishlist_Full']['items'] +>[0] & { + product?: ProductEdge['node'] +} + +export type Wishlist = Omit & { + items?: WishlistItem[] +} + +export type WishlistTypes = { + wishlist: Wishlist + itemBody: Core.WishlistItemBody +} + +export type WishlistSchema = Core.WishlistSchema +export type GetCustomerWishlistOperation = + Core.GetCustomerWishlistOperation diff --git a/packages/bigcommerce/src/wishlist/index.ts b/packages/bigcommerce/src/wishlist/index.ts new file mode 100644 index 0000000..241af3c --- /dev/null +++ b/packages/bigcommerce/src/wishlist/index.ts @@ -0,0 +1,3 @@ +export { default as useAddItem } from './use-add-item' +export { default as useWishlist } from './use-wishlist' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/bigcommerce/src/wishlist/use-add-item.tsx b/packages/bigcommerce/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..c9e237b --- /dev/null +++ b/packages/bigcommerce/src/wishlist/use-add-item.tsx @@ -0,0 +1,39 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/wishlist/use-add-item' +import type { AddItemHook } from '../types/wishlist' +import useCustomer from '../customer/use-customer' +import useWishlist from './use-wishlist' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'POST', + }, + useHook: + ({ fetch }) => + () => { + const { data: customer } = useCustomer() + const { mutate } = useWishlist() + + return useCallback( + async function addItem(item) { + if (!customer) { + // A signed customer is required in order to have a wishlist + throw new CommerceError({ + message: 'Signed customer not found', + }) + } + + // TODO: add validations before doing the fetch + const data = await fetch({ input: { item } }) + await mutate() + return data + }, + [fetch, mutate, customer] + ) + }, +} diff --git a/packages/bigcommerce/src/wishlist/use-remove-item.tsx b/packages/bigcommerce/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..40ca0da --- /dev/null +++ b/packages/bigcommerce/src/wishlist/use-remove-item.tsx @@ -0,0 +1,40 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/wishlist/use-remove-item' +import type { RemoveItemHook } from '../types/wishlist' +import useCustomer from '../customer/use-customer' +import useWishlist from './use-wishlist' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'DELETE', + }, + useHook: + ({ fetch }) => + ({ wishlist } = {}) => { + const { data: customer } = useCustomer() + const { mutate } = useWishlist(wishlist) + + return useCallback( + async function removeItem(input) { + if (!customer) { + // A signed customer is required in order to have a wishlist + throw new CommerceError({ + message: 'Signed customer not found', + }) + } + + const data = await fetch({ input: { itemId: String(input.id) } }) + await mutate() + return data + }, + [fetch, mutate, customer] + ) + }, +} diff --git a/packages/bigcommerce/src/wishlist/use-wishlist.tsx b/packages/bigcommerce/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..7882233 --- /dev/null +++ b/packages/bigcommerce/src/wishlist/use-wishlist.tsx @@ -0,0 +1,57 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useWishlist, { + UseWishlist, +} from '@vercel/commerce/wishlist/use-wishlist' +import useCustomer from '../customer/use-customer' + +import type { GetWishlistHook } from '../types/wishlist' + +export default useWishlist as UseWishlist +export const handler: SWRHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'GET', + }, + async fetcher({ input: { customerId, includeProducts }, options, fetch }) { + if (!customerId) return null + + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (includeProducts) url.searchParams.set('products', '1') + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: + ({ useData }) => + (input) => { + const { data: customer } = useCustomer() + const response = useData({ + input: [ + ['customerId', customer?.entityId], + ['includeProducts', input?.includeProducts], + ], + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.items?.length || 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/bigcommerce/taskfile.js b/packages/bigcommerce/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/bigcommerce/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/bigcommerce/tsconfig.json b/packages/bigcommerce/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/bigcommerce/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/commerce/.prettierignore b/packages/commerce/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/commerce/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/commerce/.prettierrc b/packages/commerce/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/commerce/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/commerce/README.md b/packages/commerce/README.md new file mode 100644 index 0000000..ecdebb8 --- /dev/null +++ b/packages/commerce/README.md @@ -0,0 +1,334 @@ +# Commerce Framework + +- [Commerce Framework](#commerce-framework) + - [Commerce Hooks](#commerce-hooks) + - [CommerceProvider](#commerceprovider) + - [Authentication Hooks](#authentication-hooks) + - [useSignup](#usesignup) + - [useLogin](#uselogin) + - [useLogout](#uselogout) + - [Customer Hooks](#customer-hooks) + - [useCustomer](#usecustomer) + - [Product Hooks](#product-hooks) + - [usePrice](#useprice) + - [useSearch](#usesearch) + - [Cart Hooks](#cart-hooks) + - [useCart](#usecart) + - [useAddItem](#useadditem) + - [useUpdateItem](#useupdateitem) + - [useRemoveItem](#useremoveitem) + - [Wishlist Hooks](#wishlist-hooks) + - [Commerce API](#commerce-api) + - [More](#more) + +The commerce framework ships multiple hooks and a Node.js API, both using an underlying headless e-commerce platform, which we call commerce providers. + +The core features are: + +- Code splitted hooks for data fetching using [SWR](https://swr.vercel.app/), and to handle common user actions +- A Node.js API for initial data population, static generation of content and for creating the API endpoints that connect to the hooks, if required. + +> 👩‍🔬 If you would like to contribute a new provider, check the docs for [Adding a new Commerce Provider](./new-provider.md). + +> 🚧 The core commerce framework is under active development, new features and updates will be continuously added over time. Breaking changes are expected while we finish the API. + +## Commerce Hooks + +A commerce hook is a [React hook](https://reactjs.org/docs/hooks-intro.html) that's connected to a commerce provider. They focus on user actions and data fetching of data that wasn't statically generated. + +Data fetching hooks use [SWR](https://swr.vercel.app/) underneath and you're welcome to use any of its [return values](https://swr.vercel.app/docs/options#return-values) and [options](https://swr.vercel.app/docs/options#options). For example, using the `useCustomer` hook: + +```jsx +const { data, isLoading, error } = useCustomer({ + swrOptions: { + revalidateOnFocus: true, + }, +}) +``` + +### CommerceProvider + +This component adds the provider config and handlers to the context of your React tree for it's children. You can optionally pass the `locale` to it: + +```jsx +import { CommerceProvider } from '@framework' + +const App = ({ locale = 'en-US', children }) => { + return {children} +} +``` + +## Authentication Hooks + +### useSignup + +Returns a _signup_ function that can be used to sign up the current visitor: + +```jsx +import useSignup from '@framework/auth/use-signup' + +const SignupView = () => { + const signup = useSignup() + + const handleSignup = async () => { + await signup({ + email, + firstName, + lastName, + password, + }) + } + + return

{children}
+} +``` + +### useLogin + +Returns a _login_ function that can be used to sign in the current visitor into an existing customer: + +```jsx +import useLogin from '@framework/auth/use-login' + +const LoginView = () => { + const login = useLogin() + const handleLogin = async () => { + await login({ + email, + password, + }) + } + + return
{children}
+} +``` + +### useLogout + +Returns a _logout_ function that signs out the current customer when called. + +```jsx +import useLogout from '@framework/auth/use-logout' + +const LogoutButton = () => { + const logout = useLogout() + return ( + + ) +} +``` + +## Customer Hooks + +### useCustomer + +Fetches and returns the data of the signed in customer: + +```jsx +import useCustomer from '@framework/customer/use-customer' + +const Profile = () => { + const { data, isLoading, error } = useCustomer() + + if (isLoading) return

Loading...

+ if (error) return

{error.message}

+ if (!data) return null + + return
Hello, {data.firstName}
+} +``` + +## Product Hooks + +### usePrice + +Helper hook to format price according to the commerce locale and currency code. It also handles discounts: + +```jsx +import useCart from '@framework/cart/use-cart' +import usePrice from '@framework/product/use-price' + +// ... +const { data } = useCart() +const { price, discount, basePrice } = usePrice( + data && { + amount: data.subtotalPrice, + currencyCode: data.currency.code, + // If `baseAmount` is used, a discount will be calculated + // baseAmount: number, + } +) +// ... +``` + +### useSearch + +Fetches and returns the products that match a set of filters: + +```jsx +import useSearch from '@framework/product/use-search' + +const SearchPage = ({ searchString, category, brand, sortStr }) => { + const { data } = useSearch({ + search: searchString || '', + categoryId: category?.entityId, + brandId: brand?.entityId, + sort: sortStr, + }) + + return ( + + {data.products.map((product) => ( + + ))} + + ) +} +``` + +## Cart Hooks + +### useCart + +Fetches and returns the data of the current cart: + +```jsx +import useCart from '@framework/cart/use-cart' + +const CartTotal = () => { + const { data, isLoading, isEmpty, error } = useCart() + + if (isLoading) return

Loading...

+ if (error) return

{error.message}

+ if (isEmpty) return

The cart is empty

+ + return

The cart total is {data.totalPrice}

+} +``` + +### useAddItem + +Returns a function that adds a new item to the cart when called, if this is the first item it will create the cart: + +```jsx +import { useAddItem } from '@framework/cart' + +const AddToCartButton = ({ productId, variantId }) => { + const addItem = useAddItem() + + const addToCart = async () => { + await addItem({ + productId, + variantId, + }) + } + + return +} +``` + +### useUpdateItem + +Returns a function that updates a current item in the cart when called, usually the quantity. + +```jsx +import { useUpdateItem } from '@framework/cart' + +const CartItemQuantity = ({ item }) => { + const [quantity, setQuantity] = useState(item.quantity) + const updateItem = useUpdateItem({ item }) + + const updateQuantity = async (e) => { + const val = e.target.value + + setQuantity(val) + await updateItem({ quantity: val }) + } + + return ( + + ) +} +``` + +If the `quantity` is lower than 1 the item will be removed from the cart. + +### useRemoveItem + +Returns a function that removes an item in the cart when called: + +```jsx +import { useRemoveItem } from '@framework/cart' + +const RemoveButton = ({ item }) => { + const removeItem = useRemoveItem() + const handleRemove = async () => { + await removeItem(item) + } + + return +} +``` + +## Wishlist Hooks + +Wishlist hooks work just like [cart hooks](#cart-hooks). Feel free to check how those work first. + +The example below shows how to use the `useWishlist`, `useAddItem` and `useRemoveItem` hooks: + +```jsx +import { useWishlist, useAddItem, useRemoveItem } from '@framework/wishlist' + +const WishlistButton = ({ productId, variant }) => { + const addItem = useAddItem() + const removeItem = useRemoveItem() + const { data, isLoading, isEmpty, error } = useWishlist() + + if (isLoading) return

Loading...

+ if (error) return

{error.message}

+ if (isEmpty) return

The wihslist is empty

+ + const { data: customer } = useCustomer() + const itemInWishlist = data?.items?.find( + (item) => item.product_id === productId && item.variant_id === variant.id + ) + + const handleWishlistChange = async (e) => { + e.preventDefault() + if (!customer) return + + if (itemInWishlist) { + await removeItem({ id: itemInWishlist.id }) + } else { + await addItem({ + productId, + variantId: variant.id, + }) + } + } + + return ( + + ) +} +``` + +## Commerce API + +While commerce hooks focus on client side data fetching and interactions, the commerce API focuses on static content generation for pages and API endpoints in a Node.js context. + +> The commerce API is currently going through a refactor in https://github.com/vercel/commerce/pull/252 - We'll update the docs once the API is released. + +## More + +Feel free to read through the source for more usage, and check the commerce vercel demo and commerce repo for usage examples: ([demo.vercel.store](https://demo.vercel.store/)) ([repo](https://github.com/vercel/commerce)) diff --git a/packages/commerce/fixup.mjs b/packages/commerce/fixup.mjs new file mode 100644 index 0000000..b276f5c --- /dev/null +++ b/packages/commerce/fixup.mjs @@ -0,0 +1,5 @@ +import { readFile, writeFile } from 'fs/promises' + +const packageJson = await readFile('package.json', 'utf8') + +writeFile('dist/package.json', packageJson, 'utf8') diff --git a/packages/commerce/new-provider.md b/packages/commerce/new-provider.md new file mode 100644 index 0000000..c750761 --- /dev/null +++ b/packages/commerce/new-provider.md @@ -0,0 +1,237 @@ +# Adding a new Commerce Provider + +🔔 New providers are on hold [until we have a new API for commerce](https://github.com/vercel/commerce/pull/252) 🔔 + +A commerce provider is a headless e-commerce platform that integrates with the [Commerce Framework](./README.md). Right now we have the following providers: + +- Local ([packages/local](../local)) +- Shopify ([packages/shopify](../shopify)) +- Swell ([packages/swell](../swell)) +- BigCommerce ([packages/bigcommerce](../bigcommerce)) +- Vendure ([packages/vendure](../vendure)) +- Saleor ([packages/saleor](../saleor)) +- OrderCloud ([packages/ordercloud](../ordercloud)) +- Spree ([packages/spree](../spree)) +- Kibo Commerce ([packages/kibocommerce](../kibocommerce)) +- Commerce.js ([packages/commercejs](../commercejs)) +- SFCC - SalesForce Cloud Commerce ([packages/sfcc](../sfcc)) + +Adding a commerce provider means adding a new folder in `packages` with a folder structure like the next one: + +- `src` + - `api` + - index.ts + - `product` + - usePrice + - useSearch + - getProduct + - getAllProducts + - `wishlist` + - useWishlist + - useAddItem + - useRemoveItem + - `auth` + - useLogin + - useLogout + - useSignup + - `customer` + - useCustomer + - getCustomerId + - getCustomerWistlist + - `cart` + - useCart + - useAddItem + - useRemoveItem + - useUpdateItem + - `index.ts` + - `provider.ts` + - `commerce.config.json` + - `next.config.cjs` +- `package.json` +- `tsconfig.json` +- `env.template` +- `README.md` + +`provider.ts` exports a provider object with handlers for the [Commerce Hooks](./README.md#commerce-hooks) and `api/index.ts` exports a Node.js provider for the [Commerce API](./README.md#commerce-api) + +> **Important:** We use TypeScript for every provider and expect its usage for every new one. + +The app imports from the provider directly instead of the core commerce folder (`packages/commerce`), but all providers are interchangeable and to achieve it every provider always has to implement the core types and helpers. + +## Updating the list of known providers + +Open [/site/commerce-config.js](/site/commerce-config.js) and add the provider name to the list in `PROVIDERS`. + +Then, open [/site/.env.template](/site/.env.template) and add the provider name to the list there too. + +## Adding the provider hooks + +Using BigCommerce as an example. The first thing to do is export a `CommerceProvider` component that includes a `provider` object with all the handlers that can be used for hooks: + +```tsx +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' +import { bigcommerceProvider, BigcommerceProvider } from './provider' + +export { bigcommerceProvider } +export type { BigcommerceProvider } + +export const CommerceProvider = getCommerceProvider(bigcommerceProvider) + +export const useCommerce = () => useCoreCommerce() +``` + +The exported types and components extend from the core ones exported by `@vercel/commerce`, which refers to `packages/commerce`. + +The `bigcommerceProvider` object looks like this: + +```tsx +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useWishlist } from './wishlist/use-wishlist' +import { handler as useWishlistAddItem } from './wishlist/use-add-item' +import { handler as useWishlistRemoveItem } from './wishlist/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import fetcher from './fetcher' + +export const bigcommerceProvider = { + locale: 'en-us', + cartCookie: 'bc_cartId', + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + wishlist: { + useWishlist, + useAddItem: useWishlistAddItem, + useRemoveItem: useWishlistRemoveItem, + }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type BigcommerceProvider = typeof bigcommerceProvider +``` + +The provider object, in this case `bigcommerceProvider`, has to match the `Provider` type defined in [packages/commerce](./src/index.tsx). + +A hook handler, like `useCart`, looks like this: + +```tsx +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' +import type { GetCartHook } from '@vercel/commerce/types/cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/cart', + method: 'GET', + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} +``` + +In the case of data fetching hooks like `useCart` each handler has to implement the `SWRHook` type that's defined in the core types. For mutations it's the `MutationHook`, e.g for `useAddItem`: + +```tsx +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { AddItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/cart', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} +``` + +## Showing progress and features +When creating a PR for a new provider, include this list in the PR description and mark the progress as you push so we can organize the code review. Not all points are required (but advised) so make sure to keep the list up to date. + +**Status** + +* [ ] CommerceProvider +* [ ] Schema & TS types +* [ ] API Operations - Get all collections +* [ ] API Operations - Get all pages +* [ ] API Operations - Get all products +* [ ] API Operations - Get page +* [ ] API Operations - Get product +* [ ] API Operations - Get Shop Info (categories and vendors working — `vendors` query still a WIP PR on Reaction) +* [ ] Hook - Add Item +* [ ] Hook - Remove Item +* [ ] Hook - Update Item +* [ ] Hook - Get Cart (account-tied carts working, anonymous carts working, cart reconciliation working) +* [ ] Auth (based on a WIP PR on Reaction - still need to implement refresh tokens) +* [ ] Customer information +* [ ] Product attributes - Size, Colors +* [ ] Custom checkout +* [ ] Typing (in progress) +* [ ] Tests diff --git a/packages/commerce/package.json b/packages/commerce/package.json new file mode 100644 index 0000000..17343a8 --- /dev/null +++ b/packages/commerce/package.json @@ -0,0 +1,83 @@ +{ + "name": "@vercel/commerce", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./config": "./dist/config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "config": [ + "dist/config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "config": [ + "dist/config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/fetch": "^6.1.1", + "deepmerge": "^4.2.2", + "import-cwd": "^3.0.0", + "js-cookie": "^3.0.1", + "swr": "^1.2.0" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/js-cookie": "^3.0.1", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/commerce/src/api/endpoints/cart.ts b/packages/commerce/src/api/endpoints/cart.ts new file mode 100644 index 0000000..abd5df4 --- /dev/null +++ b/packages/commerce/src/api/endpoints/cart.ts @@ -0,0 +1,60 @@ +import type { CartSchema } from '../../types/cart' +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' +import type { GetAPISchema } from '..' + +const cartEndpoint: GetAPISchema>['endpoint']['handler'] = + async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getCart'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) + ) { + return + } + + const { cookies } = req + const cartId = cookies[config.cartCookie] + + try { + // Return current cart info + if (req.method === 'GET') { + const body = { cartId } + return await handlers['getCart']({ ...ctx, body }) + } + + // Create or add an item to the cart + if (req.method === 'POST') { + const body = { ...req.body, cartId } + return await handlers['addItem']({ ...ctx, body }) + } + + // Update item in cart + if (req.method === 'PUT') { + const body = { ...req.body, cartId } + return await handlers['updateItem']({ ...ctx, body }) + } + + // Remove an item from the cart + if (req.method === 'DELETE') { + const body = { ...req.body, cartId } + return await handlers['removeItem']({ ...ctx, body }) + } + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } + } + +export default cartEndpoint diff --git a/packages/commerce/src/api/endpoints/catalog/products.ts b/packages/commerce/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..d2a4794 --- /dev/null +++ b/packages/commerce/src/api/endpoints/catalog/products.ts @@ -0,0 +1,31 @@ +import type { ProductsSchema } from '../../../types/product' +import { CommerceAPIError } from '../../utils/errors' +import isAllowedOperation from '../../utils/is-allowed-operation' +import type { GetAPISchema } from '../..' + +const productsEndpoint: GetAPISchema< + any, + ProductsSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers } = ctx + + if (!isAllowedOperation(req, res, { GET: handlers['getProducts'] })) { + return + } + + try { + const body = req.query + return await handlers['getProducts']({ ...ctx, body }) + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default productsEndpoint diff --git a/packages/commerce/src/api/endpoints/checkout.ts b/packages/commerce/src/api/endpoints/checkout.ts new file mode 100644 index 0000000..0168e70 --- /dev/null +++ b/packages/commerce/src/api/endpoints/checkout.ts @@ -0,0 +1,49 @@ +import type { CheckoutSchema } from '../../types/checkout' +import type { GetAPISchema } from '..' + +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' + +const checkoutEndpoint: GetAPISchema< + any, + CheckoutSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getCheckout'], + POST: handlers['submitCheckout'], + }) + ) { + return + } + + const { cookies } = req + const cartId = cookies[config.cartCookie] + + try { + // Create checkout + if (req.method === 'GET') { + const body = { ...req.body, cartId } + return await handlers['getCheckout']({ ...ctx, body }) + } + + // Create checkout + if (req.method === 'POST' && handlers['submitCheckout']) { + const body = { ...req.body, cartId } + return await handlers['submitCheckout']({ ...ctx, body }) + } + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default checkoutEndpoint diff --git a/packages/commerce/src/api/endpoints/customer/address.ts b/packages/commerce/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..d5ede69 --- /dev/null +++ b/packages/commerce/src/api/endpoints/customer/address.ts @@ -0,0 +1,65 @@ +import type { CustomerAddressSchema } from '../../../types/customer/address' +import type { GetAPISchema } from '../..' + +import { CommerceAPIError } from '../../utils/errors' +import isAllowedOperation from '../../utils/is-allowed-operation' + +const customerShippingEndpoint: GetAPISchema< + any, + CustomerAddressSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getAddresses'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) + ) { + return + } + + const { cookies } = req + + // Cart id might be usefull for anonymous shopping + const cartId = cookies[config.cartCookie] + + try { + // Return customer addresses + if (req.method === 'GET') { + const body = { cartId } + return await handlers['getAddresses']({ ...ctx, body }) + } + + // Create or add an item to customer addresses list + if (req.method === 'POST') { + const body = { ...req.body, cartId } + return await handlers['addItem']({ ...ctx, body }) + } + + // Update item in customer addresses list + if (req.method === 'PUT') { + const body = { ...req.body, cartId } + return await handlers['updateItem']({ ...ctx, body }) + } + + // Remove an item from customer addresses list + if (req.method === 'DELETE') { + const body = { ...req.body, cartId } + return await handlers['removeItem']({ ...ctx, body }) + } + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default customerShippingEndpoint diff --git a/packages/commerce/src/api/endpoints/customer/card.ts b/packages/commerce/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..ad268cb --- /dev/null +++ b/packages/commerce/src/api/endpoints/customer/card.ts @@ -0,0 +1,65 @@ +import type { CustomerCardSchema } from '../../../types/customer/card' +import type { GetAPISchema } from '../..' + +import { CommerceAPIError } from '../../utils/errors' +import isAllowedOperation from '../../utils/is-allowed-operation' + +const customerCardEndpoint: GetAPISchema< + any, + CustomerCardSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getCards'], + POST: handlers['addItem'], + PUT: handlers['updateItem'], + DELETE: handlers['removeItem'], + }) + ) { + return + } + + const { cookies } = req + + // Cart id might be usefull for anonymous shopping + const cartId = cookies[config.cartCookie] + + try { + // Create or add a card + if (req.method === 'GET') { + const body = { ...req.body } + return await handlers['getCards']({ ...ctx, body }) + } + + // Create or add an item to customer cards + if (req.method === 'POST') { + const body = { ...req.body, cartId } + return await handlers['addItem']({ ...ctx, body }) + } + + // Update item in customer cards + if (req.method === 'PUT') { + const body = { ...req.body, cartId } + return await handlers['updateItem']({ ...ctx, body }) + } + + // Remove an item from customer cards + if (req.method === 'DELETE') { + const body = { ...req.body, cartId } + return await handlers['removeItem']({ ...ctx, body }) + } + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default customerCardEndpoint diff --git a/packages/commerce/src/api/endpoints/customer/index.ts b/packages/commerce/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..eb2a048 --- /dev/null +++ b/packages/commerce/src/api/endpoints/customer/index.ts @@ -0,0 +1,36 @@ +import type { CustomerSchema } from '../../../types/customer' +import type { GetAPISchema } from '../..' + +import { CommerceAPIError } from '../../utils/errors' +import isAllowedOperation from '../../utils/is-allowed-operation' + +const customerEndpoint: GetAPISchema< + any, + CustomerSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getLoggedInCustomer'], + }) + ) { + return + } + + try { + const body = null + return await handlers['getLoggedInCustomer']({ ...ctx, body }) + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default customerEndpoint diff --git a/packages/commerce/src/api/endpoints/login.ts b/packages/commerce/src/api/endpoints/login.ts new file mode 100644 index 0000000..6f69629 --- /dev/null +++ b/packages/commerce/src/api/endpoints/login.ts @@ -0,0 +1,36 @@ +import type { LoginSchema } from '../../types/login' +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' +import type { GetAPISchema } from '..' + +const loginEndpoint: GetAPISchema< + any, + LoginSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers } = ctx + + if ( + !isAllowedOperation(req, res, { + POST: handlers['login'], + GET: handlers['login'], + }) + ) { + return + } + + try { + const body = req.body ?? {} + return await handlers['login']({ ...ctx, body }) + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default loginEndpoint diff --git a/packages/commerce/src/api/endpoints/logout.ts b/packages/commerce/src/api/endpoints/logout.ts new file mode 100644 index 0000000..c2640ea --- /dev/null +++ b/packages/commerce/src/api/endpoints/logout.ts @@ -0,0 +1,35 @@ +import type { LogoutSchema } from '../../types/logout' +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' +import type { GetAPISchema } from '..' + +const logoutEndpoint: GetAPISchema['endpoint']['handler'] = + async (ctx) => { + const { req, res, handlers } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['logout'], + }) + ) { + return + } + + try { + const redirectTo = req.query.redirect_to + const body = typeof redirectTo === 'string' ? { redirectTo } : {} + + return await handlers['logout']({ ...ctx, body }) + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } + } + +export default logoutEndpoint diff --git a/packages/commerce/src/api/endpoints/signup.ts b/packages/commerce/src/api/endpoints/signup.ts new file mode 100644 index 0000000..78c4cf5 --- /dev/null +++ b/packages/commerce/src/api/endpoints/signup.ts @@ -0,0 +1,36 @@ +import type { SignupSchema } from '../../types/signup' +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' +import type { GetAPISchema } from '..' + +const signupEndpoint: GetAPISchema['endpoint']['handler'] = + async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + POST: handlers['signup'], + }) + ) { + return + } + + const { cookies } = req + const cartId = cookies[config.cartCookie] + + try { + const body = { ...req.body, cartId } + return await handlers['signup']({ ...ctx, body }) + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } + } + +export default signupEndpoint diff --git a/packages/commerce/src/api/endpoints/wishlist.ts b/packages/commerce/src/api/endpoints/wishlist.ts new file mode 100644 index 0000000..233ac52 --- /dev/null +++ b/packages/commerce/src/api/endpoints/wishlist.ts @@ -0,0 +1,58 @@ +import type { WishlistSchema } from '../../types/wishlist' +import { CommerceAPIError } from '../utils/errors' +import isAllowedOperation from '../utils/is-allowed-operation' +import type { GetAPISchema } from '..' + +const wishlistEndpoint: GetAPISchema< + any, + WishlistSchema +>['endpoint']['handler'] = async (ctx) => { + const { req, res, handlers, config } = ctx + + if ( + !isAllowedOperation(req, res, { + GET: handlers['getWishlist'], + POST: handlers['addItem'], + DELETE: handlers['removeItem'], + }) + ) { + return + } + + const { cookies } = req + const customerToken = cookies[config.customerCookie] + + try { + // Return current wishlist info + if (req.method === 'GET') { + const body = { + customerToken, + includeProducts: req.query.products === '1', + } + return await handlers['getWishlist']({ ...ctx, body }) + } + + // Add an item to the wishlist + if (req.method === 'POST') { + const body = { ...req.body, customerToken } + return await handlers['addItem']({ ...ctx, body }) + } + + // Remove an item from the wishlist + if (req.method === 'DELETE') { + const body = { ...req.body, customerToken } + return await handlers['removeItem']({ ...ctx, body }) + } + } catch (error) { + console.error(error) + + const message = + error instanceof CommerceAPIError + ? 'An unexpected error ocurred with the Commerce API' + : 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default wishlistEndpoint diff --git a/packages/commerce/src/api/index.ts b/packages/commerce/src/api/index.ts new file mode 100644 index 0000000..6914b93 --- /dev/null +++ b/packages/commerce/src/api/index.ts @@ -0,0 +1,184 @@ +import type { NextApiHandler } from 'next' +import type { FetchOptions, Response } from '@vercel/fetch' +import type { APIEndpoint, APIHandler } from './utils/types' +import type { CartSchema } from '../types/cart' +import type { CustomerSchema } from '../types/customer' +import type { LoginSchema } from '../types/login' +import type { LogoutSchema } from '../types/logout' +import type { SignupSchema } from '../types/signup' +import type { ProductsSchema } from '../types/product' +import type { WishlistSchema } from '../types/wishlist' +import type { CheckoutSchema } from '../types/checkout' +import type { CustomerCardSchema } from '../types/customer/card' +import type { CustomerAddressSchema } from '../types/customer/address' +import { + defaultOperations, + OPERATIONS, + AllOperations, + APIOperations, +} from './operations' + +export type APISchemas = + | CartSchema + | CustomerSchema + | LoginSchema + | LogoutSchema + | SignupSchema + | ProductsSchema + | WishlistSchema + | CheckoutSchema + | CustomerCardSchema + | CustomerAddressSchema + +export type GetAPISchema< + C extends CommerceAPI, + S extends APISchemas = APISchemas +> = { + schema: S + endpoint: EndpointContext +} + +export type EndpointContext< + C extends CommerceAPI, + E extends EndpointSchemaBase +> = { + handler: Endpoint + handlers: EndpointHandlers +} + +export type EndpointSchemaBase = { + options: {} + handlers: { + [k: string]: { data?: any; body?: any } + } +} + +export type Endpoint< + C extends CommerceAPI, + E extends EndpointSchemaBase +> = APIEndpoint, any, E['options']> + +export type EndpointHandlers< + C extends CommerceAPI, + E extends EndpointSchemaBase +> = { + [H in keyof E['handlers']]: APIHandler< + C, + EndpointHandlers, + NonNullable['data'], + NonNullable['body'], + E['options'] + > +} + +export type APIProvider = { + config: CommerceAPIConfig + operations: APIOperations +} + +export type CommerceAPI

= + CommerceAPICore

& AllOperations

+ +export class CommerceAPICore

{ + constructor(readonly provider: P) {} + + getConfig(userConfig: Partial = {}): P['config'] { + return Object.entries(userConfig).reduce( + (cfg, [key, value]) => Object.assign(cfg, { [key]: value }), + { ...this.provider.config } + ) + } + + setConfig(newConfig: Partial) { + Object.assign(this.provider.config, newConfig) + } +} + +export function getCommerceApi

( + customProvider: P +): CommerceAPI

{ + const commerce = Object.assign( + new CommerceAPICore(customProvider), + defaultOperations as AllOperations

+ ) + const ops = customProvider.operations + + OPERATIONS.forEach((k) => { + const op = ops[k] + if (op) { + commerce[k] = op({ commerce }) as AllOperations

[typeof k] + } + }) + + return commerce +} + +export function getEndpoint< + P extends APIProvider, + T extends GetAPISchema +>( + commerce: CommerceAPI

, + context: T['endpoint'] & { + config?: P['config'] + options?: T['schema']['endpoint']['options'] + } +): NextApiHandler { + const cfg = commerce.getConfig(context.config) + + return function apiHandler(req, res) { + return context.handler({ + req, + res, + commerce, + config: cfg, + handlers: context.handlers, + options: context.options ?? {}, + }) + } +} + +export const createEndpoint = + >(endpoint: API['endpoint']) => +

( + commerce: CommerceAPI

, + context?: Partial & { + config?: P['config'] + options?: API['schema']['endpoint']['options'] + } + ): NextApiHandler => { + return getEndpoint(commerce, { ...endpoint, ...context }) + } + +export interface CommerceAPIConfig { + locale?: string + locales?: string[] + commerceUrl: string + apiToken: string + cartCookie: string + cartCookieMaxAge: number + customerCookie: string + fetch( + query: string, + queryData?: CommerceAPIFetchOptions, + fetchOptions?: FetchOptions + ): Promise> +} + +export type GraphQLFetcher< + Data extends GraphQLFetcherResult = GraphQLFetcherResult, + Variables = any +> = ( + query: string, + queryData?: CommerceAPIFetchOptions, + fetchOptions?: FetchOptions +) => Promise + +export interface GraphQLFetcherResult { + data: Data + res: Response +} + +export interface CommerceAPIFetchOptions { + variables?: Variables + preview?: boolean +} diff --git a/packages/commerce/src/api/operations.ts b/packages/commerce/src/api/operations.ts new file mode 100644 index 0000000..2910a2d --- /dev/null +++ b/packages/commerce/src/api/operations.ts @@ -0,0 +1,177 @@ +import type { ServerResponse } from 'http' +import type { LoginOperation } from '../types/login' +import type { GetAllPagesOperation, GetPageOperation } from '../types/page' +import type { GetSiteInfoOperation } from '../types/site' +import type { GetCustomerWishlistOperation } from '../types/wishlist' +import type { + GetAllProductPathsOperation, + GetAllProductsOperation, + GetProductOperation, +} from '../types/product' +import type { APIProvider, CommerceAPI } from '.' + +const noop = () => { + throw new Error('Not implemented') +} + +export const OPERATIONS = [ + 'login', + 'getAllPages', + 'getPage', + 'getSiteInfo', + 'getCustomerWishlist', + 'getAllProductPaths', + 'getAllProducts', + 'getProduct', +] as const + +export const defaultOperations = OPERATIONS.reduce((ops, k) => { + ops[k] = noop + return ops +}, {} as { [K in AllowedOperations]: typeof noop }) + +export type AllowedOperations = typeof OPERATIONS[number] + +export type Operations

= { + login: { + (opts: { + variables: T['variables'] + config?: P['config'] + res: ServerResponse + }): Promise + + ( + opts: { + variables: T['variables'] + config?: P['config'] + res: ServerResponse + } & OperationOptions + ): Promise + } + + getAllPages: { + (opts?: { + config?: P['config'] + preview?: boolean + }): Promise + + ( + opts: { + config?: P['config'] + preview?: boolean + } & OperationOptions + ): Promise + } + + getPage: { + (opts: { + variables: T['variables'] + config?: P['config'] + preview?: boolean + }): Promise + + ( + opts: { + variables: T['variables'] + config?: P['config'] + preview?: boolean + } & OperationOptions + ): Promise + } + + getSiteInfo: { + (opts: { + config?: P['config'] + preview?: boolean + }): Promise + + ( + opts: { + config?: P['config'] + preview?: boolean + } & OperationOptions + ): Promise + } + + getCustomerWishlist: { + (opts: { + variables: T['variables'] + config?: P['config'] + includeProducts?: boolean + }): Promise + + ( + opts: { + variables: T['variables'] + config?: P['config'] + includeProducts?: boolean + } & OperationOptions + ): Promise + } + + getAllProductPaths: { + (opts: { + variables?: T['variables'] + config?: P['config'] + }): Promise + + ( + opts: { + variables?: T['variables'] + config?: P['config'] + } & OperationOptions + ): Promise + } + + getAllProducts: { + (opts: { + variables?: T['variables'] + config?: P['config'] + preview?: boolean + }): Promise + + ( + opts: { + variables?: T['variables'] + config?: P['config'] + preview?: boolean + } & OperationOptions + ): Promise + } + + getProduct: { + (opts: { + variables: T['variables'] + config?: P['config'] + preview?: boolean + }): Promise + + ( + opts: { + variables: T['variables'] + config?: P['config'] + preview?: boolean + } & OperationOptions + ): Promise + } +} + +export type APIOperations

= { + [K in keyof Operations

]?: (ctx: OperationContext

) => Operations

[K] +} + +export type AllOperations

= { + [K in keyof APIOperations

]-?: P['operations'][K] extends ( + ...args: any + ) => any + ? ReturnType + : typeof noop +} + +export type OperationContext

= { + commerce: CommerceAPI

+} + +export type OperationOptions = + | { query: string; url?: never } + | { query?: never; url: string } diff --git a/packages/commerce/src/api/utils/errors.ts b/packages/commerce/src/api/utils/errors.ts new file mode 100644 index 0000000..6f9ecce --- /dev/null +++ b/packages/commerce/src/api/utils/errors.ts @@ -0,0 +1,22 @@ +import type { Response } from '@vercel/fetch' + +export class CommerceAPIError extends Error { + status: number + res: Response + data: any + + constructor(msg: string, res: Response, data?: any) { + super(msg) + this.name = 'CommerceApiError' + this.status = res.status + this.res = res + this.data = data + } +} + +export class CommerceNetworkError extends Error { + constructor(msg: string) { + super(msg) + this.name = 'CommerceNetworkError' + } +} diff --git a/packages/commerce/src/api/utils/is-allowed-method.ts b/packages/commerce/src/api/utils/is-allowed-method.ts new file mode 100644 index 0000000..51c37e2 --- /dev/null +++ b/packages/commerce/src/api/utils/is-allowed-method.ts @@ -0,0 +1,30 @@ +import type { NextApiRequest, NextApiResponse } from 'next' + +export type HTTP_METHODS = 'OPTIONS' | 'GET' | 'POST' | 'PUT' | 'DELETE' + +export default function isAllowedMethod( + req: NextApiRequest, + res: NextApiResponse, + allowedMethods: HTTP_METHODS[] +) { + const methods = allowedMethods.includes('OPTIONS') + ? allowedMethods + : [...allowedMethods, 'OPTIONS'] + + if (!req.method || !methods.includes(req.method)) { + res.status(405) + res.setHeader('Allow', methods.join(', ')) + res.end() + return false + } + + if (req.method === 'OPTIONS') { + res.status(200) + res.setHeader('Allow', methods.join(', ')) + res.setHeader('Content-Length', '0') + res.end() + return false + } + + return true +} diff --git a/packages/commerce/src/api/utils/is-allowed-operation.ts b/packages/commerce/src/api/utils/is-allowed-operation.ts new file mode 100644 index 0000000..f507781 --- /dev/null +++ b/packages/commerce/src/api/utils/is-allowed-operation.ts @@ -0,0 +1,19 @@ +import type { NextApiRequest, NextApiResponse } from 'next' +import isAllowedMethod, { HTTP_METHODS } from './is-allowed-method' +import { APIHandler } from './types' + +export default function isAllowedOperation( + req: NextApiRequest, + res: NextApiResponse, + allowedOperations: { [k in HTTP_METHODS]?: APIHandler } +) { + const methods = Object.keys(allowedOperations) as HTTP_METHODS[] + const allowedMethods = methods.reduce((arr, method) => { + if (allowedOperations[method]) { + arr.push(method) + } + return arr + }, []) + + return isAllowedMethod(req, res, allowedMethods) +} diff --git a/packages/commerce/src/api/utils/types.ts b/packages/commerce/src/api/utils/types.ts new file mode 100644 index 0000000..27a95df --- /dev/null +++ b/packages/commerce/src/api/utils/types.ts @@ -0,0 +1,49 @@ +import type { NextApiRequest, NextApiResponse } from 'next' +import type { CommerceAPI } from '..' + +export type ErrorData = { message: string; code?: string } + +export type APIResponse = + | { data: Data; errors?: ErrorData[] } + // If `data` doesn't include `null`, then `null` is only allowed on errors + | (Data extends null + ? { data: null; errors?: ErrorData[] } + : { data: null; errors: ErrorData[] }) + +export type APIHandlerContext< + C extends CommerceAPI, + H extends APIHandlers = {}, + Data = any, + Options extends {} = {} +> = { + req: NextApiRequest + res: NextApiResponse> + commerce: C + config: C['provider']['config'] + handlers: H + /** + * Custom configs that may be used by a particular handler + */ + options: Options +} + +export type APIHandler< + C extends CommerceAPI, + H extends APIHandlers = {}, + Data = any, + Body = any, + Options extends {} = {} +> = ( + context: APIHandlerContext & { body: Body } +) => void | Promise + +export type APIHandlers = { + [k: string]: APIHandler +} + +export type APIEndpoint< + C extends CommerceAPI = CommerceAPI, + H extends APIHandlers = {}, + Data = any, + Options extends {} = {} +> = (context: APIHandlerContext) => void | Promise diff --git a/packages/commerce/src/auth/use-login.tsx b/packages/commerce/src/auth/use-login.tsx new file mode 100644 index 0000000..67fb429 --- /dev/null +++ b/packages/commerce/src/auth/use-login.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { MutationHook, HookFetcherFn } from '../utils/types' +import type { LoginHook } from '../types/login' +import type { Provider } from '..' + +export type UseLogin< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.auth?.useLogin! + +const useLogin: UseLogin = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useLogin diff --git a/packages/commerce/src/auth/use-logout.tsx b/packages/commerce/src/auth/use-logout.tsx new file mode 100644 index 0000000..6ca16de --- /dev/null +++ b/packages/commerce/src/auth/use-logout.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { LogoutHook } from '../types/logout' +import type { Provider } from '..' + +export type UseLogout< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.auth?.useLogout! + +const useLogout: UseLogout = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useLogout diff --git a/packages/commerce/src/auth/use-signup.tsx b/packages/commerce/src/auth/use-signup.tsx new file mode 100644 index 0000000..2f846fa --- /dev/null +++ b/packages/commerce/src/auth/use-signup.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { SignupHook } from '../types/signup' +import type { Provider } from '..' + +export type UseSignup< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.auth?.useSignup! + +const useSignup: UseSignup = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useSignup diff --git a/packages/commerce/src/cart/use-add-item.tsx b/packages/commerce/src/cart/use-add-item.tsx new file mode 100644 index 0000000..f4072c7 --- /dev/null +++ b/packages/commerce/src/cart/use-add-item.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { AddItemHook } from '../types/cart' +import type { Provider } from '..' + +export type UseAddItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.cart?.useAddItem! + +const useAddItem: UseAddItem = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useAddItem diff --git a/packages/commerce/src/cart/use-cart.tsx b/packages/commerce/src/cart/use-cart.tsx new file mode 100644 index 0000000..cfce59e --- /dev/null +++ b/packages/commerce/src/cart/use-cart.tsx @@ -0,0 +1,32 @@ +import Cookies from 'js-cookie' +import { useHook, useSWRHook } from '../utils/use-hook' +import type { SWRHook, HookFetcherFn } from '../utils/types' +import type { GetCartHook } from '../types/cart' +import { Provider, useCommerce } from '..' + +export type UseCart< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = async ({ + options, + input: { cartId }, + fetch, +}) => { + return cartId ? await fetch(options) : null +} + +const fn = (provider: Provider) => provider.cart?.useCart! + +const useCart: UseCart = (input) => { + const hook = useHook(fn) + const { cartCookie } = useCommerce() + const fetcherFn = hook.fetcher ?? fetcher + const wrapper: typeof fetcher = (context) => { + context.input.cartId = Cookies.get(cartCookie) + return fetcherFn(context) + } + return useSWRHook({ ...hook, fetcher: wrapper })(input) +} + +export default useCart diff --git a/packages/commerce/src/cart/use-remove-item.tsx b/packages/commerce/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..f2bb43f --- /dev/null +++ b/packages/commerce/src/cart/use-remove-item.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { RemoveItemHook } from '../types/cart' +import type { Provider } from '..' + +export type UseRemoveItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.cart?.useRemoveItem! + +const useRemoveItem: UseRemoveItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useRemoveItem diff --git a/packages/commerce/src/cart/use-update-item.tsx b/packages/commerce/src/cart/use-update-item.tsx new file mode 100644 index 0000000..2527732 --- /dev/null +++ b/packages/commerce/src/cart/use-update-item.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { UpdateItemHook } from '../types/cart' +import type { Provider } from '..' + +export type UseUpdateItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.cart?.useUpdateItem! + +const useUpdateItem: UseUpdateItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useUpdateItem diff --git a/packages/commerce/src/checkout/use-checkout.ts b/packages/commerce/src/checkout/use-checkout.ts new file mode 100644 index 0000000..0fe74cb --- /dev/null +++ b/packages/commerce/src/checkout/use-checkout.ts @@ -0,0 +1,34 @@ +import type { SWRHook, HookFetcherFn } from '../utils/types' +import type { GetCheckoutHook } from '../types/checkout' + +import Cookies from 'js-cookie' + +import { useHook, useSWRHook } from '../utils/use-hook' +import { Provider, useCommerce } from '..' + +export type UseCheckout< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = async ({ + options, + input: { cartId }, + fetch, +}) => { + return cartId ? await fetch(options) : null +} + +const fn = (provider: Provider) => provider.checkout?.useCheckout! + +const useCheckout: UseCheckout = (input) => { + const hook = useHook(fn) + const { cartCookie } = useCommerce() + const fetcherFn = hook.fetcher ?? fetcher + const wrapper: typeof fetcher = (context) => { + context.input.cartId = Cookies.get(cartCookie) + return fetcherFn(context) + } + return useSWRHook({ ...hook, fetcher: wrapper })(input) +} + +export default useCheckout diff --git a/packages/commerce/src/checkout/use-submit-checkout.tsx b/packages/commerce/src/checkout/use-submit-checkout.tsx new file mode 100644 index 0000000..a5d8650 --- /dev/null +++ b/packages/commerce/src/checkout/use-submit-checkout.tsx @@ -0,0 +1,23 @@ +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { SubmitCheckoutHook } from '../types/checkout' +import type { Provider } from '..' + +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' + +export type UseSubmitCheckout< + H extends MutationHook< + SubmitCheckoutHook + > = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.checkout?.useSubmitCheckout! + +const useSubmitCheckout: UseSubmitCheckout = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useSubmitCheckout diff --git a/packages/commerce/src/config.cjs b/packages/commerce/src/config.cjs new file mode 100644 index 0000000..3f1ac9f --- /dev/null +++ b/packages/commerce/src/config.cjs @@ -0,0 +1,35 @@ +/** + * This file is expected to be used in next.config.js only + */ + +const path = require('path') +const merge = require('deepmerge') +const importCwd = require('import-cwd') + +function withCommerceConfig(nextConfig = {}) { + const commerce = nextConfig.commerce || {} + const { provider } = commerce + + if (!provider) { + throw new Error( + `The commerce provider is missing, please add a valid provider name` + ) + } + + const commerceNextConfig = importCwd(path.posix.join(provider, 'next.config')) + const config = merge(nextConfig, commerceNextConfig) + const features = merge( + config.commerce.features, + config.commerce[provider]?.features ?? {} + ) + + config.env = config.env || {} + + Object.entries(features).forEach(([k, v]) => { + if (v) config.env[`COMMERCE_${k.toUpperCase()}_ENABLED`] = true + }) + + return config +} + +module.exports = { withCommerceConfig } diff --git a/packages/commerce/src/customer/address/use-add-item.tsx b/packages/commerce/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..94c4514 --- /dev/null +++ b/packages/commerce/src/customer/address/use-add-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { AddItemHook } from '../../types/customer/address' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseAddItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.customer?.address?.useAddItem! + +const useAddItem: UseAddItem = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useAddItem diff --git a/packages/commerce/src/customer/address/use-addresses.tsx b/packages/commerce/src/customer/address/use-addresses.tsx new file mode 100644 index 0000000..7fc1292 --- /dev/null +++ b/packages/commerce/src/customer/address/use-addresses.tsx @@ -0,0 +1,34 @@ +import type { SWRHook, HookFetcherFn } from '../../utils/types' +import type { GetAddressesHook } from '../../types/customer/address' + +import Cookies from 'js-cookie' + +import { useHook, useSWRHook } from '../../utils/use-hook' +import { Provider, useCommerce } from '../..' + +export type UseAddresses< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = async ({ + options, + input: { cartId }, + fetch, +}) => { + return cartId ? await fetch(options) : null +} + +const fn = (provider: Provider) => provider.customer?.address?.useAddresses! + +const useAddresses: UseAddresses = (input) => { + const hook = useHook(fn) + const { cartCookie } = useCommerce() + const fetcherFn = hook.fetcher ?? fetcher + const wrapper: typeof fetcher = (context) => { + context.input.cartId = Cookies.get(cartCookie) + return fetcherFn(context) + } + return useSWRHook({ ...hook, fetcher: wrapper })(input) +} + +export default useAddresses diff --git a/packages/commerce/src/customer/address/use-remove-item.tsx b/packages/commerce/src/customer/address/use-remove-item.tsx new file mode 100644 index 0000000..820a65d --- /dev/null +++ b/packages/commerce/src/customer/address/use-remove-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { RemoveItemHook } from '../../types/customer/address' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseRemoveItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.customer?.address?.useRemoveItem! + +const useRemoveItem: UseRemoveItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useRemoveItem diff --git a/packages/commerce/src/customer/address/use-update-item.tsx b/packages/commerce/src/customer/address/use-update-item.tsx new file mode 100644 index 0000000..d058822 --- /dev/null +++ b/packages/commerce/src/customer/address/use-update-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { UpdateItemHook } from '../../types/customer/address' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseUpdateItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.customer?.address?.useUpdateItem! + +const useUpdateItem: UseUpdateItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useUpdateItem diff --git a/packages/commerce/src/customer/card/use-add-item.tsx b/packages/commerce/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..7b4ffdb --- /dev/null +++ b/packages/commerce/src/customer/card/use-add-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { AddItemHook } from '../../types/customer/card' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseAddItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.customer?.card?.useAddItem! + +const useAddItem: UseAddItem = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useAddItem diff --git a/packages/commerce/src/customer/card/use-cards.tsx b/packages/commerce/src/customer/card/use-cards.tsx new file mode 100644 index 0000000..5709950 --- /dev/null +++ b/packages/commerce/src/customer/card/use-cards.tsx @@ -0,0 +1,34 @@ +import type { SWRHook, HookFetcherFn } from '../../utils/types' +import type { GetCardsHook } from '../../types/customer/card' + +import Cookies from 'js-cookie' + +import { useHook, useSWRHook } from '../../utils/use-hook' +import { Provider, useCommerce } from '../..' + +export type UseCards< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = async ({ + options, + input: { cartId }, + fetch, +}) => { + return cartId ? await fetch(options) : null +} + +const fn = (provider: Provider) => provider.customer?.card?.useCards! + +const useCards: UseCards = (input) => { + const hook = useHook(fn) + const { cartCookie } = useCommerce() + const fetcherFn = hook.fetcher ?? fetcher + const wrapper: typeof fetcher = (context) => { + context.input.cartId = Cookies.get(cartCookie) + return fetcherFn(context) + } + return useSWRHook({ ...hook, fetcher: wrapper })(input) +} + +export default useCards diff --git a/packages/commerce/src/customer/card/use-remove-item.tsx b/packages/commerce/src/customer/card/use-remove-item.tsx new file mode 100644 index 0000000..1d85fa6 --- /dev/null +++ b/packages/commerce/src/customer/card/use-remove-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { RemoveItemHook } from '../../types/customer/card' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseRemoveItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.customer?.card?.useRemoveItem! + +const useRemoveItem: UseRemoveItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useRemoveItem diff --git a/packages/commerce/src/customer/card/use-update-item.tsx b/packages/commerce/src/customer/card/use-update-item.tsx new file mode 100644 index 0000000..cd8837d --- /dev/null +++ b/packages/commerce/src/customer/card/use-update-item.tsx @@ -0,0 +1,21 @@ +import type { HookFetcherFn, MutationHook } from '../../utils/types' +import type { UpdateItemHook } from '../../types/customer/card' +import type { Provider } from '../..' + +import { useHook, useMutationHook } from '../../utils/use-hook' +import { mutationFetcher } from '../../utils/default-fetcher' + +export type UseUpdateItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider?.customer?.card?.useUpdateItem! + +const useUpdateItem: UseUpdateItem = (input) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(input) +} + +export default useUpdateItem diff --git a/packages/commerce/src/customer/use-customer.tsx b/packages/commerce/src/customer/use-customer.tsx new file mode 100644 index 0000000..bbeeb32 --- /dev/null +++ b/packages/commerce/src/customer/use-customer.tsx @@ -0,0 +1,20 @@ +import { useHook, useSWRHook } from '../utils/use-hook' +import { SWRFetcher } from '../utils/default-fetcher' +import type { CustomerHook } from '../types/customer' +import type { HookFetcherFn, SWRHook } from '../utils/types' +import type { Provider } from '..' + +export type UseCustomer< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = SWRFetcher + +const fn = (provider: Provider) => provider.customer?.useCustomer! + +const useCustomer: UseCustomer = (input) => { + const hook = useHook(fn) + return useSWRHook({ fetcher, ...hook })(input) +} + +export default useCustomer diff --git a/packages/commerce/src/index.tsx b/packages/commerce/src/index.tsx new file mode 100644 index 0000000..8450f1e --- /dev/null +++ b/packages/commerce/src/index.tsx @@ -0,0 +1,123 @@ +import { + ReactNode, + MutableRefObject, + createContext, + useContext, + useMemo, + useRef, +} from 'react' + +import type { + Customer, + Wishlist, + Cart, + Product, + Signup, + Login, + Logout, + Checkout, +} from './types' + +import type { Fetcher, SWRHook, MutationHook } from './utils/types' + +const Commerce = createContext | {}>({}) + +export type Provider = CommerceConfig & { + fetcher: Fetcher + cart?: { + useCart?: SWRHook + useAddItem?: MutationHook + useUpdateItem?: MutationHook + useRemoveItem?: MutationHook + } + checkout?: { + useCheckout?: SWRHook + useSubmitCheckout?: MutationHook + } + wishlist?: { + useWishlist?: SWRHook + useAddItem?: MutationHook + useRemoveItem?: MutationHook + } + customer?: { + useCustomer?: SWRHook + card?: { + useCards?: SWRHook + useAddItem?: MutationHook + useUpdateItem?: MutationHook + useRemoveItem?: MutationHook + } + address?: { + useAddresses?: SWRHook + useAddItem?: MutationHook + useUpdateItem?: MutationHook + useRemoveItem?: MutationHook + } + } + products?: { + useSearch?: SWRHook + } + auth?: { + useSignup?: MutationHook + useLogin?: MutationHook + useLogout?: MutationHook + } +} + +export type CommerceConfig = { + locale: string + cartCookie: string +} + +export type CommerceContextValue

= { + providerRef: MutableRefObject

+ fetcherRef: MutableRefObject +} & CommerceConfig + +export type CommerceProps

= { + children?: ReactNode + provider: P +} + +/** + * These are the properties every provider should allow when implementing + * the core commerce provider + */ +export type CommerceProviderProps = { + children?: ReactNode +} & Partial + +export function CoreCommerceProvider

({ + provider, + children, +}: CommerceProps

) { + const providerRef = useRef(provider) + // TODO: Remove the fetcherRef + const fetcherRef = useRef(provider.fetcher) + // If the parent re-renders this provider will re-render every + // consumer unless we memoize the config + const { locale, cartCookie } = providerRef.current + const cfg = useMemo( + () => ({ providerRef, fetcherRef, locale, cartCookie }), + [locale, cartCookie] + ) + + return {children} +} + +export function getCommerceProvider

(provider: P) { + return function CommerceProvider({ + children, + ...props + }: CommerceProviderProps) { + return ( + + {children} + + ) + } +} + +export function useCommerce

() { + return useContext(Commerce) as CommerceContextValue

+} diff --git a/packages/commerce/src/product/use-price.tsx b/packages/commerce/src/product/use-price.tsx new file mode 100644 index 0000000..9c09e34 --- /dev/null +++ b/packages/commerce/src/product/use-price.tsx @@ -0,0 +1,64 @@ +import { useMemo } from 'react' +import { useCommerce } from '..' + +export function formatPrice({ + amount, + currencyCode, + locale, +}: { + amount: number + currencyCode: string + locale: string +}) { + const formatCurrency = new Intl.NumberFormat(locale, { + style: 'currency', + currency: currencyCode, + }) + + return formatCurrency.format(amount) +} + +export function formatVariantPrice({ + amount, + baseAmount, + currencyCode, + locale, +}: { + baseAmount: number + amount: number + currencyCode: string + locale: string +}) { + const hasDiscount = baseAmount > amount + const formatDiscount = new Intl.NumberFormat(locale, { style: 'percent' }) + const discount = hasDiscount + ? formatDiscount.format((baseAmount - amount) / baseAmount) + : null + + const price = formatPrice({ amount, currencyCode, locale }) + const basePrice = hasDiscount + ? formatPrice({ amount: baseAmount, currencyCode, locale }) + : null + + return { price, basePrice, discount } +} + +export default function usePrice( + data?: { + amount: number + baseAmount?: number + currencyCode: string + } | null +) { + const { amount, baseAmount, currencyCode } = data ?? {} + const { locale } = useCommerce() + const value = useMemo(() => { + if (typeof amount !== 'number' || !currencyCode) return '' + + return baseAmount + ? formatVariantPrice({ amount, baseAmount, currencyCode, locale }) + : formatPrice({ amount, currencyCode, locale }) + }, [amount, baseAmount, currencyCode]) + + return typeof value === 'string' ? { price: value } : value +} diff --git a/packages/commerce/src/product/use-search.tsx b/packages/commerce/src/product/use-search.tsx new file mode 100644 index 0000000..342b49e --- /dev/null +++ b/packages/commerce/src/product/use-search.tsx @@ -0,0 +1,20 @@ +import { useHook, useSWRHook } from '../utils/use-hook' +import { SWRFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, SWRHook } from '../utils/types' +import type { SearchProductsHook } from '../types/product' +import type { Provider } from '..' + +export type UseSearch< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = SWRFetcher + +const fn = (provider: Provider) => provider.products?.useSearch! + +const useSearch: UseSearch = (input) => { + const hook = useHook(fn) + return useSWRHook({ fetcher, ...hook })(input) +} + +export default useSearch diff --git a/packages/commerce/src/types/cart.ts b/packages/commerce/src/types/cart.ts new file mode 100644 index 0000000..e4af878 --- /dev/null +++ b/packages/commerce/src/types/cart.ts @@ -0,0 +1,177 @@ +import type { Discount, Measurement, Image } from './common' + +export type SelectedOption = { + // The option's id. + id?: string + // The product option’s name. + name: string + /// The product option’s value. + value: string +} + +export type LineItem = { + id: string + variantId: string + productId: string + name: string + quantity: number + discounts: Discount[] + // A human-friendly unique string automatically generated from the product’s name + path: string + variant: ProductVariant + options?: SelectedOption[] +} + +export type ProductVariant = { + id: string + // The SKU (stock keeping unit) associated with the product variant. + sku: string + // The product variant’s title, or the product's name. + name: string + // Whether a customer needs to provide a shipping address when placing + // an order for the product variant. + requiresShipping: boolean + // The product variant’s price after all discounts are applied. + price: number + // Product variant’s price, as quoted by the manufacturer/distributor. + listPrice: number + // Image associated with the product variant. Falls back to the product image + // if no image is available. + image?: Image + // Indicates whether this product variant is in stock. + isInStock?: boolean + // Indicates if the product variant is available for sale. + availableForSale?: boolean + // The variant's weight. If a weight was not explicitly specified on the + // variant this will be the product's weight. + weight?: Measurement + // The variant's height. If a height was not explicitly specified on the + // variant, this will be the product's height. + height?: Measurement + // The variant's width. If a width was not explicitly specified on the + // variant, this will be the product's width. + width?: Measurement + // The variant's depth. If a depth was not explicitly specified on the + // variant, this will be the product's depth. + depth?: Measurement +} + +// Shopping cart, a.k.a Checkout +export type Cart = { + id: string + // ID of the customer to which the cart belongs. + customerId?: string + // The email assigned to this cart + email?: string + // The date and time when the cart was created. + createdAt: string + // The currency used for this cart + currency: { code: string } + // Specifies if taxes are included in the line items. + taxesIncluded: boolean + lineItems: LineItem[] + // The sum of all the prices of all the items in the cart. + // Duties, taxes, shipping and discounts excluded. + lineItemsSubtotalPrice: number + // Price of the cart before duties, shipping and taxes. + subtotalPrice: number + // The sum of all the prices of all the items in the cart. + // Duties, taxes and discounts included. + totalPrice: number + // Discounts that have been applied on the cart. + discounts?: Discount[] +} + +/** + * Base cart item body used for cart mutations + */ +export type CartItemBody = { + variantId: string + productId?: string + quantity?: number +} + +/** + * Hooks schema + */ + +export type CartTypes = { + cart?: Cart + item: LineItem + itemBody: CartItemBody +} + +export type CartHooks = { + getCart: GetCartHook + addItem: AddItemHook + updateItem: UpdateItemHook + removeItem: RemoveItemHook +} + +export type GetCartHook = { + data: T['cart'] | null + input: {} + fetcherInput: { cartId?: string } + swrState: { isEmpty: boolean } +} + +export type AddItemHook = { + data: T['cart'] + input?: T['itemBody'] + fetcherInput: T['itemBody'] + body: { item: T['itemBody'] } + actionInput: T['itemBody'] +} + +export type UpdateItemHook = { + data: T['cart'] | null + input: { item?: T['item']; wait?: number } + fetcherInput: { itemId: string; item: T['itemBody'] } + body: { itemId: string; item: T['itemBody'] } + actionInput: T['itemBody'] & { id: string } +} + +export type RemoveItemHook = { + data: T['cart'] | null + input: { item?: T['item'] } + fetcherInput: { itemId: string } + body: { itemId: string } + actionInput: { id: string } +} + +/** + * API Schema + */ + +export type CartSchema = { + endpoint: { + options: {} + handlers: CartHandlers + } +} + +export type CartHandlers = { + getCart: GetCartHandler + addItem: AddItemHandler + updateItem: UpdateItemHandler + removeItem: RemoveItemHandler +} + +export type GetCartHandler = GetCartHook & { + body: { cartId?: string } +} + +export type AddItemHandler = AddItemHook & { + body: { cartId: string } +} + +export type UpdateItemHandler = + UpdateItemHook & { + data: T['cart'] + body: { cartId: string } + } + +export type RemoveItemHandler = + RemoveItemHook & { + body: { cartId: string } + } diff --git a/packages/commerce/src/types/checkout.ts b/packages/commerce/src/types/checkout.ts new file mode 100644 index 0000000..417604f --- /dev/null +++ b/packages/commerce/src/types/checkout.ts @@ -0,0 +1,57 @@ +import type { UseSubmitCheckout } from '../checkout/use-submit-checkout' +import type { Address, AddressFields } from './customer/address' +import type { Card, CardFields } from './customer/card' + +// Index +export type Checkout = any + +export type CheckoutTypes = { + card?: Card | CardFields + address?: Address | AddressFields + checkout?: Checkout + hasPayment?: boolean + hasShipping?: boolean +} + +export type SubmitCheckoutHook = { + data: T + input?: T + fetcherInput: T + body: { item: T } + actionInput: T +} + +export type GetCheckoutHook = { + data: T['checkout'] | null + input: {} + fetcherInput: { cartId?: string } + swrState: { isEmpty: boolean } + mutations: { submit: UseSubmitCheckout } +} + +export type CheckoutHooks = { + submitCheckout?: SubmitCheckoutHook + getCheckout: GetCheckoutHook +} + +export type GetCheckoutHandler = + GetCheckoutHook & { + body: { cartId: string } + } + +export type SubmitCheckoutHandler = + SubmitCheckoutHook & { + body: { cartId: string } + } + +export type CheckoutHandlers = { + getCheckout: GetCheckoutHandler + submitCheckout?: SubmitCheckoutHandler +} + +export type CheckoutSchema = { + endpoint: { + options: {} + handlers: CheckoutHandlers + } +} diff --git a/packages/commerce/src/types/common.ts b/packages/commerce/src/types/common.ts new file mode 100644 index 0000000..06908c4 --- /dev/null +++ b/packages/commerce/src/types/common.ts @@ -0,0 +1,16 @@ +export type Discount = { + // The value of the discount, can be an amount or percentage + value: number +} + +export type Measurement = { + value: number + unit: 'KILOGRAMS' | 'GRAMS' | 'POUNDS' | 'OUNCES' +} + +export type Image = { + url: string + altText?: string + width?: number + height?: number +} diff --git a/packages/commerce/src/types/customer/address.ts b/packages/commerce/src/types/customer/address.ts new file mode 100644 index 0000000..8dc6ffc --- /dev/null +++ b/packages/commerce/src/types/customer/address.ts @@ -0,0 +1,111 @@ +export interface Address { + id: string + mask: string +} + +export interface AddressFields { + type: string + firstName: string + lastName: string + company: string + streetNumber: string + apartments: string + zipCode: string + city: string + country: string +} + +export type CustomerAddressTypes = { + address?: Address + fields: AddressFields +} + +export type GetAddressesHook< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + data: T['address'][] | null + input: {} + fetcherInput: { cartId?: string } + swrState: { isEmpty: boolean } +} + +export type AddItemHook = + { + data: T['address'] + input?: T['fields'] + fetcherInput: T['fields'] + body: { item: T['fields'] } + actionInput: T['fields'] + } + +export type UpdateItemHook< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + data: T['address'] | null + input: { item?: T['fields']; wait?: number } + fetcherInput: { itemId: string; item: T['fields'] } + body: { itemId: string; item: T['fields'] } + actionInput: T['fields'] & { id: string } +} + +export type RemoveItemHook< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + data: T['address'] | null + input: { item?: T['address'] } + fetcherInput: { itemId: string } + body: { itemId: string } + actionInput: { id: string } +} + +export type CustomerAddressHooks< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + getAddresses: GetAddressesHook + addItem: AddItemHook + updateItem: UpdateItemHook + removeItem: RemoveItemHook +} + +export type AddressHandler< + T extends CustomerAddressTypes = CustomerAddressTypes +> = GetAddressesHook & { + body: { cartId?: string } +} + +export type AddItemHandler< + T extends CustomerAddressTypes = CustomerAddressTypes +> = AddItemHook & { + body: { cartId: string } +} + +export type UpdateItemHandler< + T extends CustomerAddressTypes = CustomerAddressTypes +> = UpdateItemHook & { + data: T['address'] + body: { cartId: string } +} + +export type RemoveItemHandler< + T extends CustomerAddressTypes = CustomerAddressTypes +> = RemoveItemHook & { + body: { cartId: string } +} + +export type CustomerAddressHandlers< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + getAddresses: GetAddressesHook + addItem: AddItemHandler + updateItem: UpdateItemHandler + removeItem: RemoveItemHandler +} + +export type CustomerAddressSchema< + T extends CustomerAddressTypes = CustomerAddressTypes +> = { + endpoint: { + options: {} + handlers: CustomerAddressHandlers + } +} diff --git a/packages/commerce/src/types/customer/card.ts b/packages/commerce/src/types/customer/card.ts new file mode 100644 index 0000000..e9b220d --- /dev/null +++ b/packages/commerce/src/types/customer/card.ts @@ -0,0 +1,102 @@ +export interface Card { + id: string + mask: string + provider: string +} + +export interface CardFields { + cardHolder: string + cardNumber: string + cardExpireDate: string + cardCvc: string + firstName: string + lastName: string + company: string + streetNumber: string + zipCode: string + city: string + country: string +} + +export type CustomerCardTypes = { + card?: Card + fields: CardFields +} + +export type GetCardsHook = { + data: T['card'][] | null + input: {} + fetcherInput: { cartId?: string } + swrState: { isEmpty: boolean } +} + +export type AddItemHook = { + data: T['card'] + input?: T['fields'] + fetcherInput: T['fields'] + body: { item: T['fields'] } + actionInput: T['fields'] +} + +export type UpdateItemHook = { + data: T['card'] | null + input: { item?: T['fields']; wait?: number } + fetcherInput: { itemId: string; item: T['fields'] } + body: { itemId: string; item: T['fields'] } + actionInput: T['fields'] & { id: string } +} + +export type RemoveItemHook = { + data: T['card'] | null + input: { item?: T['card'] } + fetcherInput: { itemId: string } + body: { itemId: string } + actionInput: { id: string } +} + +export type CustomerCardHooks = + { + getCards: GetCardsHook + addItem: AddItemHook + updateItem: UpdateItemHook + removeItem: RemoveItemHook + } + +export type CardsHandler = + GetCardsHook & { + body: { cartId?: string } + } + +export type AddItemHandler = + AddItemHook & { + body: { cartId: string } + } + +export type UpdateItemHandler = + UpdateItemHook & { + data: T['card'] + body: { cartId: string } + } + +export type RemoveItemHandler = + RemoveItemHook & { + body: { cartId: string } + } + +export type CustomerCardHandlers< + T extends CustomerCardTypes = CustomerCardTypes +> = { + getCards: GetCardsHook + addItem: AddItemHandler + updateItem: UpdateItemHandler + removeItem: RemoveItemHandler +} + +export type CustomerCardSchema< + T extends CustomerCardTypes = CustomerCardTypes +> = { + endpoint: { + options: {} + handlers: CustomerCardHandlers + } +} diff --git a/packages/commerce/src/types/customer/index.ts b/packages/commerce/src/types/customer/index.ts new file mode 100644 index 0000000..f0b210f --- /dev/null +++ b/packages/commerce/src/types/customer/index.ts @@ -0,0 +1,25 @@ +export * as Card from './card' +export * as Address from './address' + +// TODO: define this type +export type Customer = any + +export type CustomerTypes = { + customer: Customer +} + +export type CustomerHook = { + data: T['customer'] | null + fetchData: { customer: T['customer'] } | null +} + +export type CustomerSchema = { + endpoint: { + options: {} + handlers: { + getLoggedInCustomer: { + data: { customer: T['customer'] } | null + } + } + } +} diff --git a/packages/commerce/src/types/index.ts b/packages/commerce/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/commerce/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/commerce/src/types/login.ts b/packages/commerce/src/types/login.ts new file mode 100644 index 0000000..b6ef228 --- /dev/null +++ b/packages/commerce/src/types/login.ts @@ -0,0 +1,29 @@ +export type LoginBody = { + email: string + password: string +} + +export type LoginTypes = { + body: LoginBody +} + +export type LoginHook = { + data: null + actionInput: LoginBody + fetcherInput: LoginBody + body: T['body'] +} + +export type LoginSchema = { + endpoint: { + options: {} + handlers: { + login: LoginHook + } + } +} + +export type LoginOperation = { + data: { result?: string } + variables: unknown +} diff --git a/packages/commerce/src/types/logout.ts b/packages/commerce/src/types/logout.ts new file mode 100644 index 0000000..a724005 --- /dev/null +++ b/packages/commerce/src/types/logout.ts @@ -0,0 +1,17 @@ +export type LogoutTypes = { + body: { redirectTo?: string } +} + +export type LogoutHook = { + data: null + body: T['body'] +} + +export type LogoutSchema = { + endpoint: { + options: {} + handlers: { + logout: LogoutHook + } + } +} diff --git a/packages/commerce/src/types/page.ts b/packages/commerce/src/types/page.ts new file mode 100644 index 0000000..89f82c1 --- /dev/null +++ b/packages/commerce/src/types/page.ts @@ -0,0 +1,28 @@ +// TODO: define this type +export type Page = { + // ID of the Web page. + id: string + // Page name, as displayed on the storefront. + name: string + // Relative URL on the storefront for this page. + url?: string + // HTML or variable that populates this page’s `` element, in default/desktop view. Required in POST if page type is `raw`. + body: string + // If true, this page appears in the storefront’s navigation menu. + is_visible?: boolean + // Order in which this page should display on the storefront. (Lower integers specify earlier display.) + sort_order?: number +} + +export type PageTypes = { + page: Page +} + +export type GetAllPagesOperation = { + data: { pages: T['page'][] } +} + +export type GetPageOperation = { + data: { page?: T['page'] } + variables: { id: string } +} diff --git a/packages/commerce/src/types/product.ts b/packages/commerce/src/types/product.ts new file mode 100644 index 0000000..fb48ba0 --- /dev/null +++ b/packages/commerce/src/types/product.ts @@ -0,0 +1,99 @@ +export type ProductImage = { + url: string + alt?: string +} + +export type ProductPrice = { + value: number + currencyCode?: 'USD' | 'EUR' | 'ARS' | 'GBP' | string + retailPrice?: number + salePrice?: number + listPrice?: number + extendedSalePrice?: number + extendedListPrice?: number +} + +export type ProductOption = { + __typename?: 'MultipleChoiceOption' + id: string + displayName: string + values: ProductOptionValues[] +} + +export type ProductOptionValues = { + label: string + hexColors?: string[] +} + +export type ProductVariant = { + id: string | number + options: ProductOption[] + availableForSale?: boolean +} + +export type Product = { + id: string + name: string + description: string + descriptionHtml?: string + sku?: string + slug?: string + path?: string + images: ProductImage[] + variants: ProductVariant[] + price: ProductPrice + options: ProductOption[] + vendor?: string +} + +export type SearchProductsBody = { + search?: string + categoryId?: string | number + brandId?: string | number + sort?: string + locale?: string +} + +export type ProductTypes = { + product: Product + searchBody: SearchProductsBody +} + +export type SearchProductsHook = { + data: { + products: T['product'][] + found: boolean + } + body: T['searchBody'] + input: T['searchBody'] + fetcherInput: T['searchBody'] +} + +export type ProductsSchema = { + endpoint: { + options: {} + handlers: { + getProducts: SearchProductsHook + } + } +} + +export type GetAllProductPathsOperation = + { + data: { products: Pick[] } + variables: { first?: number } + } + +export type GetAllProductsOperation = { + data: { products: T['product'][] } + variables: { + relevance?: 'featured' | 'best_selling' | 'newest' + ids?: string[] + first?: number + } +} + +export type GetProductOperation = { + data: { product?: T['product'] } + variables: { path: string; slug?: never } | { path?: never; slug: string } +} diff --git a/packages/commerce/src/types/signup.ts b/packages/commerce/src/types/signup.ts new file mode 100644 index 0000000..4e23da6 --- /dev/null +++ b/packages/commerce/src/types/signup.ts @@ -0,0 +1,26 @@ +export type SignupBody = { + firstName: string + lastName: string + email: string + password: string +} + +export type SignupTypes = { + body: SignupBody +} + +export type SignupHook = { + data: null + body: T['body'] + actionInput: T['body'] + fetcherInput: T['body'] +} + +export type SignupSchema = { + endpoint: { + options: {} + handlers: { + signup: SignupHook + } + } +} diff --git a/packages/commerce/src/types/site.ts b/packages/commerce/src/types/site.ts new file mode 100644 index 0000000..73c7ddd --- /dev/null +++ b/packages/commerce/src/types/site.ts @@ -0,0 +1,20 @@ +export type Category = { + id: string + name: string + slug: string + path: string +} + +export type Brand = any + +export type SiteTypes = { + category: Category + brand: Brand +} + +export type GetSiteInfoOperation = { + data: { + categories: T['category'][] + brands: T['brand'][] + } +} diff --git a/packages/commerce/src/types/wishlist.ts b/packages/commerce/src/types/wishlist.ts new file mode 100644 index 0000000..b375984 --- /dev/null +++ b/packages/commerce/src/types/wishlist.ts @@ -0,0 +1,60 @@ +// TODO: define this type +export type Wishlist = any + +export type WishlistItemBody = { + variantId: string | number + productId: string +} + +export type WishlistTypes = { + wishlist: Wishlist + itemBody: WishlistItemBody +} + +export type GetWishlistHook = { + data: T['wishlist'] | null + body: { includeProducts?: boolean } + input: { includeProducts?: boolean } + fetcherInput: { customerId: string; includeProducts?: boolean } + swrState: { isEmpty: boolean } +} + +export type AddItemHook = { + data: T['wishlist'] + body: { item: T['itemBody'] } + fetcherInput: { item: T['itemBody'] } + actionInput: T['itemBody'] +} + +export type RemoveItemHook = { + data: T['wishlist'] | null + body: { itemId: string } + fetcherInput: { itemId: string } + actionInput: { id: string } + input: { wishlist?: { includeProducts?: boolean } } +} + +export type WishlistSchema = { + endpoint: { + options: {} + handlers: { + getWishlist: GetWishlistHook & { + data: T['wishlist'] | null + body: { customerToken?: string } + } + addItem: AddItemHook & { + body: { customerToken?: string } + } + removeItem: RemoveItemHook & { + body: { customerToken?: string } + } + } + } +} + +export type GetCustomerWishlistOperation< + T extends WishlistTypes = WishlistTypes +> = { + data: { wishlist?: T['wishlist'] } + variables: { customerId: string } +} diff --git a/packages/commerce/src/utils/default-fetcher.ts b/packages/commerce/src/utils/default-fetcher.ts new file mode 100644 index 0000000..53312fc --- /dev/null +++ b/packages/commerce/src/utils/default-fetcher.ts @@ -0,0 +1,12 @@ +import type { HookFetcherFn } from './types' + +export const SWRFetcher: HookFetcherFn = ({ options, fetch }) => + fetch(options) + +export const mutationFetcher: HookFetcherFn = ({ + input, + options, + fetch, +}) => fetch({ ...options, body: input }) + +export default SWRFetcher diff --git a/packages/commerce/src/utils/define-property.ts b/packages/commerce/src/utils/define-property.ts new file mode 100644 index 0000000..e897352 --- /dev/null +++ b/packages/commerce/src/utils/define-property.ts @@ -0,0 +1,37 @@ +// Taken from https://fettblog.eu/typescript-assertion-signatures/ + +type InferValue = Desc extends { + get(): any + value: any +} + ? never + : Desc extends { value: infer T } + ? Record + : Desc extends { get(): infer T } + ? Record + : never + +type DefineProperty< + Prop extends PropertyKey, + Desc extends PropertyDescriptor +> = Desc extends { writable: any; set(val: any): any } + ? never + : Desc extends { writable: any; get(): any } + ? never + : Desc extends { writable: false } + ? Readonly> + : Desc extends { writable: true } + ? InferValue + : Readonly> + +export default function defineProperty< + Obj extends object, + Key extends PropertyKey, + PDesc extends PropertyDescriptor +>( + obj: Obj, + prop: Key, + val: PDesc +): asserts obj is Obj & DefineProperty { + Object.defineProperty(obj, prop, val) +} diff --git a/packages/commerce/src/utils/errors.ts b/packages/commerce/src/utils/errors.ts new file mode 100644 index 0000000..f4ab9fb --- /dev/null +++ b/packages/commerce/src/utils/errors.ts @@ -0,0 +1,48 @@ +export type ErrorData = { + message: string + code?: string +} + +export type ErrorProps = { + code?: string +} & ( + | { message: string; errors?: never } + | { message?: never; errors: ErrorData[] } +) + +export class CommerceError extends Error { + code?: string + errors: ErrorData[] + + constructor({ message, code, errors }: ErrorProps) { + const error: ErrorData = message + ? { message, ...(code ? { code } : {}) } + : errors![0] + + super(error.message) + this.errors = message ? [error] : errors! + + if (error.code) this.code = error.code + } +} + +// Used for errors that come from a bad implementation of the hooks +export class ValidationError extends CommerceError { + constructor(options: ErrorProps) { + super(options) + this.code = 'validation_error' + } +} + +export class FetcherError extends CommerceError { + status: number + + constructor( + options: { + status: number + } & ErrorProps + ) { + super(options) + this.status = options.status + } +} diff --git a/packages/commerce/src/utils/types.ts b/packages/commerce/src/utils/types.ts new file mode 100644 index 0000000..317fea1 --- /dev/null +++ b/packages/commerce/src/utils/types.ts @@ -0,0 +1,147 @@ +import type { SWRConfiguration } from 'swr' +import type { CommerceError } from './errors' +import type { ResponseState } from './use-data' + +/** + * Returns the properties in T with the properties in type K, overriding properties defined in T + */ +export type Override = Omit & K + +/** + * Returns the properties in T with the properties in type K changed from optional to required + */ +export type PickRequired = Omit & { + [P in K]-?: NonNullable +} + +/** + * Core fetcher added by CommerceProvider + */ +export type Fetcher = ( + options: FetcherOptions +) => T | Promise + +export type FetcherOptions = { + url?: string + query?: string + method?: string + variables?: any + body?: Body +} + +export type HookFetcher = ( + options: HookFetcherOptions | null, + input: Input, + fetch: (options: FetcherOptions) => Promise +) => Data | Promise + +export type HookFetcherFn = ( + context: HookFetcherContext +) => H['data'] | Promise + +export type HookFetcherContext = { + options: HookFetcherOptions + input: H['fetcherInput'] + fetch: < + T = H['fetchData'] extends {} | null ? H['fetchData'] : any, + B = H['body'] + >( + options: FetcherOptions + ) => Promise +} + +export type HookFetcherOptions = { method?: string } & ( + | { query: string; url?: string } + | { query?: string; url: string } +) + +export type HookInputValue = string | number | boolean | undefined + +export type HookSWRInput = [string, HookInputValue][] + +export type HookFetchInput = { [k: string]: HookInputValue } + +export type HookFunction< + Input extends { [k: string]: unknown } | undefined, + T +> = keyof Input extends never + ? () => T + : Partial extends Input + ? (input?: Input) => T + : (input: Input) => T + +export type HookSchemaBase = { + // Data obj returned by the hook + data: any + // Input expected by the hook + input?: {} + // Input expected before doing a fetch operation (aka fetch handler) + fetcherInput?: {} + // Body object expected by the fetch operation + body?: {} + // Data returned by the fetch operation + fetchData?: any +} + +export type SWRHookSchemaBase = HookSchemaBase & { + // Custom state added to the response object of SWR + swrState?: {} + // Instances of MutationSchemaBase that the hook returns for better DX + mutations?: Record['useHook']>> +} + +export type MutationSchemaBase = HookSchemaBase & { + // Input expected by the action returned by the hook + actionInput?: {} +} + +/** + * Generates a SWR hook handler based on the schema of a hook + */ +export type SWRHook = { + useHook( + context: SWRHookContext + ): HookFunction< + H['input'] & { swrOptions?: SwrOptions }, + ResponseState & H['swrState'] & H['mutations'] + > + fetchOptions: HookFetcherOptions + fetcher?: HookFetcherFn +} + +export type SWRHookContext = { + useData(context?: { + input?: HookFetchInput | HookSWRInput + swrOptions?: SwrOptions + }): ResponseState +} + +/** + * Generates a mutation hook handler based on the schema of a hook + */ +export type MutationHook = { + useHook( + context: MutationHookContext + ): HookFunction< + H['input'], + HookFunction> + > + fetchOptions: HookFetcherOptions + fetcher?: HookFetcherFn +} + +export type MutationHookContext = { + fetch: keyof H['fetcherInput'] extends never + ? () => H['data'] | Promise + : Partial extends H['fetcherInput'] + ? (context?: { + input?: H['fetcherInput'] + }) => H['data'] | Promise + : (context: { input: H['fetcherInput'] }) => H['data'] | Promise +} + +export type SwrOptions = SWRConfiguration< + Data, + CommerceError, + HookFetcher +> diff --git a/packages/commerce/src/utils/use-data.tsx b/packages/commerce/src/utils/use-data.tsx new file mode 100644 index 0000000..fedd14e --- /dev/null +++ b/packages/commerce/src/utils/use-data.tsx @@ -0,0 +1,78 @@ +import useSWR, { SWRResponse } from 'swr' +import type { + HookSWRInput, + HookFetchInput, + HookFetcherOptions, + HookFetcherFn, + Fetcher, + SwrOptions, + SWRHookSchemaBase, +} from './types' +import defineProperty from './define-property' +import { CommerceError } from './errors' + +export type ResponseState = SWRResponse & { + isLoading: boolean +} + +export type UseData = ( + options: { + fetchOptions: HookFetcherOptions + fetcher: HookFetcherFn + }, + input: HookFetchInput | HookSWRInput, + fetcherFn: Fetcher, + swrOptions?: SwrOptions +) => ResponseState + +const useData: UseData = (options, input, fetcherFn, swrOptions) => { + const hookInput = Array.isArray(input) ? input : Object.entries(input) + const fetcher = async ( + url: string, + query?: string, + method?: string, + ...args: any[] + ) => { + try { + return await options.fetcher({ + options: { url, query, method }, + // Transform the input array into an object + input: args.reduce((obj, val, i) => { + obj[hookInput[i][0]!] = val + return obj + }, {}), + fetch: fetcherFn, + }) + } catch (error) { + // SWR will not log errors, but any error that's not an instance + // of CommerceError is not welcomed by this hook + if (!(error instanceof CommerceError)) { + console.error(error) + } + throw error + } + } + const response = useSWR( + () => { + const opts = options.fetchOptions + return opts + ? [opts.url, opts.query, opts.method, ...hookInput.map((e) => e[1])] + : null + }, + fetcher, + swrOptions + ) + + if (!('isLoading' in response)) { + defineProperty(response, 'isLoading', { + get() { + return response.data === undefined + }, + enumerable: true, + }) + } + + return response as typeof response & { isLoading: boolean } +} + +export default useData diff --git a/packages/commerce/src/utils/use-hook.ts b/packages/commerce/src/utils/use-hook.ts new file mode 100644 index 0000000..1bf0779 --- /dev/null +++ b/packages/commerce/src/utils/use-hook.ts @@ -0,0 +1,50 @@ +import { useCallback } from 'react' +import { Provider, useCommerce } from '..' +import type { MutationHook, PickRequired, SWRHook } from './types' +import useData from './use-data' + +export function useFetcher() { + const { providerRef, fetcherRef } = useCommerce() + return providerRef.current.fetcher ?? fetcherRef.current +} + +export function useHook< + P extends Provider, + H extends MutationHook | SWRHook +>(fn: (provider: P) => H) { + const { providerRef } = useCommerce

() + const provider = providerRef.current + return fn(provider) +} + +export function useSWRHook>( + hook: PickRequired +) { + const fetcher = useFetcher() + + return hook.useHook({ + useData(ctx) { + const response = useData(hook, ctx?.input ?? [], fetcher, ctx?.swrOptions) + return response + }, + }) +} + +export function useMutationHook>( + hook: PickRequired +) { + const fetcher = useFetcher() + + return hook.useHook({ + fetch: useCallback( + ({ input } = {}) => { + return hook.fetcher({ + input, + options: hook.fetchOptions, + fetch: fetcher, + }) + }, + [fetcher, hook.fetchOptions] + ), + }) +} diff --git a/packages/commerce/src/wishlist/index.ts b/packages/commerce/src/wishlist/index.ts new file mode 100644 index 0000000..241af3c --- /dev/null +++ b/packages/commerce/src/wishlist/index.ts @@ -0,0 +1,3 @@ +export { default as useAddItem } from './use-add-item' +export { default as useWishlist } from './use-wishlist' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/commerce/src/wishlist/use-add-item.tsx b/packages/commerce/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..f464be1 --- /dev/null +++ b/packages/commerce/src/wishlist/use-add-item.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { MutationHook } from '../utils/types' +import type { AddItemHook } from '../types/wishlist' +import type { Provider } from '..' + +export type UseAddItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher = mutationFetcher + +const fn = (provider: Provider) => provider.wishlist?.useAddItem! + +const useAddItem: UseAddItem = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useAddItem diff --git a/packages/commerce/src/wishlist/use-remove-item.tsx b/packages/commerce/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..4419c17 --- /dev/null +++ b/packages/commerce/src/wishlist/use-remove-item.tsx @@ -0,0 +1,20 @@ +import { useHook, useMutationHook } from '../utils/use-hook' +import { mutationFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, MutationHook } from '../utils/types' +import type { RemoveItemHook } from '../types/wishlist' +import type { Provider } from '..' + +export type UseRemoveItem< + H extends MutationHook> = MutationHook +> = ReturnType + +export const fetcher: HookFetcherFn = mutationFetcher + +const fn = (provider: Provider) => provider.wishlist?.useRemoveItem! + +const useRemoveItem: UseRemoveItem = (...args) => { + const hook = useHook(fn) + return useMutationHook({ fetcher, ...hook })(...args) +} + +export default useRemoveItem diff --git a/packages/commerce/src/wishlist/use-wishlist.tsx b/packages/commerce/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..672203f --- /dev/null +++ b/packages/commerce/src/wishlist/use-wishlist.tsx @@ -0,0 +1,20 @@ +import { useHook, useSWRHook } from '../utils/use-hook' +import { SWRFetcher } from '../utils/default-fetcher' +import type { HookFetcherFn, SWRHook } from '../utils/types' +import type { GetWishlistHook } from '../types/wishlist' +import type { Provider } from '..' + +export type UseWishlist< + H extends SWRHook> = SWRHook +> = ReturnType + +export const fetcher: HookFetcherFn = SWRFetcher + +const fn = (provider: Provider) => provider.wishlist?.useWishlist! + +const useWishlist: UseWishlist = (...args) => { + const hook = useHook(fn) + return useSWRHook({ fetcher, ...hook })(...args) +} + +export default useWishlist diff --git a/packages/commerce/taskfile.js b/packages/commerce/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/commerce/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/commerce/tsconfig.json b/packages/commerce/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/commerce/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/commercejs/.env.template b/packages/commercejs/.env.template new file mode 100644 index 0000000..3e8ba8f --- /dev/null +++ b/packages/commercejs/.env.template @@ -0,0 +1,7 @@ +COMMERCE_PROVIDER=@vercel/commerce-commercejs + +# Public key for your Commerce.js account +NEXT_PUBLIC_COMMERCEJS_PUBLIC_KEY= + +# The URL for the current deployment, optional but should be used for production deployments +NEXT_PUBLIC_COMMERCEJS_DEPLOYMENT_URL= diff --git a/packages/commercejs/.prettierignore b/packages/commercejs/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/commercejs/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/commercejs/.prettierrc b/packages/commercejs/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/commercejs/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/commercejs/README.md b/packages/commercejs/README.md new file mode 100644 index 0000000..20aaf70 --- /dev/null +++ b/packages/commercejs/README.md @@ -0,0 +1,13 @@ +# [Commerce.js](https://commercejs.com/) Provider + +**Demo:** https://commercejs.vercel.store/ + +To use this provider you must have a [Commerce.js account](https://commercejs.com/) and you should add some products in the Commerce.js dashboard. + +Next, copy the `.env.template` file in this directory to `.env.local` in the main directory (which will be ignored by Git): + +```bash +cp packages/commercejs/.env.template .env.local +``` + +Then, set the environment variables in `.env.local` to match the ones from your store. You'll need your Commerce.js public API key, which can be found in your Commerce.js dashboard in the `Developer -> API keys` section. diff --git a/packages/commercejs/global.d.ts b/packages/commercejs/global.d.ts new file mode 100644 index 0000000..3fc3787 --- /dev/null +++ b/packages/commercejs/global.d.ts @@ -0,0 +1 @@ +declare module '@components/checkout/context' diff --git a/packages/commercejs/package.json b/packages/commercejs/package.json new file mode 100644 index 0000000..9887a70 --- /dev/null +++ b/packages/commercejs/package.json @@ -0,0 +1,82 @@ +{ + "name": "@vercel/commerce-commercejs", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@chec/commerce.js": "^2.8.0", + "@vercel/commerce": "^0.0.1", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/chec__commerce.js": "^2.8.4", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/commercejs/src/api/endpoints/cart/index.ts b/packages/commercejs/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/cart/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/catalog/index.ts b/packages/commercejs/src/api/endpoints/catalog/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/catalog/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/catalog/products/index.ts b/packages/commercejs/src/api/endpoints/catalog/products/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/catalog/products/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/checkout/get-checkout.ts b/packages/commercejs/src/api/endpoints/checkout/get-checkout.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/checkout/get-checkout.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/checkout/index.ts b/packages/commercejs/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..1072902 --- /dev/null +++ b/packages/commercejs/src/api/endpoints/checkout/index.ts @@ -0,0 +1,23 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' +import type { CheckoutSchema } from '../../../types/checkout' +import type { CommercejsAPI } from '../..' + +import submitCheckout from './submit-checkout' +import getCheckout from './get-checkout' + +export type CheckoutAPI = GetAPISchema + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { + submitCheckout, + getCheckout, +} + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/commercejs/src/api/endpoints/checkout/submit-checkout.ts b/packages/commercejs/src/api/endpoints/checkout/submit-checkout.ts new file mode 100644 index 0000000..e0f3012 --- /dev/null +++ b/packages/commercejs/src/api/endpoints/checkout/submit-checkout.ts @@ -0,0 +1,44 @@ +import type { CardFields } from '@vercel/commerce/types/customer/card' +import type { AddressFields } from '@vercel/commerce/types/customer/address' +import type { CheckoutEndpoint } from '.' +import sdkFetcherFunction from '../../utils/sdk-fetch' +import { normalizeTestCheckout } from '../../../utils/normalize-checkout' + +const submitCheckout: CheckoutEndpoint['handlers']['submitCheckout'] = async ({ + res, + body: { item, cartId }, + config: { sdkFetch }, +}) => { + const sdkFetcher: typeof sdkFetcherFunction = sdkFetch + + // Generate a checkout token + const { id: checkoutToken } = await sdkFetcher( + 'checkout', + 'generateTokenFrom', + 'cart', + cartId + ) + + const shippingMethods = await sdkFetcher( + 'checkout', + 'getShippingOptions', + checkoutToken, + { + country: 'US', + } + ) + + const shippingMethodToUse = shippingMethods?.[0]?.id || '' + const checkoutData = normalizeTestCheckout({ + paymentInfo: item?.card as CardFields, + shippingInfo: item?.address as AddressFields, + shippingOption: shippingMethodToUse, + }) + + // Capture the order + await sdkFetcher('checkout', 'capture', checkoutToken, checkoutData) + + res.status(200).json({ data: null, errors: [] }) +} + +export default submitCheckout diff --git a/packages/commercejs/src/api/endpoints/customer/address/index.ts b/packages/commercejs/src/api/endpoints/customer/address/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/customer/address/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/customer/card/index.ts b/packages/commercejs/src/api/endpoints/customer/card/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/customer/card/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/customer/index.ts b/packages/commercejs/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/login/index.ts b/packages/commercejs/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..a6dbb44 --- /dev/null +++ b/packages/commercejs/src/api/endpoints/login/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import loginEndpoint from '@vercel/commerce/api/endpoints/login' +import type { LoginSchema } from '../../../types/login' +import type { CommercejsAPI } from '../..' +import login from './login' + +export type LoginAPI = GetAPISchema + +export type LoginEndpoint = LoginAPI['endpoint'] + +export const handlers: LoginEndpoint['handlers'] = { login } + +const loginApi = createEndpoint({ + handler: loginEndpoint, + handlers, +}) + +export default loginApi diff --git a/packages/commercejs/src/api/endpoints/login/login.ts b/packages/commercejs/src/api/endpoints/login/login.ts new file mode 100644 index 0000000..b9088ad --- /dev/null +++ b/packages/commercejs/src/api/endpoints/login/login.ts @@ -0,0 +1,33 @@ +import { serialize } from 'cookie' +import sdkFetcherFunction from '../../utils/sdk-fetch' +import { getDeploymentUrl } from '../../../utils/get-deployment-url' +import type { LoginEndpoint } from '.' + +const login: LoginEndpoint['handlers']['login'] = async ({ + req, + res, + config: { sdkFetch, customerCookie }, +}) => { + const sdkFetcher: typeof sdkFetcherFunction = sdkFetch + const redirectUrl = getDeploymentUrl() + try { + const loginToken = req.query?.token as string + if (!loginToken) { + res.redirect(redirectUrl) + } + const { jwt } = await sdkFetcher('customer', 'getToken', loginToken, false) + res.setHeader( + 'Set-Cookie', + serialize(customerCookie, jwt, { + secure: process.env.NODE_ENV === 'production', + maxAge: 60 * 60 * 24, + path: '/', + }) + ) + res.redirect(redirectUrl) + } catch { + res.redirect(redirectUrl) + } +} + +export default login diff --git a/packages/commercejs/src/api/endpoints/logout/index.ts b/packages/commercejs/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/signup/index.ts b/packages/commercejs/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/endpoints/wishlist/index.tsx b/packages/commercejs/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/commercejs/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/commercejs/src/api/index.ts b/packages/commercejs/src/api/index.ts new file mode 100644 index 0000000..1bc8218 --- /dev/null +++ b/packages/commercejs/src/api/index.ts @@ -0,0 +1,46 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' +import sdkFetch from './utils/sdk-fetch' +import createGraphqlFetcher from './utils/graphql-fetch' +import { API_URL, CART_COOKIE, CUSTOMER_COOKIE } from '../constants' + +export interface CommercejsConfig extends CommerceAPIConfig { + sdkFetch: typeof sdkFetch +} + +const config: CommercejsConfig = { + commerceUrl: API_URL, + cartCookie: CART_COOKIE, + cartCookieMaxAge: 2592000, + customerCookie: CUSTOMER_COOKIE, + apiToken: '', + fetch: createGraphqlFetcher(() => getCommerceApi().getConfig()), + sdkFetch, +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider +export type CommercejsAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): CommercejsAPI

{ + return commerceApi(customProvider as any) +} diff --git a/packages/commercejs/src/api/operations/get-all-pages.ts b/packages/commercejs/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..c8c9e41 --- /dev/null +++ b/packages/commercejs/src/api/operations/get-all-pages.ts @@ -0,0 +1,21 @@ +import type { CommercejsConfig } from '..' +import { GetAllPagesOperation } from '../../types/page' + +export type Page = { url: string } +export type GetAllPagesResult = { pages: Page[] } + +export default function getAllPagesOperation() { + async function getAllPages({ + config, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + return Promise.resolve({ + pages: [], + }) + } + return getAllPages +} diff --git a/packages/commercejs/src/api/operations/get-all-product-paths.ts b/packages/commercejs/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..03b7eee --- /dev/null +++ b/packages/commercejs/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,35 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { + GetAllProductPathsOperation, + CommercejsProduct, +} from '../../types/product' + +import type { CommercejsConfig, Provider } from '..' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths({ + config, + }: { + config?: Partial + } = {}): Promise { + const { sdkFetch } = commerce.getConfig(config) + const { data } = await sdkFetch('products', 'list') + + // Match a path for every product retrieved + const productPaths = data.map(({ permalink }: CommercejsProduct) => ({ + path: `/${permalink}`, + })) + + return { + products: productPaths, + } + } + + return getAllProductPaths +} diff --git a/packages/commercejs/src/api/operations/get-all-products.ts b/packages/commercejs/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..485ea22 --- /dev/null +++ b/packages/commercejs/src/api/operations/get-all-products.ts @@ -0,0 +1,29 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { GetAllProductsOperation } from '../../types/product' +import type { CommercejsConfig, Provider } from '../index' + +import { normalizeProduct } from '../../utils/normalize-product' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts({ + config, + }: { + config?: Partial + } = {}): Promise { + const { sdkFetch } = commerce.getConfig(config) + const { data } = await sdkFetch('products', 'list', { + sortBy: 'sort_order', + }) + + const productsFormatted = + data?.map((product: any) => normalizeProduct(product)) || [] + + return { + products: productsFormatted, + } + } + + return getAllProducts +} diff --git a/packages/commercejs/src/api/operations/get-page.ts b/packages/commercejs/src/api/operations/get-page.ts new file mode 100644 index 0000000..f4b69c9 --- /dev/null +++ b/packages/commercejs/src/api/operations/get-page.ts @@ -0,0 +1,15 @@ +import { GetPageOperation } from '../../types/page' + +export type Page = any +export type GetPageResult = { page?: Page } + +export type PageVariables = { + id: number +} + +export default function getPageOperation() { + async function getPage(): Promise { + return Promise.resolve({}) + } + return getPage +} diff --git a/packages/commercejs/src/api/operations/get-product.ts b/packages/commercejs/src/api/operations/get-product.ts new file mode 100644 index 0000000..c8fa590 --- /dev/null +++ b/packages/commercejs/src/api/operations/get-product.ts @@ -0,0 +1,44 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { GetProductOperation } from '../../types/product' +import type { CommercejsConfig, Provider } from '../index' +import { normalizeProduct } from '../../utils/normalize-product' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + config, + variables, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + const { sdkFetch } = commerce.getConfig(config) + + // Fetch a product by its permalink. + const product = await sdkFetch( + 'products', + 'retrieve', + variables?.slug || '', + { + type: 'permalink', + } + ) + + const { data: variants } = await sdkFetch( + 'products', + 'getVariants', + product.id + ) + + const productFormatted = normalizeProduct(product, variants) + + return { + product: productFormatted, + } + } + + return getProduct +} diff --git a/packages/commercejs/src/api/operations/get-site-info.ts b/packages/commercejs/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..0b4046d --- /dev/null +++ b/packages/commercejs/src/api/operations/get-site-info.ts @@ -0,0 +1,36 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Category, GetSiteInfoOperation } from '../../types/site' +import { normalizeCategory } from '../../utils/normalize-category' +import type { CommercejsConfig, Provider } from '../index' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo({ + config, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + const { sdkFetch } = commerce.getConfig(config) + const { data: categories } = await sdkFetch('categories', 'list') + + const formattedCategories = categories.map(normalizeCategory) + + return { + categories: formattedCategories, + brands: [], + } + } + + return getSiteInfo +} diff --git a/packages/commercejs/src/api/operations/index.ts b/packages/commercejs/src/api/operations/index.ts new file mode 100644 index 0000000..84b04a9 --- /dev/null +++ b/packages/commercejs/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getAllPages } from './get-all-pages' +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/commercejs/src/api/utils/graphql-fetch.ts b/packages/commercejs/src/api/utils/graphql-fetch.ts new file mode 100644 index 0000000..64ebf4d --- /dev/null +++ b/packages/commercejs/src/api/utils/graphql-fetch.ts @@ -0,0 +1,14 @@ +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { CommercejsConfig } from '../' + +import { FetcherError } from '@vercel/commerce/utils/errors' + +const fetchGraphqlApi: (getConfig: () => CommercejsConfig) => GraphQLFetcher = + () => async () => { + throw new FetcherError({ + errors: [{ message: 'GraphQL fetch is not implemented' }], + status: 500, + }) + } + +export default fetchGraphqlApi diff --git a/packages/commercejs/src/api/utils/sdk-fetch.ts b/packages/commercejs/src/api/utils/sdk-fetch.ts new file mode 100644 index 0000000..d080c54 --- /dev/null +++ b/packages/commercejs/src/api/utils/sdk-fetch.ts @@ -0,0 +1,21 @@ +import { commerce } from '../../lib/commercejs' +import Commerce from '@chec/commerce.js' + +type MethodKeys = { + [K in keyof T]: T[K] extends (...args: any) => infer R ? K : never +}[keyof T] + +// Calls the relevant Commerce.js SDK method based on resource and method arguments. +export default async function sdkFetch< + Resource extends keyof Commerce, + Method extends MethodKeys +>( + resource: Resource, + method: Method, + ...variables: Parameters +): Promise> { + //@ts-ignore + // Provider TODO: Fix types here. + const data = await commerce[resource][method](...variables) + return data +} diff --git a/packages/commercejs/src/auth/index.ts b/packages/commercejs/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/commercejs/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/commercejs/src/auth/use-login.tsx b/packages/commercejs/src/auth/use-login.tsx new file mode 100644 index 0000000..4287d39 --- /dev/null +++ b/packages/commercejs/src/auth/use-login.tsx @@ -0,0 +1,34 @@ +import { useCallback } from 'react' +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import type { LoginHook } from '@vercel/commerce/types/login' +import { getDeploymentUrl } from '../utils/get-deployment-url' + +export default useLogin as UseLogin + +const getLoginCallbackUrl = () => { + const baseUrl = getDeploymentUrl() + const API_ROUTE_PATH = 'api/login' + return `${baseUrl}/${API_ROUTE_PATH}` +} + +export const handler: MutationHook = { + fetchOptions: { + query: 'customer', + method: 'login', + }, + async fetcher({ input, options: { query, method }, fetch }) { + await fetch({ + query, + method, + variables: [input.email, getLoginCallbackUrl()], + }) + return null + }, + useHook: ({ fetch }) => + function useHook() { + return useCallback(async function login(input) { + return fetch({ input }) + }, []) + }, +} diff --git a/packages/commercejs/src/auth/use-logout.tsx b/packages/commercejs/src/auth/use-logout.tsx new file mode 100644 index 0000000..7c60f34 --- /dev/null +++ b/packages/commercejs/src/auth/use-logout.tsx @@ -0,0 +1,27 @@ +import { useCallback } from 'react' +import Cookies from 'js-cookie' +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import type { LogoutHook } from '@vercel/commerce/types/logout' +import useCustomer from '../customer/use-customer' +import { CUSTOMER_COOKIE } from '../constants' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: '_', + method: '_', + }, + useHook: () => () => { + const { mutate } = useCustomer() + return useCallback( + async function logout() { + Cookies.remove(CUSTOMER_COOKIE) + await mutate(null, false) + return null + }, + [mutate] + ) + }, +} diff --git a/packages/commercejs/src/auth/use-signup.tsx b/packages/commercejs/src/auth/use-signup.tsx new file mode 100644 index 0000000..1cc9538 --- /dev/null +++ b/packages/commercejs/src/auth/use-signup.tsx @@ -0,0 +1,17 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + () => {}, +} diff --git a/packages/commercejs/src/cart/index.ts b/packages/commercejs/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/commercejs/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/commercejs/src/cart/use-add-item.tsx b/packages/commercejs/src/cart/use-add-item.tsx new file mode 100644 index 0000000..3bbad11 --- /dev/null +++ b/packages/commercejs/src/cart/use-add-item.tsx @@ -0,0 +1,45 @@ +import type { AddItemHook } from '@vercel/commerce/types/cart' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { useCallback } from 'react' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { CommercejsCart } from '../types/cart' +import { normalizeCart } from '../utils/normalize-cart' +import useCart from './use-cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: 'cart', + method: 'add', + }, + async fetcher({ input: item, options, fetch }) { + // Frontend stringifies variantId even if undefined. + const hasVariant = !item.variantId || item.variantId !== 'undefined' + + const variables = [item.productId, item?.quantity || 1] + if (hasVariant) { + variables.push(item.variantId) + } + + const { cart } = await fetch<{ cart: CommercejsCart }>({ + query: options.query, + method: options.method, + variables, + }) + return normalizeCart(cart) + }, + useHook: ({ fetch }) => + function useHook() { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const cart = await fetch({ input }) + await mutate(cart, false) + return cart + }, + [mutate] + ) + }, +} diff --git a/packages/commercejs/src/cart/use-cart.tsx b/packages/commercejs/src/cart/use-cart.tsx new file mode 100644 index 0000000..57592ec --- /dev/null +++ b/packages/commercejs/src/cart/use-cart.tsx @@ -0,0 +1,41 @@ +import { useMemo } from 'react' +import type { GetCartHook } from '@vercel/commerce/types/cart' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' +import type { CommercejsCart } from '../types/cart' +import { normalizeCart } from '../utils/normalize-cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: 'cart', + method: 'retrieve', + }, + async fetcher({ options, fetch }) { + const cart = await fetch({ + query: options.query, + method: options.method, + }) + return normalizeCart(cart) + }, + useHook: ({ useData }) => + function useHook(input) { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems?.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/commercejs/src/cart/use-remove-item.tsx b/packages/commercejs/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..c9e5787 --- /dev/null +++ b/packages/commercejs/src/cart/use-remove-item.tsx @@ -0,0 +1,36 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import type { RemoveItemHook } from '@vercel/commerce/types/cart' +import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import type { CommercejsCart } from '../types/cart' +import { normalizeCart } from '../utils/normalize-cart' +import useCart from './use-cart' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + query: 'cart', + method: 'remove', + }, + async fetcher({ input, options, fetch }) { + const { cart } = await fetch<{ cart: CommercejsCart }>({ + query: options.query, + method: options.method, + variables: input.itemId, + }) + return normalizeCart(cart) + }, + useHook: ({ fetch }) => + function useHook() { + const { mutate } = useCart() + return useCallback( + async function removeItem(input) { + const cart = await fetch({ input: { itemId: input.id } }) + await mutate(cart, false) + return cart + }, + [mutate] + ) + }, +} diff --git a/packages/commercejs/src/cart/use-update-item.tsx b/packages/commercejs/src/cart/use-update-item.tsx new file mode 100644 index 0000000..1546be0 --- /dev/null +++ b/packages/commercejs/src/cart/use-update-item.tsx @@ -0,0 +1,76 @@ +import type { UpdateItemHook, LineItem } from '@vercel/commerce/types/cart' +import type { + HookFetcherContext, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import debounce from 'lodash.debounce' +import { useCallback } from 'react' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import type { CommercejsCart } from '../types/cart' +import { normalizeCart } from '../utils/normalize-cart' +import useCart from './use-cart' + +export default useUpdateItem as UseUpdateItem + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export const handler = { + fetchOptions: { + query: 'cart', + method: 'update', + }, + async fetcher({ input, options, fetch }: HookFetcherContext) { + const variables = [input.itemId, { quantity: input.item.quantity }] + const { cart } = await fetch<{ cart: CommercejsCart }>({ + query: options.query, + method: options.method, + variables, + }) + return normalizeCart(cart) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + // eslint-disable-next-line react-hooks/rules-of-hooks + const { mutate } = useCart() as any + const { item } = ctx + + // eslint-disable-next-line react-hooks/rules-of-hooks + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + const quantity = input?.quantity ?? item?.quantity + + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input for updating cart item', + }) + } + + const cart = await fetch({ + input: { + itemId, + item: { + quantity, + productId, + variantId, + }, + }, + }) + await mutate(cart, false) + return cart + }, ctx.wait ?? 500), + [mutate, item] + ) + }, +} diff --git a/packages/commercejs/src/checkout/index.ts b/packages/commercejs/src/checkout/index.ts new file mode 100644 index 0000000..3066210 --- /dev/null +++ b/packages/commercejs/src/checkout/index.ts @@ -0,0 +1,2 @@ +export { default as useSubmitCheckout } from './use-submit-checkout' +export { default as useCheckout } from './use-checkout' diff --git a/packages/commercejs/src/checkout/use-checkout.tsx b/packages/commercejs/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..52a19a7 --- /dev/null +++ b/packages/commercejs/src/checkout/use-checkout.tsx @@ -0,0 +1,52 @@ +import type { GetCheckoutHook } from '@vercel/commerce/types/checkout' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { UseCheckout } from '@vercel/commerce/checkout/use-checkout' +import useSubmitCheckout from './use-submit-checkout' +import { useCheckoutContext } from '@components/checkout/context' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '_', + method: '_', + }, + useHook: () => + function useHook() { + const { cardFields, addressFields } = useCheckoutContext() + const submit = useSubmitCheckout() + + // Basic validation - check that at least one field has a value. + const hasEnteredCard = Object.values(cardFields).some( + (fieldValue) => !!fieldValue + ) + const hasEnteredAddress = Object.values(addressFields).some( + (fieldValue) => !!fieldValue + ) + + const response = useMemo( + () => ({ + data: { + hasPayment: hasEnteredCard, + hasShipping: hasEnteredAddress, + }, + }), + [hasEnteredCard, hasEnteredAddress] + ) + + return useMemo( + () => + Object.create(response, { + submit: { + get() { + return submit + }, + enumerable: true, + }, + }), + [submit, response] + ) + }, +} diff --git a/packages/commercejs/src/checkout/use-submit-checkout.tsx b/packages/commercejs/src/checkout/use-submit-checkout.tsx new file mode 100644 index 0000000..2cb7232 --- /dev/null +++ b/packages/commercejs/src/checkout/use-submit-checkout.tsx @@ -0,0 +1,38 @@ +import type { SubmitCheckoutHook } from '@vercel/commerce/types/checkout' +import type { MutationHook } from '@vercel/commerce/utils/types' + +import { useCallback } from 'react' +import useSubmitCheckout, { + UseSubmitCheckout, +} from '@vercel/commerce/checkout/use-submit-checkout' +import { useCheckoutContext } from '@components/checkout/context' + +export default useSubmitCheckout as UseSubmitCheckout + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/checkout', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + const data = await fetch({ + ...options, + body: { item }, + }) + return data + }, + useHook: ({ fetch }) => + function useHook() { + const { cardFields, addressFields } = useCheckoutContext() + + return useCallback( + async function onSubmitCheckout(input) { + const data = await fetch({ + input: { card: cardFields, address: addressFields }, + }) + return data + }, + [cardFields, addressFields] + ) + }, +} diff --git a/packages/commercejs/src/commerce.config.json b/packages/commercejs/src/commerce.config.json new file mode 100644 index 0000000..ba52b04 --- /dev/null +++ b/packages/commercejs/src/commerce.config.json @@ -0,0 +1,10 @@ +{ + "provider": "commercejs", + "features": { + "cart": true, + "search": true, + "customCheckout": true, + "customerAuth": true, + "wishlist": false + } +} diff --git a/packages/commercejs/src/constants.ts b/packages/commercejs/src/constants.ts new file mode 100644 index 0000000..33a7677 --- /dev/null +++ b/packages/commercejs/src/constants.ts @@ -0,0 +1,4 @@ +export const CART_COOKIE = 'commercejs_cart_id' +export const CUSTOMER_COOKIE = 'commercejs_customer_token' +export const API_URL = 'https://api.chec.io/v1' +export const LOCALE = 'en-us' diff --git a/packages/commercejs/src/customer/address/index.ts b/packages/commercejs/src/customer/address/index.ts new file mode 100644 index 0000000..1fb07c0 --- /dev/null +++ b/packages/commercejs/src/customer/address/index.ts @@ -0,0 +1,2 @@ +export { default as useAddresses } from './use-addresses' +export { default as useAddItem } from './use-add-item' diff --git a/packages/commercejs/src/customer/address/use-add-item.tsx b/packages/commercejs/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..0f02059 --- /dev/null +++ b/packages/commercejs/src/customer/address/use-add-item.tsx @@ -0,0 +1,25 @@ +import type { AddItemHook } from '@vercel/commerce/types/customer/address' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { useCallback } from 'react' +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import { useCheckoutContext } from '@components/checkout/context' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '_', + method: '_', + }, + useHook: () => + function useHook() { + const { setAddressFields } = useCheckoutContext() + return useCallback( + async function addItem(input) { + setAddressFields(input) + return undefined + }, + [setAddressFields] + ) + }, +} diff --git a/packages/commercejs/src/customer/address/use-addresses.tsx b/packages/commercejs/src/customer/address/use-addresses.tsx new file mode 100644 index 0000000..a56255d --- /dev/null +++ b/packages/commercejs/src/customer/address/use-addresses.tsx @@ -0,0 +1,34 @@ +import type { GetAddressesHook } from '@vercel/commerce/types/customer/address' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useAddresses, { + UseAddresses, +} from '@vercel/commerce/customer/address/use-addresses' + +export default useAddresses as UseAddresses + +export const handler: SWRHook = { + fetchOptions: { + url: '_', + method: '_', + }, + useHook: () => + function useHook() { + return useMemo( + () => + Object.create( + {}, + { + isEmpty: { + get() { + return true + }, + enumerable: true, + }, + } + ), + [] + ) + }, +} diff --git a/packages/commercejs/src/customer/card/index.ts b/packages/commercejs/src/customer/card/index.ts new file mode 100644 index 0000000..4048ca2 --- /dev/null +++ b/packages/commercejs/src/customer/card/index.ts @@ -0,0 +1,2 @@ +export { default as useCards } from './use-cards' +export { default as useAddItem } from './use-add-item' diff --git a/packages/commercejs/src/customer/card/use-add-item.tsx b/packages/commercejs/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..d4c179b --- /dev/null +++ b/packages/commercejs/src/customer/card/use-add-item.tsx @@ -0,0 +1,25 @@ +import type { AddItemHook } from '@vercel/commerce/types/customer/card' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { useCallback } from 'react' +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import { useCheckoutContext } from '@components/checkout/context' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '_', + method: '_', + }, + useHook: () => + function useHook() { + const { setCardFields } = useCheckoutContext() + return useCallback( + async function addItem(input) { + setCardFields(input) + return undefined + }, + [setCardFields] + ) + }, +} diff --git a/packages/commercejs/src/customer/card/use-cards.tsx b/packages/commercejs/src/customer/card/use-cards.tsx new file mode 100644 index 0000000..7c956a6 --- /dev/null +++ b/packages/commercejs/src/customer/card/use-cards.tsx @@ -0,0 +1,31 @@ +import type { GetCardsHook } from '@vercel/commerce/types/customer/card' +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCard, { UseCards } from '@vercel/commerce/customer/card/use-cards' + +export default useCard as UseCards + +export const handler: SWRHook = { + fetchOptions: { + query: '_', + method: '_', + }, + useHook: () => + function useHook() { + return useMemo( + () => + Object.create( + {}, + { + isEmpty: { + get() { + return true + }, + enumerable: true, + }, + } + ), + [] + ) + }, +} diff --git a/packages/commercejs/src/customer/index.ts b/packages/commercejs/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/commercejs/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/commercejs/src/customer/use-customer.tsx b/packages/commercejs/src/customer/use-customer.tsx new file mode 100644 index 0000000..4906223 --- /dev/null +++ b/packages/commercejs/src/customer/use-customer.tsx @@ -0,0 +1,44 @@ +import Cookies from 'js-cookie' +import { decode } from 'jsonwebtoken' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' +import { CUSTOMER_COOKIE, API_URL } from '../constants' +import type { CustomerHook } from '../types/customer' + +export default useCustomer as UseCustomer +export const handler: SWRHook = { + fetchOptions: { + query: 'customer', + method: '_request', + }, + async fetcher({ options, fetch }) { + const token = Cookies.get(CUSTOMER_COOKIE) + if (!token) { + return null + } + + const decodedToken = decode(token) as { cid: string } + const customer = await fetch({ + query: options.query, + method: options.method, + variables: [ + `${API_URL}/customers/${decodedToken.cid}`, + 'get', + null, + {}, + token, + ], + }) + return customer + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/commercejs/src/fetcher.ts b/packages/commercejs/src/fetcher.ts new file mode 100644 index 0000000..ab47ae9 --- /dev/null +++ b/packages/commercejs/src/fetcher.ts @@ -0,0 +1,61 @@ +import { commerce } from './lib/commercejs' +import type { Fetcher } from '@vercel/commerce/utils/types' +import { FetcherError } from '@vercel/commerce/utils/errors' + +function isValidSDKQuery(query?: string): query is keyof typeof commerce { + if (!query) return false + return query in commerce +} + +// Fetches from an API route within /api/endpoints directory +const customFetcher: Fetcher = async ({ method, url, body }) => { + const response = await fetch(url!, { + method, + body: body ? JSON.stringify(body) : undefined, + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => response.json()) + .then((response) => response.data) + + return response +} + +const fetcher: Fetcher = async ({ url, query, method, variables, body }) => { + // If a URL is passed, it means that the fetch needs to be passed on to a custom API route. + const isCustomFetch = !!url + if (isCustomFetch) { + const data = await customFetcher({ url, method, body }) + return data + } + + // Fetch using the Commerce.js SDK, but make sure that it's a valid method. + if (!isValidSDKQuery(query)) { + throw new FetcherError({ + errors: [ + { message: `Query ${query} does not exist on Commerce.js SDK.` }, + ], + status: 400, + }) + } + + const resource: any = commerce[query] + + if (!method || !resource[method]) { + throw new FetcherError({ + errors: [ + { + message: `Method ${method} does not exist on Commerce.js SDK ${query} resource.`, + }, + ], + status: 400, + }) + } + + const variablesArgument = Array.isArray(variables) ? variables : [variables] + const data = await resource[method](...variablesArgument) + return data +} + +export default fetcher diff --git a/packages/commercejs/src/index.tsx b/packages/commercejs/src/index.tsx new file mode 100644 index 0000000..9da7c11 --- /dev/null +++ b/packages/commercejs/src/index.tsx @@ -0,0 +1,9 @@ +import { commercejsProvider, CommercejsProvider } from './provider' +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' + +export { commercejsProvider } +export type { CommercejsProvider } + +export const CommerceProvider = getCommerceProvider(commercejsProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/commercejs/src/lib/commercejs.ts b/packages/commercejs/src/lib/commercejs.ts new file mode 100644 index 0000000..8acea54 --- /dev/null +++ b/packages/commercejs/src/lib/commercejs.ts @@ -0,0 +1,11 @@ +import Commerce from '@chec/commerce.js' + +const commercejsPublicKey = process.env + .NEXT_PUBLIC_COMMERCEJS_PUBLIC_KEY as string +const devEnvironment = process.env.NODE_ENV === 'development' + +if (devEnvironment && !commercejsPublicKey) { + throw Error('A Commerce.js public API key must be provided') +} + +export const commerce = new Commerce(commercejsPublicKey, devEnvironment) diff --git a/packages/commercejs/src/next.config.cjs b/packages/commercejs/src/next.config.cjs new file mode 100644 index 0000000..0c9e96b --- /dev/null +++ b/packages/commercejs/src/next.config.cjs @@ -0,0 +1,16 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['cdn.chec.io'], + }, + rewrites() { + return [ + { + source: '/api/login/:token', + destination: '/api/login?token=:token', + }, + ] + }, +} diff --git a/packages/commercejs/src/product/index.ts b/packages/commercejs/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/commercejs/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/commercejs/src/product/use-price.tsx b/packages/commercejs/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/commercejs/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/commercejs/src/product/use-search.tsx b/packages/commercejs/src/product/use-search.tsx new file mode 100644 index 0000000..ec8ad61 --- /dev/null +++ b/packages/commercejs/src/product/use-search.tsx @@ -0,0 +1,53 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import { SearchProductsHook } from '@vercel/commerce/types/product' +import type { CommercejsProduct } from '../types/product' +import { getProductSearchVariables } from '../utils/product-search' +import { normalizeProduct } from '../utils/normalize-product' + +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + query: 'products', + method: 'list', + }, + async fetcher({ input, options, fetch }) { + const { data, meta } = await fetch<{ + data: CommercejsProduct[] + meta: { + pagination: { + total: number + } + } + }>({ + query: options.query, + method: options.method, + variables: getProductSearchVariables(input), + }) + + const formattedProducts = + data?.map((product) => normalizeProduct(product)) || [] + + return { + products: formattedProducts, + found: meta.pagination.total > 0, + } + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/commercejs/src/provider.ts b/packages/commercejs/src/provider.ts new file mode 100644 index 0000000..d596fa9 --- /dev/null +++ b/packages/commercejs/src/provider.ts @@ -0,0 +1,55 @@ +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import { handler as useCheckout } from './checkout/use-checkout' +import { handler as useSubmitCheckout } from './checkout/use-submit-checkout' + +import { handler as useCards } from './customer/card/use-cards' +import { handler as useAddCardItem } from './customer/card/use-add-item' + +import { handler as useAddresses } from './customer/address/use-addresses' +import { handler as useAddAddressItem } from './customer/address/use-add-item' + +import { CART_COOKIE, CUSTOMER_COOKIE, LOCALE } from './constants' +import { default as sdkFetcher } from './fetcher' + +export const commercejsProvider = { + locale: LOCALE, + cartCookie: CART_COOKIE, + customerCookie: CUSTOMER_COOKIE, + fetcher: sdkFetcher, + cart: { + useCart, + useAddItem, + useUpdateItem, + useRemoveItem, + }, + checkout: { + useCheckout, + useSubmitCheckout, + }, + customer: { + useCustomer, + card: { + useCards, + useAddItem: useAddCardItem, + }, + address: { + useAddresses, + useAddItem: useAddAddressItem, + }, + }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type CommercejsProvider = typeof commercejsProvider diff --git a/packages/commercejs/src/types/cart.ts b/packages/commercejs/src/types/cart.ts new file mode 100644 index 0000000..9de6839 --- /dev/null +++ b/packages/commercejs/src/types/cart.ts @@ -0,0 +1,4 @@ +export * from '@vercel/commerce/types/cart' + +export type { Cart as CommercejsCart } from '@chec/commerce.js/types/cart' +export type { LineItem as CommercejsLineItem } from '@chec/commerce.js/types/line-item' diff --git a/packages/commercejs/src/types/checkout.ts b/packages/commercejs/src/types/checkout.ts new file mode 100644 index 0000000..970d5cf --- /dev/null +++ b/packages/commercejs/src/types/checkout.ts @@ -0,0 +1,3 @@ +export * from '@vercel/commerce/types/checkout' + +export type { CheckoutCapture as CommercejsCheckoutCapture } from '@chec/commerce.js/types/checkout-capture' diff --git a/packages/commercejs/src/types/common.ts b/packages/commercejs/src/types/common.ts new file mode 100644 index 0000000..23b8daa --- /dev/null +++ b/packages/commercejs/src/types/common.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/common' diff --git a/packages/commercejs/src/types/customer.ts b/packages/commercejs/src/types/customer.ts new file mode 100644 index 0000000..c637055 --- /dev/null +++ b/packages/commercejs/src/types/customer.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/customer' diff --git a/packages/commercejs/src/types/index.ts b/packages/commercejs/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/commercejs/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/commercejs/src/types/login.ts b/packages/commercejs/src/types/login.ts new file mode 100644 index 0000000..0706a2f --- /dev/null +++ b/packages/commercejs/src/types/login.ts @@ -0,0 +1,9 @@ +import { LoginBody, LoginTypes } from '@vercel/commerce/types/login' +export * from '@vercel/commerce/types/login' + +export type LoginHook = { + data: null + actionInput: LoginBody + fetcherInput: LoginBody + body: T['body'] +} diff --git a/packages/commercejs/src/types/logout.ts b/packages/commercejs/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/commercejs/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/commercejs/src/types/page.ts b/packages/commercejs/src/types/page.ts new file mode 100644 index 0000000..12f6b02 --- /dev/null +++ b/packages/commercejs/src/types/page.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/page' diff --git a/packages/commercejs/src/types/product.ts b/packages/commercejs/src/types/product.ts new file mode 100644 index 0000000..7cdab70 --- /dev/null +++ b/packages/commercejs/src/types/product.ts @@ -0,0 +1,4 @@ +export * from '@vercel/commerce/types/product' + +export type { Product as CommercejsProduct } from '@chec/commerce.js/types/product' +export type { Variant as CommercejsVariant } from '@chec/commerce.js/types/variant' diff --git a/packages/commercejs/src/types/signup.ts b/packages/commercejs/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/commercejs/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/commercejs/src/types/site.ts b/packages/commercejs/src/types/site.ts new file mode 100644 index 0000000..346278b --- /dev/null +++ b/packages/commercejs/src/types/site.ts @@ -0,0 +1,3 @@ +export * from '@vercel/commerce/types/site' + +export type { Category as CommercejsCategory } from '@chec/commerce.js/types/category' diff --git a/packages/commercejs/src/types/wishlist.ts b/packages/commercejs/src/types/wishlist.ts new file mode 100644 index 0000000..af92d9f --- /dev/null +++ b/packages/commercejs/src/types/wishlist.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/wishlist' diff --git a/packages/commercejs/src/utils/get-deployment-url.ts b/packages/commercejs/src/utils/get-deployment-url.ts new file mode 100644 index 0000000..b0926ab --- /dev/null +++ b/packages/commercejs/src/utils/get-deployment-url.ts @@ -0,0 +1,12 @@ +export const getDeploymentUrl = () => { + // Custom environment variable. + if (process.env.NEXT_PUBLIC_COMMERCEJS_DEPLOYMENT_URL) { + return process.env.NEXT_PUBLIC_COMMERCEJS_DEPLOYMENT_URL + } + // Automatic Vercel deployment URL. + if (process.env.NEXT_PUBLIC_VERCEL_URL) { + return `https://${process.env.NEXT_PUBLIC_VERCEL_URL}` + } + // Assume local development. + return 'http://localhost:3000' +} diff --git a/packages/commercejs/src/utils/normalize-cart.ts b/packages/commercejs/src/utils/normalize-cart.ts new file mode 100644 index 0000000..c01ea6d --- /dev/null +++ b/packages/commercejs/src/utils/normalize-cart.ts @@ -0,0 +1,74 @@ +import type { + Cart, + LineItem, + CommercejsCart, + CommercejsLineItem, +} from '../types/cart' + +type CommercejsLineItemType = CommercejsLineItem & { image: { url: string } } + +const normalizeLineItem = ( + commercejsLineItem: CommercejsLineItemType +): LineItem => { + const { + id, + sku, + quantity, + price, + product_id, + product_name, + permalink, + variant, + image, + selected_options, + } = commercejsLineItem + return { + id, + variantId: variant?.id ?? '', + productId: product_id, + name: product_name, + quantity, + discounts: [], + path: permalink, + options: selected_options?.map(({ group_name, option_name }) => ({ + name: group_name, + value: option_name, + })), + variant: { + id: variant?.id ?? id, + sku: variant?.sku ?? sku, + name: product_name, + requiresShipping: false, + price: variant?.price?.raw ?? price.raw, + listPrice: variant?.price?.raw ?? price.raw, + image: { + url: image?.url, + }, + }, + } +} + +export const normalizeCart = (commercejsCart: CommercejsCart): Cart => { + const { + id, + created, + subtotal: { raw: rawPrice }, + currency, + line_items, + } = commercejsCart + + return { + id, + createdAt: new Date(created * 1000).toISOString(), + currency: { + code: currency.code, + }, + taxesIncluded: false, + lineItems: line_items.map((item) => { + return normalizeLineItem(item as CommercejsLineItemType) + }), + lineItemsSubtotalPrice: rawPrice, + subtotalPrice: rawPrice, + totalPrice: rawPrice, + } +} diff --git a/packages/commercejs/src/utils/normalize-category.ts b/packages/commercejs/src/utils/normalize-category.ts new file mode 100644 index 0000000..4190092 --- /dev/null +++ b/packages/commercejs/src/utils/normalize-category.ts @@ -0,0 +1,14 @@ +import type { Category } from '@vercel/commerce/types/site' +import type { Category as CommercejsCategory } from '@chec/commerce.js/types/category' + +export function normalizeCategory( + commercejsCatgeory: CommercejsCategory +): Category { + const { id, name, slug } = commercejsCatgeory + return { + id, + name, + slug, + path: slug, + } +} diff --git a/packages/commercejs/src/utils/normalize-checkout.ts b/packages/commercejs/src/utils/normalize-checkout.ts new file mode 100644 index 0000000..db136e0 --- /dev/null +++ b/packages/commercejs/src/utils/normalize-checkout.ts @@ -0,0 +1,63 @@ +import type { CardFields } from '@vercel/commerce/types/customer/card' +import type { AddressFields } from '@vercel/commerce/types/customer/address' +import type { CommercejsCheckoutCapture } from '../types/checkout' + +/** + * Creates a checkout payload suitable for test checkouts. + * 1. Hard-codes the payment values for the Commerce.js test gateway. + * 2. Hard-codes the email until an email field exists on the checkout form. + * 3. Gets as much as much checkout info as possible from the checkout form, and uses fallback values. + */ +export function normalizeTestCheckout({ + paymentInfo, + shippingInfo, + shippingOption, +}: { + paymentInfo?: CardFields + shippingInfo?: AddressFields + shippingOption: string +}): CommercejsCheckoutCapture { + const firstName = + shippingInfo?.firstName || paymentInfo?.firstName || 'Nextjs' + const lastName = shippingInfo?.lastName || paymentInfo?.lastName || 'Commerce' + const fullName = `${firstName} ${lastName}` + const postalCode = shippingInfo?.zipCode || paymentInfo?.zipCode || '94103' + const street = + shippingInfo?.streetNumber || paymentInfo?.streetNumber || 'Test Street' + const townCity = shippingInfo?.city || paymentInfo?.city || 'Test Town' + + return { + payment: { + gateway: 'test_gateway', + card: { + number: '4242 4242 4242 4242', + expiry_month: '01', + expiry_year: '2024', + cvc: '123', + postal_zip_code: postalCode, + }, + }, + customer: { + email: 'nextcommerce@test.com', + firstname: firstName, + lastname: lastName, + }, + shipping: { + name: fullName, + street, + town_city: townCity, + country: 'US', + }, + billing: { + name: fullName, + street, + town_city: townCity, + postal_zip_code: postalCode, + county_state: 'California', + country: 'US', + }, + fulfillment: { + shipping_method: shippingOption, + }, + } +} diff --git a/packages/commercejs/src/utils/normalize-product.ts b/packages/commercejs/src/utils/normalize-product.ts new file mode 100644 index 0000000..86c42d9 --- /dev/null +++ b/packages/commercejs/src/utils/normalize-product.ts @@ -0,0 +1,77 @@ +import type { + Product, + CommercejsProduct, + CommercejsVariant, +} from '../types/product' + +function getOptionsFromVariantGroups( + variantGroups: CommercejsProduct['variant_groups'] +): Product['options'] { + const optionsFromVariantGroups = variantGroups.map( + ({ id, name: variantName, options }) => ({ + id, + displayName: variantName, + values: options.map(({ name: optionName }) => ({ + label: optionName, + })), + }) + ) + return optionsFromVariantGroups +} + +function normalizeVariants( + variants: Array = [], + variantGroups: CommercejsProduct['variant_groups'] +) { + if (!Array.isArray(variants)) return [] + return variants?.map((variant) => ({ + id: variant.id, + options: Object.entries(variant.options).map( + ([variantGroupId, variantOptionId]) => { + const variantGroupFromId = variantGroups.find( + (group) => group.id === variantGroupId + ) + const valueLabel = variantGroupFromId?.options.find( + (option) => option.id === variantOptionId + )?.name + + return { + id: variantOptionId, + displayName: variantGroupFromId?.name || '', + __typename: 'MultipleChoiceOption' as 'MultipleChoiceOption', + values: [ + { + label: valueLabel || '', + }, + ], + } + } + ), + })) +} + +export function normalizeProduct( + commercejsProduct: CommercejsProduct, + commercejsProductVariants: Array = [] +): Product { + const { id, name, description, permalink, assets, price, variant_groups } = + commercejsProduct + return { + id, + name, + description, + descriptionHtml: description, + slug: permalink, + path: permalink, + images: assets.map(({ url, description, filename }) => ({ + url, + alt: description || filename, + })), + price: { + value: price.raw, + currencyCode: 'USD', + }, + variants: normalizeVariants(commercejsProductVariants, variant_groups), + options: getOptionsFromVariantGroups(variant_groups), + } +} diff --git a/packages/commercejs/src/utils/product-search.ts b/packages/commercejs/src/utils/product-search.ts new file mode 100644 index 0000000..9a4d429 --- /dev/null +++ b/packages/commercejs/src/utils/product-search.ts @@ -0,0 +1,54 @@ +import { SearchProductsBody } from '@vercel/commerce/types/product' + +const getFilterVariables = ({ + search, + categoryId, +}: { + search?: string + categoryId?: string | number +}) => { + let filterVariables: { [key: string]: any } = {} + if (search) { + filterVariables.query = search + } + if (categoryId) { + filterVariables['category_id'] = categoryId + } + return filterVariables +} + +const getSortVariables = ({ sort }: { sort?: string }) => { + let sortVariables: { [key: string]: any } = {} + switch (sort) { + case 'trending-desc': + case 'latest-desc': + sortVariables = { + sortBy: 'updated', + sortDirection: 'desc', + } + break + case 'price-asc': + sortVariables = { + sortBy: 'price', + sortDirection: 'asc', + } + break + case 'price-desc': + sortVariables = { + sortBy: 'price', + sortDirection: 'desc', + } + break + } + return sortVariables +} + +export const getProductSearchVariables = (input: SearchProductsBody) => { + const { search, categoryId, sort } = input + const filterVariables = getFilterVariables({ search, categoryId }) + const sortVariables = getSortVariables({ sort }) + return { + ...filterVariables, + ...sortVariables, + } +} diff --git a/packages/commercejs/src/wishlist/use-add-item.tsx b/packages/commercejs/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/commercejs/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/commercejs/src/wishlist/use-remove-item.tsx b/packages/commercejs/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/commercejs/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/commercejs/src/wishlist/use-wishlist.tsx b/packages/commercejs/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..7816143 --- /dev/null +++ b/packages/commercejs/src/wishlist/use-wishlist.tsx @@ -0,0 +1,40 @@ +import { HookFetcher } from '@vercel/commerce/utils/types' + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: any + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/commercejs/taskfile.js b/packages/commercejs/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/commercejs/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/commercejs/tsconfig.json b/packages/commercejs/tsconfig.json new file mode 100644 index 0000000..8f98f04 --- /dev/null +++ b/packages/commercejs/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src", "global.d.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/kibocommerce/.env.template b/packages/kibocommerce/.env.template new file mode 100644 index 0000000..2636d4d --- /dev/null +++ b/packages/kibocommerce/.env.template @@ -0,0 +1,7 @@ +COMMERCE_PROVIDER=@vercel/commerce-kibocommerce +KIBO_API_URL= +KIBO_CART_COOKIE= +KIBO_CUSTOMER_COOKIE= +KIBO_CLIENT_ID= +KIBO_SHARED_SECRET= +KIBO_AUTH_URL= diff --git a/packages/kibocommerce/.prettierignore b/packages/kibocommerce/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/kibocommerce/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/kibocommerce/.prettierrc b/packages/kibocommerce/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/kibocommerce/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/kibocommerce/README.md b/packages/kibocommerce/README.md new file mode 100644 index 0000000..13fa331 --- /dev/null +++ b/packages/kibocommerce/README.md @@ -0,0 +1,37 @@ +# Kibo Commerce Provider + +If you already have a Kibo Commerce account and want to use your current store, then copy the `.env.template` file in this directory to `.env.local` in the main directory (which will be ignored by Git): + +```bash +cp packages/kibocommerce/.env.template .env.local +``` + +Then, set the environment variables in `.env.local` to match the ones from your store. + +``` +COMMERCE_PROVIDER='kibocommerce' +KIBO_API_URL= 'https://t1234-s1234.sandbox.mozu.com/graphql' +KIBO_CART_COOKIE='kibo_cart' +KIBO_CUSTOMER_COOKIE='kibo_customer' +KIBO_CLIENT_ID='KIBO.APP.1.0.0.Release' +KIBO_SHARED_SECRET='12345secret' +KIBO_AUTH_URL='https://home.mozu.com' +``` + +- `KIBO_API_URL` - link to your Kibo Commerce GraphQL API instance. +- `KIBO_CART_COOKIE` - configurable cookie name for cart. +- `KIBO_CUSTOMER_COOKIE` - configurable cookie name for shopper identifier/authentication cookie +- `KIBO_CLIENT_ID` - Unique Application (Client) ID of your Application +- `KIBO_SHARED_SECRET` - Secret API key used to authenticate application/client id. + + +Your Kibo Client ID and Shared Secret can be found from your [Kibo eCommerce Dev Center](https://mozu.com/login) + +Visit [Kibo documentation](https://apidocs.kibong-perf.com/?spec=graphql#auth) for more details on API authentication + +Based on the config, this integration will handle Authenticating your application against the Kibo API using the Kibo Client ID and Kibo Shared Secret. +## Contribute + +Our commitment to Open Source can be found [here](https://vercel.com/oss). + +If you find an issue with the provider or want a new feature, feel free to open a PR or [create a new issue](https://github.com/vercel/commerce/issues). diff --git a/packages/kibocommerce/codegen.json b/packages/kibocommerce/codegen.json new file mode 100644 index 0000000..ede2d2f --- /dev/null +++ b/packages/kibocommerce/codegen.json @@ -0,0 +1,21 @@ +{ + "schema": { + "https://t17194-s21127.dev10.kubedev.kibo-dev.com/graphql": {} + }, + "generates": { + "./schema.d.ts": { + "plugins": ["typescript", "typescript-operations"], + "config": { + "scalars": { + "ID": "string" + } + } + }, + "./schema.graphql": { + "plugins": ["schema-ast"] + } + }, + "hooks": { + "afterAllFileWrite": ["prettier --write"] + } + } diff --git a/packages/kibocommerce/package.json b/packages/kibocommerce/package.json new file mode 100644 index 0000000..6a29128 --- /dev/null +++ b/packages/kibocommerce/package.json @@ -0,0 +1,87 @@ +{ + "name": "@vercel/commerce-kibocommerce", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write .", + "generate": "graphql-codegen" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist", + "schema.d.ts" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@graphql-codegen/cli": "^2.3.1", + "@graphql-codegen/schema-ast": "^2.4.1", + "@graphql-codegen/typescript": "^2.4.2", + "@graphql-codegen/typescript-operations": "^2.2.2", + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/kibocommerce/schema.d.ts b/packages/kibocommerce/schema.d.ts new file mode 100644 index 0000000..cf52dde --- /dev/null +++ b/packages/kibocommerce/schema.d.ts @@ -0,0 +1,11399 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & + { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & + { [SubKey in K]: Maybe } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** The `AnyScalar` type allows any scalar value by examining the input and passing the serialize, parseValue, and parseLiteral operations to their respective types. */ + AnyScalar: any + /** DateTime custom scalar type */ + DateTime: any + /** Object custom scalar type */ + Object: any +} + +export type AccountPasswordInfoCollectionInput = { + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type AccountPasswordInfoInput = { + accountId: Scalars['Int'] + userId?: Maybe + unlockAccount?: Maybe + passwordInfo?: Maybe +} + +export type AccountSalesRep = { + __typename?: 'AccountSalesRep' + _get?: Maybe + _root?: Maybe + accountId: Scalars['Int'] + adminUserId?: Maybe +} + +export type AccountSalesRep_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AccountSalesRepInput = { + accountId: Scalars['Int'] + adminUserId?: Maybe +} + +export type ActiveDateRange = { + __typename?: 'ActiveDateRange' + _get?: Maybe + _root?: Maybe + startDate?: Maybe + endDate?: Maybe +} + +export type ActiveDateRange_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ActiveDateRangeInput = { + startDate?: Maybe + endDate?: Maybe +} + +export type AddressValidationRequestInput = { + address?: Maybe +} + +export type AddressValidationResponse = { + __typename?: 'AddressValidationResponse' + _get?: Maybe + _root?: Maybe + addressCandidates?: Maybe>> +} + +export type AddressValidationResponse_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Adjustment = { + __typename?: 'Adjustment' + _get?: Maybe + _root?: Maybe + amount?: Maybe + description?: Maybe + internalComment?: Maybe +} + +export type Adjustment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AdjustmentInput = { + amount?: Maybe + description?: Maybe + internalComment?: Maybe +} + +export type AppliedLineItemProductDiscount = { + __typename?: 'AppliedLineItemProductDiscount' + _get?: Maybe + _root?: Maybe + appliesToSalePrice?: Maybe + discountQuantity: Scalars['Int'] + productQuantity?: Maybe + impactPerUnit?: Maybe +} + +export type AppliedLineItemProductDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AppliedLineItemProductDiscountInput = { + appliesToSalePrice?: Maybe + discountQuantity: Scalars['Int'] + productQuantity?: Maybe + impactPerUnit?: Maybe +} + +export type AppliedLineItemShippingDiscount = { + __typename?: 'AppliedLineItemShippingDiscount' + _get?: Maybe + _root?: Maybe + methodCode?: Maybe + discount?: Maybe + discountQuantity: Scalars['Int'] + impactPerUnit: Scalars['Float'] +} + +export type AppliedLineItemShippingDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AppliedLineItemShippingDiscountInput = { + methodCode?: Maybe + discount?: Maybe + discountQuantity: Scalars['Int'] + impactPerUnit: Scalars['Float'] +} + +export type AttributeDetail = { + __typename?: 'AttributeDetail' + _get?: Maybe + _root?: Maybe + valueType?: Maybe + inputType?: Maybe + dataType?: Maybe + usageType?: Maybe + dataTypeSequence: Scalars['Int'] + name?: Maybe + description?: Maybe + validation?: Maybe + searchableInStorefront?: Maybe + searchDisplayValue?: Maybe + allowFilteringAndSortingInStorefront?: Maybe + indexValueWithCase?: Maybe + customWeightInStorefrontSearch?: Maybe + displayIntention?: Maybe +} + +export type AttributeDetail_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AttributeVocabularyValueDisplayInfo = { + __typename?: 'AttributeVocabularyValueDisplayInfo' + _get?: Maybe + _root?: Maybe + cmsId?: Maybe + imageUrl?: Maybe + colorValue?: Maybe +} + +export type AttributeVocabularyValueDisplayInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AuditRecord = { + __typename?: 'AuditRecord' + _get?: Maybe + _root?: Maybe + id?: Maybe + changes?: Maybe>> + auditInfo?: Maybe +} + +export type AuditRecord_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AuditRecordChange = { + __typename?: 'AuditRecordChange' + _get?: Maybe + _root?: Maybe + type?: Maybe + path?: Maybe + fields?: Maybe>> +} + +export type AuditRecordChange_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AuditRecordChangeField = { + __typename?: 'AuditRecordChangeField' + _get?: Maybe + _root?: Maybe + name?: Maybe + oldValue?: Maybe + newValue?: Maybe +} + +export type AuditRecordChangeField_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type AuditRecordChangeFieldInput = { + name?: Maybe + oldValue?: Maybe + newValue?: Maybe +} + +export type AuditRecordChangeInput = { + type?: Maybe + path?: Maybe + fields?: Maybe>> +} + +export type AuditRecordInput = { + id?: Maybe + changes?: Maybe>> + auditInfo?: Maybe +} + +export type B2BAccount = { + __typename?: 'B2BAccount' + _get?: Maybe + _root?: Maybe + users?: Maybe>> + isActive?: Maybe + priceList?: Maybe + salesReps?: Maybe>> + rootAccountId?: Maybe + parentAccountId?: Maybe + approvalStatus?: Maybe + id: Scalars['Int'] + customerSet?: Maybe + commerceSummary?: Maybe + contacts?: Maybe>> + companyOrOrganization?: Maybe + notes?: Maybe>> + attributes?: Maybe>> + segments?: Maybe>> + taxId?: Maybe + externalId?: Maybe + auditInfo?: Maybe + customerSinceDate?: Maybe + accountType?: Maybe +} + +export type B2BAccount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type B2BAccountCollection = { + __typename?: 'B2BAccountCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type B2BAccountCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type B2BAccountInput = { + users?: Maybe>> + isActive?: Maybe + priceList?: Maybe + salesReps?: Maybe>> + rootAccountId?: Maybe + parentAccountId?: Maybe + approvalStatus?: Maybe + id: Scalars['Int'] + customerSet?: Maybe + commerceSummary?: Maybe + contacts?: Maybe>> + companyOrOrganization?: Maybe + notes?: Maybe>> + attributes?: Maybe>> + segments?: Maybe>> + taxId?: Maybe + externalId?: Maybe + auditInfo?: Maybe + customerSinceDate?: Maybe + accountType?: Maybe +} + +export type B2BUser = { + __typename?: 'B2BUser' + _get?: Maybe + _root?: Maybe + emailAddress?: Maybe + userName?: Maybe + firstName?: Maybe + lastName?: Maybe + localeCode?: Maybe + userId?: Maybe + roles?: Maybe>> + isLocked?: Maybe + isActive?: Maybe + isRemoved?: Maybe + acceptsMarketing?: Maybe + hasExternalPassword?: Maybe +} + +export type B2BUser_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type B2BUserAndAuthInfoInput = { + b2BUser?: Maybe + externalPassword?: Maybe + isImport?: Maybe +} + +export type B2BUserCollection = { + __typename?: 'B2BUserCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type B2BUserCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type B2BUserInput = { + emailAddress?: Maybe + userName?: Maybe + firstName?: Maybe + lastName?: Maybe + localeCode?: Maybe + userId?: Maybe + roles?: Maybe>> + isLocked?: Maybe + isActive?: Maybe + isRemoved?: Maybe + acceptsMarketing?: Maybe + hasExternalPassword?: Maybe +} + +export type BillingInfo = { + __typename?: 'BillingInfo' + _get?: Maybe + _root?: Maybe + paymentType?: Maybe + paymentWorkflow?: Maybe + billingContact?: Maybe + isSameBillingShippingAddress?: Maybe + card?: Maybe + token?: Maybe + purchaseOrder?: Maybe + check?: Maybe + auditInfo?: Maybe + storeCreditCode?: Maybe + storeCreditType?: Maybe + customCreditType?: Maybe + externalTransactionId?: Maybe + data?: Maybe +} + +export type BillingInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type BillingInfoInput = { + paymentType?: Maybe + paymentWorkflow?: Maybe + billingContact?: Maybe + isSameBillingShippingAddress?: Maybe + card?: Maybe + token?: Maybe + purchaseOrder?: Maybe + check?: Maybe + auditInfo?: Maybe + storeCreditCode?: Maybe + storeCreditType?: Maybe + customCreditType?: Maybe + externalTransactionId?: Maybe + data?: Maybe +} + +export type BoxType = { + __typename?: 'BoxType' + _get?: Maybe + _root?: Maybe + name?: Maybe + height?: Maybe + width?: Maybe + length?: Maybe +} + +export type BoxType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type BpmConfiguration = { + __typename?: 'BpmConfiguration' + _get?: Maybe + _root?: Maybe + shipmentType?: Maybe + workflowContainerId?: Maybe + workflowProcessId?: Maybe +} + +export type BpmConfiguration_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type BundledProductSummary = { + __typename?: 'BundledProductSummary' + _get?: Maybe + _root?: Maybe + productShortDescription?: Maybe + productName?: Maybe + productCode?: Maybe + goodsType?: Maybe + quantity: Scalars['Int'] + measurements?: Maybe + isPackagedStandAlone?: Maybe + inventoryInfo?: Maybe + optionAttributeFQN?: Maybe + optionValue?: Maybe + creditValue?: Maybe + productType?: Maybe +} + +export type BundledProductSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export enum BundlingStrategyEnum { + ItemDependency = 'ITEM_DEPENDENCY', +} + +export type CancelReasonCollection = { + __typename?: 'CancelReasonCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CancelReasonCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CancelReasonItem = { + __typename?: 'CancelReasonItem' + _get?: Maybe + _root?: Maybe + reasonCode?: Maybe + name?: Maybe + needsMoreInfo?: Maybe +} + +export type CancelReasonItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CanceledItem = { + __typename?: 'CanceledItem' + _get?: Maybe + _root?: Maybe + canceledReason?: Maybe + auditInfo?: Maybe + lineId: Scalars['Int'] + originalOrderItemId?: Maybe + parentId?: Maybe + productCode?: Maybe + variationProductCode?: Maybe + optionAttributeFQN?: Maybe + name?: Maybe + fulfillmentLocationCode?: Maybe + imageUrl?: Maybe + isTaxable?: Maybe + quantity: Scalars['Int'] + unitPrice: Scalars['Float'] + actualPrice: Scalars['Float'] + overridePrice?: Maybe + itemDiscount: Scalars['Float'] + lineItemCost: Scalars['Float'] + itemTax: Scalars['Float'] + shipping: Scalars['Float'] + shippingDiscount: Scalars['Float'] + shippingTax: Scalars['Float'] + handling: Scalars['Float'] + handlingDiscount: Scalars['Float'] + handlingTax: Scalars['Float'] + duty: Scalars['Float'] + isPackagedStandAlone?: Maybe + readyForPickupQuantity?: Maybe + backorderReleaseDate?: Maybe + measurements?: Maybe + options?: Maybe>> + data?: Maybe + taxData?: Maybe + weightedShipmentAdjustment: Scalars['Float'] + weightedLineItemTaxAdjustment: Scalars['Float'] + weightedShippingAdjustment: Scalars['Float'] + weightedShippingTaxAdjustment: Scalars['Float'] + weightedHandlingAdjustment: Scalars['Float'] + weightedHandlingTaxAdjustment: Scalars['Float'] + weightedDutyAdjustment: Scalars['Float'] + taxableShipping: Scalars['Float'] + taxableLineItemCost: Scalars['Float'] + taxableHandling: Scalars['Float'] + fulfillmentFields?: Maybe>> + isAssemblyRequired?: Maybe + parentItemId?: Maybe + childItemIds?: Maybe> + giftCards?: Maybe>> +} + +export type CanceledItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CanceledItemInput = { + canceledReason?: Maybe + auditInfo?: Maybe + lineId: Scalars['Int'] + originalOrderItemId?: Maybe + parentId?: Maybe + productCode?: Maybe + variationProductCode?: Maybe + optionAttributeFQN?: Maybe + name?: Maybe + fulfillmentLocationCode?: Maybe + imageUrl?: Maybe + isTaxable?: Maybe + quantity: Scalars['Int'] + unitPrice: Scalars['Float'] + actualPrice: Scalars['Float'] + overridePrice?: Maybe + itemDiscount: Scalars['Float'] + lineItemCost: Scalars['Float'] + itemTax: Scalars['Float'] + shipping: Scalars['Float'] + shippingDiscount: Scalars['Float'] + shippingTax: Scalars['Float'] + handling: Scalars['Float'] + handlingDiscount: Scalars['Float'] + handlingTax: Scalars['Float'] + duty: Scalars['Float'] + isPackagedStandAlone?: Maybe + readyForPickupQuantity?: Maybe + backorderReleaseDate?: Maybe + measurements?: Maybe + options?: Maybe>> + data?: Maybe + taxData?: Maybe + weightedShipmentAdjustment: Scalars['Float'] + weightedLineItemTaxAdjustment: Scalars['Float'] + weightedShippingAdjustment: Scalars['Float'] + weightedShippingTaxAdjustment: Scalars['Float'] + weightedHandlingAdjustment: Scalars['Float'] + weightedHandlingTaxAdjustment: Scalars['Float'] + weightedDutyAdjustment: Scalars['Float'] + taxableShipping: Scalars['Float'] + taxableLineItemCost: Scalars['Float'] + taxableHandling: Scalars['Float'] + fulfillmentFields?: Maybe>> + isAssemblyRequired?: Maybe + parentItemId?: Maybe + childItemIds?: Maybe> + giftCards?: Maybe>> +} + +export type CanceledReason = { + __typename?: 'CanceledReason' + _get?: Maybe + _root?: Maybe + reasonCode?: Maybe + description?: Maybe + moreInfo?: Maybe +} + +export type CanceledReason_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CanceledReasonInput = { + reasonCode?: Maybe + description?: Maybe + moreInfo?: Maybe +} + +export type CapturableShipmentSummary = { + __typename?: 'CapturableShipmentSummary' + _get?: Maybe + _root?: Maybe + shipmentNumber: Scalars['Int'] + shipmentTotal: Scalars['Float'] + amountApplied: Scalars['Float'] +} + +export type CapturableShipmentSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CapturableShipmentSummaryInput = { + shipmentNumber: Scalars['Int'] + shipmentTotal: Scalars['Float'] + amountApplied: Scalars['Float'] +} + +export type Card = { + __typename?: 'Card' + _get?: Maybe + _root?: Maybe + id?: Maybe + nameOnCard?: Maybe + cardType?: Maybe + expireMonth?: Maybe + expireYear?: Maybe + cardNumberPart?: Maybe + contactId: Scalars['Int'] + isDefaultPayMethod?: Maybe +} + +export type Card_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CardCollection = { + __typename?: 'CardCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CardCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CardInput = { + id?: Maybe + nameOnCard?: Maybe + cardType?: Maybe + expireMonth?: Maybe + expireYear?: Maybe + cardNumberPart?: Maybe + contactId: Scalars['Int'] + isDefaultPayMethod?: Maybe +} + +export type Carrier = { + __typename?: 'Carrier' + _get?: Maybe + _root?: Maybe + carrierType?: Maybe + isEnabled?: Maybe + shippingMethodMappings?: Maybe +} + +export type Carrier_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CarrierServiceGenerateLabelResponse = { + __typename?: 'CarrierServiceGenerateLabelResponse' + _get?: Maybe + _root?: Maybe + imageURL?: Maybe + integratorId?: Maybe + price?: Maybe + trackingNumber?: Maybe +} + +export type CarrierServiceGenerateLabelResponse_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Cart = { + __typename?: 'Cart' + _get?: Maybe + _root?: Maybe + items?: Maybe>> + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + priceListCode?: Maybe + cartMessage?: Maybe + cartMessages?: Maybe>> + handlingAmount?: Maybe + handlingSubTotal?: Maybe + handlingTotal?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type Cart_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CartChangeMessageCollection = { + __typename?: 'CartChangeMessageCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CartChangeMessageCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CartInput = { + items?: Maybe>> + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + priceListCode?: Maybe + cartMessage?: Maybe + cartMessages?: Maybe>> + handlingAmount?: Maybe + handlingSubTotal?: Maybe + handlingTotal?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type CartItem = { + __typename?: 'CartItem' + _get?: Maybe + _root?: Maybe + id?: Maybe + fulfillmentLocationCode?: Maybe + fulfillmentMethod?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type CartItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CartItemCollection = { + __typename?: 'CartItemCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CartItemCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CartItemInput = { + id?: Maybe + fulfillmentLocationCode?: Maybe + fulfillmentMethod?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type CartMessage = { + __typename?: 'CartMessage' + _get?: Maybe + _root?: Maybe + message?: Maybe + messageType?: Maybe + productsRemoved?: Maybe>> +} + +export type CartMessage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CartMessageInput = { + message?: Maybe + messageType?: Maybe + productsRemoved?: Maybe>> +} + +export type CartSummary = { + __typename?: 'CartSummary' + _get?: Maybe + _root?: Maybe + itemCount?: Maybe + totalQuantity?: Maybe + total?: Maybe + isExpired?: Maybe + hasActiveCart?: Maybe +} + +export type CartSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CategoryCollection = { + __typename?: 'CategoryCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CategoryCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CategoryContent = { + __typename?: 'CategoryContent' + _get?: Maybe + _root?: Maybe + categoryImages?: Maybe>> + name?: Maybe + description?: Maybe + pageTitle?: Maybe + metaTagTitle?: Maybe + metaTagDescription?: Maybe + metaTagKeywords?: Maybe + slug?: Maybe +} + +export type CategoryContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CategoryImage = { + __typename?: 'CategoryImage' + _get?: Maybe + _root?: Maybe + imageLabel?: Maybe + altText?: Maybe + imageUrl?: Maybe + cmsId?: Maybe + videoUrl?: Maybe + mediaType?: Maybe + sequence?: Maybe +} + +export type CategoryImage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CategoryPagedCollection = { + __typename?: 'CategoryPagedCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CategoryPagedCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChangeMessage = { + __typename?: 'ChangeMessage' + _get?: Maybe + _root?: Maybe + id?: Maybe + correlationId?: Maybe + userId?: Maybe + userFirstName?: Maybe + userLastName?: Maybe + userScopeType?: Maybe + appId?: Maybe + appKey?: Maybe + appName?: Maybe + subjectType?: Maybe + success?: Maybe + identifier?: Maybe + subject?: Maybe + verb?: Maybe + message?: Maybe + metadata?: Maybe + oldValue?: Maybe + newValue?: Maybe + amount?: Maybe + createDate?: Maybe +} + +export type ChangeMessage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChangeMessageInput = { + id?: Maybe + correlationId?: Maybe + userId?: Maybe + userFirstName?: Maybe + userLastName?: Maybe + userScopeType?: Maybe + appId?: Maybe + appKey?: Maybe + appName?: Maybe + subjectType?: Maybe + success?: Maybe + identifier?: Maybe + subject?: Maybe + verb?: Maybe + message?: Maybe + metadata?: Maybe + oldValue?: Maybe + newValue?: Maybe + amount?: Maybe + createDate?: Maybe +} + +export type ChangePasswordResult = { + __typename?: 'ChangePasswordResult' + _get?: Maybe + _root?: Maybe + accountId: Scalars['Int'] + succeeded?: Maybe + errorMessage?: Maybe +} + +export type ChangePasswordResult_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChangePasswordResultCollection = { + __typename?: 'ChangePasswordResultCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ChangePasswordResultCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Channel = { + __typename?: 'Channel' + _get?: Maybe + _root?: Maybe + tenantId: Scalars['Int'] + code?: Maybe + name?: Maybe + region?: Maybe + countryCode?: Maybe + groupCode?: Maybe + siteIds?: Maybe> + auditInfo?: Maybe +} + +export type Channel_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChannelCollection = { + __typename?: 'ChannelCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ChannelCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChannelGroup = { + __typename?: 'ChannelGroup' + _get?: Maybe + _root?: Maybe + tenantId: Scalars['Int'] + code?: Maybe + name?: Maybe + auditInfo?: Maybe +} + +export type ChannelGroup_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChannelGroupCollection = { + __typename?: 'ChannelGroupCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ChannelGroupCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ChannelGroupInput = { + tenantId: Scalars['Int'] + code?: Maybe + name?: Maybe + auditInfo?: Maybe +} + +export type ChannelInput = { + tenantId: Scalars['Int'] + code?: Maybe + name?: Maybe + region?: Maybe + countryCode?: Maybe + groupCode?: Maybe + siteIds?: Maybe> + auditInfo?: Maybe +} + +export type CheckPayment = { + __typename?: 'CheckPayment' + _get?: Maybe + _root?: Maybe + checkNumber?: Maybe +} + +export type CheckPayment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CheckPaymentInput = { + checkNumber?: Maybe +} + +export type Checkout = { + __typename?: 'Checkout' + _get?: Maybe + _root?: Maybe + id?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + number?: Maybe + originalCartId?: Maybe + submittedDate?: Maybe + type?: Maybe + items?: Maybe>> + groupings?: Maybe>> + auditInfo?: Maybe + destinations?: Maybe>> + payments?: Maybe>> + amountRemainingForPayment: Scalars['Float'] + acceptsMarketing?: Maybe + customerAccountId?: Maybe + email?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + currencyCode?: Maybe + priceListCode?: Maybe + attributes?: Maybe>> + shopperNotes?: Maybe + availableActions?: Maybe> + data?: Maybe + taxData?: Maybe + channelCode?: Maybe + locationCode?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + orderDiscounts?: Maybe>> + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + suggestedDiscounts?: Maybe>> + discountThresholdMessages?: Maybe>> + dutyTotal?: Maybe + feeTotal: Scalars['Float'] + subTotal: Scalars['Float'] + itemLevelProductDiscountTotal: Scalars['Float'] + orderLevelProductDiscountTotal: Scalars['Float'] + itemTaxTotal: Scalars['Float'] + itemTotal: Scalars['Float'] + shippingSubTotal: Scalars['Float'] + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingSubTotal: Scalars['Float'] + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + total: Scalars['Float'] +} + +export type Checkout_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CheckoutActionInput = { + actionName?: Maybe +} + +export type CheckoutCollection = { + __typename?: 'CheckoutCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CheckoutCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CheckoutGroupRates = { + __typename?: 'CheckoutGroupRates' + _get?: Maybe + _root?: Maybe + groupingId?: Maybe + shippingRates?: Maybe>> +} + +export type CheckoutGroupRates_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CheckoutGroupShippingMethodInput = { + groupingId?: Maybe + shippingRate?: Maybe +} + +export type CheckoutGrouping = { + __typename?: 'CheckoutGrouping' + _get?: Maybe + _root?: Maybe + id?: Maybe + destinationId?: Maybe + fulfillmentMethod?: Maybe + orderItemIds?: Maybe> + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + standaloneGroup?: Maybe + shippingDiscounts?: Maybe>> + handlingDiscounts?: Maybe>> + dutyAmount?: Maybe + dutyTotal: Scalars['Float'] + shippingAmount?: Maybe + shippingSubTotal: Scalars['Float'] + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingTax?: Maybe + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingAmount?: Maybe + handlingSubTotal: Scalars['Float'] + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingTax?: Maybe + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + taxData?: Maybe +} + +export type CheckoutGrouping_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CheckoutGroupingInput = { + id?: Maybe + destinationId?: Maybe + fulfillmentMethod?: Maybe + orderItemIds?: Maybe> + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + standaloneGroup?: Maybe + shippingDiscounts?: Maybe>> + handlingDiscounts?: Maybe>> + dutyAmount?: Maybe + dutyTotal: Scalars['Float'] + shippingAmount?: Maybe + shippingSubTotal: Scalars['Float'] + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingTax?: Maybe + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingAmount?: Maybe + handlingSubTotal: Scalars['Float'] + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingTax?: Maybe + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + taxData?: Maybe +} + +export type CheckoutInput = { + id?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + number?: Maybe + originalCartId?: Maybe + submittedDate?: Maybe + type?: Maybe + items?: Maybe>> + groupings?: Maybe>> + auditInfo?: Maybe + destinations?: Maybe>> + payments?: Maybe>> + amountRemainingForPayment: Scalars['Float'] + acceptsMarketing?: Maybe + customerAccountId?: Maybe + email?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + currencyCode?: Maybe + priceListCode?: Maybe + attributes?: Maybe>> + shopperNotes?: Maybe + availableActions?: Maybe> + data?: Maybe + taxData?: Maybe + channelCode?: Maybe + locationCode?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + orderDiscounts?: Maybe>> + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + suggestedDiscounts?: Maybe>> + discountThresholdMessages?: Maybe>> + dutyTotal?: Maybe + feeTotal: Scalars['Float'] + subTotal: Scalars['Float'] + itemLevelProductDiscountTotal: Scalars['Float'] + orderLevelProductDiscountTotal: Scalars['Float'] + itemTaxTotal: Scalars['Float'] + itemTotal: Scalars['Float'] + shippingSubTotal: Scalars['Float'] + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingSubTotal: Scalars['Float'] + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + total: Scalars['Float'] +} + +export type CoHttpContentInput = { + headers?: Maybe>> +} + +export type CoHttpMethodInput = { + method?: Maybe +} + +export type CoHttpRequestMessageInput = { + version?: Maybe + content?: Maybe + method?: Maybe + requestUri?: Maybe + headers?: Maybe>> + properties?: Maybe +} + +export type CommerceSummary = { + __typename?: 'CommerceSummary' + _get?: Maybe + _root?: Maybe + totalOrderAmount?: Maybe + orderCount: Scalars['Int'] + lastOrderDate?: Maybe + wishlistCount: Scalars['Int'] + visitsCount: Scalars['Int'] +} + +export type CommerceSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CommerceSummaryInput = { + totalOrderAmount?: Maybe + orderCount: Scalars['Int'] + lastOrderDate?: Maybe + wishlistCount: Scalars['Int'] + visitsCount: Scalars['Int'] +} + +export type CommerceUnitPrice = { + __typename?: 'CommerceUnitPrice' + _get?: Maybe + _root?: Maybe + extendedAmount?: Maybe + listAmount?: Maybe + saleAmount?: Maybe + overrideAmount?: Maybe +} + +export type CommerceUnitPrice_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CommerceUnitPriceInput = { + extendedAmount?: Maybe + listAmount?: Maybe + saleAmount?: Maybe + overrideAmount?: Maybe +} + +export type ConfiguredProduct = { + __typename?: 'ConfiguredProduct' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + purchaseLocation?: Maybe + fulfillmentTypesSupported?: Maybe> + variationProductCode?: Maybe + upc?: Maybe + mfgPartNumber?: Maybe + purchasableState?: Maybe + priceRange?: Maybe + volumePriceBands?: Maybe>> + volumePriceRange?: Maybe + price?: Maybe + availableShippingDiscounts?: Maybe>> + measurements?: Maybe + inventoryInfo?: Maybe + options?: Maybe>> + properties?: Maybe>> + priceListEntryTypeProperty?: Maybe + productImages?: Maybe>> +} + +export type ConfiguredProduct_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Contact = { + __typename?: 'Contact' + _get?: Maybe + _root?: Maybe + id?: Maybe + email?: Maybe + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumbers?: Maybe + address?: Maybe +} + +export type Contact_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ContactInput = { + id?: Maybe + email?: Maybe + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumbers?: Maybe + address?: Maybe +} + +export type ContactType = { + __typename?: 'ContactType' + _get?: Maybe + _root?: Maybe + name?: Maybe + isPrimary?: Maybe +} + +export type ContactType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ContactTypeInput = { + name?: Maybe + isPrimary?: Maybe +} + +export type Coordinates = { + __typename?: 'Coordinates' + _get?: Maybe + _root?: Maybe + lat: Scalars['Float'] + lng: Scalars['Float'] +} + +export type Coordinates_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CoordinatesInput = { + lat: Scalars['Float'] + lng: Scalars['Float'] +} + +export type CrAddress = { + __typename?: 'CrAddress' + _get?: Maybe + _root?: Maybe + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type CrAddress_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrAddressInput = { + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type CrAppliedDiscount = { + __typename?: 'CrAppliedDiscount' + _get?: Maybe + _root?: Maybe + impact?: Maybe + discount?: Maybe + couponCode?: Maybe + excluded?: Maybe +} + +export type CrAppliedDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrAppliedDiscountInput = { + impact?: Maybe + discount?: Maybe + couponCode?: Maybe + excluded?: Maybe +} + +export type CrAuditInfo = { + __typename?: 'CrAuditInfo' + _get?: Maybe + _root?: Maybe + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type CrAuditInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrAuditInfoInput = { + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type CrBundledProduct = { + __typename?: 'CrBundledProduct' + _get?: Maybe + _root?: Maybe + quantity: Scalars['Int'] + optionAttributeFQN?: Maybe + optionValue?: Maybe + creditValue?: Maybe + deltaPrice?: Maybe + productCode?: Maybe + name?: Maybe + description?: Maybe + goodsType?: Maybe + isPackagedStandAlone?: Maybe + stock?: Maybe + productReservationId?: Maybe + allocationId?: Maybe + allocationExpiration?: Maybe + measurements?: Maybe + fulfillmentStatus?: Maybe +} + +export type CrBundledProduct_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrBundledProductInput = { + quantity: Scalars['Int'] + optionAttributeFQN?: Maybe + optionValue?: Maybe + creditValue?: Maybe + deltaPrice?: Maybe + productCode?: Maybe + name?: Maybe + description?: Maybe + goodsType?: Maybe + isPackagedStandAlone?: Maybe + stock?: Maybe + productReservationId?: Maybe + allocationId?: Maybe + allocationExpiration?: Maybe + measurements?: Maybe + fulfillmentStatus?: Maybe +} + +export type CrCategory = { + __typename?: 'CrCategory' + _get?: Maybe + _root?: Maybe + id?: Maybe + parent?: Maybe +} + +export type CrCategory_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrCategoryInput = { + id?: Maybe + parent?: Maybe +} + +export type CrDiscount = { + __typename?: 'CrDiscount' + _get?: Maybe + _root?: Maybe + id: Scalars['Int'] + name?: Maybe + itemIds?: Maybe> + expirationDate?: Maybe + hasMultipleTargetProducts?: Maybe +} + +export type CrDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrDiscountInput = { + id: Scalars['Int'] + name?: Maybe + itemIds?: Maybe> + expirationDate?: Maybe + hasMultipleTargetProducts?: Maybe +} + +export type CrMeasurement = { + __typename?: 'CrMeasurement' + _get?: Maybe + _root?: Maybe + unit?: Maybe + value?: Maybe +} + +export type CrMeasurement_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrMeasurementInput = { + unit?: Maybe + value?: Maybe +} + +export type CrOrderItem = { + __typename?: 'CrOrderItem' + _get?: Maybe + _root?: Maybe + id?: Maybe + destinationId?: Maybe + originalCartItemId?: Maybe + fulfillmentLocationCode?: Maybe + fulfillmentMethod?: Maybe + dutyAmount?: Maybe + expectedDeliveryDate?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type CrOrderItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrOrderItemInput = { + id?: Maybe + destinationId?: Maybe + originalCartItemId?: Maybe + fulfillmentLocationCode?: Maybe + fulfillmentMethod?: Maybe + dutyAmount?: Maybe + expectedDeliveryDate?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type CrPackageMeasurements = { + __typename?: 'CrPackageMeasurements' + _get?: Maybe + _root?: Maybe + height?: Maybe + width?: Maybe + length?: Maybe + weight?: Maybe +} + +export type CrPackageMeasurements_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrPackageMeasurementsInput = { + height?: Maybe + width?: Maybe + length?: Maybe + weight?: Maybe +} + +export type CrPhone = { + __typename?: 'CrPhone' + _get?: Maybe + _root?: Maybe + home?: Maybe + mobile?: Maybe + work?: Maybe +} + +export type CrPhone_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrPhoneInput = { + home?: Maybe + mobile?: Maybe + work?: Maybe +} + +export type CrProduct = { + __typename?: 'CrProduct' + _get?: Maybe + _root?: Maybe + mfgPartNumber?: Maybe + upc?: Maybe + sku?: Maybe + fulfillmentTypesSupported?: Maybe> + imageAlternateText?: Maybe + imageUrl?: Maybe + variationProductCode?: Maybe + options?: Maybe>> + properties?: Maybe>> + categories?: Maybe>> + price?: Maybe + discountsRestricted?: Maybe + discountsRestrictedStartDate?: Maybe + discountsRestrictedEndDate?: Maybe + isRecurring?: Maybe + isTaxable?: Maybe + productType?: Maybe + productUsage?: Maybe + bundledProducts?: Maybe>> + fulfillmentFields?: Maybe>> + productCode?: Maybe + name?: Maybe + description?: Maybe + goodsType?: Maybe + isPackagedStandAlone?: Maybe + stock?: Maybe + productReservationId?: Maybe + allocationId?: Maybe + allocationExpiration?: Maybe + measurements?: Maybe + fulfillmentStatus?: Maybe +} + +export type CrProduct_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrProductInput = { + mfgPartNumber?: Maybe + upc?: Maybe + sku?: Maybe + fulfillmentTypesSupported?: Maybe> + imageAlternateText?: Maybe + imageUrl?: Maybe + variationProductCode?: Maybe + options?: Maybe>> + properties?: Maybe>> + categories?: Maybe>> + price?: Maybe + discountsRestricted?: Maybe + discountsRestrictedStartDate?: Maybe + discountsRestrictedEndDate?: Maybe + isRecurring?: Maybe + isTaxable?: Maybe + productType?: Maybe + productUsage?: Maybe + bundledProducts?: Maybe>> + fulfillmentFields?: Maybe>> + productCode?: Maybe + name?: Maybe + description?: Maybe + goodsType?: Maybe + isPackagedStandAlone?: Maybe + stock?: Maybe + productReservationId?: Maybe + allocationId?: Maybe + allocationExpiration?: Maybe + measurements?: Maybe + fulfillmentStatus?: Maybe +} + +export type CrProductOption = { + __typename?: 'CrProductOption' + _get?: Maybe + _root?: Maybe + name?: Maybe + value?: Maybe + shopperEnteredValue?: Maybe + attributeFQN?: Maybe + dataType?: Maybe + stringValue?: Maybe +} + +export type CrProductOption_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrProductOptionInput = { + name?: Maybe + value?: Maybe + shopperEnteredValue?: Maybe + attributeFQN?: Maybe + dataType?: Maybe + stringValue?: Maybe +} + +export type CrProductPrice = { + __typename?: 'CrProductPrice' + _get?: Maybe + _root?: Maybe + price?: Maybe + salePrice?: Maybe + tenantOverridePrice?: Maybe + msrp?: Maybe + creditValue?: Maybe + priceListCode?: Maybe + priceListEntryMode?: Maybe +} + +export type CrProductPrice_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrProductPriceInput = { + price?: Maybe + salePrice?: Maybe + tenantOverridePrice?: Maybe + msrp?: Maybe + creditValue?: Maybe + priceListCode?: Maybe + priceListEntryMode?: Maybe +} + +export type CrProductProperty = { + __typename?: 'CrProductProperty' + _get?: Maybe + _root?: Maybe + attributeFQN?: Maybe + name?: Maybe + dataType?: Maybe + isMultiValue?: Maybe + values?: Maybe>> +} + +export type CrProductProperty_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrProductPropertyInput = { + attributeFQN?: Maybe + name?: Maybe + dataType?: Maybe + isMultiValue?: Maybe + values?: Maybe>> +} + +export type CrProductPropertyValue = { + __typename?: 'CrProductPropertyValue' + _get?: Maybe + _root?: Maybe + stringValue?: Maybe + value?: Maybe +} + +export type CrProductPropertyValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CrProductPropertyValueInput = { + stringValue?: Maybe + value?: Maybe +} + +export type Credit = { + __typename?: 'Credit' + _get?: Maybe + _root?: Maybe + code?: Maybe + activationDate?: Maybe + creditType?: Maybe + customCreditType?: Maybe + currencyCode?: Maybe + initialBalance?: Maybe + currentBalance?: Maybe + expirationDate?: Maybe + customerId?: Maybe + auditInfo?: Maybe + creditTypeId: Scalars['Int'] +} + +export type Credit_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditAuditEntry = { + __typename?: 'CreditAuditEntry' + _get?: Maybe + _root?: Maybe + activityType?: Maybe + details?: Maybe + auditInfo?: Maybe + activityTypeId: Scalars['Int'] +} + +export type CreditAuditEntry_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditAuditEntryCollection = { + __typename?: 'CreditAuditEntryCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CreditAuditEntryCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditCollection = { + __typename?: 'CreditCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CreditCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditInput = { + code?: Maybe + activationDate?: Maybe + creditType?: Maybe + customCreditType?: Maybe + currencyCode?: Maybe + initialBalance?: Maybe + currentBalance?: Maybe + expirationDate?: Maybe + customerId?: Maybe + auditInfo?: Maybe + creditTypeId: Scalars['Int'] +} + +export type CreditTransaction = { + __typename?: 'CreditTransaction' + _get?: Maybe + _root?: Maybe + id?: Maybe + transactionType?: Maybe + comments?: Maybe + impactAmount?: Maybe + auditInfo?: Maybe + orderId?: Maybe + data?: Maybe +} + +export type CreditTransaction_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditTransactionCollection = { + __typename?: 'CreditTransactionCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CreditTransactionCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CreditTransactionInput = { + id?: Maybe + transactionType?: Maybe + comments?: Maybe + impactAmount?: Maybe + auditInfo?: Maybe + orderId?: Maybe + data?: Maybe +} + +export type CuAddress = { + __typename?: 'CuAddress' + _get?: Maybe + _root?: Maybe + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type CuAddress_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAddressInput = { + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type CuAttribute = { + __typename?: 'CuAttribute' + _get?: Maybe + _root?: Maybe + id?: Maybe + adminName?: Maybe + namespace?: Maybe + attributeCode: Scalars['String'] + inputType?: Maybe + valueType: Scalars['String'] + dataType?: Maybe + attributeMetadata?: Maybe>> + attributeFQN?: Maybe + content?: Maybe + validation?: Maybe + vocabularyValues?: Maybe>> + auditInfo?: Maybe + isActive?: Maybe + isRequired?: Maybe + isReadOnly?: Maybe + isMultiValued?: Maybe + isVisible?: Maybe + order?: Maybe + displayGroup: Scalars['String'] +} + +export type CuAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeCollection = { + __typename?: 'CuAttributeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CuAttributeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeInput = { + id?: Maybe + adminName?: Maybe + namespace?: Maybe + attributeCode: Scalars['String'] + inputType?: Maybe + valueType: Scalars['String'] + dataType?: Maybe + attributeMetadata?: Maybe>> + attributeFQN?: Maybe + content?: Maybe + validation?: Maybe + vocabularyValues?: Maybe>> + auditInfo?: Maybe + isActive?: Maybe + isRequired?: Maybe + isReadOnly?: Maybe + isMultiValued?: Maybe + isVisible?: Maybe + order?: Maybe + displayGroup: Scalars['String'] +} + +export type CuAttributeLocalizedContent = { + __typename?: 'CuAttributeLocalizedContent' + _get?: Maybe + _root?: Maybe + localeCode?: Maybe + value?: Maybe +} + +export type CuAttributeLocalizedContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeLocalizedContentInput = { + localeCode?: Maybe + value?: Maybe +} + +export type CuAttributeMetadataItem = { + __typename?: 'CuAttributeMetadataItem' + _get?: Maybe + _root?: Maybe + key: Scalars['String'] + value: Scalars['String'] +} + +export type CuAttributeMetadataItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeMetadataItemInput = { + key: Scalars['String'] + value: Scalars['String'] +} + +export type CuAttributeValidation = { + __typename?: 'CuAttributeValidation' + _get?: Maybe + _root?: Maybe + regularExpression?: Maybe + minStringLength?: Maybe + maxStringLength?: Maybe + minNumericValue?: Maybe + maxNumericValue?: Maybe + minDateTime?: Maybe + maxDateTime?: Maybe +} + +export type CuAttributeValidation_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeValidationInput = { + regularExpression?: Maybe + minStringLength?: Maybe + maxStringLength?: Maybe + minNumericValue?: Maybe + maxNumericValue?: Maybe + minDateTime?: Maybe + maxDateTime?: Maybe +} + +export type CuAttributeValueLocalizedContent = { + __typename?: 'CuAttributeValueLocalizedContent' + _get?: Maybe + _root?: Maybe + localeCode: Scalars['String'] + value: Scalars['String'] +} + +export type CuAttributeValueLocalizedContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeValueLocalizedContentInput = { + localeCode: Scalars['String'] + value: Scalars['String'] +} + +export type CuAttributeVocabularyValue = { + __typename?: 'CuAttributeVocabularyValue' + _get?: Maybe + _root?: Maybe + value: Scalars['String'] + sequence?: Maybe + isHidden?: Maybe + content?: Maybe +} + +export type CuAttributeVocabularyValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAttributeVocabularyValueInput = { + value: Scalars['String'] + sequence?: Maybe + isHidden?: Maybe + content?: Maybe +} + +export type CuAuditInfo = { + __typename?: 'CuAuditInfo' + _get?: Maybe + _root?: Maybe + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type CuAuditInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuAuditInfoInput = { + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type CuPhone = { + __typename?: 'CuPhone' + _get?: Maybe + _root?: Maybe + home?: Maybe + mobile?: Maybe + work?: Maybe +} + +export type CuPhone_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CuPhoneInput = { + home?: Maybe + mobile?: Maybe + work?: Maybe +} + +export type CurrencyAmount = { + __typename?: 'CurrencyAmount' + _get?: Maybe + _root?: Maybe + currencyCode?: Maybe + amount: Scalars['Float'] +} + +export type CurrencyAmount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CurrencyAmountInput = { + currencyCode?: Maybe + amount: Scalars['Float'] +} + +export type CurrencyExchangeRate = { + __typename?: 'CurrencyExchangeRate' + _get?: Maybe + _root?: Maybe + fromCurrencyCode?: Maybe + toCurrencyCode?: Maybe + rate?: Maybe + multiplier?: Maybe + decimalPlaces?: Maybe + roundingStrategy?: Maybe + referenceData?: Maybe +} + +export type CurrencyExchangeRate_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Customer = { + __typename?: 'Customer' + _get?: Maybe + _root?: Maybe + customerContact?: Maybe + data?: Maybe + isDestinationCommercial?: Maybe +} + +export type Customer_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAccount = { + __typename?: 'CustomerAccount' + _get?: Maybe + _root?: Maybe + emailAddress?: Maybe + userName?: Maybe + firstName?: Maybe + lastName?: Maybe + localeCode?: Maybe + userId?: Maybe + isAnonymous?: Maybe + isLocked?: Maybe + isActive?: Maybe + acceptsMarketing?: Maybe + hasExternalPassword?: Maybe + id: Scalars['Int'] + customerSet?: Maybe + commerceSummary?: Maybe + contacts?: Maybe>> + companyOrOrganization?: Maybe + notes?: Maybe>> + attributes?: Maybe>> + segments?: Maybe>> + taxId?: Maybe + externalId?: Maybe + auditInfo?: Maybe + customerSinceDate?: Maybe + accountType?: Maybe +} + +export type CustomerAccount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAccountAndAuthInfoInput = { + account?: Maybe + password?: Maybe + externalPassword?: Maybe + isImport?: Maybe +} + +export type CustomerAccountCollection = { + __typename?: 'CustomerAccountCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerAccountCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAccountInput = { + emailAddress?: Maybe + userName?: Maybe + firstName?: Maybe + lastName?: Maybe + localeCode?: Maybe + userId?: Maybe + isAnonymous?: Maybe + isLocked?: Maybe + isActive?: Maybe + acceptsMarketing?: Maybe + hasExternalPassword?: Maybe + id: Scalars['Int'] + customerSet?: Maybe + commerceSummary?: Maybe + contacts?: Maybe>> + companyOrOrganization?: Maybe + notes?: Maybe>> + attributes?: Maybe>> + segments?: Maybe>> + taxId?: Maybe + externalId?: Maybe + auditInfo?: Maybe + customerSinceDate?: Maybe + accountType?: Maybe +} + +export type CustomerAttribute = { + __typename?: 'CustomerAttribute' + _get?: Maybe + _root?: Maybe + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type CustomerAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAttributeCollection = { + __typename?: 'CustomerAttributeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerAttributeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAttributeInput = { + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type CustomerAuditEntry = { + __typename?: 'CustomerAuditEntry' + _get?: Maybe + _root?: Maybe + customerAccountId: Scalars['Int'] + customerAuditEntryId: Scalars['Int'] + entryDate: Scalars['DateTime'] + entryUser?: Maybe + application?: Maybe + site?: Maybe + description?: Maybe + fieldPath?: Maybe + oldValue?: Maybe + newValue?: Maybe +} + +export type CustomerAuditEntry_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAuditEntryCollection = { + __typename?: 'CustomerAuditEntryCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerAuditEntryCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerAuthTicket = { + __typename?: 'CustomerAuthTicket' + _get?: Maybe + _root?: Maybe + customerAccount?: Maybe + accessToken?: Maybe + accessTokenExpiration: Scalars['DateTime'] + refreshToken?: Maybe + refreshTokenExpiration: Scalars['DateTime'] + userId?: Maybe + jwtAccessToken?: Maybe +} + +export type CustomerAuthTicket_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerContact = { + __typename?: 'CustomerContact' + _get?: Maybe + _root?: Maybe + accountId: Scalars['Int'] + types?: Maybe>> + auditInfo?: Maybe + faxNumber?: Maybe + label?: Maybe + id?: Maybe + email?: Maybe + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumbers?: Maybe + address?: Maybe +} + +export type CustomerContact_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerContactCollection = { + __typename?: 'CustomerContactCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerContactCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerContactInput = { + accountId: Scalars['Int'] + types?: Maybe>> + auditInfo?: Maybe + faxNumber?: Maybe + label?: Maybe + id?: Maybe + email?: Maybe + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumbers?: Maybe + address?: Maybe +} + +export type CustomerInput = { + customerContact?: Maybe + data?: Maybe + isDestinationCommercial?: Maybe +} + +export type CustomerLoginInfoInput = { + emailAddress?: Maybe + username?: Maybe + password?: Maybe + externalPassword?: Maybe + isImport?: Maybe +} + +export type CustomerNote = { + __typename?: 'CustomerNote' + _get?: Maybe + _root?: Maybe + id: Scalars['Int'] + content?: Maybe + auditInfo?: Maybe +} + +export type CustomerNote_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerNoteCollection = { + __typename?: 'CustomerNoteCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerNoteCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerNoteInput = { + id: Scalars['Int'] + content?: Maybe + auditInfo?: Maybe +} + +export type CustomerPurchaseOrderAccount = { + __typename?: 'CustomerPurchaseOrderAccount' + _get?: Maybe + _root?: Maybe + id: Scalars['Int'] + accountId: Scalars['Int'] + isEnabled?: Maybe + creditLimit: Scalars['Float'] + availableBalance: Scalars['Float'] + totalAvailableBalance: Scalars['Float'] + overdraftAllowance?: Maybe + overdraftAllowanceType?: Maybe + customerPurchaseOrderPaymentTerms?: Maybe< + Array> + > + auditInfo?: Maybe +} + +export type CustomerPurchaseOrderAccount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerPurchaseOrderAccountCollection = { + __typename?: 'CustomerPurchaseOrderAccountCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerPurchaseOrderAccountCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerPurchaseOrderAccountInput = { + id: Scalars['Int'] + accountId: Scalars['Int'] + isEnabled?: Maybe + creditLimit: Scalars['Float'] + availableBalance: Scalars['Float'] + totalAvailableBalance: Scalars['Float'] + overdraftAllowance?: Maybe + overdraftAllowanceType?: Maybe + customerPurchaseOrderPaymentTerms?: Maybe< + Array> + > + auditInfo?: Maybe +} + +export type CustomerPurchaseOrderPaymentTerm = { + __typename?: 'CustomerPurchaseOrderPaymentTerm' + _get?: Maybe + _root?: Maybe + siteId: Scalars['Int'] + code?: Maybe + description?: Maybe + auditInfo?: Maybe +} + +export type CustomerPurchaseOrderPaymentTerm_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerPurchaseOrderPaymentTermInput = { + siteId: Scalars['Int'] + code?: Maybe + description?: Maybe + auditInfo?: Maybe +} + +export type CustomerSegment = { + __typename?: 'CustomerSegment' + _get?: Maybe + _root?: Maybe + id: Scalars['Int'] + code?: Maybe + name?: Maybe + description?: Maybe + auditInfo?: Maybe +} + +export type CustomerSegment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerSegmentCollection = { + __typename?: 'CustomerSegmentCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerSegmentCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerSegmentInput = { + id: Scalars['Int'] + code?: Maybe + name?: Maybe + description?: Maybe + auditInfo?: Maybe +} + +export type CustomerSet = { + __typename?: 'CustomerSet' + _get?: Maybe + _root?: Maybe + code?: Maybe + name?: Maybe + description?: Maybe + auditInfo?: Maybe + sites?: Maybe>> + isDefault?: Maybe + aggregateInfo?: Maybe +} + +export type CustomerSet_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerSetAggregateInfo = { + __typename?: 'CustomerSetAggregateInfo' + _get?: Maybe + _root?: Maybe + customerCount: Scalars['Int'] +} + +export type CustomerSetAggregateInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerSetCollection = { + __typename?: 'CustomerSetCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type CustomerSetCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerSetSite = { + __typename?: 'CustomerSetSite' + _get?: Maybe + _root?: Maybe + siteId: Scalars['Int'] + customerSetCode?: Maybe + name?: Maybe +} + +export type CustomerSetSite_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type CustomerUserAuthInfoInput = { + username?: Maybe + password?: Maybe +} + +export type Destination = { + __typename?: 'Destination' + _get?: Maybe + _root?: Maybe + id?: Maybe + destinationContact?: Maybe + isDestinationCommercial?: Maybe + data?: Maybe +} + +export type Destination_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DestinationInput = { + id?: Maybe + destinationContact?: Maybe + isDestinationCommercial?: Maybe + data?: Maybe +} + +export type DigitalPackage = { + __typename?: 'DigitalPackage' + _get?: Maybe + _root?: Maybe + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type DigitalPackage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DigitalPackageInput = { + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type DigitalPackageItem = { + __typename?: 'DigitalPackageItem' + _get?: Maybe + _root?: Maybe + giftCardCode?: Maybe + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type DigitalPackageItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DigitalPackageItemInput = { + giftCardCode?: Maybe + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type DigitalWalletInput = { + digitalWalletData?: Maybe + cartId?: Maybe +} + +export type DiscountSelectionsInput = { + discountIds?: Maybe> +} + +export type DiscountValidationSummary = { + __typename?: 'DiscountValidationSummary' + _get?: Maybe + _root?: Maybe + applicableDiscounts?: Maybe>> +} + +export type DiscountValidationSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Document = { + __typename?: 'Document' + _get?: Maybe + _root?: Maybe + id?: Maybe + name?: Maybe + path?: Maybe + publishSetCode?: Maybe + extension?: Maybe + documentTypeFQN?: Maybe + listFQN?: Maybe + contentLength?: Maybe + contentMimeType?: Maybe + contentUpdateDate?: Maybe + publishState?: Maybe + properties?: Maybe + insertDate?: Maybe + updateDate?: Maybe + activeDateRange?: Maybe +} + +export type Document_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentCollection = { + __typename?: 'DocumentCollection' + _get?: Maybe + _root?: Maybe + subPaths?: Maybe> + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type DocumentCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentDraftSummary = { + __typename?: 'DocumentDraftSummary' + _get?: Maybe + _root?: Maybe + id?: Maybe + name?: Maybe + documentTypeFQN?: Maybe + listFQN?: Maybe + activeUpdateDate?: Maybe + draftUpdateDate: Scalars['DateTime'] + updatedBy?: Maybe + activeUpdatedBy?: Maybe + publishType?: Maybe + publishSetCode?: Maybe + masterCatalogId?: Maybe + catalogId?: Maybe + siteId?: Maybe +} + +export type DocumentDraftSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentDraftSummaryPagedCollection = { + __typename?: 'DocumentDraftSummaryPagedCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type DocumentDraftSummaryPagedCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentInput = { + id?: Maybe + name?: Maybe + path?: Maybe + publishSetCode?: Maybe + extension?: Maybe + documentTypeFQN?: Maybe + listFQN?: Maybe + contentLength?: Maybe + contentMimeType?: Maybe + contentUpdateDate?: Maybe + publishState?: Maybe + properties?: Maybe + insertDate?: Maybe + updateDate?: Maybe + activeDateRange?: Maybe +} + +export type DocumentInstallation = { + __typename?: 'DocumentInstallation' + _get?: Maybe + _root?: Maybe + name?: Maybe + documentTypeFQN?: Maybe + properties?: Maybe + locale?: Maybe +} + +export type DocumentInstallation_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentInstallationInput = { + name?: Maybe + documentTypeFQN?: Maybe + properties?: Maybe + locale?: Maybe +} + +export type DocumentList = { + __typename?: 'DocumentList' + _get?: Maybe + _root?: Maybe + name?: Maybe + namespace?: Maybe + listFQN?: Maybe + documentTypes?: Maybe> + supportsPublishing?: Maybe + enablePublishing?: Maybe + supportsActiveDateRanges?: Maybe + enableActiveDateRanges?: Maybe + views?: Maybe>> + usages?: Maybe> + security?: Maybe + scopeId?: Maybe + scopeType?: Maybe + documentListType?: Maybe + metadata?: Maybe +} + +export type DocumentList_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentListCollection = { + __typename?: 'DocumentListCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type DocumentListCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentListInput = { + name?: Maybe + namespace?: Maybe + listFQN?: Maybe + documentTypes?: Maybe> + supportsPublishing?: Maybe + enablePublishing?: Maybe + supportsActiveDateRanges?: Maybe + enableActiveDateRanges?: Maybe + views?: Maybe>> + usages?: Maybe> + security?: Maybe + scopeId?: Maybe + scopeType?: Maybe + documentListType?: Maybe + metadata?: Maybe +} + +export type DocumentListType = { + __typename?: 'DocumentListType' + _get?: Maybe + _root?: Maybe + name?: Maybe + namespace?: Maybe + documentListTypeFQN?: Maybe + scopeType?: Maybe + installationPackage?: Maybe + version?: Maybe + defaultDocuments?: Maybe>> + documentTypeFQNs?: Maybe> + supportsPublishing?: Maybe + enablePublishing?: Maybe + supportsActiveDateRanges?: Maybe + enableActiveDateRanges?: Maybe + views?: Maybe>> + usages?: Maybe> + metadata?: Maybe +} + +export type DocumentListType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentListTypeCollection = { + __typename?: 'DocumentListTypeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type DocumentListTypeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentListTypeInput = { + name?: Maybe + namespace?: Maybe + documentListTypeFQN?: Maybe + scopeType?: Maybe + installationPackage?: Maybe + version?: Maybe + defaultDocuments?: Maybe>> + documentTypeFQNs?: Maybe> + supportsPublishing?: Maybe + enablePublishing?: Maybe + supportsActiveDateRanges?: Maybe + enableActiveDateRanges?: Maybe + views?: Maybe>> + usages?: Maybe> + metadata?: Maybe +} + +export type DocumentType = { + __typename?: 'DocumentType' + _get?: Maybe + _root?: Maybe + name?: Maybe + namespace?: Maybe + documentTypeFQN?: Maybe + adminName?: Maybe + installationPackage?: Maybe + version?: Maybe + metadata?: Maybe + properties?: Maybe>> +} + +export type DocumentType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentTypeCollection = { + __typename?: 'DocumentTypeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type DocumentTypeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type DocumentTypeInput = { + name?: Maybe + namespace?: Maybe + documentTypeFQN?: Maybe + adminName?: Maybe + installationPackage?: Maybe + version?: Maybe + metadata?: Maybe + properties?: Maybe>> +} + +export type EntityCollection = { + __typename?: 'EntityCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe> +} + +export type EntityCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type EntityContainer = { + __typename?: 'EntityContainer' + _get?: Maybe + _root?: Maybe + tenantId: Scalars['Int'] + siteId?: Maybe + masterCatalogId?: Maybe + catalogId?: Maybe + localeCode?: Maybe + listFullName?: Maybe + userId?: Maybe + id?: Maybe + item?: Maybe + createBy?: Maybe + createDate: Scalars['DateTime'] + updateBy?: Maybe + updateDate: Scalars['DateTime'] +} + +export type EntityContainer_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type EntityContainerCollection = { + __typename?: 'EntityContainerCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type EntityContainerCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type EntityList = { + __typename?: 'EntityList' + _get?: Maybe + _root?: Maybe + tenantId: Scalars['Int'] + nameSpace?: Maybe + name?: Maybe + contextLevel?: Maybe + useSystemAssignedId?: Maybe + idProperty?: Maybe + indexA?: Maybe + indexB?: Maybe + indexC?: Maybe + indexD?: Maybe + isVisibleInStorefront?: Maybe + isLocaleSpecific?: Maybe + isShopperSpecific?: Maybe + isSandboxDataCloningSupported?: Maybe + views?: Maybe>> + usages?: Maybe> + metadata?: Maybe + createDate: Scalars['DateTime'] + updateDate: Scalars['DateTime'] +} + +export type EntityList_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type EntityListCollection = { + __typename?: 'EntityListCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type EntityListCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type EntityListInput = { + tenantId: Scalars['Int'] + nameSpace?: Maybe + name?: Maybe + contextLevel?: Maybe + useSystemAssignedId?: Maybe + idProperty?: Maybe + indexA?: Maybe + indexB?: Maybe + indexC?: Maybe + indexD?: Maybe + isVisibleInStorefront?: Maybe + isLocaleSpecific?: Maybe + isShopperSpecific?: Maybe + isSandboxDataCloningSupported?: Maybe + views?: Maybe>> + usages?: Maybe> + metadata?: Maybe + createDate: Scalars['DateTime'] + updateDate: Scalars['DateTime'] +} + +export type ExclusionListEntryLocationCodeInput = { + locationCode: Scalars['String'] + orderItemID: Scalars['Int'] +} + +export type ExtendedProperty = { + __typename?: 'ExtendedProperty' + _get?: Maybe + _root?: Maybe + key?: Maybe + value?: Maybe +} + +export type ExtendedProperty_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ExtendedPropertyInput = { + key?: Maybe + value?: Maybe +} + +export type Facet = { + __typename?: 'Facet' + _get?: Maybe + _root?: Maybe + label?: Maybe + facetType?: Maybe + field?: Maybe + values?: Maybe>> +} + +export type Facet_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FacetValue = { + __typename?: 'FacetValue' + _get?: Maybe + _root?: Maybe + label?: Maybe + isApplied?: Maybe + count: Scalars['Int'] + value?: Maybe + filterValue?: Maybe + rangeQueryValueStart?: Maybe + rangeQueryValueEnd?: Maybe + parentFacetValue?: Maybe + isDisplayed?: Maybe + childrenFacetValues?: Maybe>> +} + +export type FacetValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FulfillmentActionInput = { + actionName?: Maybe + packageIds?: Maybe> + pickupIds?: Maybe> + digitalPackageIds?: Maybe> +} + +export type FulfillmentField = { + __typename?: 'FulfillmentField' + _get?: Maybe + _root?: Maybe + name?: Maybe + userEnteredValue?: Maybe + required?: Maybe +} + +export type FulfillmentField_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FulfillmentFieldInput = { + name?: Maybe + userEnteredValue?: Maybe + required?: Maybe +} + +export type FulfillmentInfo = { + __typename?: 'FulfillmentInfo' + _get?: Maybe + _root?: Maybe + fulfillmentContact?: Maybe + isDestinationCommercial?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + data?: Maybe + auditInfo?: Maybe +} + +export type FulfillmentInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FulfillmentInfoInput = { + fulfillmentContact?: Maybe + isDestinationCommercial?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + data?: Maybe + auditInfo?: Maybe +} + +export type FulfillmentShopperNotes = { + __typename?: 'FulfillmentShopperNotes' + _get?: Maybe + _root?: Maybe + comments?: Maybe + deliveryInstructions?: Maybe + giftMessage?: Maybe +} + +export type FulfillmentShopperNotes_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FulfillmentShopperNotesInput = { + comments?: Maybe + deliveryInstructions?: Maybe + giftMessage?: Maybe +} + +export type FulfillmentTask = { + __typename?: 'FulfillmentTask' + _get?: Maybe + _root?: Maybe + links?: Maybe + active?: Maybe + attributes?: Maybe + completed?: Maybe + completedDate?: Maybe + description?: Maybe + inputs?: Maybe>> + name?: Maybe + skippable?: Maybe + subject?: Maybe + taskId?: Maybe +} + +export type FulfillmentTask_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type FulfillmentTaskInput = { + links?: Maybe + active?: Maybe + attributes?: Maybe + completed?: Maybe + completedDate?: Maybe + description?: Maybe + inputs?: Maybe>> + name?: Maybe + skippable?: Maybe + subject?: Maybe + taskId?: Maybe +} + +export type GatewayGiftCard = { + __typename?: 'GatewayGiftCard' + _get?: Maybe + _root?: Maybe + cardNumber?: Maybe + amount: Scalars['Float'] + currencyCode?: Maybe +} + +export type GatewayGiftCard_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type GatewayGiftCardInput = { + cardNumber?: Maybe + amount: Scalars['Float'] + currencyCode?: Maybe +} + +export type GiftCard = { + __typename?: 'GiftCard' + _get?: Maybe + _root?: Maybe + activationDate?: Maybe + cardNumber?: Maybe + code?: Maybe + creditType?: Maybe + creditValue?: Maybe + currencyCode?: Maybe + currentBalance?: Maybe + customerId?: Maybe + expirationDate?: Maybe + initialBalance?: Maybe +} + +export type GiftCard_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type GiftCardInput = { + activationDate?: Maybe + cardNumber?: Maybe + code?: Maybe + creditType?: Maybe + creditValue?: Maybe + currencyCode?: Maybe + currentBalance?: Maybe + customerId?: Maybe + expirationDate?: Maybe + initialBalance?: Maybe +} + +export type Hours = { + __typename?: 'Hours' + _get?: Maybe + _root?: Maybe + label?: Maybe + openTime?: Maybe + closeTime?: Maybe + isClosed?: Maybe +} + +export type Hours_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type HoursInput = { + label?: Maybe + openTime?: Maybe + closeTime?: Maybe + isClosed?: Maybe +} + +export type InStockNotificationSubscription = { + __typename?: 'InStockNotificationSubscription' + _get?: Maybe + _root?: Maybe + id?: Maybe + email?: Maybe + customerId?: Maybe + productCode?: Maybe + locationCode?: Maybe + userId?: Maybe + auditInfo?: Maybe +} + +export type InStockNotificationSubscription_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type InStockNotificationSubscriptionCollection = { + __typename?: 'InStockNotificationSubscriptionCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type InStockNotificationSubscriptionCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type InStockNotificationSubscriptionInput = { + id?: Maybe + email?: Maybe + customerId?: Maybe + productCode?: Maybe + locationCode?: Maybe + userId?: Maybe + auditInfo?: Maybe +} + +export type IndexedProperty = { + __typename?: 'IndexedProperty' + _get?: Maybe + _root?: Maybe + propertyName?: Maybe + dataType?: Maybe +} + +export type IndexedProperty_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type IndexedPropertyInput = { + propertyName?: Maybe + dataType?: Maybe +} + +export type InvalidCoupon = { + __typename?: 'InvalidCoupon' + _get?: Maybe + _root?: Maybe + couponCode?: Maybe + reasonCode: Scalars['Int'] + reason?: Maybe + createDate: Scalars['DateTime'] + discountId: Scalars['Int'] +} + +export type InvalidCoupon_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type InvalidCouponInput = { + couponCode?: Maybe + reasonCode: Scalars['Int'] + reason?: Maybe + createDate: Scalars['DateTime'] + discountId: Scalars['Int'] +} + +export enum InventoryRequestTypeEnum { + All = 'ALL', + Partial = 'PARTIAL', + Any = 'ANY', + AllStores = 'ALL_STORES', +} + +export type ItemsForDestinationInput = { + destinationId?: Maybe + itemIds?: Maybe> +} + +export type JsonNode = { + __typename?: 'JsonNode' + _get?: Maybe + _root?: Maybe + array?: Maybe + bigDecimal?: Maybe + bigInteger?: Maybe + binary?: Maybe + boolean?: Maybe + containerNode?: Maybe + double?: Maybe + float?: Maybe + floatingPointNumber?: Maybe + int?: Maybe + integralNumber?: Maybe + long?: Maybe + missingNode?: Maybe + nodeType?: Maybe + null?: Maybe + number?: Maybe + object?: Maybe + pojo?: Maybe + short?: Maybe + textual?: Maybe + valueNode?: Maybe +} + +export type JsonNode_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type KeyValuePair2Input = { + key?: Maybe + value?: Maybe> +} + +export type ListView = { + __typename?: 'ListView' + _get?: Maybe + _root?: Maybe + name?: Maybe + usages?: Maybe> + metaData?: Maybe + security?: Maybe + filter?: Maybe + defaultSort?: Maybe + fields?: Maybe>> +} + +export type ListView_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ListViewCollection = { + __typename?: 'ListViewCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ListViewCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ListViewField = { + __typename?: 'ListViewField' + _get?: Maybe + _root?: Maybe + name?: Maybe + type?: Maybe + target?: Maybe +} + +export type ListViewField_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ListViewFieldInput = { + name?: Maybe + type?: Maybe + target?: Maybe +} + +export type ListViewInput = { + name?: Maybe + usages?: Maybe> + metaData?: Maybe + security?: Maybe + filter?: Maybe + defaultSort?: Maybe + fields?: Maybe>> +} + +export type LoAddress = { + __typename?: 'LoAddress' + _get?: Maybe + _root?: Maybe + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type LoAddress_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAddressInput = { + address1?: Maybe + address2?: Maybe + address3?: Maybe + address4?: Maybe + cityOrTown?: Maybe + stateOrProvince?: Maybe + postalOrZipCode?: Maybe + countryCode?: Maybe + addressType?: Maybe + isValidated?: Maybe +} + +export type LoAttribute = { + __typename?: 'LoAttribute' + _get?: Maybe + _root?: Maybe + id?: Maybe + adminName?: Maybe + namespace?: Maybe + attributeCode: Scalars['String'] + inputType?: Maybe + valueType: Scalars['String'] + dataType?: Maybe + attributeMetadata?: Maybe>> + attributeFQN?: Maybe + content?: Maybe + validation?: Maybe + vocabularyValues?: Maybe>> + auditInfo?: Maybe + isActive?: Maybe + isRequired?: Maybe + isReadOnly?: Maybe + isMultiValued?: Maybe + isVisible?: Maybe + order?: Maybe + displayGroup: Scalars['String'] +} + +export type LoAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeCollection = { + __typename?: 'LoAttributeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type LoAttributeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeInput = { + id?: Maybe + adminName?: Maybe + namespace?: Maybe + attributeCode: Scalars['String'] + inputType?: Maybe + valueType: Scalars['String'] + dataType?: Maybe + attributeMetadata?: Maybe>> + attributeFQN?: Maybe + content?: Maybe + validation?: Maybe + vocabularyValues?: Maybe>> + auditInfo?: Maybe + isActive?: Maybe + isRequired?: Maybe + isReadOnly?: Maybe + isMultiValued?: Maybe + isVisible?: Maybe + order?: Maybe + displayGroup: Scalars['String'] +} + +export type LoAttributeLocalizedContent = { + __typename?: 'LoAttributeLocalizedContent' + _get?: Maybe + _root?: Maybe + localeCode?: Maybe + value?: Maybe +} + +export type LoAttributeLocalizedContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeLocalizedContentInput = { + localeCode?: Maybe + value?: Maybe +} + +export type LoAttributeMetadataItem = { + __typename?: 'LoAttributeMetadataItem' + _get?: Maybe + _root?: Maybe + key: Scalars['String'] + value: Scalars['String'] +} + +export type LoAttributeMetadataItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeMetadataItemInput = { + key: Scalars['String'] + value: Scalars['String'] +} + +export type LoAttributeValidation = { + __typename?: 'LoAttributeValidation' + _get?: Maybe + _root?: Maybe + regularExpression?: Maybe + minStringLength?: Maybe + maxStringLength?: Maybe + minNumericValue?: Maybe + maxNumericValue?: Maybe + minDateTime?: Maybe + maxDateTime?: Maybe +} + +export type LoAttributeValidation_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeValidationInput = { + regularExpression?: Maybe + minStringLength?: Maybe + maxStringLength?: Maybe + minNumericValue?: Maybe + maxNumericValue?: Maybe + minDateTime?: Maybe + maxDateTime?: Maybe +} + +export type LoAttributeValueLocalizedContent = { + __typename?: 'LoAttributeValueLocalizedContent' + _get?: Maybe + _root?: Maybe + localeCode: Scalars['String'] + value: Scalars['String'] +} + +export type LoAttributeValueLocalizedContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeValueLocalizedContentInput = { + localeCode: Scalars['String'] + value: Scalars['String'] +} + +export type LoAttributeVocabularyValue = { + __typename?: 'LoAttributeVocabularyValue' + _get?: Maybe + _root?: Maybe + value: Scalars['String'] + sequence?: Maybe + isHidden?: Maybe + content?: Maybe +} + +export type LoAttributeVocabularyValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAttributeVocabularyValueInput = { + value: Scalars['String'] + sequence?: Maybe + isHidden?: Maybe + content?: Maybe +} + +export type LoAuditInfo = { + __typename?: 'LoAuditInfo' + _get?: Maybe + _root?: Maybe + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type LoAuditInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoAuditInfoInput = { + updateDate?: Maybe + createDate?: Maybe + updateBy?: Maybe + createBy?: Maybe +} + +export type LoFulfillmentType = { + __typename?: 'LoFulfillmentType' + _get?: Maybe + _root?: Maybe + code?: Maybe + name?: Maybe +} + +export type LoFulfillmentType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LoFulfillmentTypeInput = { + code?: Maybe + name?: Maybe +} + +export type Location = { + __typename?: 'Location' + _get?: Maybe + _root?: Maybe + code?: Maybe + locationTypes?: Maybe>> + name?: Maybe + description?: Maybe + address?: Maybe + geo?: Maybe + phone?: Maybe + fax?: Maybe + supportsInventory?: Maybe + fulfillmentTypes?: Maybe>> + regularHours?: Maybe + shippingOriginContact?: Maybe + note?: Maybe + tags?: Maybe> + attributes?: Maybe>> + auditInfo?: Maybe + allowFulfillmentWithNoStock?: Maybe + isDisabled?: Maybe + express?: Maybe + transferEnabled?: Maybe + includeInInventoryAggregrate?: Maybe + includeInLocationExport?: Maybe + warehouseEnabled?: Maybe + requiresManifest?: Maybe +} + +export type Location_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationAttribute = { + __typename?: 'LocationAttribute' + _get?: Maybe + _root?: Maybe + attributeDefinition?: Maybe + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type LocationAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationAttributeInput = { + attributeDefinition?: Maybe + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type LocationCollection = { + __typename?: 'LocationCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type LocationCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationGroup = { + __typename?: 'LocationGroup' + _get?: Maybe + _root?: Maybe + locationGroupId: Scalars['Int'] + locationGroupCode?: Maybe + siteIds?: Maybe> + name?: Maybe + locationCodes?: Maybe> + auditInfo?: Maybe +} + +export type LocationGroup_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationGroupCollection = { + __typename?: 'LocationGroupCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type LocationGroupCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationGroupConfiguration = { + __typename?: 'LocationGroupConfiguration' + _get?: Maybe + _root?: Maybe + tenantId: Scalars['Int'] + siteId: Scalars['Int'] + locationGroupId: Scalars['Int'] + locationGroupCode?: Maybe + customerFailedToPickupAfterAction?: Maybe + customerFailedToPickupDeadline?: Maybe + sendCustomerPickupReminder?: Maybe + enableForSTH?: Maybe + enableForISPU?: Maybe + enableAdvancedOptionForPickWaveCreation?: Maybe + maximumNumberOfOrdersInPickWave?: Maybe + defaultNumberOfOrdersInPickWave?: Maybe + pickWavePrintFormat?: Maybe + closePickWavePermissions?: Maybe> + wmsEnabled?: Maybe + enableScanningOfUpcForShipToHome?: Maybe + allowReturns?: Maybe + returnRefundReduction?: Maybe + defaultReturnRefundReductionAmount?: Maybe + maximumReturnRefundReductionAmount?: Maybe + defaultCarrier?: Maybe + carriers?: Maybe>> + printReturnLabel?: Maybe + defaultPrinterType?: Maybe + boxTypes?: Maybe>> + attributes?: Maybe>> + bpmConfigurations?: Maybe>> + auditInfo?: Maybe + autoPackingListPopup?: Maybe + blockPartialStock?: Maybe + defaultMaxNumberOfShipmentsInPickWave?: Maybe + displayProductImagesInPickWaveDetails?: Maybe + enablePnpForSTH?: Maybe + enablePnpForBOPIS?: Maybe + blockPartialCancel?: Maybe + packageSettings?: Maybe +} + +export type LocationGroupConfiguration_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationGroupInput = { + locationGroupId: Scalars['Int'] + locationGroupCode?: Maybe + siteIds?: Maybe> + name?: Maybe + locationCodes?: Maybe> + auditInfo?: Maybe +} + +export type LocationInput = { + code?: Maybe + locationTypes?: Maybe>> + name?: Maybe + description?: Maybe + address?: Maybe + geo?: Maybe + phone?: Maybe + fax?: Maybe + supportsInventory?: Maybe + fulfillmentTypes?: Maybe>> + regularHours?: Maybe + shippingOriginContact?: Maybe + note?: Maybe + tags?: Maybe> + attributes?: Maybe>> + auditInfo?: Maybe + allowFulfillmentWithNoStock?: Maybe + isDisabled?: Maybe + express?: Maybe + transferEnabled?: Maybe + includeInInventoryAggregrate?: Maybe + includeInLocationExport?: Maybe + warehouseEnabled?: Maybe + requiresManifest?: Maybe +} + +export type LocationInventory = { + __typename?: 'LocationInventory' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + locationCode?: Maybe + stockAvailable?: Maybe + softStockAvailable?: Maybe + sku?: Maybe + mfgPartNumber?: Maybe +} + +export type LocationInventory_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationInventoryCollection = { + __typename?: 'LocationInventoryCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type LocationInventoryCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationInventoryQueryInput = { + locationCodes?: Maybe> + productCodes?: Maybe> +} + +export type LocationType = { + __typename?: 'LocationType' + _get?: Maybe + _root?: Maybe + code?: Maybe + name?: Maybe + auditInfo?: Maybe +} + +export type LocationType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationTypeInput = { + code?: Maybe + name?: Maybe + auditInfo?: Maybe +} + +export type LocationUsage = { + __typename?: 'LocationUsage' + _get?: Maybe + _root?: Maybe + locationUsageTypeCode?: Maybe + locationTypeCodes?: Maybe> + locationCodes?: Maybe> + auditInfo?: Maybe +} + +export type LocationUsage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationUsageCollection = { + __typename?: 'LocationUsageCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type LocationUsageCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type LocationUsageInput = { + locationUsageTypeCode?: Maybe + locationTypeCodes?: Maybe> + locationCodes?: Maybe> + auditInfo?: Maybe +} + +export type LoginState = { + __typename?: 'LoginState' + _get?: Maybe + _root?: Maybe + isPasswordChangeRequired?: Maybe + lastPasswordChangeOn?: Maybe + isLocked?: Maybe + lastLockedOn?: Maybe + failedLoginAttemptCount: Scalars['Int'] + remainingLoginAttempts: Scalars['Int'] + firstFailedLoginAttemptOn?: Maybe + lastLoginOn?: Maybe + createdOn?: Maybe + updatedOn?: Maybe +} + +export type LoginState_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type MzdbHttpContentInput = { + headers?: Maybe>> +} + +export type MzdbHttpMethodInput = { + method?: Maybe +} + +export type MzdbHttpRequestMessageInput = { + version?: Maybe + content?: Maybe + method?: Maybe + requestUri?: Maybe + headers?: Maybe>> + properties?: Maybe +} + +export type MzdbStringStringIEnumerableKeyValuePairInput = { + key?: Maybe + value?: Maybe> +} + +export type Mutation = { + __typename?: 'Mutation' + createCustomerAccountAttributeDefinition?: Maybe + updateCustomerAccountAttributeDefinition?: Maybe + validateCustomerAddress?: Maybe + validateAddress?: Maybe>> + createCustomerAuthTicket?: Maybe + refreshCustomerAuthTickets?: Maybe + createCustomerB2bAccountAttribute?: Maybe + deleteB2bAccountAttribute?: Maybe + updateCustomerB2bAccountAttribute?: Maybe + createCustomerB2bAccount?: Maybe + updateCustomerB2bAccount?: Maybe + createCustomerB2bAccountUser?: Maybe + updateCustomerB2bAccountUser?: Maybe + removeCustomerB2bAccountUser?: Maybe + addRoleToCustomerB2bAccount?: Maybe + deleteB2bAccountRole?: Maybe + createCustomerCredit?: Maybe + updateCustomerCredit?: Maybe + deleteCustomerCredit?: Maybe + updateCustomerCreditAssociateToShopper?: Maybe + resendCustomerCreditEmail?: Maybe + createCustomerCreditTransaction?: Maybe + createCustomerAccountAttribute?: Maybe + deleteCustomerAccountAttribute?: Maybe + updateCustomerAccountAttribute?: Maybe + createCustomerAccountCard?: Maybe + updateCustomerAccountCard?: Maybe + deleteCustomerAccountCard?: Maybe + createCustomerAccountContact?: Maybe + updateCustomerAccountContacts?: Maybe + updateCustomerAccountContact?: Maybe + deleteCustomerAccountContact?: Maybe + createCustomerAccount?: Maybe + updateCustomerAccount?: Maybe + deleteCustomerAccount?: Maybe + createCustomerAccountTransaction?: Maybe + deleteCustomerAccountTransaction?: Maybe + recomputeCustomerAccountLifetimeValue?: Maybe + createCustomerAccountNote?: Maybe + updateCustomerAccountNote?: Maybe + deleteCustomerAccountNote?: Maybe + createCustomerAccountPurchaseOrderAccount?: Maybe + updateCustomerPurchaseOrderAccount?: Maybe + createCustomerAccountPurchaseOrderAccountTransaction?: Maybe + createPurchaseOrderAccount?: Maybe + changeCustomerAccountPassword?: Maybe + updateCustomerAccountPasswords?: Maybe + resetCustomerAccountPassword?: Maybe + createCustomerAccountLogin?: Maybe + createCustomerAccountAndLogin?: Maybe + setCustomerAccountLoginLocked?: Maybe + setCustomerAccountPasswordChangeRequired?: Maybe + createCustomerAccounts?: Maybe + createCustomerSegment?: Maybe + updateCustomerSegment?: Maybe + deleteCustomerSegment?: Maybe + createCustomerSegmentAccount?: Maybe + deleteCustomerSegmentAccount?: Maybe + createInStockNotification?: Maybe + deleteInStockNotification?: Maybe + createResolvedPriceList?: Maybe + configureProduct?: Maybe + validateProduct?: Maybe + validateProductDiscounts?: Maybe + manageLocationProductInventory?: Maybe + createProductCost?: Maybe + createCartForUser?: Maybe + updateUserCart?: Maybe + updateCurrentCart?: Maybe + deleteCurrentCart?: Maybe + updateCart?: Maybe + deleteCart?: Maybe + deleteUserCart?: Maybe + rejectCartDiscount?: Maybe + updateCartCoupon?: Maybe + deleteCartCoupons?: Maybe + deleteCartCoupon?: Maybe + addExtendedPropertyToCurrentCart?: Maybe>> + updateCurrentCartExtendedProperties?: Maybe>> + deleteCurrentCartExtendedProperties?: Maybe + updateCurrentCartExtendedProperty?: Maybe + deleteCurrentCartExtendedProperty?: Maybe + deleteCurrentCartItems?: Maybe + addItemToCurrentCart?: Maybe + deleteCartItems?: Maybe + addItemToCart?: Maybe + updateCurrentCartItem?: Maybe + deleteCurrentCartItem?: Maybe + updateCartItem?: Maybe + deleteCartItem?: Maybe + addItemsToCurrentCart?: Maybe + addItemsToCart?: Maybe + updateCurrentCartItemQuantity?: Maybe + updateCartItemQuantity?: Maybe + deleteCurrentCartMessages?: Maybe + deleteCurrentCartMessage?: Maybe + createCommerceChannel?: Maybe + updateChannel?: Maybe + deleteCommerceChannel?: Maybe + createCommerceChannelGroup?: Maybe + updateChannelGroup?: Maybe + deleteCommerceChannelGroup?: Maybe + createCheckoutAttribute?: Maybe>> + updateCheckoutAttributes?: Maybe>> + updateCheckout?: Maybe + createCheckout?: Maybe + createCheckoutShippingMethod?: Maybe + createCheckoutAction?: Maybe + updateCheckoutDigitalWalletType?: Maybe + updateCheckoutPriceList?: Maybe + resendCheckoutEmail?: Maybe + updateCheckoutCoupon?: Maybe + deleteCheckoutCoupons?: Maybe + deleteCheckoutCoupon?: Maybe + updateCheckoutDestination?: Maybe + deleteCheckoutDestination?: Maybe + createCheckoutDestination?: Maybe + createCheckoutItem?: Maybe + deleteCheckoutItem?: Maybe + updateCheckoutItemDestination?: Maybe + createCheckoutItemDestination?: Maybe + createCheckoutPaymentAction?: Maybe + updateCheckoutPaymentAction?: Maybe + createOrderPaymentAction?: Maybe + createOrderPaymentPaymentAction?: Maybe + createOrderAutoCapture?: Maybe + createOrderPickup?: Maybe + updateOrderPickup?: Maybe + deleteOrderPickup?: Maybe + createOrderRefund?: Maybe + updateOrderRefund?: Maybe + createOrderShipment?: Maybe>> + deleteOrderShipment?: Maybe + repriceOrderShipment?: Maybe + createOrderShipmentAdjustment?: Maybe + createOrderShipmentItemAdjustment?: Maybe + splitOrderShipment?: Maybe>> + updateOrderValidationResults?: Maybe + updateOrderAdjustment?: Maybe + deleteOrderAdjustment?: Maybe + updateOrderShippingAdjustment?: Maybe + deleteOrderAdjustmentShipping?: Maybe + updateOrderHandlingAdjustment?: Maybe + deleteOrderAdjustmentHandling?: Maybe + createOrderAttribute?: Maybe>> + updateOrderAttributes?: Maybe>> + updateOrderBillingInfo?: Maybe + cancelOrder?: Maybe + createOrder?: Maybe + updateUserOrder?: Maybe + updateOrderPriceList?: Maybe + resendOrderEmail?: Maybe + updateOrder?: Maybe + updateOrderDigitalWalletTpe?: Maybe + updateOrderDraft?: Maybe + createOrderAction?: Maybe + updateOrderDiscount?: Maybe + updateOrderPrice?: Maybe + updateOrderCoupon?: Maybe + deleteOrderCoupons?: Maybe + deleteOrderCoupon?: Maybe + createOrderDigitalPackage?: Maybe + updateOrderDigitalPackage?: Maybe + deleteOrderDigitalPackage?: Maybe + createOrderExtendedProperties?: Maybe>> + updateOrderExtendedProperties?: Maybe>> + deleteOrderExtendedProperties?: Maybe + updateOrderExtendedProperty?: Maybe + deleteOrderExtendedProperty?: Maybe + createOrderFulfillmentAction?: Maybe + resendOrderFulfillmentEmail?: Maybe + updateOrderFulfillmentInfo?: Maybe + createOrderItem?: Maybe + deleteOrderItem?: Maybe + updateOrderItemPrice?: Maybe + updateOrderItemQuantity?: Maybe + updateOrderItemDutyAmount?: Maybe + updateOrderItemFulfillment?: Maybe + updateOrderItemDiscount?: Maybe + createOrderNote?: Maybe + updateOrderNotes?: Maybe + deleteOrderNote?: Maybe + createOrderPackage?: Maybe + updateOrderPackage?: Maybe + deleteOrderPackage?: Maybe + validateOrder?: Maybe + updateQuote?: Maybe + deleteQuote?: Maybe + createQuote?: Maybe + createQuoteItem?: Maybe + deleteQuoteItem?: Maybe + createReturn?: Maybe + resendReturnEmail?: Maybe + updateReturn?: Maybe + deleteReturn?: Maybe + createReturnAction?: Maybe + setReturnShip?: Maybe + createReturnPaymentAction?: Maybe + createReturnPaymentPaymentAction?: Maybe + setReturnRestock?: Maybe + createReturnItem?: Maybe + deleteReturnItem?: Maybe + createReturnNote?: Maybe + updateReturnNote?: Maybe + deleteReturnNote?: Maybe + createReturnPackage?: Maybe + updateReturnPackage?: Maybe + deleteReturnPackage?: Maybe + createReturnShipment?: Maybe>> + deleteReturnShipment?: Maybe + createWishlist?: Maybe + updateWishlist?: Maybe + deleteWishlist?: Maybe + deleteWishlistItems?: Maybe + createWishlistItem?: Maybe + updateWishlistItem?: Maybe + deleteWishlistItem?: Maybe + updateWishlistItemQuantity?: Maybe + updateDocumentListDocumentContent?: Maybe + deleteDocumentListDocumentContent?: Maybe + updateDocumentListDocumentTreeContent?: Maybe + deleteDocumentListDocumentTreeContent?: Maybe + createDocumentListDocument?: Maybe + updateDocumentListDocument?: Maybe + patchDocumentListDocument?: Maybe + deleteDocumentListDocument?: Maybe + createDocumentList?: Maybe + updateDocumentList?: Maybe + deleteDocumentList?: Maybe + createDocumentListType?: Maybe + updateDocumentListType?: Maybe + createDocumentDraft?: Maybe + toggleDocumentPublishing?: Maybe + createDocumentType?: Maybe + updateDocumentType?: Maybe + createPropertyType?: Maybe + updatePropertyType?: Maybe + deletePropertyType?: Maybe + adminCreateLocation?: Maybe + adminUpdateLocation?: Maybe + deleteAdminLocation?: Maybe + adminCreateLocationAttribute?: Maybe + adminUpdateLocationAttribute?: Maybe + adminCreateLocationGroup?: Maybe + updateLocationUsage?: Maybe + adminCreateLocationType?: Maybe + adminUpdateLocationType?: Maybe + deleteAdminLocationType?: Maybe + updateEntityListEntities?: Maybe + deleteEntityListEntity?: Maybe + createEntityListEntity?: Maybe + updateEntityList?: Maybe + deleteEntityList?: Maybe + createEntityList?: Maybe + createEntityListView?: Maybe + updateEntityListView?: Maybe + deleteEntityListView?: Maybe + createTargetRule?: Maybe + updateTargetRule?: Maybe + deleteCommerceTargetRule?: Maybe + validateTargetRule?: Maybe + createOrderRoutingSuggestion?: Maybe +} + +export type MutationCreateCustomerAccountAttributeDefinitionArgs = { + attributeInput?: Maybe +} + +export type MutationUpdateCustomerAccountAttributeDefinitionArgs = { + attributeFQN: Scalars['String'] + attributeInput?: Maybe +} + +export type MutationValidateCustomerAddressArgs = { + addressValidationRequestInput?: Maybe +} + +export type MutationValidateAddressArgs = { + addressInput?: Maybe +} + +export type MutationCreateCustomerAuthTicketArgs = { + customerUserAuthInfoInput?: Maybe +} + +export type MutationRefreshCustomerAuthTicketsArgs = { + refreshToken?: Maybe +} + +export type MutationCreateCustomerB2bAccountAttributeArgs = { + accountId: Scalars['Int'] + customerAttributeInput?: Maybe +} + +export type MutationDeleteB2bAccountAttributeArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] +} + +export type MutationUpdateCustomerB2bAccountAttributeArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] + customerAttributeInput?: Maybe +} + +export type MutationCreateCustomerB2bAccountArgs = { + b2BAccountInput?: Maybe +} + +export type MutationUpdateCustomerB2bAccountArgs = { + accountId: Scalars['Int'] + b2BAccountInput?: Maybe +} + +export type MutationCreateCustomerB2bAccountUserArgs = { + accountId: Scalars['Int'] + b2BUserAndAuthInfoInput?: Maybe +} + +export type MutationUpdateCustomerB2bAccountUserArgs = { + accountId: Scalars['Int'] + userId: Scalars['String'] + b2BUserInput?: Maybe +} + +export type MutationRemoveCustomerB2bAccountUserArgs = { + accountId: Scalars['Int'] + userId: Scalars['String'] +} + +export type MutationAddRoleToCustomerB2bAccountArgs = { + accountId: Scalars['Int'] + userId: Scalars['String'] + roleId: Scalars['Int'] +} + +export type MutationDeleteB2bAccountRoleArgs = { + accountId: Scalars['Int'] + userId: Scalars['String'] + roleId: Scalars['Int'] +} + +export type MutationCreateCustomerCreditArgs = { + userId?: Maybe + creditInput?: Maybe +} + +export type MutationUpdateCustomerCreditArgs = { + code: Scalars['String'] + creditInput?: Maybe +} + +export type MutationDeleteCustomerCreditArgs = { + code: Scalars['String'] +} + +export type MutationUpdateCustomerCreditAssociateToShopperArgs = { + code: Scalars['String'] +} + +export type MutationResendCustomerCreditEmailArgs = { + code: Scalars['String'] + userId?: Maybe +} + +export type MutationCreateCustomerCreditTransactionArgs = { + code: Scalars['String'] + creditTransactionInput?: Maybe +} + +export type MutationCreateCustomerAccountAttributeArgs = { + accountId: Scalars['Int'] + userId?: Maybe + customerAttributeInput?: Maybe +} + +export type MutationDeleteCustomerAccountAttributeArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] + userId?: Maybe +} + +export type MutationUpdateCustomerAccountAttributeArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] + userId?: Maybe + customerAttributeInput?: Maybe +} + +export type MutationCreateCustomerAccountCardArgs = { + accountId: Scalars['Int'] + cardInput?: Maybe +} + +export type MutationUpdateCustomerAccountCardArgs = { + accountId: Scalars['Int'] + cardId: Scalars['String'] + cardInput?: Maybe +} + +export type MutationDeleteCustomerAccountCardArgs = { + accountId: Scalars['Int'] + cardId: Scalars['String'] +} + +export type MutationCreateCustomerAccountContactArgs = { + accountId: Scalars['Int'] + customerContactInput?: Maybe +} + +export type MutationUpdateCustomerAccountContactsArgs = { + accountId: Scalars['Int'] + customerContactInput?: Maybe +} + +export type MutationUpdateCustomerAccountContactArgs = { + accountId: Scalars['Int'] + contactId: Scalars['Int'] + userId?: Maybe + customerContactInput?: Maybe +} + +export type MutationDeleteCustomerAccountContactArgs = { + accountId: Scalars['Int'] + contactId: Scalars['Int'] +} + +export type MutationCreateCustomerAccountArgs = { + customerAccountInput?: Maybe +} + +export type MutationUpdateCustomerAccountArgs = { + accountId: Scalars['Int'] + customerAccountInput?: Maybe +} + +export type MutationDeleteCustomerAccountArgs = { + accountId: Scalars['Int'] +} + +export type MutationCreateCustomerAccountTransactionArgs = { + accountId: Scalars['Int'] + transactionInput?: Maybe +} + +export type MutationDeleteCustomerAccountTransactionArgs = { + accountId: Scalars['Int'] + transactionId: Scalars['String'] +} + +export type MutationRecomputeCustomerAccountLifetimeValueArgs = { + accountId: Scalars['Int'] +} + +export type MutationCreateCustomerAccountNoteArgs = { + accountId: Scalars['Int'] + customerNoteInput?: Maybe +} + +export type MutationUpdateCustomerAccountNoteArgs = { + accountId: Scalars['Int'] + noteId: Scalars['Int'] + customerNoteInput?: Maybe +} + +export type MutationDeleteCustomerAccountNoteArgs = { + accountId: Scalars['Int'] + noteId: Scalars['Int'] +} + +export type MutationCreateCustomerAccountPurchaseOrderAccountArgs = { + accountId: Scalars['Int'] + customerPurchaseOrderAccountInput?: Maybe +} + +export type MutationUpdateCustomerPurchaseOrderAccountArgs = { + accountId: Scalars['Int'] + customerPurchaseOrderAccountInput?: Maybe +} + +export type MutationCreateCustomerAccountPurchaseOrderAccountTransactionArgs = { + accountId: Scalars['Int'] + purchaseOrderTransactionInput?: Maybe +} + +export type MutationCreatePurchaseOrderAccountArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + accountType?: Maybe +} + +export type MutationChangeCustomerAccountPasswordArgs = { + accountId: Scalars['Int'] + unlockAccount?: Maybe + userId?: Maybe + passwordInfoInput?: Maybe +} + +export type MutationUpdateCustomerAccountPasswordsArgs = { + accountPasswordInfoCollectionInput?: Maybe +} + +export type MutationResetCustomerAccountPasswordArgs = { + resetPasswordInfoInput?: Maybe +} + +export type MutationCreateCustomerAccountLoginArgs = { + accountId: Scalars['Int'] + customerLoginInfoInput?: Maybe +} + +export type MutationCreateCustomerAccountAndLoginArgs = { + customerAccountAndAuthInfoInput?: Maybe +} + +export type MutationSetCustomerAccountLoginLockedArgs = { + accountId: Scalars['Int'] + userId?: Maybe + graphQLBoolean?: Maybe +} + +export type MutationSetCustomerAccountPasswordChangeRequiredArgs = { + accountId: Scalars['Int'] + userId?: Maybe + graphQLBoolean?: Maybe +} + +export type MutationCreateCustomerAccountsArgs = { + customerAccountAndAuthInfoInput?: Maybe +} + +export type MutationCreateCustomerSegmentArgs = { + customerSegmentInput?: Maybe +} + +export type MutationUpdateCustomerSegmentArgs = { + id: Scalars['Int'] + customerSegmentInput?: Maybe +} + +export type MutationDeleteCustomerSegmentArgs = { + id: Scalars['Int'] +} + +export type MutationCreateCustomerSegmentAccountArgs = { + id: Scalars['Int'] + graphQLInt?: Maybe +} + +export type MutationDeleteCustomerSegmentAccountArgs = { + id: Scalars['Int'] + accountId: Scalars['Int'] +} + +export type MutationCreateInStockNotificationArgs = { + inStockNotificationSubscriptionInput?: Maybe +} + +export type MutationDeleteInStockNotificationArgs = { + id: Scalars['Int'] +} + +export type MutationCreateResolvedPriceListArgs = { + object?: Maybe +} + +export type MutationConfigureProductArgs = { + productCode: Scalars['String'] + includeOptionDetails?: Maybe + skipInventoryCheck?: Maybe + quantity?: Maybe + purchaseLocation?: Maybe + variationProductCodeFilter?: Maybe + productOptionSelectionsInput?: Maybe +} + +export type MutationValidateProductArgs = { + productCode: Scalars['String'] + skipInventoryCheck?: Maybe + quantity?: Maybe + skipDefaults?: Maybe + purchaseLocation?: Maybe + productOptionSelectionsInput?: Maybe +} + +export type MutationValidateProductDiscountsArgs = { + productCode: Scalars['String'] + variationProductCode?: Maybe + customerAccountId?: Maybe + allowInactive?: Maybe + skipInventoryCheck?: Maybe + discountSelectionsInput?: Maybe +} + +export type MutationManageLocationProductInventoryArgs = { + locationInventoryQueryInput?: Maybe +} + +export type MutationCreateProductCostArgs = { + productCostQueryInput?: Maybe +} + +export type MutationCreateCartForUserArgs = { + userId: Scalars['String'] +} + +export type MutationUpdateUserCartArgs = { + userId: Scalars['String'] + cartInput?: Maybe +} + +export type MutationUpdateCurrentCartArgs = { + cartInput?: Maybe +} + +export type MutationUpdateCartArgs = { + cartId: Scalars['String'] + cartInput?: Maybe +} + +export type MutationDeleteCartArgs = { + cartId: Scalars['String'] +} + +export type MutationDeleteUserCartArgs = { + userId: Scalars['String'] +} + +export type MutationRejectCartDiscountArgs = { + cartId: Scalars['String'] + discountId: Scalars['Int'] +} + +export type MutationUpdateCartCouponArgs = { + cartId: Scalars['String'] + couponCode: Scalars['String'] +} + +export type MutationDeleteCartCouponsArgs = { + cartId: Scalars['String'] +} + +export type MutationDeleteCartCouponArgs = { + cartId: Scalars['String'] + couponCode: Scalars['String'] +} + +export type MutationAddExtendedPropertyToCurrentCartArgs = { + extendedPropertyInput?: Maybe +} + +export type MutationUpdateCurrentCartExtendedPropertiesArgs = { + upsert?: Maybe + extendedPropertyInput?: Maybe +} + +export type MutationDeleteCurrentCartExtendedPropertiesArgs = { + graphQLString?: Maybe +} + +export type MutationUpdateCurrentCartExtendedPropertyArgs = { + key: Scalars['String'] + upsert?: Maybe + extendedPropertyInput?: Maybe +} + +export type MutationDeleteCurrentCartExtendedPropertyArgs = { + key: Scalars['String'] +} + +export type MutationAddItemToCurrentCartArgs = { + cartItemInput?: Maybe +} + +export type MutationDeleteCartItemsArgs = { + cartId: Scalars['String'] +} + +export type MutationAddItemToCartArgs = { + cartId: Scalars['String'] + cartItemInput?: Maybe +} + +export type MutationUpdateCurrentCartItemArgs = { + cartItemId: Scalars['String'] + cartItemInput?: Maybe +} + +export type MutationDeleteCurrentCartItemArgs = { + cartItemId: Scalars['String'] +} + +export type MutationUpdateCartItemArgs = { + cartId: Scalars['String'] + cartItemId: Scalars['String'] + cartItemInput?: Maybe +} + +export type MutationDeleteCartItemArgs = { + cartId: Scalars['String'] + cartItemId: Scalars['String'] +} + +export type MutationAddItemsToCurrentCartArgs = { + throwErrorOnInvalidItems?: Maybe + cartItemInput?: Maybe +} + +export type MutationAddItemsToCartArgs = { + cartId: Scalars['String'] + throwErrorOnInvalidItems?: Maybe + cartItemInput?: Maybe +} + +export type MutationUpdateCurrentCartItemQuantityArgs = { + cartItemId: Scalars['String'] + quantity: Scalars['Int'] +} + +export type MutationUpdateCartItemQuantityArgs = { + cartId: Scalars['String'] + cartItemId: Scalars['String'] + quantity: Scalars['Int'] +} + +export type MutationDeleteCurrentCartMessageArgs = { + messageId: Scalars['String'] +} + +export type MutationCreateCommerceChannelArgs = { + channelInput?: Maybe +} + +export type MutationUpdateChannelArgs = { + code: Scalars['String'] + channelInput?: Maybe +} + +export type MutationDeleteCommerceChannelArgs = { + code: Scalars['String'] +} + +export type MutationCreateCommerceChannelGroupArgs = { + channelGroupInput?: Maybe +} + +export type MutationUpdateChannelGroupArgs = { + code: Scalars['String'] + channelGroupInput?: Maybe +} + +export type MutationDeleteCommerceChannelGroupArgs = { + code: Scalars['String'] +} + +export type MutationCreateCheckoutAttributeArgs = { + checkoutId: Scalars['String'] + orderAttributeInput?: Maybe +} + +export type MutationUpdateCheckoutAttributesArgs = { + checkoutId: Scalars['String'] + removeMissing?: Maybe + orderAttributeInput?: Maybe +} + +export type MutationUpdateCheckoutArgs = { + checkoutId: Scalars['String'] + checkoutInput?: Maybe +} + +export type MutationCreateCheckoutArgs = { + cartId?: Maybe +} + +export type MutationCreateCheckoutShippingMethodArgs = { + checkoutId: Scalars['String'] + checkoutGroupShippingMethodInput?: Maybe +} + +export type MutationCreateCheckoutActionArgs = { + checkoutId: Scalars['String'] + checkoutActionInput?: Maybe +} + +export type MutationUpdateCheckoutDigitalWalletTypeArgs = { + checkoutId: Scalars['String'] + digitalWalletType: Scalars['String'] + digitalWalletInput?: Maybe +} + +export type MutationUpdateCheckoutPriceListArgs = { + checkoutId: Scalars['String'] + graphQLString?: Maybe +} + +export type MutationResendCheckoutEmailArgs = { + checkoutId: Scalars['String'] +} + +export type MutationUpdateCheckoutCouponArgs = { + checkoutId: Scalars['String'] + couponCode: Scalars['String'] +} + +export type MutationDeleteCheckoutCouponsArgs = { + checkoutId: Scalars['String'] +} + +export type MutationDeleteCheckoutCouponArgs = { + checkoutId: Scalars['String'] + couponCode: Scalars['String'] +} + +export type MutationUpdateCheckoutDestinationArgs = { + checkoutId: Scalars['String'] + destinationId: Scalars['String'] + destinationInput?: Maybe +} + +export type MutationDeleteCheckoutDestinationArgs = { + checkoutId: Scalars['String'] + destinationId: Scalars['String'] +} + +export type MutationCreateCheckoutDestinationArgs = { + checkoutId: Scalars['String'] + destinationInput?: Maybe +} + +export type MutationCreateCheckoutItemArgs = { + checkoutId: Scalars['String'] + orderItemInput?: Maybe +} + +export type MutationDeleteCheckoutItemArgs = { + checkoutId: Scalars['String'] + itemId: Scalars['String'] +} + +export type MutationUpdateCheckoutItemDestinationArgs = { + checkoutId: Scalars['String'] + itemId: Scalars['String'] + destinationId: Scalars['String'] +} + +export type MutationCreateCheckoutItemDestinationArgs = { + checkoutId: Scalars['String'] + itemsForDestinationInput?: Maybe +} + +export type MutationCreateCheckoutPaymentActionArgs = { + checkoutId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationUpdateCheckoutPaymentActionArgs = { + checkoutId: Scalars['String'] + paymentId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationCreateOrderPaymentActionArgs = { + orderId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationCreateOrderPaymentPaymentActionArgs = { + orderId: Scalars['String'] + paymentId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationCreateOrderAutoCaptureArgs = { + orderId: Scalars['String'] + forceCapture?: Maybe +} + +export type MutationCreateOrderPickupArgs = { + orderId: Scalars['String'] + pickupInput?: Maybe +} + +export type MutationUpdateOrderPickupArgs = { + orderId: Scalars['String'] + pickupId: Scalars['String'] + pickupInput?: Maybe +} + +export type MutationDeleteOrderPickupArgs = { + orderId: Scalars['String'] + pickupId: Scalars['String'] +} + +export type MutationCreateOrderRefundArgs = { + orderId: Scalars['String'] + refundInput?: Maybe +} + +export type MutationUpdateOrderRefundArgs = { + orderId: Scalars['String'] + refundId: Scalars['String'] +} + +export type MutationCreateOrderShipmentArgs = { + orderId: Scalars['String'] + graphQLString?: Maybe +} + +export type MutationDeleteOrderShipmentArgs = { + orderId: Scalars['String'] + shipmentId: Scalars['String'] +} + +export type MutationRepriceOrderShipmentArgs = { + shipmentNumber: Scalars['Int'] + orderId: Scalars['String'] + repriceShipmentObjectInput?: Maybe +} + +export type MutationCreateOrderShipmentAdjustmentArgs = { + orderId: Scalars['String'] + shipmentNumber: Scalars['Int'] + shipmentAdjustmentInput?: Maybe +} + +export type MutationCreateOrderShipmentItemAdjustmentArgs = { + shipmentNumber: Scalars['Int'] + itemId: Scalars['Int'] + orderId: Scalars['String'] + shipmentItemAdjustmentInput?: Maybe +} + +export type MutationSplitOrderShipmentArgs = { + orderId: Scalars['String'] + shipmentNumber: Scalars['String'] + splitShipmentsObjectInput?: Maybe +} + +export type MutationUpdateOrderValidationResultsArgs = { + orderId: Scalars['String'] + orderValidationResultInput?: Maybe +} + +export type MutationUpdateOrderAdjustmentArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + adjustmentInput?: Maybe +} + +export type MutationDeleteOrderAdjustmentArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderShippingAdjustmentArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + adjustmentInput?: Maybe +} + +export type MutationDeleteOrderAdjustmentShippingArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderHandlingAdjustmentArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + adjustmentInput?: Maybe +} + +export type MutationDeleteOrderAdjustmentHandlingArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationCreateOrderAttributeArgs = { + orderId: Scalars['String'] + orderAttributeInput?: Maybe +} + +export type MutationUpdateOrderAttributesArgs = { + orderId: Scalars['String'] + removeMissing?: Maybe + orderAttributeInput?: Maybe +} + +export type MutationUpdateOrderBillingInfoArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + billingInfoInput?: Maybe +} + +export type MutationCancelOrderArgs = { + orderId: Scalars['String'] + canceledReasonInput?: Maybe +} + +export type MutationCreateOrderArgs = { + cartId?: Maybe + quoteId?: Maybe + orderInput?: Maybe +} + +export type MutationUpdateUserOrderArgs = { + orderId: Scalars['String'] +} + +export type MutationUpdateOrderPriceListArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + graphQLString?: Maybe +} + +export type MutationResendOrderEmailArgs = { + orderId: Scalars['String'] + orderActionInput?: Maybe +} + +export type MutationUpdateOrderArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + orderInput?: Maybe +} + +export type MutationUpdateOrderDigitalWalletTpeArgs = { + orderId: Scalars['String'] + digitalWalletType: Scalars['String'] + digitalWalletInput?: Maybe +} + +export type MutationUpdateOrderDraftArgs = { + orderId: Scalars['String'] + version?: Maybe +} + +export type MutationCreateOrderActionArgs = { + orderId: Scalars['String'] + orderActionInput?: Maybe +} + +export type MutationUpdateOrderDiscountArgs = { + orderId: Scalars['String'] + discountId: Scalars['Int'] + updateMode?: Maybe + version?: Maybe + appliedDiscountInput?: Maybe +} + +export type MutationUpdateOrderPriceArgs = { + refreshShipping?: Maybe + orderInput?: Maybe +} + +export type MutationUpdateOrderCouponArgs = { + orderId: Scalars['String'] + couponCode: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationDeleteOrderCouponsArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationDeleteOrderCouponArgs = { + orderId: Scalars['String'] + couponCode: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationCreateOrderDigitalPackageArgs = { + orderId: Scalars['String'] + digitalPackageInput?: Maybe +} + +export type MutationUpdateOrderDigitalPackageArgs = { + orderId: Scalars['String'] + digitalPackageId: Scalars['String'] + digitalPackageInput?: Maybe +} + +export type MutationDeleteOrderDigitalPackageArgs = { + orderId: Scalars['String'] + digitalPackageId: Scalars['String'] +} + +export type MutationCreateOrderExtendedPropertiesArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + extendedPropertyInput?: Maybe +} + +export type MutationUpdateOrderExtendedPropertiesArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + upsert?: Maybe + extendedPropertyInput?: Maybe +} + +export type MutationDeleteOrderExtendedPropertiesArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + graphQLString?: Maybe +} + +export type MutationUpdateOrderExtendedPropertyArgs = { + orderId: Scalars['String'] + key: Scalars['String'] + updateMode?: Maybe + version?: Maybe + upsert?: Maybe + extendedPropertyInput?: Maybe +} + +export type MutationDeleteOrderExtendedPropertyArgs = { + orderId: Scalars['String'] + key: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationCreateOrderFulfillmentActionArgs = { + orderId: Scalars['String'] + fulfillmentActionInput?: Maybe +} + +export type MutationResendOrderFulfillmentEmailArgs = { + orderId: Scalars['String'] + fulfillmentActionInput?: Maybe +} + +export type MutationUpdateOrderFulfillmentInfoArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + fulfillmentInfoInput?: Maybe +} + +export type MutationCreateOrderItemArgs = { + orderId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + skipInventoryCheck?: Maybe + orderItemInput?: Maybe +} + +export type MutationDeleteOrderItemArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderItemPriceArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + price: Scalars['Float'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderItemQuantityArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + quantity: Scalars['Int'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderItemDutyAmountArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + dutyAmount: Scalars['Float'] + updateMode?: Maybe + version?: Maybe +} + +export type MutationUpdateOrderItemFulfillmentArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + updateMode?: Maybe + version?: Maybe + orderItemInput?: Maybe +} + +export type MutationUpdateOrderItemDiscountArgs = { + orderId: Scalars['String'] + orderItemId: Scalars['String'] + discountId: Scalars['Int'] + updateMode?: Maybe + version?: Maybe + appliedDiscountInput?: Maybe +} + +export type MutationCreateOrderNoteArgs = { + orderId: Scalars['String'] + orderNoteInput?: Maybe +} + +export type MutationUpdateOrderNotesArgs = { + orderId: Scalars['String'] + noteId: Scalars['String'] + orderNoteInput?: Maybe +} + +export type MutationDeleteOrderNoteArgs = { + orderId: Scalars['String'] + noteId: Scalars['String'] +} + +export type MutationCreateOrderPackageArgs = { + orderId: Scalars['String'] + packageObjInput?: Maybe +} + +export type MutationUpdateOrderPackageArgs = { + orderId: Scalars['String'] + packageId: Scalars['String'] + packageObjInput?: Maybe +} + +export type MutationDeleteOrderPackageArgs = { + orderId: Scalars['String'] + packageId: Scalars['String'] +} + +export type MutationValidateOrderArgs = { + orderInput?: Maybe +} + +export type MutationUpdateQuoteArgs = { + quoteId: Scalars['String'] + updateMode?: Maybe + quoteInput?: Maybe +} + +export type MutationDeleteQuoteArgs = { + quoteId: Scalars['String'] + draft?: Maybe +} + +export type MutationCreateQuoteArgs = { + quoteInput?: Maybe +} + +export type MutationCreateQuoteItemArgs = { + quoteId: Scalars['String'] + updateMode?: Maybe + orderItemInput?: Maybe +} + +export type MutationDeleteQuoteItemArgs = { + quoteId: Scalars['String'] + quoteItemId: Scalars['String'] + updateMode?: Maybe +} + +export type MutationCreateReturnArgs = { + returnObjInput?: Maybe +} + +export type MutationResendReturnEmailArgs = { + returnActionInput?: Maybe +} + +export type MutationUpdateReturnArgs = { + returnId: Scalars['String'] + returnObjInput?: Maybe +} + +export type MutationDeleteReturnArgs = { + returnId: Scalars['String'] +} + +export type MutationCreateReturnActionArgs = { + returnActionInput?: Maybe +} + +export type MutationSetReturnShipArgs = { + returnId: Scalars['String'] + returnItemSpecifierInput?: Maybe +} + +export type MutationCreateReturnPaymentActionArgs = { + returnId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationCreateReturnPaymentPaymentActionArgs = { + returnId: Scalars['String'] + paymentId: Scalars['String'] + paymentActionInput?: Maybe +} + +export type MutationSetReturnRestockArgs = { + returnId: Scalars['String'] + restockableReturnItemInput?: Maybe +} + +export type MutationCreateReturnItemArgs = { + returnId: Scalars['String'] + returnItemInput?: Maybe +} + +export type MutationDeleteReturnItemArgs = { + returnId?: Maybe + returnItemId?: Maybe + orderId: Scalars['String'] + orderItemId: Scalars['String'] +} + +export type MutationCreateReturnNoteArgs = { + returnId: Scalars['String'] + orderNoteInput?: Maybe +} + +export type MutationUpdateReturnNoteArgs = { + returnId: Scalars['String'] + noteId: Scalars['String'] + orderNoteInput?: Maybe +} + +export type MutationDeleteReturnNoteArgs = { + returnId: Scalars['String'] + noteId: Scalars['String'] +} + +export type MutationCreateReturnPackageArgs = { + returnId: Scalars['String'] + packageObjInput?: Maybe +} + +export type MutationUpdateReturnPackageArgs = { + returnId: Scalars['String'] + packageId: Scalars['String'] + packageObjInput?: Maybe +} + +export type MutationDeleteReturnPackageArgs = { + returnId: Scalars['String'] + packageId: Scalars['String'] +} + +export type MutationCreateReturnShipmentArgs = { + returnId: Scalars['String'] + graphQLString?: Maybe +} + +export type MutationDeleteReturnShipmentArgs = { + returnId: Scalars['String'] + shipmentId: Scalars['String'] +} + +export type MutationCreateWishlistArgs = { + wishlistInput?: Maybe +} + +export type MutationUpdateWishlistArgs = { + wishlistId: Scalars['String'] + wishlistInput?: Maybe +} + +export type MutationDeleteWishlistArgs = { + wishlistId: Scalars['String'] +} + +export type MutationDeleteWishlistItemsArgs = { + wishlistId: Scalars['String'] +} + +export type MutationCreateWishlistItemArgs = { + wishlistId: Scalars['String'] + wishlistItemInput?: Maybe +} + +export type MutationUpdateWishlistItemArgs = { + wishlistId: Scalars['String'] + wishlistItemId: Scalars['String'] + wishlistItemInput?: Maybe +} + +export type MutationDeleteWishlistItemArgs = { + wishlistId: Scalars['String'] + wishlistItemId: Scalars['String'] +} + +export type MutationUpdateWishlistItemQuantityArgs = { + wishlistId: Scalars['String'] + wishlistItemId: Scalars['String'] + quantity: Scalars['Int'] +} + +export type MutationUpdateDocumentListDocumentContentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] + httpRequestMessageInput?: Maybe +} + +export type MutationDeleteDocumentListDocumentContentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] +} + +export type MutationUpdateDocumentListDocumentTreeContentArgs = { + documentListName: Scalars['String'] + documentName: Scalars['String'] + httpRequestMessageInput?: Maybe +} + +export type MutationDeleteDocumentListDocumentTreeContentArgs = { + documentListName: Scalars['String'] + documentName: Scalars['String'] + httpRequestMessageInput?: Maybe +} + +export type MutationCreateDocumentListDocumentArgs = { + documentListName: Scalars['String'] + documentInput?: Maybe +} + +export type MutationUpdateDocumentListDocumentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] + documentInput?: Maybe +} + +export type MutationPatchDocumentListDocumentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] + documentInput?: Maybe +} + +export type MutationDeleteDocumentListDocumentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] +} + +export type MutationCreateDocumentListArgs = { + documentListInput?: Maybe +} + +export type MutationUpdateDocumentListArgs = { + documentListName: Scalars['String'] + documentListInput?: Maybe +} + +export type MutationDeleteDocumentListArgs = { + documentListName: Scalars['String'] +} + +export type MutationCreateDocumentListTypeArgs = { + documentListTypeInput?: Maybe +} + +export type MutationUpdateDocumentListTypeArgs = { + documentListTypeFQN: Scalars['String'] + documentListTypeInput?: Maybe +} + +export type MutationCreateDocumentDraftArgs = { + documentLists?: Maybe + graphQLString?: Maybe +} + +export type MutationToggleDocumentPublishingArgs = { + documentLists?: Maybe + graphQLString?: Maybe +} + +export type MutationCreateDocumentTypeArgs = { + documentTypeInput?: Maybe +} + +export type MutationUpdateDocumentTypeArgs = { + documentTypeName: Scalars['String'] + documentTypeInput?: Maybe +} + +export type MutationCreatePropertyTypeArgs = { + propertyTypeInput?: Maybe +} + +export type MutationUpdatePropertyTypeArgs = { + propertyTypeName: Scalars['String'] + propertyTypeInput?: Maybe +} + +export type MutationDeletePropertyTypeArgs = { + propertyTypeName: Scalars['String'] +} + +export type MutationAdminCreateLocationArgs = { + locationInput?: Maybe +} + +export type MutationAdminUpdateLocationArgs = { + locationCode: Scalars['String'] + locationInput?: Maybe +} + +export type MutationDeleteAdminLocationArgs = { + locationCode: Scalars['String'] +} + +export type MutationAdminCreateLocationAttributeArgs = { + attributeInput?: Maybe +} + +export type MutationAdminUpdateLocationAttributeArgs = { + attributeFQN: Scalars['String'] + attributeInput?: Maybe +} + +export type MutationAdminCreateLocationGroupArgs = { + locationGroupInput?: Maybe +} + +export type MutationUpdateLocationUsageArgs = { + code: Scalars['String'] + locationUsageInput?: Maybe +} + +export type MutationAdminCreateLocationTypeArgs = { + locationTypeInput?: Maybe +} + +export type MutationAdminUpdateLocationTypeArgs = { + locationTypeCode: Scalars['String'] + locationTypeInput?: Maybe +} + +export type MutationDeleteAdminLocationTypeArgs = { + locationTypeCode: Scalars['String'] +} + +export type MutationUpdateEntityListEntitiesArgs = { + entityListFullName: Scalars['String'] + id: Scalars['String'] + httpRequestMessageInput?: Maybe +} + +export type MutationDeleteEntityListEntityArgs = { + entityListFullName: Scalars['String'] + id: Scalars['String'] +} + +export type MutationCreateEntityListEntityArgs = { + entityListFullName: Scalars['String'] + httpRequestMessageInput?: Maybe +} + +export type MutationUpdateEntityListArgs = { + entityListFullName: Scalars['String'] + entityListInput?: Maybe +} + +export type MutationDeleteEntityListArgs = { + entityListFullName: Scalars['String'] +} + +export type MutationCreateEntityListArgs = { + entityListInput?: Maybe +} + +export type MutationCreateEntityListViewArgs = { + entityListFullName: Scalars['String'] + listViewInput?: Maybe +} + +export type MutationUpdateEntityListViewArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] + listViewInput?: Maybe +} + +export type MutationDeleteEntityListViewArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] +} + +export type MutationCreateTargetRuleArgs = { + targetRuleInput?: Maybe +} + +export type MutationUpdateTargetRuleArgs = { + code: Scalars['String'] + targetRuleInput?: Maybe +} + +export type MutationDeleteCommerceTargetRuleArgs = { + code: Scalars['String'] +} + +export type MutationValidateTargetRuleArgs = { + targetRuleInput?: Maybe +} + +export type MutationCreateOrderRoutingSuggestionArgs = { + returnSuggestionLog?: Maybe + suggestionRequestInput?: Maybe +} + +export enum NodeTypeEnum { + Array = 'ARRAY', + Binary = 'BINARY', + Boolean = 'BOOLEAN', + Missing = 'MISSING', + Null = 'NULL', + Number = 'NUMBER', + Object = 'OBJECT', + Pojo = 'POJO', + String = 'STRING', +} + +export type Order = { + __typename?: 'Order' + _get?: Maybe + _root?: Maybe + orderNumber?: Maybe + locationCode?: Maybe + version?: Maybe + parentOrderId?: Maybe + parentOrderNumber?: Maybe + parentCheckoutId?: Maybe + parentCheckoutNumber?: Maybe + partialOrderNumber?: Maybe + partialOrderCount?: Maybe + isPartialOrder?: Maybe + parentReturnId?: Maybe + parentReturnNumber?: Maybe + originalCartId?: Maybe + originalQuoteId?: Maybe + originalQuoteNumber?: Maybe + priceListCode?: Maybe + availableActions?: Maybe> + shopperNotes?: Maybe + customerAccountId?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + email?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + acceptsMarketing?: Maybe + status?: Maybe + type?: Maybe + paymentStatus?: Maybe + returnStatus?: Maybe + isEligibleForReturns?: Maybe + totalCollected: Scalars['Float'] + attributes?: Maybe>> + adjustment?: Maybe + shippingAdjustment?: Maybe + handlingAdjustment?: Maybe + shippingDiscounts?: Maybe>> + handlingDiscounts?: Maybe>> + handlingAmount?: Maybe + handlingSubTotal?: Maybe + handlingTotal?: Maybe + dutyAmount?: Maybe + dutyTotal?: Maybe + fulfillmentStatus?: Maybe + submittedDate?: Maybe + cancelledDate?: Maybe + closedDate?: Maybe + acceptedDate?: Maybe + notes?: Maybe>> + items?: Maybe>> + validationResults?: Maybe>> + billingInfo?: Maybe + payments?: Maybe>> + refunds?: Maybe>> + packages?: Maybe>> + pickups?: Maybe>> + digitalPackages?: Maybe>> + shipments?: Maybe>> + isDraft?: Maybe + hasDraft?: Maybe + isImport?: Maybe + isHistoricalImport?: Maybe + importDate?: Maybe + isUnified?: Maybe + externalId?: Maybe + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + amountAvailableForRefund: Scalars['Float'] + amountRemainingForPayment: Scalars['Float'] + amountRefunded: Scalars['Float'] + readyToCapture?: Maybe + isOptInForSms?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type Order_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderActionInput = { + actionName?: Maybe +} + +export type OrderAttribute = { + __typename?: 'OrderAttribute' + _get?: Maybe + _root?: Maybe + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type OrderAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderAttributeInput = { + auditInfo?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type OrderCollection = { + __typename?: 'OrderCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type OrderCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderInput = { + orderNumber?: Maybe + locationCode?: Maybe + version?: Maybe + parentOrderId?: Maybe + parentOrderNumber?: Maybe + parentCheckoutId?: Maybe + parentCheckoutNumber?: Maybe + partialOrderNumber?: Maybe + partialOrderCount?: Maybe + isPartialOrder?: Maybe + parentReturnId?: Maybe + parentReturnNumber?: Maybe + originalCartId?: Maybe + originalQuoteId?: Maybe + originalQuoteNumber?: Maybe + priceListCode?: Maybe + availableActions?: Maybe> + shopperNotes?: Maybe + customerAccountId?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + email?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + acceptsMarketing?: Maybe + status?: Maybe + type?: Maybe + paymentStatus?: Maybe + returnStatus?: Maybe + isEligibleForReturns?: Maybe + totalCollected: Scalars['Float'] + attributes?: Maybe>> + adjustment?: Maybe + shippingAdjustment?: Maybe + handlingAdjustment?: Maybe + shippingDiscounts?: Maybe>> + handlingDiscounts?: Maybe>> + handlingAmount?: Maybe + handlingSubTotal?: Maybe + handlingTotal?: Maybe + dutyAmount?: Maybe + dutyTotal?: Maybe + fulfillmentStatus?: Maybe + submittedDate?: Maybe + cancelledDate?: Maybe + closedDate?: Maybe + acceptedDate?: Maybe + notes?: Maybe>> + items?: Maybe>> + validationResults?: Maybe>> + billingInfo?: Maybe + payments?: Maybe>> + refunds?: Maybe>> + packages?: Maybe>> + pickups?: Maybe>> + digitalPackages?: Maybe>> + shipments?: Maybe>> + isDraft?: Maybe + hasDraft?: Maybe + isImport?: Maybe + isHistoricalImport?: Maybe + importDate?: Maybe + isUnified?: Maybe + externalId?: Maybe + couponCodes?: Maybe> + invalidCoupons?: Maybe>> + amountAvailableForRefund: Scalars['Float'] + amountRemainingForPayment: Scalars['Float'] + amountRefunded: Scalars['Float'] + readyToCapture?: Maybe + isOptInForSms?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type OrderItemCollection = { + __typename?: 'OrderItemCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type OrderItemCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderItemInput = { + backorderable?: Maybe + customItemData: Scalars['Object'] + itemDependency: Scalars['Int'] + orderItemID: Scalars['Int'] + partNumber: Scalars['String'] + quantity: Scalars['Int'] + sku: Scalars['String'] + upc: Scalars['String'] +} + +export type OrderNote = { + __typename?: 'OrderNote' + _get?: Maybe + _root?: Maybe + id?: Maybe + text?: Maybe + auditInfo?: Maybe +} + +export type OrderNote_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderNoteInput = { + id?: Maybe + text?: Maybe + auditInfo?: Maybe +} + +export type OrderReturnableItem = { + __typename?: 'OrderReturnableItem' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + productName?: Maybe + shipmentNumber?: Maybe + shipmentItemId?: Maybe + quantityOrdered: Scalars['Int'] + quantityFulfilled: Scalars['Int'] + quantityReturned: Scalars['Int'] + quantityReturnable: Scalars['Int'] + fulfillmentStatus?: Maybe + orderItemId?: Maybe + orderLineId: Scalars['Int'] + orderItemOptionAttributeFQN?: Maybe + unitQuantity: Scalars['Int'] + parentProductCode?: Maybe + parentProductName?: Maybe + fulfillmentFields?: Maybe>> + sku?: Maybe + mfgPartNumber?: Maybe +} + +export type OrderReturnableItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderReturnableItemCollection = { + __typename?: 'OrderReturnableItemCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type OrderReturnableItemCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export enum OrderTypeEnum { + Directship = 'DIRECTSHIP', + Transfer = 'TRANSFER', +} + +export type OrderValidationMessage = { + __typename?: 'OrderValidationMessage' + _get?: Maybe + _root?: Maybe + orderItemId?: Maybe + messageType?: Maybe + message?: Maybe +} + +export type OrderValidationMessage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderValidationMessageInput = { + orderItemId?: Maybe + messageType?: Maybe + message?: Maybe +} + +export type OrderValidationResult = { + __typename?: 'OrderValidationResult' + _get?: Maybe + _root?: Maybe + validationId?: Maybe + validatorName?: Maybe + validatorType?: Maybe + status?: Maybe + createdDate?: Maybe + messages?: Maybe>> +} + +export type OrderValidationResult_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type OrderValidationResultInput = { + validationId?: Maybe + validatorName?: Maybe + validatorType?: Maybe + status?: Maybe + createdDate?: Maybe + messages?: Maybe>> +} + +export type PackageItem = { + __typename?: 'PackageItem' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type PackageItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PackageItemInput = { + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type PackageObj = { + __typename?: 'PackageObj' + _get?: Maybe + _root?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + shipmentId?: Maybe + trackingNumber?: Maybe + trackingNumbers?: Maybe> + packagingType?: Maybe + hasLabel?: Maybe + measurements?: Maybe + carrier?: Maybe + signatureRequired?: Maybe + trackings?: Maybe>> + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type PackageObj_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PackageObjInput = { + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + shipmentId?: Maybe + trackingNumber?: Maybe + trackingNumbers?: Maybe> + packagingType?: Maybe + hasLabel?: Maybe + measurements?: Maybe + carrier?: Maybe + signatureRequired?: Maybe + trackings?: Maybe>> + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type PackageSettings = { + __typename?: 'PackageSettings' + _get?: Maybe + _root?: Maybe + unitType?: Maybe +} + +export type PackageSettings_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PasswordInfoInput = { + oldPassword?: Maybe + newPassword?: Maybe + externalPassword?: Maybe +} + +export type Payment = { + __typename?: 'Payment' + _get?: Maybe + _root?: Maybe + id?: Maybe + groupId?: Maybe + paymentServiceTransactionId?: Maybe + availableActions?: Maybe> + orderId?: Maybe + paymentType?: Maybe + paymentWorkflow?: Maybe + externalTransactionId?: Maybe + billingInfo?: Maybe + data?: Maybe + status?: Maybe + subPayments?: Maybe>> + interactions?: Maybe>> + isRecurring?: Maybe + amountCollected: Scalars['Float'] + amountCredited: Scalars['Float'] + amountRequested: Scalars['Float'] + changeMessages?: Maybe>> + auditInfo?: Maybe + gatewayGiftCard?: Maybe +} + +export type Payment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentActionInput = { + actionName?: Maybe + currencyCode?: Maybe + checkNumber?: Maybe + returnUrl?: Maybe + cancelUrl?: Maybe + amount?: Maybe + interactionDate?: Maybe + newBillingInfo?: Maybe + referenceSourcePaymentId?: Maybe + manualGatewayInteraction?: Maybe + externalTransactionId?: Maybe + data?: Maybe +} + +export type PaymentActionTarget = { + __typename?: 'PaymentActionTarget' + _get?: Maybe + _root?: Maybe + targetType?: Maybe + targetId?: Maybe + targetNumber?: Maybe +} + +export type PaymentActionTarget_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentActionTargetInput = { + targetType?: Maybe + targetId?: Maybe + targetNumber?: Maybe +} + +export type PaymentCard = { + __typename?: 'PaymentCard' + _get?: Maybe + _root?: Maybe + paymentServiceCardId?: Maybe + isUsedRecurring?: Maybe + nameOnCard?: Maybe + isCardInfoSaved?: Maybe + isTokenized?: Maybe + paymentOrCardType?: Maybe + cardNumberPartOrMask?: Maybe + expireMonth: Scalars['Int'] + expireYear: Scalars['Int'] + bin?: Maybe +} + +export type PaymentCard_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentCardInput = { + paymentServiceCardId?: Maybe + isUsedRecurring?: Maybe + nameOnCard?: Maybe + isCardInfoSaved?: Maybe + isTokenized?: Maybe + paymentOrCardType?: Maybe + cardNumberPartOrMask?: Maybe + expireMonth: Scalars['Int'] + expireYear: Scalars['Int'] + bin?: Maybe +} + +export type PaymentCollection = { + __typename?: 'PaymentCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type PaymentCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentGatewayInteractionInput = { + gatewayInteractionId?: Maybe + gatewayTransactionId?: Maybe + gatewayAuthCode?: Maybe + gatewayAVSCodes?: Maybe + gatewayCVV2Codes?: Maybe + gatewayResponseCode?: Maybe + gatewayResponseText?: Maybe +} + +export type PaymentGatewayResponseData = { + __typename?: 'PaymentGatewayResponseData' + _get?: Maybe + _root?: Maybe + key?: Maybe + value?: Maybe +} + +export type PaymentGatewayResponseData_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentGatewayResponseDataInput = { + key?: Maybe + value?: Maybe +} + +export type PaymentInput = { + id?: Maybe + groupId?: Maybe + paymentServiceTransactionId?: Maybe + availableActions?: Maybe> + orderId?: Maybe + paymentType?: Maybe + paymentWorkflow?: Maybe + externalTransactionId?: Maybe + billingInfo?: Maybe + data?: Maybe + status?: Maybe + subPayments?: Maybe>> + interactions?: Maybe>> + isRecurring?: Maybe + amountCollected: Scalars['Float'] + amountCredited: Scalars['Float'] + amountRequested: Scalars['Float'] + changeMessages?: Maybe>> + auditInfo?: Maybe + gatewayGiftCard?: Maybe +} + +export type PaymentInteraction = { + __typename?: 'PaymentInteraction' + _get?: Maybe + _root?: Maybe + id?: Maybe + gatewayInteractionId?: Maybe + paymentId?: Maybe + orderId?: Maybe + target?: Maybe + currencyCode?: Maybe + interactionType?: Maybe + checkNumber?: Maybe + status?: Maybe + paymentEntryStatus?: Maybe + isRecurring?: Maybe + isManual?: Maybe + gatewayTransactionId?: Maybe + gatewayAuthCode?: Maybe + gatewayAVSCodes?: Maybe + gatewayCVV2Codes?: Maybe + gatewayResponseCode?: Maybe + gatewayResponseText?: Maybe + gatewayResponseData?: Maybe>> + paymentTransactionInteractionIdReference?: Maybe + amount?: Maybe + note?: Maybe + interactionDate?: Maybe + auditInfo?: Maybe + returnId?: Maybe + refundId?: Maybe + capturableShipmentsSummary?: Maybe>> +} + +export type PaymentInteraction_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentInteractionInput = { + id?: Maybe + gatewayInteractionId?: Maybe + paymentId?: Maybe + orderId?: Maybe + target?: Maybe + currencyCode?: Maybe + interactionType?: Maybe + checkNumber?: Maybe + status?: Maybe + paymentEntryStatus?: Maybe + isRecurring?: Maybe + isManual?: Maybe + gatewayTransactionId?: Maybe + gatewayAuthCode?: Maybe + gatewayAVSCodes?: Maybe + gatewayCVV2Codes?: Maybe + gatewayResponseCode?: Maybe + gatewayResponseText?: Maybe + gatewayResponseData?: Maybe>> + paymentTransactionInteractionIdReference?: Maybe + amount?: Maybe + note?: Maybe + interactionDate?: Maybe + auditInfo?: Maybe + returnId?: Maybe + refundId?: Maybe + capturableShipmentsSummary?: Maybe< + Array> + > +} + +export type PaymentToken = { + __typename?: 'PaymentToken' + _get?: Maybe + _root?: Maybe + paymentServiceTokenId?: Maybe + type?: Maybe +} + +export type PaymentToken_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PaymentTokenInput = { + paymentServiceTokenId?: Maybe + type?: Maybe +} + +export type Pickup = { + __typename?: 'Pickup' + _get?: Maybe + _root?: Maybe + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type Pickup_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PickupInput = { + id?: Maybe + code?: Maybe + status?: Maybe + items?: Maybe>> + fulfillmentDate?: Maybe + fulfillmentLocationCode?: Maybe + auditInfo?: Maybe + availableActions?: Maybe> + changeMessages?: Maybe>> +} + +export type PickupItem = { + __typename?: 'PickupItem' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type PickupItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PickupItemInput = { + productCode?: Maybe + quantity: Scalars['Int'] + fulfillmentItemType?: Maybe + lineId?: Maybe + optionAttributeFQN?: Maybe +} + +export type PrAppliedDiscount = { + __typename?: 'PrAppliedDiscount' + _get?: Maybe + _root?: Maybe + couponCode?: Maybe + discount?: Maybe + discounts?: Maybe>> + impact: Scalars['Float'] +} + +export type PrAppliedDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrAttributeValidation = { + __typename?: 'PrAttributeValidation' + _get?: Maybe + _root?: Maybe + regularExpression?: Maybe + minStringLength?: Maybe + maxStringLength?: Maybe + minNumericValue?: Maybe + maxNumericValue?: Maybe + minDateValue?: Maybe + maxDateValue?: Maybe +} + +export type PrAttributeValidation_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrBundledProduct = { + __typename?: 'PrBundledProduct' + _get?: Maybe + _root?: Maybe + content?: Maybe + productCode?: Maybe + goodsType?: Maybe + quantity: Scalars['Int'] + measurements?: Maybe + isPackagedStandAlone?: Maybe + inventoryInfo?: Maybe + optionAttributeFQN?: Maybe + optionValue?: Maybe + creditValue?: Maybe + productType?: Maybe +} + +export type PrBundledProduct_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrCategory = { + __typename?: 'PrCategory' + _get?: Maybe + _root?: Maybe + categoryId: Scalars['Int'] + parentCategory?: Maybe + content?: Maybe + childrenCategories?: Maybe>> + sequence?: Maybe + isDisplayed?: Maybe + categoryCode?: Maybe + count?: Maybe + updateDate: Scalars['DateTime'] + shouldSlice?: Maybe +} + +export type PrCategory_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrDiscount = { + __typename?: 'PrDiscount' + _get?: Maybe + _root?: Maybe + discountId: Scalars['Int'] + expirationDate?: Maybe + name?: Maybe + friendlyDescription?: Maybe + impact: Scalars['Float'] +} + +export type PrDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrMeasurement = { + __typename?: 'PrMeasurement' + _get?: Maybe + _root?: Maybe + unit?: Maybe + value?: Maybe +} + +export type PrMeasurement_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PrPackageMeasurements = { + __typename?: 'PrPackageMeasurements' + _get?: Maybe + _root?: Maybe + packageHeight?: Maybe + packageWidth?: Maybe + packageLength?: Maybe + packageWeight?: Maybe +} + +export type PrPackageMeasurements_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PriceList = { + __typename?: 'PriceList' + _get?: Maybe + _root?: Maybe + priceListCode?: Maybe + priceListId: Scalars['Int'] + enabled?: Maybe + name?: Maybe + resolvable?: Maybe + isIndexed?: Maybe + filteredInStoreFront?: Maybe + isSiteDefault?: Maybe + description?: Maybe + ancestors?: Maybe>> + descendants?: Maybe>> + validSites?: Maybe> +} + +export type PriceList_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PriceListNode = { + __typename?: 'PriceListNode' + _get?: Maybe + _root?: Maybe + priceListCode?: Maybe + priceListId: Scalars['Int'] + parentPriceListId?: Maybe + priceListLevel: Scalars['Int'] +} + +export type PriceListNode_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingAppliedDiscount = { + __typename?: 'PricingAppliedDiscount' + _get?: Maybe + _root?: Maybe + impact: Scalars['Float'] + discount?: Maybe + couponCode?: Maybe + couponSetId?: Maybe +} + +export type PricingAppliedDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingAppliedLineItemProductDiscount = { + __typename?: 'PricingAppliedLineItemProductDiscount' + _get?: Maybe + _root?: Maybe + appliesToSalePrice?: Maybe + quantity: Scalars['Int'] + impactPerUnit: Scalars['Float'] + isForced?: Maybe + normalizedImpact: Scalars['Float'] + impact: Scalars['Float'] + discount?: Maybe + couponCode?: Maybe + couponSetId?: Maybe +} + +export type PricingAppliedLineItemProductDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingAppliedLineItemShippingDiscount = { + __typename?: 'PricingAppliedLineItemShippingDiscount' + _get?: Maybe + _root?: Maybe + shippingMethodCode?: Maybe + quantity: Scalars['Int'] + impactPerUnit: Scalars['Float'] + isForced?: Maybe + normalizedImpact: Scalars['Float'] + impact: Scalars['Float'] + discount?: Maybe + couponCode?: Maybe + couponSetId?: Maybe +} + +export type PricingAppliedLineItemShippingDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingAppliedOrderShippingDiscount = { + __typename?: 'PricingAppliedOrderShippingDiscount' + _get?: Maybe + _root?: Maybe + shippingMethodCode?: Maybe + impact: Scalars['Float'] + discount?: Maybe + couponCode?: Maybe + couponSetId?: Maybe +} + +export type PricingAppliedOrderShippingDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingDiscount = { + __typename?: 'PricingDiscount' + _get?: Maybe + _root?: Maybe + discountId: Scalars['Int'] + name?: Maybe + friendlyDescription?: Maybe + amount: Scalars['Float'] + scope?: Maybe + maxRedemptions?: Maybe + maximumUsesPerUser?: Maybe + requiresAuthenticatedUser?: Maybe + doesNotApplyToProductsWithSalePrice?: Maybe + maximumRedemptionsPerOrder?: Maybe + maximumDiscountValuePerOrder?: Maybe + maxDiscountValuePerRedemption?: Maybe + doesNotApplyToMultiShipToOrders?: Maybe + includedPriceLists?: Maybe> + redemptions: Scalars['Int'] + type?: Maybe + amountType?: Maybe + target?: Maybe + condition?: Maybe + expirationDate?: Maybe + stackingLayer: Scalars['Int'] +} + +export type PricingDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingDiscountCondition = { + __typename?: 'PricingDiscountCondition' + _get?: Maybe + _root?: Maybe + requiresCoupon?: Maybe + couponCode?: Maybe + minimumQuantityProductsRequiredInCategories?: Maybe + includedCategoryIds?: Maybe> + excludedCategoryIds?: Maybe> + minimumQuantityRequiredProducts?: Maybe + includedProductCodes?: Maybe> + excludedProductCodes?: Maybe> + paymentWorkflows?: Maybe> + customerSegmentIds?: Maybe> + minimumOrderAmount?: Maybe + maximumOrderAmount?: Maybe + minimumLifetimeValueAmount?: Maybe + startDate?: Maybe + expirationDate?: Maybe + minimumCategorySubtotalBeforeDiscounts?: Maybe +} + +export type PricingDiscountCondition_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingDiscountTarget = { + __typename?: 'PricingDiscountTarget' + _get?: Maybe + _root?: Maybe + type?: Maybe + includedCategoryIds?: Maybe> + excludedCategoryIds?: Maybe> + includedCategoriesOperator?: Maybe + excludedCategoriesOperator?: Maybe + includedProductCodes?: Maybe> + excludedProductCodes?: Maybe> + includeAllProducts?: Maybe + shippingMethods?: Maybe> + shippingZones?: Maybe> +} + +export type PricingDiscountTarget_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingProductAttribute = { + __typename?: 'PricingProductAttribute' + _get?: Maybe + _root?: Maybe + inputType?: Maybe + valueType?: Maybe + dataType?: Maybe + name?: Maybe + description?: Maybe +} + +export type PricingProductAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingProductProperty = { + __typename?: 'PricingProductProperty' + _get?: Maybe + _root?: Maybe + attributeFQN?: Maybe + values?: Maybe>> + attributeDetail?: Maybe + isHidden?: Maybe + isMultiValue?: Maybe +} + +export type PricingProductProperty_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingProductPropertyValue = { + __typename?: 'PricingProductPropertyValue' + _get?: Maybe + _root?: Maybe + value?: Maybe + stringValue?: Maybe +} + +export type PricingProductPropertyValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingTaxAttribute = { + __typename?: 'PricingTaxAttribute' + _get?: Maybe + _root?: Maybe + fullyQualifiedName?: Maybe + attributeDefinitionId?: Maybe + values?: Maybe> +} + +export type PricingTaxAttribute_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingTaxContext = { + __typename?: 'PricingTaxContext' + _get?: Maybe + _root?: Maybe + taxContextId?: Maybe + customerId?: Maybe + taxExemptId?: Maybe + originAddress?: Maybe + destinationAddress?: Maybe +} + +export type PricingTaxContext_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingTaxableLineItem = { + __typename?: 'PricingTaxableLineItem' + _get?: Maybe + _root?: Maybe + id?: Maybe + productCode?: Maybe + variantProductCode?: Maybe + productName?: Maybe + productProperties?: Maybe>> + quantity: Scalars['Int'] + lineItemPrice: Scalars['Float'] + discountTotal?: Maybe + discountedTotal?: Maybe + shippingAmount: Scalars['Float'] + handlingAmount?: Maybe + feeTotal?: Maybe + isTaxable?: Maybe + reason?: Maybe + data?: Maybe + productDiscount?: Maybe + shippingDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe< + Array> + > + originAddress?: Maybe + destinationAddress?: Maybe +} + +export type PricingTaxableLineItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PricingTaxableOrder = { + __typename?: 'PricingTaxableOrder' + _get?: Maybe + _root?: Maybe + orderDate: Scalars['DateTime'] + taxContext?: Maybe + lineItems?: Maybe>> + shippingAmount: Scalars['Float'] + currencyCode?: Maybe + handlingFee: Scalars['Float'] + originalDocumentCode?: Maybe + orderId?: Maybe + orderNumber?: Maybe + originalOrderDate: Scalars['DateTime'] + data?: Maybe + attributes?: Maybe>> + shippingDiscounts?: Maybe>> + shippingDiscount?: Maybe + orderDiscounts?: Maybe>> + orderDiscount?: Maybe + handlingDiscounts?: Maybe>> + handlingDiscount?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + taxRequestType?: Maybe +} + +export type PricingTaxableOrder_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Product = { + __typename?: 'Product' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + purchaseLocation?: Maybe + productSequence?: Maybe + productUsage?: Maybe + fulfillmentTypesSupported?: Maybe> + goodsType?: Maybe + bundledProducts?: Maybe>> + content?: Maybe + purchasableState?: Maybe + isActive?: Maybe + publishState?: Maybe + price?: Maybe + priceRange?: Maybe + volumePriceBands?: Maybe>> + volumePriceRange?: Maybe + availableShippingDiscounts?: Maybe>> + productType?: Maybe + productTypeId?: Maybe + isTaxable?: Maybe + isRecurring?: Maybe + pricingBehavior?: Maybe + inventoryInfo?: Maybe + createDate: Scalars['DateTime'] + updateDate: Scalars['DateTime'] + dateFirstAvailableInCatalog?: Maybe + catalogStartDate?: Maybe + catalogEndDate?: Maybe + daysAvailableInCatalog?: Maybe + upc?: Maybe + upCs?: Maybe> + mfgPartNumber?: Maybe + mfgPartNumbers?: Maybe> + variationProductCode?: Maybe + categories?: Maybe>> + measurements?: Maybe + isPackagedStandAlone?: Maybe + properties?: Maybe>> + options?: Maybe>> + variations?: Maybe>> + validPriceLists?: Maybe> + locationsInStock?: Maybe> + slicingAttributeFQN?: Maybe + productImageGroups?: Maybe>> + sliceValue?: Maybe + productCollections?: Maybe>> + productCollectionMembers?: Maybe>> + collectionMembersProductContent?: Maybe>> + score: Scalars['Float'] + personalizationScore: Scalars['Float'] +} + +export type Product_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPropertiesArgs = { + filterAttribute?: Maybe + filterOperator?: Maybe + filterValue?: Maybe +} + +export type ProductCollection = { + __typename?: 'ProductCollection' + _get?: Maybe + _root?: Maybe + nextCursorMark?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ProductCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCollectionInfo = { + __typename?: 'ProductCollectionInfo' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + isPrimary?: Maybe +} + +export type ProductCollectionInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCollectionMember = { + __typename?: 'ProductCollectionMember' + _get?: Maybe + _root?: Maybe + memberKey?: Maybe +} + +export type ProductCollectionMember_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCollectionMemberKey = { + __typename?: 'ProductCollectionMemberKey' + _get?: Maybe + _root?: Maybe + value?: Maybe +} + +export type ProductCollectionMemberKey_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductContent = { + __typename?: 'ProductContent' + _get?: Maybe + _root?: Maybe + productName?: Maybe + productFullDescription?: Maybe + productShortDescription?: Maybe + metaTagTitle?: Maybe + metaTagDescription?: Maybe + metaTagKeywords?: Maybe + seoFriendlyUrl?: Maybe + productImages?: Maybe>> +} + +export type ProductContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCost = { + __typename?: 'ProductCost' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + cost: Scalars['Float'] +} + +export type ProductCost_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCostCollection = { + __typename?: 'ProductCostCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ProductCostCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductCostQueryInput = { + productCodes?: Maybe> +} + +export type ProductForIndexing = { + __typename?: 'ProductForIndexing' + _get?: Maybe + _root?: Maybe + slices?: Maybe>> + productCode?: Maybe + purchaseLocation?: Maybe + productSequence?: Maybe + productUsage?: Maybe + fulfillmentTypesSupported?: Maybe> + goodsType?: Maybe + bundledProducts?: Maybe>> + content?: Maybe + purchasableState?: Maybe + isActive?: Maybe + publishState?: Maybe + price?: Maybe + priceRange?: Maybe + volumePriceBands?: Maybe>> + volumePriceRange?: Maybe + availableShippingDiscounts?: Maybe>> + productType?: Maybe + productTypeId?: Maybe + isTaxable?: Maybe + isRecurring?: Maybe + pricingBehavior?: Maybe + inventoryInfo?: Maybe + createDate: Scalars['DateTime'] + updateDate: Scalars['DateTime'] + dateFirstAvailableInCatalog?: Maybe + catalogStartDate?: Maybe + catalogEndDate?: Maybe + daysAvailableInCatalog?: Maybe + upc?: Maybe + upCs?: Maybe> + mfgPartNumber?: Maybe + mfgPartNumbers?: Maybe> + variationProductCode?: Maybe + categories?: Maybe>> + measurements?: Maybe + isPackagedStandAlone?: Maybe + properties?: Maybe>> + options?: Maybe>> + variations?: Maybe>> + validPriceLists?: Maybe> + locationsInStock?: Maybe> + slicingAttributeFQN?: Maybe + productImageGroups?: Maybe>> + sliceValue?: Maybe + productCollections?: Maybe>> + productCollectionMembers?: Maybe>> + collectionMembersProductContent?: Maybe>> + score: Scalars['Float'] + personalizationScore: Scalars['Float'] +} + +export type ProductForIndexing_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductImage = { + __typename?: 'ProductImage' + _get?: Maybe + _root?: Maybe + imageLabel?: Maybe + altText?: Maybe + imageUrl?: Maybe + cmsId?: Maybe + videoUrl?: Maybe + mediaType?: Maybe + sequence?: Maybe + productImageGroupId?: Maybe +} + +export type ProductImage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductImageGroup = { + __typename?: 'ProductImageGroup' + _get?: Maybe + _root?: Maybe + productImageGroupId: Scalars['String'] + productImageGroupTags?: Maybe>> +} + +export type ProductImageGroup_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductImageGroupTag = { + __typename?: 'ProductImageGroupTag' + _get?: Maybe + _root?: Maybe + attributeFqn?: Maybe + value?: Maybe +} + +export type ProductImageGroupTag_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductInventoryInfo = { + __typename?: 'ProductInventoryInfo' + _get?: Maybe + _root?: Maybe + manageStock?: Maybe + outOfStockBehavior?: Maybe + onlineStockAvailable?: Maybe + onlineSoftStockAvailable?: Maybe + onlineLocationCode?: Maybe + availableDate?: Maybe +} + +export type ProductInventoryInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductOption = { + __typename?: 'ProductOption' + _get?: Maybe + _root?: Maybe + attributeFQN?: Maybe + isRequired?: Maybe + isMultiValue?: Maybe + values?: Maybe>> + attributeDetail?: Maybe + isProductImageGroupSelector?: Maybe +} + +export type ProductOption_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductOptionSelectionInput = { + attributeFQN?: Maybe + value?: Maybe + attributeValueId?: Maybe + shopperEnteredValue?: Maybe +} + +export type ProductOptionSelectionsInput = { + variationProductCode?: Maybe + options?: Maybe>> +} + +export type ProductOptionValue = { + __typename?: 'ProductOptionValue' + _get?: Maybe + _root?: Maybe + value?: Maybe + attributeValueId: Scalars['Int'] + stringValue?: Maybe + isEnabled?: Maybe + isSelected?: Maybe + isDefault?: Maybe + deltaWeight?: Maybe + deltaPrice?: Maybe + shopperEnteredValue?: Maybe + bundledProduct?: Maybe + displayInfo?: Maybe +} + +export type ProductOptionValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPrice = { + __typename?: 'ProductPrice' + _get?: Maybe + _root?: Maybe + msrp?: Maybe + price?: Maybe + priceType?: Maybe + salePrice?: Maybe + salePriceType?: Maybe + catalogSalePrice?: Maybe + catalogListPrice?: Maybe + discount?: Maybe + creditValue?: Maybe + effectivePricelistCode?: Maybe + priceListEntryCode?: Maybe + priceListEntryMode?: Maybe +} + +export type ProductPrice_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPriceRange = { + __typename?: 'ProductPriceRange' + _get?: Maybe + _root?: Maybe + lower?: Maybe + upper?: Maybe +} + +export type ProductPriceRange_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPricingBehaviorInfo = { + __typename?: 'ProductPricingBehaviorInfo' + _get?: Maybe + _root?: Maybe + discountsRestricted?: Maybe + discountsRestrictedStartDate?: Maybe + discountsRestrictedEndDate?: Maybe +} + +export type ProductPricingBehaviorInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductProperty = { + __typename?: 'ProductProperty' + _get?: Maybe + _root?: Maybe + attributeFQN?: Maybe + isHidden?: Maybe + isMultiValue?: Maybe + attributeDetail?: Maybe + values?: Maybe>> + propertyType?: Maybe +} + +export type ProductProperty_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPropertyValue = { + __typename?: 'ProductPropertyValue' + _get?: Maybe + _root?: Maybe + value?: Maybe + stringValue?: Maybe + displayInfo?: Maybe +} + +export type ProductPropertyValue_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductPurchasableState = { + __typename?: 'ProductPurchasableState' + _get?: Maybe + _root?: Maybe + isPurchasable?: Maybe + messages?: Maybe>> +} + +export type ProductPurchasableState_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductSearchRandomAccessCursor = { + __typename?: 'ProductSearchRandomAccessCursor' + _get?: Maybe + _root?: Maybe + cursorMarks?: Maybe> +} + +export type ProductSearchRandomAccessCursor_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductSearchResult = { + __typename?: 'ProductSearchResult' + _get?: Maybe + _root?: Maybe + facets?: Maybe>> + solrDebugInfo?: Maybe + searchRedirect?: Maybe + searchEngine?: Maybe + nextCursorMark?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ProductSearchResult_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductStock = { + __typename?: 'ProductStock' + _get?: Maybe + _root?: Maybe + manageStock?: Maybe + isOnBackOrder?: Maybe + availableDate?: Maybe + stockAvailable?: Maybe + aggregateInventory?: Maybe +} + +export type ProductStock_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductStockInput = { + manageStock?: Maybe + isOnBackOrder?: Maybe + availableDate?: Maybe + stockAvailable?: Maybe + aggregateInventory?: Maybe +} + +export type ProductValidationSummary = { + __typename?: 'ProductValidationSummary' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + purchaseLocation?: Maybe + productUsage?: Maybe + fulfillmentTypesSupported?: Maybe> + goodsType?: Maybe + bundledProducts?: Maybe>> + upc?: Maybe + mfgPartNumber?: Maybe + variationProductCode?: Maybe + purchasableState?: Maybe + price?: Maybe + measurements?: Maybe + isPackagedStandAlone?: Maybe + image?: Maybe + productShortDescription?: Maybe + productName?: Maybe + categories?: Maybe>> + properties?: Maybe>> + pricingBehavior?: Maybe + inventoryInfo?: Maybe + isTaxable?: Maybe + productType?: Maybe +} + +export type ProductValidationSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ProductVolumePrice = { + __typename?: 'ProductVolumePrice' + _get?: Maybe + _root?: Maybe + isCurrent?: Maybe + minQty: Scalars['Int'] + maxQty?: Maybe + priceRange?: Maybe + price?: Maybe +} + +export type ProductVolumePrice_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Property = { + __typename?: 'Property' + _get?: Maybe + _root?: Maybe + name?: Maybe + isRequired?: Maybe + isMultiValued?: Maybe + propertyType?: Maybe +} + +export type Property_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PropertyInput = { + name?: Maybe + isRequired?: Maybe + isMultiValued?: Maybe + propertyType?: Maybe +} + +export type PropertyType = { + __typename?: 'PropertyType' + _get?: Maybe + _root?: Maybe + name?: Maybe + namespace?: Maybe + propertyTypeFQN?: Maybe + adminName?: Maybe + installationPackage?: Maybe + version?: Maybe + dataType?: Maybe + isQueryable?: Maybe + isSortable?: Maybe + isAggregatable?: Maybe +} + +export type PropertyType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PropertyTypeCollection = { + __typename?: 'PropertyTypeCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type PropertyTypeCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PropertyTypeInput = { + name?: Maybe + namespace?: Maybe + propertyTypeFQN?: Maybe + adminName?: Maybe + installationPackage?: Maybe + version?: Maybe + dataType?: Maybe + isQueryable?: Maybe + isSortable?: Maybe + isAggregatable?: Maybe +} + +export type PurchaseOrderCustomField = { + __typename?: 'PurchaseOrderCustomField' + _get?: Maybe + _root?: Maybe + code?: Maybe + label?: Maybe + value?: Maybe +} + +export type PurchaseOrderCustomField_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PurchaseOrderCustomFieldInput = { + code?: Maybe + label?: Maybe + value?: Maybe +} + +export type PurchaseOrderPayment = { + __typename?: 'PurchaseOrderPayment' + _get?: Maybe + _root?: Maybe + purchaseOrderNumber?: Maybe + paymentTerm?: Maybe + customFields?: Maybe>> +} + +export type PurchaseOrderPayment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PurchaseOrderPaymentInput = { + purchaseOrderNumber?: Maybe + paymentTerm?: Maybe + customFields?: Maybe>> +} + +export type PurchaseOrderPaymentTerm = { + __typename?: 'PurchaseOrderPaymentTerm' + _get?: Maybe + _root?: Maybe + code?: Maybe + description?: Maybe +} + +export type PurchaseOrderPaymentTerm_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PurchaseOrderPaymentTermInput = { + code?: Maybe + description?: Maybe +} + +export type PurchaseOrderTransaction = { + __typename?: 'PurchaseOrderTransaction' + _get?: Maybe + _root?: Maybe + customerPurchaseOrderAccountId: Scalars['Int'] + externalId?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + transactionDate: Scalars['DateTime'] + orderId?: Maybe + purchaseOrderNumber?: Maybe + transactionAmount: Scalars['Float'] + creditLimit: Scalars['Float'] + additionalTransactionDetail?: Maybe + availableBalance: Scalars['Float'] + transactionTypeId: Scalars['Int'] + transactionDescription?: Maybe + author?: Maybe + auditInfo?: Maybe +} + +export type PurchaseOrderTransaction_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PurchaseOrderTransactionCollection = { + __typename?: 'PurchaseOrderTransactionCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type PurchaseOrderTransactionCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type PurchaseOrderTransactionInput = { + customerPurchaseOrderAccountId: Scalars['Int'] + externalId?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + transactionDate: Scalars['DateTime'] + orderId?: Maybe + purchaseOrderNumber?: Maybe + transactionAmount: Scalars['Float'] + creditLimit: Scalars['Float'] + additionalTransactionDetail?: Maybe + availableBalance: Scalars['Float'] + transactionTypeId: Scalars['Int'] + transactionDescription?: Maybe + author?: Maybe + auditInfo?: Maybe +} + +export type Query = { + __typename?: 'Query' + customerAccountAttributeDefinitions?: Maybe + customerAccountAttributeVocabularyValues?: Maybe< + Array> + > + customerAccountAttributeDefinition?: Maybe + b2bAccountAttributes?: Maybe + b2bAccountAttributeVocabularyValues?: Maybe + b2bAccounts?: Maybe + b2bAccount?: Maybe + b2bAccountUsers?: Maybe + b2bAccountUserRoles?: Maybe + customerCreditAuditTrail?: Maybe + customerCredits?: Maybe + customerCredit?: Maybe + customerCreditTransactions?: Maybe + customerAccountAttributes?: Maybe + customerAccountAttribute?: Maybe + customerAccountCards?: Maybe + customerAccountCard?: Maybe + customerAccountContacts?: Maybe + customerAccountContact?: Maybe + customerAccounts?: Maybe + customerAccount?: Maybe + getCurrentAccount?: Maybe + customerAccountTransactions?: Maybe>> + customerAccountNotes?: Maybe + customerAccountNote?: Maybe + customerAccountSegments?: Maybe + customerAccountAuditLog?: Maybe + customerPurchaseOrderAccount?: Maybe + customerPurchaseOrderAccountTransaction?: Maybe + customerAccountLoginState?: Maybe + customerSegments?: Maybe + customerSegment?: Maybe + customerSets?: Maybe + customerSet?: Maybe + inStockNotifications?: Maybe + inStockNotification?: Maybe + authTicket?: Maybe + exchangeRates?: Maybe>> + resolvedPriceList?: Maybe + categoriesTree?: Maybe + categories?: Maybe + category?: Maybe + products?: Maybe + product?: Maybe + productVersion?: Maybe + productLocationInventory?: Maybe + suggestionSearch?: Maybe + productSearchRandomAccessCursor?: Maybe + productSearch?: Maybe + priceList?: Maybe + cartsSummary?: Maybe + userCartSummary?: Maybe + cartSummary?: Maybe + userCart?: Maybe + currentCart?: Maybe + cart?: Maybe + currentCartExtendedProperties?: Maybe>> + currentCartItems?: Maybe + cartItems?: Maybe + currentCartItem?: Maybe + cartItem?: Maybe + currentCartMessages?: Maybe + channels?: Maybe + channel?: Maybe + channelGroups?: Maybe + channelGroup?: Maybe + checkoutAttributes?: Maybe>> + checkout?: Maybe + checkouts?: Maybe + checkoutShippingMethods?: Maybe>> + checkoutActions?: Maybe>> + checkoutDestination?: Maybe + checkoutDestinations?: Maybe>> + orderPackageActions?: Maybe>> + orderPaymentActions?: Maybe>> + orderPayment?: Maybe + orderPayments?: Maybe + orderPickup?: Maybe + orderPickupActions?: Maybe>> + orderReturnableItems?: Maybe + orderShipment?: Maybe + orderShipmentMethods?: Maybe>> + orderValidationResults?: Maybe>> + orderAttributes?: Maybe>> + orderBillingInfo?: Maybe + orderCancelReasons?: Maybe + orders?: Maybe + order?: Maybe + orderActions?: Maybe>> + orderTaxableOrders?: Maybe>> + orderDigitalPackage?: Maybe + orderDigitalPackageActions?: Maybe>> + orderExtendedProperties?: Maybe>> + orderFulfillmentInfo?: Maybe + orderItems?: Maybe + orderNotes?: Maybe>> + orderNote?: Maybe + orderPackage?: Maybe + orderPackageLabel?: Maybe + quote?: Maybe + quotes?: Maybe + customerAccountQuote?: Maybe + quoteItems?: Maybe>> + customerAccountQuoteItems?: Maybe>> + quoteItem?: Maybe + returns?: Maybe + returnReasons?: Maybe + returnReason?: Maybe + returnActions?: Maybe>> + returnPayments?: Maybe + returnPayment?: Maybe + returnPaymentActions?: Maybe>> + returnShippingLabel?: Maybe + returnItems?: Maybe + returnItem?: Maybe + returnNotes?: Maybe>> + returnNote?: Maybe + returnPackage?: Maybe + returnPackageLabel?: Maybe + returnShipment?: Maybe + wishlists?: Maybe + wishlist?: Maybe + customerWishlist?: Maybe + wishlistItems?: Maybe + customerWishlistItems?: Maybe + wishlistItem?: Maybe + orderItem?: Maybe + documentListDocumentContent?: Maybe + documentListDocumentTransform?: Maybe + documentListTreeDocumentContent?: Maybe + documentListTreeDocumentTransform?: Maybe + documentListDocuments?: Maybe + documentListDocument?: Maybe + documentListTreeDocument?: Maybe + documentLists?: Maybe + documentList?: Maybe + documentListViewDocuments?: Maybe + documentListTypes?: Maybe + documentListType?: Maybe + documentDrafts?: Maybe + documentTypes?: Maybe + documentType?: Maybe + propertyTypes?: Maybe + propertyType?: Maybe + adminLocations?: Maybe + adminLocation?: Maybe + adminLocationAttributes?: Maybe + adminLocationAttributeVocabularyValues?: Maybe< + Array> + > + adminLocationAttribute?: Maybe + adminLocationGroups?: Maybe + dslLocation?: Maybe + spLocations?: Maybe + spLocation?: Maybe + usageTypeLocations?: Maybe + location?: Maybe + locationUsages?: Maybe + locationUsage?: Maybe + adminLocationTypes?: Maybe>> + adminLocationType?: Maybe + locationGroupConfig?: Maybe + locationGroup?: Maybe + entityListEntity?: Maybe + entityListEntities?: Maybe + entityListEntityContainer?: Maybe + entityListEntityContainers?: Maybe + entityList?: Maybe + entityLists?: Maybe + entityListViews?: Maybe + entityListView?: Maybe + entityListViewEntityContainers?: Maybe + entityListViewEntities?: Maybe + entityListViewEntityContainer?: Maybe + entityListViewEntity?: Maybe + carrierLocaleServiceTypes?: Maybe>> + localeServiceTypes?: Maybe>> + targetRules?: Maybe + targetRule?: Maybe + orderRoutingRoutingSuggestionLog?: Maybe>> +} + +export type QueryCustomerAccountAttributeDefinitionsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountAttributeVocabularyValuesArgs = { + attributeFQN: Scalars['String'] +} + +export type QueryCustomerAccountAttributeDefinitionArgs = { + attributeFQN: Scalars['String'] +} + +export type QueryB2bAccountAttributesArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryB2bAccountAttributeVocabularyValuesArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] +} + +export type QueryB2bAccountsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + fields?: Maybe + q?: Maybe + qLimit?: Maybe +} + +export type QueryB2bAccountArgs = { + accountId: Scalars['Int'] +} + +export type QueryB2bAccountUsersArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe + qLimit?: Maybe +} + +export type QueryB2bAccountUserRolesArgs = { + accountId: Scalars['Int'] + userId: Scalars['String'] +} + +export type QueryCustomerCreditAuditTrailArgs = { + code: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerCreditsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerCreditArgs = { + code: Scalars['String'] +} + +export type QueryCustomerCreditTransactionsArgs = { + code: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountAttributesArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + userId?: Maybe +} + +export type QueryCustomerAccountAttributeArgs = { + accountId: Scalars['Int'] + attributeFQN: Scalars['String'] + userId?: Maybe +} + +export type QueryCustomerAccountCardsArgs = { + accountId: Scalars['Int'] +} + +export type QueryCustomerAccountCardArgs = { + accountId: Scalars['Int'] + cardId: Scalars['String'] +} + +export type QueryCustomerAccountContactsArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + userId?: Maybe +} + +export type QueryCustomerAccountContactArgs = { + accountId: Scalars['Int'] + contactId: Scalars['Int'] + userId?: Maybe +} + +export type QueryCustomerAccountsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + fields?: Maybe + q?: Maybe + qLimit?: Maybe + isAnonymous?: Maybe +} + +export type QueryCustomerAccountArgs = { + accountId: Scalars['Int'] + userId?: Maybe +} + +export type QueryCustomerAccountTransactionsArgs = { + accountId: Scalars['Int'] +} + +export type QueryCustomerAccountNotesArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountNoteArgs = { + accountId: Scalars['Int'] + noteId: Scalars['Int'] +} + +export type QueryCustomerAccountSegmentsArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountAuditLogArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerPurchaseOrderAccountArgs = { + accountId: Scalars['Int'] +} + +export type QueryCustomerPurchaseOrderAccountTransactionArgs = { + accountId: Scalars['Int'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountLoginStateArgs = { + accountId: Scalars['Int'] + userId?: Maybe +} + +export type QueryCustomerSegmentsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerSegmentArgs = { + id: Scalars['Int'] +} + +export type QueryCustomerSetsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe +} + +export type QueryCustomerSetArgs = { + code: Scalars['String'] +} + +export type QueryInStockNotificationsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryInStockNotificationArgs = { + id: Scalars['Int'] +} + +export type QueryAuthTicketArgs = { + accountId?: Maybe +} + +export type QueryResolvedPriceListArgs = { + customerAccountId?: Maybe +} + +export type QueryCategoriesArgs = { + filter?: Maybe + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe +} + +export type QueryCategoryArgs = { + categoryId: Scalars['Int'] + allowInactive?: Maybe +} + +export type QueryProductsArgs = { + filter?: Maybe + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + responseOptions?: Maybe + cursorMark?: Maybe + defaultSort?: Maybe + mid?: Maybe + includeAllImages?: Maybe +} + +export type QueryProductArgs = { + productCode: Scalars['String'] + variationProductCode?: Maybe + allowInactive?: Maybe + skipInventoryCheck?: Maybe + supressOutOfStock404?: Maybe + quantity?: Maybe + acceptVariantProductCode?: Maybe + purchaseLocation?: Maybe + variationProductCodeFilter?: Maybe + sliceValue?: Maybe + includeAllImages?: Maybe +} + +export type QueryProductVersionArgs = { + productCode: Scalars['String'] + productVersion?: Maybe + lastModifiedDate?: Maybe +} + +export type QueryProductLocationInventoryArgs = { + productCode: Scalars['String'] + locationCodes?: Maybe +} + +export type QuerySuggestionSearchArgs = { + query?: Maybe + groups?: Maybe + pageSize?: Maybe + mid?: Maybe + filter?: Maybe +} + +export type QueryProductSearchRandomAccessCursorArgs = { + query?: Maybe + filter?: Maybe + pageSize?: Maybe +} + +export type QueryProductSearchArgs = { + query?: Maybe + filter?: Maybe + facetTemplate?: Maybe + facetTemplateSubset?: Maybe + facet?: Maybe + facetFieldRangeQuery?: Maybe + facetHierPrefix?: Maybe + facetHierValue?: Maybe + facetHierDepth?: Maybe + facetStartIndex?: Maybe + facetPageSize?: Maybe + facetSettings?: Maybe + facetValueFilter?: Maybe + sortBy?: Maybe + pageSize?: Maybe + startIndex?: Maybe + searchSettings?: Maybe + enableSearchTuningRules?: Maybe + searchTuningRuleContext?: Maybe + searchTuningRuleCode?: Maybe + facetTemplateExclude?: Maybe + facetPrefix?: Maybe + responseOptions?: Maybe + cursorMark?: Maybe + facetValueSort?: Maybe + defaultSort?: Maybe + sortDefinitionName?: Maybe + defaultSortDefinitionName?: Maybe + shouldSlice?: Maybe + mid?: Maybe + omitNamespace?: Maybe +} + +export type QueryPriceListArgs = { + priceListCode?: Maybe +} + +export type QueryUserCartSummaryArgs = { + userId: Scalars['String'] +} + +export type QueryCartSummaryArgs = { + cartId: Scalars['String'] +} + +export type QueryUserCartArgs = { + userId: Scalars['String'] +} + +export type QueryCartArgs = { + cartId: Scalars['String'] +} + +export type QueryCartItemsArgs = { + cartId: Scalars['String'] +} + +export type QueryCurrentCartItemArgs = { + cartItemId: Scalars['String'] +} + +export type QueryCartItemArgs = { + cartId: Scalars['String'] + cartItemId: Scalars['String'] +} + +export type QueryChannelsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryChannelArgs = { + code: Scalars['String'] +} + +export type QueryChannelGroupsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryChannelGroupArgs = { + code: Scalars['String'] +} + +export type QueryCheckoutAttributesArgs = { + checkoutId: Scalars['String'] +} + +export type QueryCheckoutArgs = { + checkoutId: Scalars['String'] +} + +export type QueryCheckoutsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe + qLimit?: Maybe +} + +export type QueryCheckoutShippingMethodsArgs = { + checkoutId: Scalars['String'] +} + +export type QueryCheckoutActionsArgs = { + checkoutId: Scalars['String'] +} + +export type QueryCheckoutDestinationArgs = { + checkoutId: Scalars['String'] + destinationId: Scalars['String'] +} + +export type QueryCheckoutDestinationsArgs = { + checkoutId: Scalars['String'] +} + +export type QueryOrderPackageActionsArgs = { + orderId: Scalars['String'] + packageId: Scalars['String'] +} + +export type QueryOrderPaymentActionsArgs = { + orderId: Scalars['String'] + paymentId: Scalars['String'] +} + +export type QueryOrderPaymentArgs = { + orderId: Scalars['String'] + paymentId: Scalars['String'] +} + +export type QueryOrderPaymentsArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderPickupArgs = { + orderId: Scalars['String'] + pickupId: Scalars['String'] +} + +export type QueryOrderPickupActionsArgs = { + orderId: Scalars['String'] + pickupId: Scalars['String'] +} + +export type QueryOrderReturnableItemsArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderShipmentArgs = { + orderId: Scalars['String'] + shipmentId: Scalars['String'] +} + +export type QueryOrderShipmentMethodsArgs = { + orderId: Scalars['String'] + draft?: Maybe +} + +export type QueryOrderValidationResultsArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderAttributesArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderBillingInfoArgs = { + orderId: Scalars['String'] + draft?: Maybe +} + +export type QueryOrderCancelReasonsArgs = { + category?: Maybe +} + +export type QueryOrdersArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe + qLimit?: Maybe + includeBin?: Maybe + mode?: Maybe +} + +export type QueryOrderArgs = { + orderId: Scalars['String'] + draft?: Maybe + includeBin?: Maybe + mode?: Maybe +} + +export type QueryOrderActionsArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderTaxableOrdersArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderDigitalPackageArgs = { + orderId: Scalars['String'] + digitalPackageId: Scalars['String'] +} + +export type QueryOrderDigitalPackageActionsArgs = { + orderId: Scalars['String'] + digitalPackageId: Scalars['String'] +} + +export type QueryOrderExtendedPropertiesArgs = { + orderId: Scalars['String'] + draft?: Maybe +} + +export type QueryOrderFulfillmentInfoArgs = { + orderId: Scalars['String'] + draft?: Maybe +} + +export type QueryOrderItemsArgs = { + orderId: Scalars['String'] + draft?: Maybe +} + +export type QueryOrderNotesArgs = { + orderId: Scalars['String'] +} + +export type QueryOrderNoteArgs = { + orderId: Scalars['String'] + noteId: Scalars['String'] +} + +export type QueryOrderPackageArgs = { + orderId: Scalars['String'] + packageId: Scalars['String'] +} + +export type QueryOrderPackageLabelArgs = { + orderId: Scalars['String'] + packageId: Scalars['String'] +} + +export type QueryQuoteArgs = { + quoteId: Scalars['String'] + draft?: Maybe +} + +export type QueryQuotesArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe + qLimit?: Maybe +} + +export type QueryCustomerAccountQuoteArgs = { + customerAccountId: Scalars['Int'] + quoteName: Scalars['String'] + draft?: Maybe +} + +export type QueryQuoteItemsArgs = { + quoteId: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerAccountQuoteItemsArgs = { + customerAccountId: Scalars['Int'] + quoteName: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryQuoteItemArgs = { + quoteId: Scalars['String'] + quoteItemId: Scalars['String'] + draft?: Maybe +} + +export type QueryReturnsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe +} + +export type QueryReturnReasonArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnActionsArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnPaymentsArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnPaymentArgs = { + returnId: Scalars['String'] + paymentId: Scalars['String'] +} + +export type QueryReturnPaymentActionsArgs = { + returnId: Scalars['String'] + paymentId: Scalars['String'] +} + +export type QueryReturnShippingLabelArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnItemsArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnItemArgs = { + returnId: Scalars['String'] + returnItemId: Scalars['String'] +} + +export type QueryReturnNotesArgs = { + returnId: Scalars['String'] +} + +export type QueryReturnNoteArgs = { + returnId: Scalars['String'] + noteId: Scalars['String'] +} + +export type QueryReturnPackageArgs = { + returnId: Scalars['String'] + packageId: Scalars['String'] +} + +export type QueryReturnPackageLabelArgs = { + returnId: Scalars['String'] + packageId: Scalars['String'] + returnAsBase64Png?: Maybe +} + +export type QueryReturnShipmentArgs = { + returnId: Scalars['String'] + shipmentId: Scalars['String'] +} + +export type QueryWishlistsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + q?: Maybe + qLimit?: Maybe +} + +export type QueryWishlistArgs = { + wishlistId: Scalars['String'] +} + +export type QueryCustomerWishlistArgs = { + customerAccountId: Scalars['Int'] + wishlistName: Scalars['String'] +} + +export type QueryWishlistItemsArgs = { + wishlistId: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryCustomerWishlistItemsArgs = { + customerAccountId: Scalars['Int'] + wishlistName: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryWishlistItemArgs = { + wishlistId: Scalars['String'] + wishlistItemId: Scalars['String'] +} + +export type QueryOrderItemArgs = { + orderId?: Maybe + lineId?: Maybe + orderItemId?: Maybe + draft?: Maybe +} + +export type QueryDocumentListDocumentContentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] +} + +export type QueryDocumentListDocumentTransformArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] + width?: Maybe + height?: Maybe + max?: Maybe + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + quality?: Maybe +} + +export type QueryDocumentListTreeDocumentContentArgs = { + documentListName: Scalars['String'] + documentName: Scalars['String'] +} + +export type QueryDocumentListTreeDocumentTransformArgs = { + documentListName: Scalars['String'] + documentName: Scalars['String'] + width?: Maybe + height?: Maybe + max?: Maybe + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + quality?: Maybe +} + +export type QueryDocumentListDocumentsArgs = { + documentListName: Scalars['String'] + filter?: Maybe + sortBy?: Maybe + pageSize?: Maybe + startIndex?: Maybe + includeInactive?: Maybe + path?: Maybe + includeSubPaths?: Maybe + queryScope?: Maybe +} + +export type QueryDocumentListDocumentArgs = { + documentListName: Scalars['String'] + documentId: Scalars['String'] + includeInactive?: Maybe +} + +export type QueryDocumentListTreeDocumentArgs = { + documentListName: Scalars['String'] + documentName: Scalars['String'] + includeInactive?: Maybe +} + +export type QueryDocumentListsArgs = { + pageSize?: Maybe + startIndex?: Maybe +} + +export type QueryDocumentListArgs = { + documentListName: Scalars['String'] +} + +export type QueryDocumentListViewDocumentsArgs = { + documentListName: Scalars['String'] + viewName: Scalars['String'] + filter?: Maybe + sortBy?: Maybe + pageSize?: Maybe + startIndex?: Maybe + includeInactive?: Maybe +} + +export type QueryDocumentListTypesArgs = { + pageSize?: Maybe + startIndex?: Maybe +} + +export type QueryDocumentListTypeArgs = { + documentListTypeFQN: Scalars['String'] +} + +export type QueryDocumentDraftsArgs = { + pageSize?: Maybe + startIndex?: Maybe + documentLists?: Maybe +} + +export type QueryDocumentTypesArgs = { + pageSize?: Maybe + startIndex?: Maybe +} + +export type QueryDocumentTypeArgs = { + documentTypeName: Scalars['String'] +} + +export type QueryPropertyTypesArgs = { + pageSize?: Maybe + startIndex?: Maybe +} + +export type QueryPropertyTypeArgs = { + propertyTypeName: Scalars['String'] +} + +export type QueryAdminLocationsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryAdminLocationArgs = { + locationCode: Scalars['String'] +} + +export type QueryAdminLocationAttributesArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryAdminLocationAttributeVocabularyValuesArgs = { + attributeFQN: Scalars['String'] +} + +export type QueryAdminLocationAttributeArgs = { + attributeFQN: Scalars['String'] +} + +export type QueryAdminLocationGroupsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryDslLocationArgs = { + includeAttributeDefinition?: Maybe +} + +export type QuerySpLocationsArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + includeAttributeDefinition?: Maybe +} + +export type QuerySpLocationArgs = { + locationCode: Scalars['String'] + includeAttributeDefinition?: Maybe +} + +export type QueryUsageTypeLocationsArgs = { + locationUsageType: Scalars['String'] + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe + includeAttributeDefinition?: Maybe +} + +export type QueryLocationArgs = { + locationCode: Scalars['String'] + includeAttributeDefinition?: Maybe +} + +export type QueryLocationUsageArgs = { + code: Scalars['String'] +} + +export type QueryAdminLocationTypeArgs = { + locationTypeCode: Scalars['String'] +} + +export type QueryLocationGroupConfigArgs = { + locationGroupId?: Maybe + locationGroupCode?: Maybe + locationCode?: Maybe +} + +export type QueryLocationGroupArgs = { + groupId?: Maybe + locationGroupCode?: Maybe +} + +export type QueryEntityListEntityArgs = { + entityListFullName: Scalars['String'] + id: Scalars['String'] +} + +export type QueryEntityListEntitiesArgs = { + entityListFullName: Scalars['String'] + pageSize?: Maybe + startIndex?: Maybe + filter?: Maybe + sortBy?: Maybe +} + +export type QueryEntityListEntityContainerArgs = { + entityListFullName: Scalars['String'] + id: Scalars['String'] +} + +export type QueryEntityListEntityContainersArgs = { + entityListFullName: Scalars['String'] + pageSize?: Maybe + startIndex?: Maybe + filter?: Maybe + sortBy?: Maybe +} + +export type QueryEntityListArgs = { + entityListFullName: Scalars['String'] +} + +export type QueryEntityListsArgs = { + pageSize?: Maybe + startIndex?: Maybe + filter?: Maybe + sortBy?: Maybe +} + +export type QueryEntityListViewsArgs = { + entityListFullName: Scalars['String'] +} + +export type QueryEntityListViewArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] +} + +export type QueryEntityListViewEntityContainersArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] + pageSize?: Maybe + startIndex?: Maybe + filter?: Maybe +} + +export type QueryEntityListViewEntitiesArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] + pageSize?: Maybe + startIndex?: Maybe + filter?: Maybe +} + +export type QueryEntityListViewEntityContainerArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] + entityId: Scalars['String'] +} + +export type QueryEntityListViewEntityArgs = { + entityListFullName: Scalars['String'] + viewName: Scalars['String'] + entityId: Scalars['String'] +} + +export type QueryCarrierLocaleServiceTypesArgs = { + carrierId: Scalars['String'] + localeCode: Scalars['String'] +} + +export type QueryLocaleServiceTypesArgs = { + localeCode: Scalars['String'] +} + +export type QueryTargetRulesArgs = { + startIndex?: Maybe + pageSize?: Maybe + sortBy?: Maybe + filter?: Maybe +} + +export type QueryTargetRuleArgs = { + code: Scalars['String'] +} + +export type QueryOrderRoutingRoutingSuggestionLogArgs = { + externalResponseID?: Maybe + orderID?: Maybe + responseID?: Maybe + suggestionID?: Maybe +} + +export type Quote = { + __typename?: 'Quote' + _get?: Maybe + _root?: Maybe + id?: Maybe + name?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + number?: Maybe + submittedDate?: Maybe + items?: Maybe>> + auditHistory?: Maybe>> + auditInfo?: Maybe + comments?: Maybe>> + expirationDate?: Maybe + fulfillmentInfo?: Maybe + userId?: Maybe + customerAccountId?: Maybe + email?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + currencyCode?: Maybe + priceListCode?: Maybe + data?: Maybe + taxData?: Maybe + channelCode?: Maybe + locationCode?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + orderDiscounts?: Maybe>> + subTotal: Scalars['Float'] + itemLevelProductDiscountTotal: Scalars['Float'] + orderLevelProductDiscountTotal: Scalars['Float'] + itemTaxTotal: Scalars['Float'] + adjustment?: Maybe + itemTotal: Scalars['Float'] + total: Scalars['Float'] + shippingDiscounts?: Maybe>> + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingAmount: Scalars['Float'] + shippingAdjustment?: Maybe + shippingSubTotal: Scalars['Float'] + shippingTax?: Maybe + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingDiscounts?: Maybe>> + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingAmount?: Maybe + handlingAdjustment?: Maybe + handlingSubTotal: Scalars['Float'] + handlingTax?: Maybe + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + dutyAmount?: Maybe + dutyTotal: Scalars['Float'] + feeTotal: Scalars['Float'] + isDraft?: Maybe + hasDraft?: Maybe + status?: Maybe + couponCodes?: Maybe> + invalidCoupons?: Maybe>> +} + +export type Quote_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type QuoteCollection = { + __typename?: 'QuoteCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type QuoteCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type QuoteComment = { + __typename?: 'QuoteComment' + _get?: Maybe + _root?: Maybe + id?: Maybe + text?: Maybe + auditInfo?: Maybe +} + +export type QuoteComment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type QuoteCommentInput = { + id?: Maybe + text?: Maybe + auditInfo?: Maybe +} + +export type QuoteInput = { + id?: Maybe + name?: Maybe + siteId: Scalars['Int'] + tenantId: Scalars['Int'] + number?: Maybe + submittedDate?: Maybe + items?: Maybe>> + auditHistory?: Maybe>> + auditInfo?: Maybe + comments?: Maybe>> + expirationDate?: Maybe + fulfillmentInfo?: Maybe + userId?: Maybe + customerAccountId?: Maybe + email?: Maybe + customerTaxId?: Maybe + isTaxExempt?: Maybe + currencyCode?: Maybe + priceListCode?: Maybe + data?: Maybe + taxData?: Maybe + channelCode?: Maybe + locationCode?: Maybe + ipAddress?: Maybe + sourceDevice?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + orderDiscounts?: Maybe>> + subTotal: Scalars['Float'] + itemLevelProductDiscountTotal: Scalars['Float'] + orderLevelProductDiscountTotal: Scalars['Float'] + itemTaxTotal: Scalars['Float'] + adjustment?: Maybe + itemTotal: Scalars['Float'] + total: Scalars['Float'] + shippingDiscounts?: Maybe>> + itemLevelShippingDiscountTotal: Scalars['Float'] + orderLevelShippingDiscountTotal: Scalars['Float'] + shippingAmount: Scalars['Float'] + shippingAdjustment?: Maybe + shippingSubTotal: Scalars['Float'] + shippingTax?: Maybe + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingDiscounts?: Maybe>> + itemLevelHandlingDiscountTotal: Scalars['Float'] + orderLevelHandlingDiscountTotal: Scalars['Float'] + handlingAmount?: Maybe + handlingAdjustment?: Maybe + handlingSubTotal: Scalars['Float'] + handlingTax?: Maybe + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + dutyAmount?: Maybe + dutyTotal: Scalars['Float'] + feeTotal: Scalars['Float'] + isDraft?: Maybe + hasDraft?: Maybe + status?: Maybe + couponCodes?: Maybe> + invalidCoupons?: Maybe>> +} + +export type ReasonCollection = { + __typename?: 'ReasonCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe> +} + +export type ReasonCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Refund = { + __typename?: 'Refund' + _get?: Maybe + _root?: Maybe + id?: Maybe + orderId?: Maybe + reason?: Maybe + reasonCode?: Maybe + payment?: Maybe + amount: Scalars['Float'] + refundMethod?: Maybe + auditInfo?: Maybe +} + +export type Refund_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type RefundInput = { + id?: Maybe + orderId?: Maybe + reason?: Maybe + reasonCode?: Maybe + payment?: Maybe + amount: Scalars['Float'] + refundMethod?: Maybe + auditInfo?: Maybe +} + +export type RegularHours = { + __typename?: 'RegularHours' + _get?: Maybe + _root?: Maybe + sunday?: Maybe + monday?: Maybe + tuesday?: Maybe + wednesday?: Maybe + thursday?: Maybe + friday?: Maybe + saturday?: Maybe + timeZone?: Maybe +} + +export type RegularHours_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type RegularHoursInput = { + sunday?: Maybe + monday?: Maybe + tuesday?: Maybe + wednesday?: Maybe + thursday?: Maybe + friday?: Maybe + saturday?: Maybe + timeZone?: Maybe +} + +export type RepriceShipmentObjectInput = { + originalShipment?: Maybe + newShipment?: Maybe +} + +export type ResetPasswordInfoInput = { + emailAddress?: Maybe + userName?: Maybe + customerSetCode?: Maybe +} + +export type ResolvedPriceList = { + __typename?: 'ResolvedPriceList' + _get?: Maybe + _root?: Maybe + priceListCode?: Maybe + priceListId: Scalars['Int'] + name?: Maybe + description?: Maybe +} + +export type ResolvedPriceList_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type RestockableReturnItemInput = { + returnItemId?: Maybe + quantity: Scalars['Int'] + locationCode?: Maybe +} + +export type ReturnActionInput = { + actionName?: Maybe + returnIds?: Maybe> +} + +export type ReturnBundle = { + __typename?: 'ReturnBundle' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + quantity: Scalars['Int'] +} + +export type ReturnBundle_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnBundleInput = { + productCode?: Maybe + quantity: Scalars['Int'] +} + +export type ReturnCollection = { + __typename?: 'ReturnCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ReturnCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnItem = { + __typename?: 'ReturnItem' + _get?: Maybe + _root?: Maybe + id?: Maybe + orderItemId?: Maybe + orderLineId?: Maybe + orderItemOptionAttributeFQN?: Maybe + product?: Maybe + reasons?: Maybe>> + excludeProductExtras?: Maybe + returnType?: Maybe + returnNotRequired?: Maybe + quantityReceived: Scalars['Int'] + receiveStatus?: Maybe + quantityShipped: Scalars['Int'] + replaceStatus?: Maybe + quantityRestockable: Scalars['Int'] + quantityRestocked: Scalars['Int'] + refundAmount?: Maybe + refundStatus?: Maybe + quantityReplaced?: Maybe + notes?: Maybe>> + productLossAmount?: Maybe + productLossTaxAmount?: Maybe + shippingLossAmount?: Maybe + shippingLossTaxAmount?: Maybe + bundledProducts?: Maybe>> + totalWithoutWeightedShippingAndHandling?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + shipmentItemId?: Maybe + shipmentNumber?: Maybe +} + +export type ReturnItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnItemCollection = { + __typename?: 'ReturnItemCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type ReturnItemCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnItemInput = { + id?: Maybe + orderItemId?: Maybe + orderLineId?: Maybe + orderItemOptionAttributeFQN?: Maybe + product?: Maybe + reasons?: Maybe>> + excludeProductExtras?: Maybe + returnType?: Maybe + returnNotRequired?: Maybe + quantityReceived: Scalars['Int'] + receiveStatus?: Maybe + quantityShipped: Scalars['Int'] + replaceStatus?: Maybe + quantityRestockable: Scalars['Int'] + quantityRestocked: Scalars['Int'] + refundAmount?: Maybe + refundStatus?: Maybe + quantityReplaced?: Maybe + notes?: Maybe>> + productLossAmount?: Maybe + productLossTaxAmount?: Maybe + shippingLossAmount?: Maybe + shippingLossTaxAmount?: Maybe + bundledProducts?: Maybe>> + totalWithoutWeightedShippingAndHandling?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + shipmentItemId?: Maybe + shipmentNumber?: Maybe +} + +export type ReturnItemSpecifierInput = { + returnItemId?: Maybe + quantity: Scalars['Int'] +} + +export type ReturnObj = { + __typename?: 'ReturnObj' + _get?: Maybe + _root?: Maybe + id?: Maybe + customerAccountId?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + availableActions?: Maybe> + returnNumber?: Maybe + contact?: Maybe + locationCode?: Maybe + originalOrderId?: Maybe + originalOrderNumber?: Maybe + returnOrderId?: Maybe + currencyCode?: Maybe + status?: Maybe + receiveStatus?: Maybe + refundStatus?: Maybe + replaceStatus?: Maybe + items?: Maybe>> + notes?: Maybe>> + rmaDeadline?: Maybe + returnType?: Maybe + refundAmount?: Maybe + auditInfo?: Maybe + payments?: Maybe>> + packages?: Maybe>> + productLossTotal?: Maybe + shippingLossTotal?: Maybe + lossTotal?: Maybe + productLossTaxTotal?: Maybe + shippingLossTaxTotal?: Maybe + tenantId?: Maybe + siteId?: Maybe + userId?: Maybe + channelCode?: Maybe + changeMessages?: Maybe>> + actionRequired?: Maybe + isUnified?: Maybe +} + +export type ReturnObj_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnObjInput = { + id?: Maybe + customerAccountId?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + availableActions?: Maybe> + returnNumber?: Maybe + contact?: Maybe + locationCode?: Maybe + originalOrderId?: Maybe + originalOrderNumber?: Maybe + returnOrderId?: Maybe + currencyCode?: Maybe + status?: Maybe + receiveStatus?: Maybe + refundStatus?: Maybe + replaceStatus?: Maybe + items?: Maybe>> + notes?: Maybe>> + rmaDeadline?: Maybe + returnType?: Maybe + refundAmount?: Maybe + auditInfo?: Maybe + payments?: Maybe>> + packages?: Maybe>> + productLossTotal?: Maybe + shippingLossTotal?: Maybe + lossTotal?: Maybe + productLossTaxTotal?: Maybe + shippingLossTaxTotal?: Maybe + tenantId?: Maybe + siteId?: Maybe + userId?: Maybe + channelCode?: Maybe + changeMessages?: Maybe>> + actionRequired?: Maybe + isUnified?: Maybe +} + +export type ReturnReason = { + __typename?: 'ReturnReason' + _get?: Maybe + _root?: Maybe + reason?: Maybe + quantity: Scalars['Int'] +} + +export type ReturnReason_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ReturnReasonInput = { + reason?: Maybe + quantity: Scalars['Int'] +} + +export type SearchSuggestion = { + __typename?: 'SearchSuggestion' + _get?: Maybe + _root?: Maybe + suggestionType?: Maybe + suggestion?: Maybe +} + +export type SearchSuggestion_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SearchSuggestionGroup = { + __typename?: 'SearchSuggestionGroup' + _get?: Maybe + _root?: Maybe + name?: Maybe + suggestions?: Maybe>> +} + +export type SearchSuggestionGroup_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SearchSuggestionResult = { + __typename?: 'SearchSuggestionResult' + _get?: Maybe + _root?: Maybe + query?: Maybe + suggestionGroups?: Maybe>> +} + +export type SearchSuggestionResult_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ServiceType = { + __typename?: 'ServiceType' + _get?: Maybe + _root?: Maybe + code?: Maybe + deliveryDuration?: Maybe + content?: Maybe +} + +export type ServiceType_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ServiceTypeLocalizedContent = { + __typename?: 'ServiceTypeLocalizedContent' + _get?: Maybe + _root?: Maybe + localeCode?: Maybe + name?: Maybe +} + +export type ServiceTypeLocalizedContent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type Shipment = { + __typename?: 'Shipment' + _get?: Maybe + _root?: Maybe + id?: Maybe + externalShipmentId?: Maybe + number?: Maybe + orderId?: Maybe + orderNumber: Scalars['Int'] + email?: Maybe + currencyCode?: Maybe + customerAccountId?: Maybe + customerTaxId?: Maybe + shipmentType?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + fulfillmentLocationCode?: Maybe + origin?: Maybe + destination?: Maybe + shipmentStatus?: Maybe + shipmentStatusReason?: Maybe + transferShipmentNumbers?: Maybe> + isTransfer?: Maybe + originalShipmentNumber?: Maybe + parentShipmentNumber?: Maybe + fulfillmentStatus?: Maybe + workflowProcessId?: Maybe + workflowProcessContainerId?: Maybe + workflowState?: Maybe + backorderCreatedDate?: Maybe + fulfillmentDate?: Maybe + orderSubmitDate?: Maybe + pickStatus?: Maybe + pickType?: Maybe + changeMessages?: Maybe>> + packages?: Maybe>> + items?: Maybe>> + canceledItems?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shipmentAdjustment: Scalars['Float'] + lineItemSubtotal: Scalars['Float'] + lineItemTaxAdjustment: Scalars['Float'] + lineItemTaxTotal: Scalars['Float'] + lineItemTotal: Scalars['Float'] + shippingAdjustment: Scalars['Float'] + shippingSubtotal: Scalars['Float'] + shippingTaxAdjustment: Scalars['Float'] + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingAdjustment: Scalars['Float'] + handlingSubtotal: Scalars['Float'] + handlingTaxAdjustment: Scalars['Float'] + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + dutyAdjustment: Scalars['Float'] + dutyTotal: Scalars['Float'] + total: Scalars['Float'] + cost?: Maybe + externalOrderId?: Maybe + isExpress?: Maybe + readyToCapture?: Maybe + pickupInfo?: Maybe + shopperNotes?: Maybe + customer?: Maybe +} + +export type Shipment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShipmentAdjustmentInput = { + itemAdjustment?: Maybe + itemTaxAdjustment?: Maybe + shippingAdjustment?: Maybe + shippingTaxAdjustment?: Maybe + handlingAdjustment?: Maybe + handlingTaxAdjustment?: Maybe +} + +export type ShipmentInput = { + id?: Maybe + externalShipmentId?: Maybe + number?: Maybe + orderId?: Maybe + orderNumber: Scalars['Int'] + email?: Maybe + currencyCode?: Maybe + customerAccountId?: Maybe + customerTaxId?: Maybe + shipmentType?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + fulfillmentLocationCode?: Maybe + origin?: Maybe + destination?: Maybe + shipmentStatus?: Maybe + shipmentStatusReason?: Maybe + transferShipmentNumbers?: Maybe> + isTransfer?: Maybe + originalShipmentNumber?: Maybe + parentShipmentNumber?: Maybe + fulfillmentStatus?: Maybe + workflowProcessId?: Maybe + workflowProcessContainerId?: Maybe + workflowState?: Maybe + backorderCreatedDate?: Maybe + fulfillmentDate?: Maybe + orderSubmitDate?: Maybe + pickStatus?: Maybe + pickType?: Maybe + changeMessages?: Maybe>> + packages?: Maybe>> + items?: Maybe>> + canceledItems?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shipmentAdjustment: Scalars['Float'] + lineItemSubtotal: Scalars['Float'] + lineItemTaxAdjustment: Scalars['Float'] + lineItemTaxTotal: Scalars['Float'] + lineItemTotal: Scalars['Float'] + shippingAdjustment: Scalars['Float'] + shippingSubtotal: Scalars['Float'] + shippingTaxAdjustment: Scalars['Float'] + shippingTaxTotal: Scalars['Float'] + shippingTotal: Scalars['Float'] + handlingAdjustment: Scalars['Float'] + handlingSubtotal: Scalars['Float'] + handlingTaxAdjustment: Scalars['Float'] + handlingTaxTotal: Scalars['Float'] + handlingTotal: Scalars['Float'] + dutyAdjustment: Scalars['Float'] + dutyTotal: Scalars['Float'] + total: Scalars['Float'] + cost?: Maybe + externalOrderId?: Maybe + isExpress?: Maybe + readyToCapture?: Maybe + pickupInfo?: Maybe + shopperNotes?: Maybe + customer?: Maybe +} + +export type ShipmentItem = { + __typename?: 'ShipmentItem' + _get?: Maybe + _root?: Maybe + lineId: Scalars['Int'] + originalOrderItemId?: Maybe + parentId?: Maybe + productCode?: Maybe + variationProductCode?: Maybe + optionAttributeFQN?: Maybe + name?: Maybe + auditInfo?: Maybe + fulfillmentLocationCode?: Maybe + imageUrl?: Maybe + isTaxable?: Maybe + quantity: Scalars['Int'] + unitPrice: Scalars['Float'] + actualPrice: Scalars['Float'] + overridePrice?: Maybe + itemDiscount: Scalars['Float'] + lineItemCost: Scalars['Float'] + itemTax: Scalars['Float'] + shipping: Scalars['Float'] + shippingDiscount: Scalars['Float'] + shippingTax: Scalars['Float'] + handling: Scalars['Float'] + handlingDiscount: Scalars['Float'] + handlingTax: Scalars['Float'] + duty: Scalars['Float'] + isPackagedStandAlone?: Maybe + readyForPickupQuantity?: Maybe + backorderReleaseDate?: Maybe + measurements?: Maybe + options?: Maybe>> + data?: Maybe + taxData?: Maybe + weightedShipmentAdjustment: Scalars['Float'] + weightedLineItemTaxAdjustment: Scalars['Float'] + weightedShippingAdjustment: Scalars['Float'] + weightedShippingTaxAdjustment: Scalars['Float'] + weightedHandlingAdjustment: Scalars['Float'] + weightedHandlingTaxAdjustment: Scalars['Float'] + weightedDutyAdjustment: Scalars['Float'] + taxableShipping: Scalars['Float'] + taxableLineItemCost: Scalars['Float'] + taxableHandling: Scalars['Float'] + fulfillmentFields?: Maybe>> + isAssemblyRequired?: Maybe + parentItemId?: Maybe + childItemIds?: Maybe> + giftCards?: Maybe>> +} + +export type ShipmentItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShipmentItemAdjustmentInput = { + overridePrice?: Maybe +} + +export type ShipmentItemInput = { + lineId: Scalars['Int'] + originalOrderItemId?: Maybe + parentId?: Maybe + productCode?: Maybe + variationProductCode?: Maybe + optionAttributeFQN?: Maybe + name?: Maybe + auditInfo?: Maybe + fulfillmentLocationCode?: Maybe + imageUrl?: Maybe + isTaxable?: Maybe + quantity: Scalars['Int'] + unitPrice: Scalars['Float'] + actualPrice: Scalars['Float'] + overridePrice?: Maybe + itemDiscount: Scalars['Float'] + lineItemCost: Scalars['Float'] + itemTax: Scalars['Float'] + shipping: Scalars['Float'] + shippingDiscount: Scalars['Float'] + shippingTax: Scalars['Float'] + handling: Scalars['Float'] + handlingDiscount: Scalars['Float'] + handlingTax: Scalars['Float'] + duty: Scalars['Float'] + isPackagedStandAlone?: Maybe + readyForPickupQuantity?: Maybe + backorderReleaseDate?: Maybe + measurements?: Maybe + options?: Maybe>> + data?: Maybe + taxData?: Maybe + weightedShipmentAdjustment: Scalars['Float'] + weightedLineItemTaxAdjustment: Scalars['Float'] + weightedShippingAdjustment: Scalars['Float'] + weightedShippingTaxAdjustment: Scalars['Float'] + weightedHandlingAdjustment: Scalars['Float'] + weightedHandlingTaxAdjustment: Scalars['Float'] + weightedDutyAdjustment: Scalars['Float'] + taxableShipping: Scalars['Float'] + taxableLineItemCost: Scalars['Float'] + taxableHandling: Scalars['Float'] + fulfillmentFields?: Maybe>> + isAssemblyRequired?: Maybe + parentItemId?: Maybe + childItemIds?: Maybe> + giftCards?: Maybe>> +} + +export type ShipmentStatusReason = { + __typename?: 'ShipmentStatusReason' + _get?: Maybe + _root?: Maybe + reasonCode?: Maybe + moreInfo?: Maybe +} + +export type ShipmentStatusReason_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShipmentStatusReasonInput = { + reasonCode?: Maybe + moreInfo?: Maybe +} + +export type ShippingAddressInput = { + addressID: Scalars['Int'] + addressLine1: Scalars['String'] + city: Scalars['String'] + countryCode: Scalars['String'] + customerID: Scalars['Int'] + latitude: Scalars['Float'] + longitude: Scalars['Float'] + phone: Scalars['String'] + postalCode: Scalars['String'] + state: Scalars['String'] +} + +export type ShippingDiscount = { + __typename?: 'ShippingDiscount' + _get?: Maybe + _root?: Maybe + methodCode?: Maybe + discount?: Maybe +} + +export type ShippingDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShippingDiscountInput = { + methodCode?: Maybe + discount?: Maybe +} + +export type ShippingMethodMappings = { + __typename?: 'ShippingMethodMappings' + _get?: Maybe + _root?: Maybe + shippingMethods?: Maybe> + returnLabelShippingMethod?: Maybe + standardDefault?: Maybe + express1DayDefault?: Maybe + express2DayDefault?: Maybe + express3DayDefault?: Maybe + enableSmartPost?: Maybe + internationalUsReturnLabelShippingMethod?: Maybe +} + +export type ShippingMethodMappings_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShippingOriginContact = { + __typename?: 'ShippingOriginContact' + _get?: Maybe + _root?: Maybe + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumber?: Maybe + email?: Maybe +} + +export type ShippingOriginContact_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShippingOriginContactInput = { + firstName?: Maybe + middleNameOrInitial?: Maybe + lastNameOrSurname?: Maybe + companyOrOrganization?: Maybe + phoneNumber?: Maybe + email?: Maybe +} + +export type ShippingRate = { + __typename?: 'ShippingRate' + _get?: Maybe + _root?: Maybe + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + shippingZoneCode?: Maybe + isValid?: Maybe + messages?: Maybe> + data?: Maybe + currencyCode?: Maybe + price?: Maybe +} + +export type ShippingRate_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShippingRateInput = { + shippingMethodCode?: Maybe + shippingMethodName?: Maybe + shippingZoneCode?: Maybe + isValid?: Maybe + messages?: Maybe> + data?: Maybe + currencyCode?: Maybe + price?: Maybe +} + +export type ShopperNotes = { + __typename?: 'ShopperNotes' + _get?: Maybe + _root?: Maybe + giftMessage?: Maybe + comments?: Maybe + deliveryInstructions?: Maybe +} + +export type ShopperNotes_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ShopperNotesInput = { + giftMessage?: Maybe + comments?: Maybe + deliveryInstructions?: Maybe +} + +export type SolrDebugInfo = { + __typename?: 'SolrDebugInfo' + _get?: Maybe + _root?: Maybe + searchTuningRuleCode?: Maybe + boostedProductCodes?: Maybe> + blockedProductCodes?: Maybe> + boostQueries?: Maybe> + boostFunctions?: Maybe> +} + +export type SolrDebugInfo_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SplitShipmentsObjectInput = { + originalShipment?: Maybe + newShipments?: Maybe>> +} + +export type SubPayment = { + __typename?: 'SubPayment' + _get?: Maybe + _root?: Maybe + status?: Maybe + amountCollected: Scalars['Float'] + amountCredited: Scalars['Float'] + amountRequested: Scalars['Float'] + amountRefunded: Scalars['Float'] + target?: Maybe +} + +export type SubPayment_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SubPaymentInput = { + status?: Maybe + amountCollected: Scalars['Float'] + amountCredited: Scalars['Float'] + amountRequested: Scalars['Float'] + amountRefunded: Scalars['Float'] + target?: Maybe +} + +export type SuggestedDiscount = { + __typename?: 'SuggestedDiscount' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + autoAdd?: Maybe + discountId: Scalars['Int'] + hasMultipleProducts?: Maybe + hasOptions?: Maybe +} + +export type SuggestedDiscount_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SuggestedDiscountInput = { + productCode?: Maybe + autoAdd?: Maybe + discountId: Scalars['Int'] + hasMultipleProducts?: Maybe + hasOptions?: Maybe +} + +export type SuggestionEvent = { + __typename?: 'SuggestionEvent' + _get?: Maybe + _root?: Maybe + causeID: Scalars['Int'] + errors: Array + name: Scalars['String'] + type?: Maybe +} + +export type SuggestionEvent_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SuggestionLog = { + __typename?: 'SuggestionLog' + _get?: Maybe + _root?: Maybe + created: Scalars['DateTime'] + creatorUsername: Scalars['String'] + environmentID: Scalars['Int'] + events: Array> + externalResponseID: Scalars['String'] + orderID: Scalars['Int'] + pathString: Scalars['String'] + persisted?: Maybe + siteID: Scalars['Int'] + suggestionID: Scalars['Int'] + tenantID: Scalars['Int'] + updated: Scalars['DateTime'] + updaterUsername: Scalars['String'] +} + +export type SuggestionLog_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type SuggestionRequestInput = { + bundlingStrategy?: Maybe + customData: Scalars['Object'] + environmentID: Scalars['Int'] + exclusionListLocationCode: Array> + externalResponseID: Scalars['String'] + fraud: Scalars['Int'] + inventoryRequestType?: Maybe + isExpress?: Maybe + items: Array> + locationCodeWhiteList: Array + numShipmentsNotInRequest: Scalars['Int'] + orderID: Scalars['Int'] + orderType?: Maybe + pickupLocationCode: Scalars['String'] + shippingAddress?: Maybe + total: Scalars['Float'] +} + +export type SuggestionResponse = { + __typename?: 'SuggestionResponse' + _get?: Maybe + _root?: Maybe + assignmentSuggestions: Scalars['Object'] + availableLocations: Array + externalResponseID: Scalars['String'] + responseID: Scalars['Int'] + stateChangeSuggestions: Scalars['Object'] + suggestionLog?: Maybe +} + +export type SuggestionResponse_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TargetRule = { + __typename?: 'TargetRule' + _get?: Maybe + _root?: Maybe + code?: Maybe + description?: Maybe + domain?: Maybe + expression?: Maybe +} + +export type TargetRule_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TargetRuleCollection = { + __typename?: 'TargetRuleCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type TargetRuleCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TargetRuleInput = { + code?: Maybe + description?: Maybe + domain?: Maybe + expression?: Maybe +} + +export type TaskInput = { + __typename?: 'TaskInput' + _get?: Maybe + _root?: Maybe + helpMessage?: Maybe + label?: Maybe + maxLength?: Maybe + maximum: Scalars['Float'] + minLength?: Maybe + minimum: Scalars['Float'] + name?: Maybe + options?: Maybe> + pattern?: Maybe + required?: Maybe + type?: Maybe +} + +export type TaskInput_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TaskInputInput = { + helpMessage?: Maybe + label?: Maybe + maxLength?: Maybe + maximum: Scalars['Float'] + minLength?: Maybe + minimum: Scalars['Float'] + name?: Maybe + options?: Maybe> + pattern?: Maybe + required?: Maybe + type?: Maybe +} + +export type ThresholdMessage = { + __typename?: 'ThresholdMessage' + _get?: Maybe + _root?: Maybe + discountId: Scalars['Int'] + message?: Maybe + thresholdValue: Scalars['Float'] + showOnCheckout?: Maybe + showInCart?: Maybe + requiresCouponCode?: Maybe +} + +export type ThresholdMessage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ThresholdMessageInput = { + discountId: Scalars['Int'] + message?: Maybe + thresholdValue: Scalars['Float'] + showOnCheckout?: Maybe + showInCart?: Maybe + requiresCouponCode?: Maybe +} + +export type Tracking = { + __typename?: 'Tracking' + _get?: Maybe + _root?: Maybe + attributes?: Maybe + number?: Maybe + url?: Maybe +} + +export type Tracking_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TrackingInput = { + attributes?: Maybe + number?: Maybe + url?: Maybe +} + +export type Transaction = { + __typename?: 'Transaction' + _get?: Maybe + _root?: Maybe + transactionId?: Maybe + visitId?: Maybe + transactionType?: Maybe + interactionType?: Maybe + amount: Scalars['Float'] + date: Scalars['DateTime'] + currencyCode?: Maybe +} + +export type Transaction_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type TransactionInput = { + transactionId?: Maybe + visitId?: Maybe + transactionType?: Maybe + interactionType?: Maybe + amount: Scalars['Float'] + date: Scalars['DateTime'] + currencyCode?: Maybe +} + +export enum TypeEnum { + NewRequest = 'NEW_REQUEST', + RouteSelected = 'ROUTE_SELECTED', + MakeLocationsAvailable = 'MAKE_LOCATIONS_AVAILABLE', + NoRouteFound = 'NO_ROUTE_FOUND', + RemovedInactiveLocations = 'REMOVED_INACTIVE_LOCATIONS', + RemovedOnHoldLocations = 'REMOVED_ON_HOLD_LOCATIONS', + RemovedOverfulfilledLocations = 'REMOVED_OVERFULFILLED_LOCATIONS', + Group = 'GROUP', + GroupFilter = 'GROUP_FILTER', + GroupSort = 'GROUP_SORT', + Filter = 'FILTER', + Sort = 'SORT', + AfterAction = 'AFTER_ACTION', + FoundFullOrderLocation = 'FOUND_FULL_ORDER_LOCATION', + Response = 'RESPONSE', + AfterActionSort = 'AFTER_ACTION_SORT', + DefaultResponse = 'DEFAULT_RESPONSE', + MaxSplitsExceeded = 'MAX_SPLITS_EXCEEDED', + AutoAssignLimitExceeded = 'AUTO_ASSIGN_LIMIT_EXCEEDED', + InventoryRequest = 'INVENTORY_REQUEST', + RemovedInternationalLocations = 'REMOVED_INTERNATIONAL_LOCATIONS', +} + +export type UserRole = { + __typename?: 'UserRole' + _get?: Maybe + _root?: Maybe + userId?: Maybe + assignedInScope?: Maybe + roleId: Scalars['Int'] + roleName?: Maybe + roleTags?: Maybe> + auditInfo?: Maybe +} + +export type UserRole_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type UserRoleCollection = { + __typename?: 'UserRoleCollection' + _get?: Maybe + _root?: Maybe + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type UserRoleCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type UserRoleInput = { + userId?: Maybe + assignedInScope?: Maybe + roleId: Scalars['Int'] + roleName?: Maybe + roleTags?: Maybe> + auditInfo?: Maybe +} + +export type UserScope = { + __typename?: 'UserScope' + _get?: Maybe + _root?: Maybe + type?: Maybe + id?: Maybe + name?: Maybe +} + +export type UserScope_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type UserScopeInput = { + type?: Maybe + id?: Maybe + name?: Maybe +} + +export type ValidationMessage = { + __typename?: 'ValidationMessage' + _get?: Maybe + _root?: Maybe + severity?: Maybe + source?: Maybe + message?: Maybe + validationType?: Maybe + sourceId?: Maybe +} + +export type ValidationMessage_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type VariationOption = { + __typename?: 'VariationOption' + _get?: Maybe + _root?: Maybe + valueSequence: Scalars['Int'] + attributeFQN?: Maybe + value?: Maybe +} + +export type VariationOption_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type VariationSummary = { + __typename?: 'VariationSummary' + _get?: Maybe + _root?: Maybe + productCode?: Maybe + options?: Maybe>> + inventoryInfo?: Maybe +} + +export type VariationSummary_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type View = { + __typename?: 'View' + _get?: Maybe + _root?: Maybe + name?: Maybe + usages?: Maybe> + metadata?: Maybe + isVisibleInStorefront?: Maybe + filter?: Maybe + includeInactiveMode?: Maybe + isAdminDefault?: Maybe + fields?: Maybe>> +} + +export type View_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ViewField = { + __typename?: 'ViewField' + _get?: Maybe + _root?: Maybe + name?: Maybe + target?: Maybe +} + +export type ViewField_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type ViewFieldInput = { + name?: Maybe + target?: Maybe +} + +export type ViewInput = { + name?: Maybe + usages?: Maybe> + metadata?: Maybe + isVisibleInStorefront?: Maybe + filter?: Maybe + includeInactiveMode?: Maybe + isAdminDefault?: Maybe + fields?: Maybe>> +} + +export type Wishlist = { + __typename?: 'Wishlist' + _get?: Maybe + _root?: Maybe + customerAccountId?: Maybe + typeTag?: Maybe + name?: Maybe + items?: Maybe>> + privacyType?: Maybe + sortOrder?: Maybe + version?: Maybe + isImport?: Maybe + importDate?: Maybe + externalId?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type Wishlist_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type WishlistCollection = { + __typename?: 'WishlistCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type WishlistCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type WishlistInput = { + customerAccountId?: Maybe + typeTag?: Maybe + name?: Maybe + items?: Maybe>> + privacyType?: Maybe + sortOrder?: Maybe + version?: Maybe + isImport?: Maybe + importDate?: Maybe + externalId?: Maybe + userId?: Maybe + id?: Maybe + tenantId?: Maybe + siteId?: Maybe + channelCode?: Maybe + currencyCode?: Maybe + visitId?: Maybe + webSessionId?: Maybe + customerInteractionType?: Maybe + fulfillmentInfo?: Maybe + orderDiscounts?: Maybe>> + suggestedDiscounts?: Maybe>> + rejectedDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + subtotal?: Maybe + discountedSubtotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + shippingTotal?: Maybe + shippingSubTotal?: Maybe + shippingTaxTotal?: Maybe + handlingTaxTotal?: Maybe + itemTaxTotal?: Maybe + taxTotal?: Maybe + feeTotal?: Maybe + total?: Maybe + lineItemSubtotalWithOrderAdjustments?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + lastValidationDate?: Maybe + expirationDate?: Maybe + changeMessages?: Maybe>> + extendedProperties?: Maybe>> + discountThresholdMessages?: Maybe>> + auditInfo?: Maybe +} + +export type WishlistItem = { + __typename?: 'WishlistItem' + _get?: Maybe + _root?: Maybe + id?: Maybe + comments?: Maybe + priorityType?: Maybe + purchasableStatusType?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type WishlistItem_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type WishlistItemCollection = { + __typename?: 'WishlistItemCollection' + _get?: Maybe + _root?: Maybe + startIndex: Scalars['Int'] + pageSize: Scalars['Int'] + pageCount: Scalars['Int'] + totalCount: Scalars['Int'] + items?: Maybe>> +} + +export type WishlistItemCollection_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type WishlistItemInput = { + id?: Maybe + comments?: Maybe + priorityType?: Maybe + purchasableStatusType?: Maybe + localeCode?: Maybe + purchaseLocation?: Maybe + lineId?: Maybe + product?: Maybe + quantity: Scalars['Int'] + isRecurring?: Maybe + isTaxable?: Maybe + subtotal?: Maybe + extendedTotal?: Maybe + taxableTotal?: Maybe + discountTotal?: Maybe + discountedTotal?: Maybe + itemTaxTotal?: Maybe + shippingTaxTotal?: Maybe + shippingTotal?: Maybe + handlingAmount?: Maybe + feeTotal?: Maybe + total?: Maybe + unitPrice?: Maybe + productDiscount?: Maybe + productDiscounts?: Maybe>> + shippingDiscounts?: Maybe>> + data?: Maybe + taxData?: Maybe + auditInfo?: Maybe + shippingAmountBeforeDiscountsAndAdjustments?: Maybe + weightedOrderAdjustment?: Maybe + weightedOrderDiscount?: Maybe + adjustedLineItemSubtotal?: Maybe + totalWithoutWeightedShippingAndHandling?: Maybe + weightedOrderTax?: Maybe + weightedOrderShipping?: Maybe + weightedOrderShippingDiscount?: Maybe + weightedOrderShippingManualAdjustment?: Maybe + weightedOrderShippingTax?: Maybe + weightedOrderHandlingFee?: Maybe + weightedOrderHandlingFeeTax?: Maybe + weightedOrderHandlingFeeDiscount?: Maybe + weightedOrderDuty?: Maybe + totalWithWeightedShippingAndHandling?: Maybe + weightedOrderHandlingAdjustment?: Maybe + autoAddDiscountId?: Maybe + isAssemblyRequired?: Maybe + childItemIds?: Maybe> + parentItemId?: Maybe +} + +export type WorkflowState = { + __typename?: 'WorkflowState' + _get?: Maybe + _root?: Maybe + attributes?: Maybe + auditInfo?: Maybe + completedDate?: Maybe + processInstanceId?: Maybe + shipmentState?: Maybe + taskList?: Maybe>> +} + +export type WorkflowState_GetArgs = { + path: Scalars['String'] + defaultValue?: Maybe + allowUndefined?: Maybe +} + +export type WorkflowStateInput = { + attributes?: Maybe + auditInfo?: Maybe + completedDate?: Maybe + processInstanceId?: Maybe + shipmentState?: Maybe + taskList?: Maybe>> +} diff --git a/packages/kibocommerce/schema.graphql b/packages/kibocommerce/schema.graphql new file mode 100644 index 0000000..8d02ae5 --- /dev/null +++ b/packages/kibocommerce/schema.graphql @@ -0,0 +1,9129 @@ +input AccountPasswordInfoCollectionInput { + totalCount: Int! + items: [AccountPasswordInfoInput] +} + +input AccountPasswordInfoInput { + accountId: Int! + userId: String + unlockAccount: Boolean = false + passwordInfo: PasswordInfoInput +} + +type AccountSalesRep { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AccountSalesRep + accountId: Int! + adminUserId: String +} + +input AccountSalesRepInput { + accountId: Int! + adminUserId: String +} + +type ActiveDateRange { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ActiveDateRange + startDate: DateTime + endDate: DateTime +} + +input ActiveDateRangeInput { + startDate: DateTime + endDate: DateTime +} + +input AddressValidationRequestInput { + address: CuAddressInput +} + +type AddressValidationResponse { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AddressValidationResponse + addressCandidates: [CuAddress] +} + +type Adjustment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Adjustment + amount: Float + description: String + internalComment: String +} + +input AdjustmentInput { + amount: Float + description: String + internalComment: String +} + +""" +The `AnyScalar` type allows any scalar value by examining the input and passing the serialize, parseValue, and parseLiteral operations to their respective types. +""" +scalar AnyScalar + +type AppliedLineItemProductDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AppliedLineItemProductDiscount + appliesToSalePrice: Boolean + discountQuantity: Int! + productQuantity: Int + impactPerUnit: Float +} + +input AppliedLineItemProductDiscountInput { + appliesToSalePrice: Boolean = false + discountQuantity: Int! + productQuantity: Int + impactPerUnit: Float +} + +type AppliedLineItemShippingDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AppliedLineItemShippingDiscount + methodCode: String + discount: CrAppliedDiscount + discountQuantity: Int! + impactPerUnit: Float! +} + +input AppliedLineItemShippingDiscountInput { + methodCode: String + discount: CrAppliedDiscountInput + discountQuantity: Int! + impactPerUnit: Float! +} + +type AttributeDetail { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AttributeDetail + valueType: String + inputType: String + dataType: String + usageType: String + dataTypeSequence: Int! + name: String + description: String + validation: PrAttributeValidation + searchableInStorefront: Boolean + searchDisplayValue: Boolean + allowFilteringAndSortingInStorefront: Boolean + indexValueWithCase: Boolean + customWeightInStorefrontSearch: Boolean + displayIntention: String +} + +type AttributeVocabularyValueDisplayInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AttributeVocabularyValueDisplayInfo + cmsId: String + imageUrl: String + colorValue: String +} + +type AuditRecord { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AuditRecord + id: String + changes: [AuditRecordChange] + auditInfo: CrAuditInfo +} + +type AuditRecordChange { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AuditRecordChange + type: String + path: String + fields: [AuditRecordChangeField] +} + +type AuditRecordChangeField { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: AuditRecordChangeField + name: String + oldValue: String + newValue: String +} + +input AuditRecordChangeFieldInput { + name: String + oldValue: String + newValue: String +} + +input AuditRecordChangeInput { + type: String + path: String + fields: [AuditRecordChangeFieldInput] +} + +input AuditRecordInput { + id: String + changes: [AuditRecordChangeInput] + auditInfo: CrAuditInfoInput +} + +type B2BAccount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: B2BAccount + users: [B2BUser] + isActive: Boolean + priceList: String + salesReps: [AccountSalesRep] + rootAccountId: Int + parentAccountId: Int + approvalStatus: String + id: Int! + customerSet: String + commerceSummary: CommerceSummary + contacts: [CustomerContact] + companyOrOrganization: String + notes: [CustomerNote] + attributes: [CustomerAttribute] + segments: [CustomerSegment] + taxId: String + externalId: String + auditInfo: CuAuditInfo + customerSinceDate: DateTime + accountType: String +} + +type B2BAccountCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: B2BAccountCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [B2BAccount] +} + +input B2BAccountInput { + users: [B2BUserInput] + isActive: Boolean = false + priceList: String + salesReps: [AccountSalesRepInput] + rootAccountId: Int + parentAccountId: Int + approvalStatus: String + id: Int! + customerSet: String + commerceSummary: CommerceSummaryInput + contacts: [CustomerContactInput] + companyOrOrganization: String + notes: [CustomerNoteInput] + attributes: [CustomerAttributeInput] + segments: [CustomerSegmentInput] + taxId: String + externalId: String + auditInfo: CuAuditInfoInput + customerSinceDate: DateTime + accountType: String +} + +type B2BUser { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: B2BUser + emailAddress: String + userName: String + firstName: String + lastName: String + localeCode: String + userId: String + roles: [UserRole] + isLocked: Boolean + isActive: Boolean + isRemoved: Boolean + acceptsMarketing: Boolean + hasExternalPassword: Boolean +} + +input B2BUserAndAuthInfoInput { + b2BUser: B2BUserInput + externalPassword: String + isImport: Boolean = false +} + +type B2BUserCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: B2BUserCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [B2BUser] +} + +input B2BUserInput { + emailAddress: String + userName: String + firstName: String + lastName: String + localeCode: String + userId: String + roles: [UserRoleInput] + isLocked: Boolean = false + isActive: Boolean = false + isRemoved: Boolean = false + acceptsMarketing: Boolean = false + hasExternalPassword: Boolean = false +} + +type BillingInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: BillingInfo + paymentType: String + paymentWorkflow: String + billingContact: Contact + isSameBillingShippingAddress: Boolean + card: PaymentCard + token: PaymentToken + purchaseOrder: PurchaseOrderPayment + check: CheckPayment + auditInfo: CrAuditInfo + storeCreditCode: String + storeCreditType: String + customCreditType: String + externalTransactionId: String + data: Object +} + +input BillingInfoInput { + paymentType: String + paymentWorkflow: String + billingContact: ContactInput + isSameBillingShippingAddress: Boolean = false + card: PaymentCardInput + token: PaymentTokenInput + purchaseOrder: PurchaseOrderPaymentInput + check: CheckPaymentInput + auditInfo: CrAuditInfoInput + storeCreditCode: String + storeCreditType: String + customCreditType: String + externalTransactionId: String + data: Object +} + +type BoxType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: BoxType + name: String + height: Float + width: Float + length: Float +} + +type BpmConfiguration { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: BpmConfiguration + shipmentType: String + workflowContainerId: String + workflowProcessId: String +} + +type BundledProductSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: BundledProductSummary + productShortDescription: String + productName: String + productCode: String + goodsType: String + quantity: Int! + measurements: PrPackageMeasurements + isPackagedStandAlone: Boolean + inventoryInfo: ProductInventoryInfo + optionAttributeFQN: String + optionValue: Object + creditValue: Float + productType: String +} + +enum BundlingStrategyEnum { + ITEM_DEPENDENCY +} + +type CancelReasonCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CancelReasonCollection + totalCount: Int! + items: [CancelReasonItem] +} + +type CancelReasonItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CancelReasonItem + reasonCode: String + name: String + needsMoreInfo: Boolean +} + +type CanceledItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CanceledItem + canceledReason: CanceledReason + auditInfo: CrAuditInfo + lineId: Int! + originalOrderItemId: String + parentId: String + productCode: String + variationProductCode: String + optionAttributeFQN: String + name: String + fulfillmentLocationCode: String + imageUrl: String + isTaxable: Boolean + quantity: Int! + unitPrice: Float! + actualPrice: Float! + overridePrice: Float + itemDiscount: Float! + lineItemCost: Float! + itemTax: Float! + shipping: Float! + shippingDiscount: Float! + shippingTax: Float! + handling: Float! + handlingDiscount: Float! + handlingTax: Float! + duty: Float! + isPackagedStandAlone: Boolean + readyForPickupQuantity: Int + backorderReleaseDate: DateTime + measurements: CrPackageMeasurements + options: [CrProductOption] + data: Object + taxData: Object + weightedShipmentAdjustment: Float! + weightedLineItemTaxAdjustment: Float! + weightedShippingAdjustment: Float! + weightedShippingTaxAdjustment: Float! + weightedHandlingAdjustment: Float! + weightedHandlingTaxAdjustment: Float! + weightedDutyAdjustment: Float! + taxableShipping: Float! + taxableLineItemCost: Float! + taxableHandling: Float! + fulfillmentFields: [FulfillmentField] + isAssemblyRequired: Boolean + parentItemId: String + childItemIds: [String!] + giftCards: [GiftCard] +} + +input CanceledItemInput { + canceledReason: CanceledReasonInput + auditInfo: CrAuditInfoInput + lineId: Int! + originalOrderItemId: String + parentId: String + productCode: String + variationProductCode: String + optionAttributeFQN: String + name: String + fulfillmentLocationCode: String + imageUrl: String + isTaxable: Boolean = false + quantity: Int! + unitPrice: Float! + actualPrice: Float! + overridePrice: Float + itemDiscount: Float! + lineItemCost: Float! + itemTax: Float! + shipping: Float! + shippingDiscount: Float! + shippingTax: Float! + handling: Float! + handlingDiscount: Float! + handlingTax: Float! + duty: Float! + isPackagedStandAlone: Boolean = false + readyForPickupQuantity: Int + backorderReleaseDate: DateTime + measurements: CrPackageMeasurementsInput + options: [CrProductOptionInput] + data: Object + taxData: Object + weightedShipmentAdjustment: Float! + weightedLineItemTaxAdjustment: Float! + weightedShippingAdjustment: Float! + weightedShippingTaxAdjustment: Float! + weightedHandlingAdjustment: Float! + weightedHandlingTaxAdjustment: Float! + weightedDutyAdjustment: Float! + taxableShipping: Float! + taxableLineItemCost: Float! + taxableHandling: Float! + fulfillmentFields: [FulfillmentFieldInput] + isAssemblyRequired: Boolean = false + parentItemId: String + childItemIds: [String!] + giftCards: [GiftCardInput] +} + +type CanceledReason { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CanceledReason + reasonCode: String + description: String + moreInfo: String +} + +input CanceledReasonInput { + reasonCode: String + description: String + moreInfo: String +} + +type CapturableShipmentSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CapturableShipmentSummary + shipmentNumber: Int! + shipmentTotal: Float! + amountApplied: Float! +} + +input CapturableShipmentSummaryInput { + shipmentNumber: Int! + shipmentTotal: Float! + amountApplied: Float! +} + +type Card { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Card + id: String + nameOnCard: String + cardType: String + expireMonth: Int + expireYear: Int + cardNumberPart: String + contactId: Int! + isDefaultPayMethod: Boolean +} + +type CardCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CardCollection + totalCount: Int! + items: [Card] +} + +input CardInput { + id: String + nameOnCard: String + cardType: String + expireMonth: Int + expireYear: Int + cardNumberPart: String + contactId: Int! + isDefaultPayMethod: Boolean = false +} + +type Carrier { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Carrier + carrierType: String + isEnabled: Boolean + shippingMethodMappings: ShippingMethodMappings +} + +type CarrierServiceGenerateLabelResponse { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CarrierServiceGenerateLabelResponse + imageURL: String + integratorId: String + price: Float + trackingNumber: String +} + +type Cart { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Cart + items: [CartItem] + couponCodes: [String!] + invalidCoupons: [InvalidCoupon] + priceListCode: String + cartMessage: CartMessage + cartMessages: [CartMessage] + handlingAmount: Float + handlingSubTotal: Float + handlingTotal: Float + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfo + orderDiscounts: [CrAppliedDiscount] + suggestedDiscounts: [SuggestedDiscount] + rejectedDiscounts: [SuggestedDiscount] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessage] + extendedProperties: [ExtendedProperty] + discountThresholdMessages: [ThresholdMessage] + auditInfo: CrAuditInfo +} + +type CartChangeMessageCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CartChangeMessageCollection + totalCount: Int! + items: [ChangeMessage] +} + +input CartInput { + items: [CartItemInput] + couponCodes: [String!] + invalidCoupons: [InvalidCouponInput] + priceListCode: String + cartMessage: CartMessageInput + cartMessages: [CartMessageInput] + handlingAmount: Float + handlingSubTotal: Float + handlingTotal: Float + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfoInput + orderDiscounts: [CrAppliedDiscountInput] + suggestedDiscounts: [SuggestedDiscountInput] + rejectedDiscounts: [SuggestedDiscountInput] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessageInput] + extendedProperties: [ExtendedPropertyInput] + discountThresholdMessages: [ThresholdMessageInput] + auditInfo: CrAuditInfoInput +} + +type CartItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CartItem + id: String + fulfillmentLocationCode: String + fulfillmentMethod: String + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProduct + quantity: Int! + isRecurring: Boolean + isTaxable: Boolean + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPrice + productDiscount: AppliedLineItemProductDiscount + productDiscounts: [AppliedLineItemProductDiscount] + shippingDiscounts: [AppliedLineItemShippingDiscount] + data: Object + taxData: Object + auditInfo: CrAuditInfo + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean + childItemIds: [String!] + parentItemId: String +} + +type CartItemCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CartItemCollection + totalCount: Int! + items: [CartItem] +} + +input CartItemInput { + id: String + fulfillmentLocationCode: String + fulfillmentMethod: String + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProductInput + quantity: Int! + isRecurring: Boolean = false + isTaxable: Boolean = false + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPriceInput + productDiscount: AppliedLineItemProductDiscountInput + productDiscounts: [AppliedLineItemProductDiscountInput] + shippingDiscounts: [AppliedLineItemShippingDiscountInput] + data: Object + taxData: Object + auditInfo: CrAuditInfoInput + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean = false + childItemIds: [String!] + parentItemId: String +} + +type CartMessage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CartMessage + message: String + messageType: String + productsRemoved: [CrProduct] +} + +input CartMessageInput { + message: String + messageType: String + productsRemoved: [CrProductInput] +} + +type CartSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CartSummary + itemCount: Int + totalQuantity: Int + total: Float + isExpired: Boolean + hasActiveCart: Boolean +} + +type CategoryCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CategoryCollection + totalCount: Int! + items: [PrCategory] +} + +type CategoryContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CategoryContent + categoryImages: [CategoryImage] + name: String + description: String + pageTitle: String + metaTagTitle: String + metaTagDescription: String + metaTagKeywords: String + slug: String +} + +type CategoryImage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CategoryImage + imageLabel: String + altText: String + imageUrl: String + cmsId: String + videoUrl: String + mediaType: String + sequence: Int +} + +type CategoryPagedCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CategoryPagedCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [PrCategory] +} + +type ChangeMessage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChangeMessage + id: String + correlationId: String + userId: String + userFirstName: String + userLastName: String + userScopeType: String + appId: String + appKey: String + appName: String + subjectType: String + success: Boolean + identifier: String + subject: String + verb: String + message: String + metadata: Object + oldValue: String + newValue: String + amount: Float + createDate: DateTime +} + +input ChangeMessageInput { + id: String + correlationId: String + userId: String + userFirstName: String + userLastName: String + userScopeType: String + appId: String + appKey: String + appName: String + subjectType: String + success: Boolean = false + identifier: String + subject: String + verb: String + message: String + metadata: Object + oldValue: String + newValue: String + amount: Float + createDate: DateTime +} + +type ChangePasswordResult { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChangePasswordResult + accountId: Int! + succeeded: Boolean + errorMessage: String +} + +type ChangePasswordResultCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChangePasswordResultCollection + totalCount: Int! + items: [ChangePasswordResult] +} + +type Channel { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Channel + tenantId: Int! + code: String + name: String + region: String + countryCode: String + groupCode: String + siteIds: [Int!] + auditInfo: CrAuditInfo +} + +type ChannelCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChannelCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Channel] +} + +type ChannelGroup { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChannelGroup + tenantId: Int! + code: String + name: String + auditInfo: CrAuditInfo +} + +type ChannelGroupCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ChannelGroupCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [ChannelGroup] +} + +input ChannelGroupInput { + tenantId: Int! + code: String + name: String + auditInfo: CrAuditInfoInput +} + +input ChannelInput { + tenantId: Int! + code: String + name: String + region: String + countryCode: String + groupCode: String + siteIds: [Int!] + auditInfo: CrAuditInfoInput +} + +type CheckPayment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CheckPayment + checkNumber: String +} + +input CheckPaymentInput { + checkNumber: String +} + +type Checkout { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Checkout + id: String + siteId: Int! + tenantId: Int! + number: Int + originalCartId: String + submittedDate: DateTime + type: String + items: [CrOrderItem] + groupings: [CheckoutGrouping] + auditInfo: CrAuditInfo + destinations: [Destination] + payments: [Payment] + amountRemainingForPayment: Float! + acceptsMarketing: Boolean + customerAccountId: Int + email: String + customerTaxId: String + isTaxExempt: Boolean + currencyCode: String + priceListCode: String + attributes: [OrderAttribute] + shopperNotes: ShopperNotes + availableActions: [String!] + data: Object + taxData: Object + channelCode: String + locationCode: String + ipAddress: String + sourceDevice: String + visitId: String + webSessionId: String + customerInteractionType: String + orderDiscounts: [CrAppliedDiscount] + couponCodes: [String!] + invalidCoupons: [InvalidCoupon] + suggestedDiscounts: [SuggestedDiscount] + discountThresholdMessages: [ThresholdMessage] + dutyTotal: Float + feeTotal: Float! + subTotal: Float! + itemLevelProductDiscountTotal: Float! + orderLevelProductDiscountTotal: Float! + itemTaxTotal: Float! + itemTotal: Float! + shippingSubTotal: Float! + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingTaxTotal: Float! + shippingTotal: Float! + handlingSubTotal: Float! + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingTaxTotal: Float! + handlingTotal: Float! + total: Float! +} + +input CheckoutActionInput { + actionName: String +} + +type CheckoutCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CheckoutCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Checkout] +} + +type CheckoutGroupRates { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CheckoutGroupRates + groupingId: String + shippingRates: [ShippingRate] +} + +input CheckoutGroupShippingMethodInput { + groupingId: String + shippingRate: ShippingRateInput +} + +type CheckoutGrouping { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CheckoutGrouping + id: String + destinationId: String + fulfillmentMethod: String + orderItemIds: [String!] + shippingMethodCode: String + shippingMethodName: String + standaloneGroup: Boolean + shippingDiscounts: [ShippingDiscount] + handlingDiscounts: [CrAppliedDiscount] + dutyAmount: Float + dutyTotal: Float! + shippingAmount: Float + shippingSubTotal: Float! + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingTax: Float + shippingTaxTotal: Float! + shippingTotal: Float! + handlingAmount: Float + handlingSubTotal: Float! + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingTax: Float + handlingTaxTotal: Float! + handlingTotal: Float! + taxData: Object +} + +input CheckoutGroupingInput { + id: String + destinationId: String + fulfillmentMethod: String + orderItemIds: [String!] + shippingMethodCode: String + shippingMethodName: String + standaloneGroup: Boolean = false + shippingDiscounts: [ShippingDiscountInput] + handlingDiscounts: [CrAppliedDiscountInput] + dutyAmount: Float + dutyTotal: Float! + shippingAmount: Float + shippingSubTotal: Float! + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingTax: Float + shippingTaxTotal: Float! + shippingTotal: Float! + handlingAmount: Float + handlingSubTotal: Float! + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingTax: Float + handlingTaxTotal: Float! + handlingTotal: Float! + taxData: Object +} + +input CheckoutInput { + id: String + siteId: Int! + tenantId: Int! + number: Int + originalCartId: String + submittedDate: DateTime + type: String + items: [CrOrderItemInput] + groupings: [CheckoutGroupingInput] + auditInfo: CrAuditInfoInput + destinations: [DestinationInput] + payments: [PaymentInput] + amountRemainingForPayment: Float! + acceptsMarketing: Boolean = false + customerAccountId: Int + email: String + customerTaxId: String + isTaxExempt: Boolean = false + currencyCode: String + priceListCode: String + attributes: [OrderAttributeInput] + shopperNotes: ShopperNotesInput + availableActions: [String!] + data: Object + taxData: Object + channelCode: String + locationCode: String + ipAddress: String + sourceDevice: String + visitId: String + webSessionId: String + customerInteractionType: String + orderDiscounts: [CrAppliedDiscountInput] + couponCodes: [String!] + invalidCoupons: [InvalidCouponInput] + suggestedDiscounts: [SuggestedDiscountInput] + discountThresholdMessages: [ThresholdMessageInput] + dutyTotal: Float + feeTotal: Float! + subTotal: Float! + itemLevelProductDiscountTotal: Float! + orderLevelProductDiscountTotal: Float! + itemTaxTotal: Float! + itemTotal: Float! + shippingSubTotal: Float! + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingTaxTotal: Float! + shippingTotal: Float! + handlingSubTotal: Float! + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingTaxTotal: Float! + handlingTotal: Float! + total: Float! +} + +input CoHttpContentInput { + headers: [KeyValuePair2Input] +} + +input CoHttpMethodInput { + method: String +} + +input CoHttpRequestMessageInput { + version: String + content: CoHttpContentInput + method: CoHttpMethodInput + requestUri: DateTime + headers: [KeyValuePair2Input] + properties: Object +} + +type CommerceSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CommerceSummary + totalOrderAmount: CurrencyAmount + orderCount: Int! + lastOrderDate: DateTime + wishlistCount: Int! + visitsCount: Int! +} + +input CommerceSummaryInput { + totalOrderAmount: CurrencyAmountInput + orderCount: Int! + lastOrderDate: DateTime + wishlistCount: Int! + visitsCount: Int! +} + +type CommerceUnitPrice { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CommerceUnitPrice + extendedAmount: Float + listAmount: Float + saleAmount: Float + overrideAmount: Float +} + +input CommerceUnitPriceInput { + extendedAmount: Float + listAmount: Float + saleAmount: Float + overrideAmount: Float +} + +type ConfiguredProduct { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ConfiguredProduct + productCode: String + purchaseLocation: String + fulfillmentTypesSupported: [String!] + variationProductCode: String + upc: String + mfgPartNumber: String + purchasableState: ProductPurchasableState + priceRange: ProductPriceRange + volumePriceBands: [ProductVolumePrice] + volumePriceRange: ProductPriceRange + price: ProductPrice + availableShippingDiscounts: [PrDiscount] + measurements: PrPackageMeasurements + inventoryInfo: ProductInventoryInfo + options: [ProductOption] + properties: [ProductProperty] + priceListEntryTypeProperty: ProductProperty + productImages: [ProductImage] +} + +type Contact { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Contact + id: Int + email: String + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumbers: CrPhone + address: CrAddress +} + +input ContactInput { + id: Int + email: String + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumbers: CrPhoneInput + address: CrAddressInput +} + +type ContactType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ContactType + name: String + isPrimary: Boolean +} + +input ContactTypeInput { + name: String + isPrimary: Boolean = false +} + +type Coordinates { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Coordinates + lat: Float! + lng: Float! +} + +input CoordinatesInput { + lat: Float! + lng: Float! +} + +type CrAddress { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrAddress + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean +} + +input CrAddressInput { + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean = false +} + +type CrAppliedDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrAppliedDiscount + impact: Float + discount: CrDiscount + couponCode: String + excluded: Boolean +} + +input CrAppliedDiscountInput { + impact: Float + discount: CrDiscountInput + couponCode: String + excluded: Boolean = false +} + +type CrAuditInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrAuditInfo + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +input CrAuditInfoInput { + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +type CrBundledProduct { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrBundledProduct + quantity: Int! + optionAttributeFQN: String + optionValue: Object + creditValue: Float + deltaPrice: Float + productCode: String + name: String + description: String + goodsType: String + isPackagedStandAlone: Boolean + stock: ProductStock + productReservationId: Int + allocationId: Int + allocationExpiration: DateTime + measurements: CrPackageMeasurements + fulfillmentStatus: String +} + +input CrBundledProductInput { + quantity: Int! + optionAttributeFQN: String + optionValue: Object + creditValue: Float + deltaPrice: Float + productCode: String + name: String + description: String + goodsType: String + isPackagedStandAlone: Boolean = false + stock: ProductStockInput + productReservationId: Int + allocationId: Int + allocationExpiration: DateTime + measurements: CrPackageMeasurementsInput + fulfillmentStatus: String +} + +type CrCategory { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrCategory + id: Int + parent: CrCategory +} + +input CrCategoryInput { + id: Int + parent: CrCategoryInput +} + +type CrDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrDiscount + id: Int! + name: String + itemIds: [String!] + expirationDate: DateTime + hasMultipleTargetProducts: Boolean +} + +input CrDiscountInput { + id: Int! + name: String + itemIds: [String!] + expirationDate: DateTime + hasMultipleTargetProducts: Boolean = false +} + +type CrMeasurement { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrMeasurement + unit: String + value: Float +} + +input CrMeasurementInput { + unit: String + value: Float +} + +type CrOrderItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrOrderItem + id: String + destinationId: String + originalCartItemId: String + fulfillmentLocationCode: String + fulfillmentMethod: String + dutyAmount: Float + expectedDeliveryDate: DateTime + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProduct + quantity: Int! + isRecurring: Boolean + isTaxable: Boolean + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPrice + productDiscount: AppliedLineItemProductDiscount + productDiscounts: [AppliedLineItemProductDiscount] + shippingDiscounts: [AppliedLineItemShippingDiscount] + data: Object + taxData: Object + auditInfo: CrAuditInfo + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean + childItemIds: [String!] + parentItemId: String +} + +input CrOrderItemInput { + id: String + destinationId: String + originalCartItemId: String + fulfillmentLocationCode: String + fulfillmentMethod: String + dutyAmount: Float + expectedDeliveryDate: DateTime + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProductInput + quantity: Int! + isRecurring: Boolean = false + isTaxable: Boolean = false + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPriceInput + productDiscount: AppliedLineItemProductDiscountInput + productDiscounts: [AppliedLineItemProductDiscountInput] + shippingDiscounts: [AppliedLineItemShippingDiscountInput] + data: Object + taxData: Object + auditInfo: CrAuditInfoInput + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean = false + childItemIds: [String!] + parentItemId: String +} + +type CrPackageMeasurements { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrPackageMeasurements + height: CrMeasurement + width: CrMeasurement + length: CrMeasurement + weight: CrMeasurement +} + +input CrPackageMeasurementsInput { + height: CrMeasurementInput + width: CrMeasurementInput + length: CrMeasurementInput + weight: CrMeasurementInput +} + +type CrPhone { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrPhone + home: String + mobile: String + work: String +} + +input CrPhoneInput { + home: String + mobile: String + work: String +} + +type CrProduct { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrProduct + mfgPartNumber: String + upc: String + sku: String + fulfillmentTypesSupported: [String!] + imageAlternateText: String + imageUrl: String + variationProductCode: String + options: [CrProductOption] + properties: [CrProductProperty] + categories: [CrCategory] + price: CrProductPrice + discountsRestricted: Boolean + discountsRestrictedStartDate: DateTime + discountsRestrictedEndDate: DateTime + isRecurring: Boolean + isTaxable: Boolean + productType: String + productUsage: String + bundledProducts: [CrBundledProduct] + fulfillmentFields: [FulfillmentField] + productCode: String + name: String + description: String + goodsType: String + isPackagedStandAlone: Boolean + stock: ProductStock + productReservationId: Int + allocationId: Int + allocationExpiration: DateTime + measurements: CrPackageMeasurements + fulfillmentStatus: String +} + +input CrProductInput { + mfgPartNumber: String + upc: String + sku: String + fulfillmentTypesSupported: [String!] + imageAlternateText: String + imageUrl: String + variationProductCode: String + options: [CrProductOptionInput] + properties: [CrProductPropertyInput] + categories: [CrCategoryInput] + price: CrProductPriceInput + discountsRestricted: Boolean = false + discountsRestrictedStartDate: DateTime + discountsRestrictedEndDate: DateTime + isRecurring: Boolean = false + isTaxable: Boolean = false + productType: String + productUsage: String + bundledProducts: [CrBundledProductInput] + fulfillmentFields: [FulfillmentFieldInput] + productCode: String + name: String + description: String + goodsType: String + isPackagedStandAlone: Boolean = false + stock: ProductStockInput + productReservationId: Int + allocationId: Int + allocationExpiration: DateTime + measurements: CrPackageMeasurementsInput + fulfillmentStatus: String +} + +type CrProductOption { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrProductOption + name: String + value: Object + shopperEnteredValue: Object + attributeFQN: String + dataType: String + stringValue: String +} + +input CrProductOptionInput { + name: String + value: Object + shopperEnteredValue: Object + attributeFQN: String + dataType: String + stringValue: String +} + +type CrProductPrice { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrProductPrice + price: Float + salePrice: Float + tenantOverridePrice: Float + msrp: Float + creditValue: Float + priceListCode: String + priceListEntryMode: String +} + +input CrProductPriceInput { + price: Float + salePrice: Float + tenantOverridePrice: Float + msrp: Float + creditValue: Float + priceListCode: String + priceListEntryMode: String +} + +type CrProductProperty { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrProductProperty + attributeFQN: String + name: String + dataType: String + isMultiValue: Boolean + values: [CrProductPropertyValue] +} + +input CrProductPropertyInput { + attributeFQN: String + name: String + dataType: String + isMultiValue: Boolean = false + values: [CrProductPropertyValueInput] +} + +type CrProductPropertyValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CrProductPropertyValue + stringValue: String + value: Object +} + +input CrProductPropertyValueInput { + stringValue: String + value: Object +} + +type Credit { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Credit + code: String + activationDate: DateTime + creditType: String + customCreditType: String + currencyCode: String + initialBalance: Float + currentBalance: Float + expirationDate: DateTime + customerId: Int + auditInfo: CuAuditInfo + creditTypeId: Int! +} + +type CreditAuditEntry { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CreditAuditEntry + activityType: String + details: String + auditInfo: CuAuditInfo + activityTypeId: Int! +} + +type CreditAuditEntryCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CreditAuditEntryCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CreditAuditEntry] +} + +type CreditCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CreditCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Credit] +} + +input CreditInput { + code: String + activationDate: DateTime + creditType: String + customCreditType: String + currencyCode: String + initialBalance: Float + currentBalance: Float + expirationDate: DateTime + customerId: Int + auditInfo: CuAuditInfoInput + creditTypeId: Int! +} + +type CreditTransaction { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CreditTransaction + id: Int + transactionType: String + comments: String + impactAmount: Float + auditInfo: CuAuditInfo + orderId: String + data: Object +} + +type CreditTransactionCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CreditTransactionCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CreditTransaction] +} + +input CreditTransactionInput { + id: Int + transactionType: String + comments: String + impactAmount: Float + auditInfo: CuAuditInfoInput + orderId: String + data: Object +} + +type CuAddress { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAddress + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean +} + +input CuAddressInput { + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean = false +} + +type CuAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttribute + id: Int + adminName: String + namespace: String + attributeCode: String! + inputType: String + valueType: String! + dataType: String + attributeMetadata: [CuAttributeMetadataItem] + attributeFQN: String + content: CuAttributeLocalizedContent + validation: CuAttributeValidation + vocabularyValues: [CuAttributeVocabularyValue] + auditInfo: CuAuditInfo + isActive: Boolean + isRequired: Boolean + isReadOnly: Boolean + isMultiValued: Boolean + isVisible: Boolean + order: Int + displayGroup: String! +} + +type CuAttributeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CuAttribute] +} + +input CuAttributeInput { + id: Int + adminName: String + namespace: String + attributeCode: String! + inputType: String + valueType: String! + dataType: String + attributeMetadata: [CuAttributeMetadataItemInput] + attributeFQN: String + content: CuAttributeLocalizedContentInput + validation: CuAttributeValidationInput + vocabularyValues: [CuAttributeVocabularyValueInput] + auditInfo: CuAuditInfoInput + isActive: Boolean = false + isRequired: Boolean = false + isReadOnly: Boolean = false + isMultiValued: Boolean = false + isVisible: Boolean = false + order: Int + displayGroup: String! +} + +type CuAttributeLocalizedContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeLocalizedContent + localeCode: String + value: String +} + +input CuAttributeLocalizedContentInput { + localeCode: String + value: String +} + +type CuAttributeMetadataItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeMetadataItem + key: String! + value: String! +} + +input CuAttributeMetadataItemInput { + key: String! + value: String! +} + +type CuAttributeValidation { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeValidation + regularExpression: String + minStringLength: Int + maxStringLength: Int + minNumericValue: Float + maxNumericValue: Float + minDateTime: DateTime + maxDateTime: DateTime +} + +input CuAttributeValidationInput { + regularExpression: String + minStringLength: Int + maxStringLength: Int + minNumericValue: Float + maxNumericValue: Float + minDateTime: DateTime + maxDateTime: DateTime +} + +type CuAttributeValueLocalizedContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeValueLocalizedContent + localeCode: String! + value: String! +} + +input CuAttributeValueLocalizedContentInput { + localeCode: String! + value: String! +} + +type CuAttributeVocabularyValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAttributeVocabularyValue + value: String! + sequence: Int + isHidden: Boolean + content: CuAttributeValueLocalizedContent +} + +input CuAttributeVocabularyValueInput { + value: String! + sequence: Int + isHidden: Boolean = false + content: CuAttributeValueLocalizedContentInput +} + +type CuAuditInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuAuditInfo + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +input CuAuditInfoInput { + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +type CuPhone { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CuPhone + home: String + mobile: String + work: String +} + +input CuPhoneInput { + home: String + mobile: String + work: String +} + +type CurrencyAmount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CurrencyAmount + currencyCode: String + amount: Float! +} + +input CurrencyAmountInput { + currencyCode: String + amount: Float! +} + +type CurrencyExchangeRate { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CurrencyExchangeRate + fromCurrencyCode: String + toCurrencyCode: String + rate: Float + multiplier: Float + decimalPlaces: Int + roundingStrategy: Int + referenceData: String +} + +type Customer { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Customer + customerContact: Contact + data: Object + isDestinationCommercial: Boolean +} + +type CustomerAccount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAccount + emailAddress: String + userName: String + firstName: String + lastName: String + localeCode: String + userId: String + isAnonymous: Boolean + isLocked: Boolean + isActive: Boolean + acceptsMarketing: Boolean + hasExternalPassword: Boolean + id: Int! + customerSet: String + commerceSummary: CommerceSummary + contacts: [CustomerContact] + companyOrOrganization: String + notes: [CustomerNote] + attributes: [CustomerAttribute] + segments: [CustomerSegment] + taxId: String + externalId: String + auditInfo: CuAuditInfo + customerSinceDate: DateTime + accountType: String +} + +input CustomerAccountAndAuthInfoInput { + account: CustomerAccountInput + password: String + externalPassword: String + isImport: Boolean = false +} + +type CustomerAccountCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAccountCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerAccount] +} + +input CustomerAccountInput { + emailAddress: String + userName: String + firstName: String + lastName: String + localeCode: String + userId: String + isAnonymous: Boolean = false + isLocked: Boolean = false + isActive: Boolean = false + acceptsMarketing: Boolean = false + hasExternalPassword: Boolean = false + id: Int! + customerSet: String + commerceSummary: CommerceSummaryInput + contacts: [CustomerContactInput] + companyOrOrganization: String + notes: [CustomerNoteInput] + attributes: [CustomerAttributeInput] + segments: [CustomerSegmentInput] + taxId: String + externalId: String + auditInfo: CuAuditInfoInput + customerSinceDate: DateTime + accountType: String +} + +type CustomerAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAttribute + auditInfo: CuAuditInfo + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +type CustomerAttributeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAttributeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerAttribute] +} + +input CustomerAttributeInput { + auditInfo: CuAuditInfoInput + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +type CustomerAuditEntry { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAuditEntry + customerAccountId: Int! + customerAuditEntryId: Int! + entryDate: DateTime! + entryUser: String + application: String + site: String + description: String + fieldPath: String + oldValue: String + newValue: String +} + +type CustomerAuditEntryCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAuditEntryCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerAuditEntry] +} + +type CustomerAuthTicket { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerAuthTicket + customerAccount: CustomerAccount + accessToken: String + accessTokenExpiration: DateTime! + refreshToken: String + refreshTokenExpiration: DateTime! + userId: String + jwtAccessToken: String +} + +type CustomerContact { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerContact + accountId: Int! + types: [ContactType] + auditInfo: CuAuditInfo + faxNumber: String + label: String + id: Int + email: String + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumbers: CuPhone + address: CuAddress +} + +type CustomerContactCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerContactCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerContact] +} + +input CustomerContactInput { + accountId: Int! + types: [ContactTypeInput] + auditInfo: CuAuditInfoInput + faxNumber: String + label: String + id: Int + email: String + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumbers: CuPhoneInput + address: CuAddressInput +} + +input CustomerInput { + customerContact: ContactInput + data: Object + isDestinationCommercial: Boolean = false +} + +input CustomerLoginInfoInput { + emailAddress: String + username: String + password: String + externalPassword: String + isImport: Boolean = false +} + +type CustomerNote { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerNote + id: Int! + content: String + auditInfo: CuAuditInfo +} + +type CustomerNoteCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerNoteCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerNote] +} + +input CustomerNoteInput { + id: Int! + content: String + auditInfo: CuAuditInfoInput +} + +type CustomerPurchaseOrderAccount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerPurchaseOrderAccount + id: Int! + accountId: Int! + isEnabled: Boolean + creditLimit: Float! + availableBalance: Float! + totalAvailableBalance: Float! + overdraftAllowance: Float + overdraftAllowanceType: String + customerPurchaseOrderPaymentTerms: [CustomerPurchaseOrderPaymentTerm] + auditInfo: CuAuditInfo +} + +type CustomerPurchaseOrderAccountCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerPurchaseOrderAccountCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerPurchaseOrderAccount] +} + +input CustomerPurchaseOrderAccountInput { + id: Int! + accountId: Int! + isEnabled: Boolean = false + creditLimit: Float! + availableBalance: Float! + totalAvailableBalance: Float! + overdraftAllowance: Float + overdraftAllowanceType: String + customerPurchaseOrderPaymentTerms: [CustomerPurchaseOrderPaymentTermInput] + auditInfo: CuAuditInfoInput +} + +type CustomerPurchaseOrderPaymentTerm { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerPurchaseOrderPaymentTerm + siteId: Int! + code: String + description: String + auditInfo: CuAuditInfo +} + +input CustomerPurchaseOrderPaymentTermInput { + siteId: Int! + code: String + description: String + auditInfo: CuAuditInfoInput +} + +type CustomerSegment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSegment + id: Int! + code: String + name: String + description: String + auditInfo: CuAuditInfo +} + +type CustomerSegmentCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSegmentCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerSegment] +} + +input CustomerSegmentInput { + id: Int! + code: String + name: String + description: String + auditInfo: CuAuditInfoInput +} + +type CustomerSet { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSet + code: String + name: String + description: String + auditInfo: CuAuditInfo + sites: [CustomerSetSite] + isDefault: Boolean + aggregateInfo: CustomerSetAggregateInfo +} + +type CustomerSetAggregateInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSetAggregateInfo + customerCount: Int! +} + +type CustomerSetCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSetCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [CustomerSet] +} + +type CustomerSetSite { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: CustomerSetSite + siteId: Int! + customerSetCode: String + name: String +} + +input CustomerUserAuthInfoInput { + username: String + password: String +} + +""" +DateTime custom scalar type +""" +scalar DateTime + +type Destination { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Destination + id: String + destinationContact: Contact + isDestinationCommercial: Boolean + data: Object +} + +input DestinationInput { + id: String + destinationContact: ContactInput + isDestinationCommercial: Boolean = false + data: Object +} + +type DigitalPackage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DigitalPackage + id: String + code: String + status: String + items: [DigitalPackageItem] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfo + availableActions: [String!] + changeMessages: [ChangeMessage] +} + +input DigitalPackageInput { + id: String + code: String + status: String + items: [DigitalPackageItemInput] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfoInput + availableActions: [String!] + changeMessages: [ChangeMessageInput] +} + +type DigitalPackageItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DigitalPackageItem + giftCardCode: String + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +input DigitalPackageItemInput { + giftCardCode: String + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +input DigitalWalletInput { + digitalWalletData: String + cartId: String +} + +input DiscountSelectionsInput { + discountIds: [Int!] +} + +type DiscountValidationSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DiscountValidationSummary + applicableDiscounts: [PrDiscount] +} + +type Document { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Document + id: String + name: String + path: String + publishSetCode: String + extension: String + documentTypeFQN: String + listFQN: String + contentLength: Int + contentMimeType: String + contentUpdateDate: DateTime + publishState: String + properties: Object + insertDate: DateTime + updateDate: DateTime + activeDateRange: ActiveDateRange +} + +type DocumentCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentCollection + subPaths: [String!] + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Document] +} + +type DocumentDraftSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentDraftSummary + id: String + name: String + documentTypeFQN: String + listFQN: String + activeUpdateDate: DateTime + draftUpdateDate: DateTime! + updatedBy: String + activeUpdatedBy: String + publishType: String + publishSetCode: String + masterCatalogId: Int + catalogId: Int + siteId: Int +} + +type DocumentDraftSummaryPagedCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentDraftSummaryPagedCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [DocumentDraftSummary] +} + +input DocumentInput { + id: String + name: String + path: String + publishSetCode: String + extension: String + documentTypeFQN: String + listFQN: String + contentLength: Int + contentMimeType: String + contentUpdateDate: DateTime + publishState: String + properties: Object + insertDate: DateTime + updateDate: DateTime + activeDateRange: ActiveDateRangeInput +} + +type DocumentInstallation { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentInstallation + name: String + documentTypeFQN: String + properties: Object + locale: String +} + +input DocumentInstallationInput { + name: String + documentTypeFQN: String + properties: Object + locale: String +} + +type DocumentList { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentList + name: String + namespace: String + listFQN: String + documentTypes: [String!] + supportsPublishing: Boolean + enablePublishing: Boolean + supportsActiveDateRanges: Boolean + enableActiveDateRanges: Boolean + views: [View] + usages: [String!] + security: String + scopeId: Int + scopeType: String + documentListType: String + metadata: Object +} + +type DocumentListCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentListCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [DocumentList] +} + +input DocumentListInput { + name: String + namespace: String + listFQN: String + documentTypes: [String!] + supportsPublishing: Boolean = false + enablePublishing: Boolean = false + supportsActiveDateRanges: Boolean = false + enableActiveDateRanges: Boolean = false + views: [ViewInput] + usages: [String!] + security: String + scopeId: Int + scopeType: String + documentListType: String + metadata: Object +} + +type DocumentListType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentListType + name: String + namespace: String + documentListTypeFQN: String + scopeType: String + installationPackage: String + version: String + defaultDocuments: [DocumentInstallation] + documentTypeFQNs: [String!] + supportsPublishing: Boolean + enablePublishing: Boolean + supportsActiveDateRanges: Boolean + enableActiveDateRanges: Boolean + views: [View] + usages: [String!] + metadata: Object +} + +type DocumentListTypeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentListTypeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [DocumentListType] +} + +input DocumentListTypeInput { + name: String + namespace: String + documentListTypeFQN: String + scopeType: String + installationPackage: String + version: String + defaultDocuments: [DocumentInstallationInput] + documentTypeFQNs: [String!] + supportsPublishing: Boolean = false + enablePublishing: Boolean = false + supportsActiveDateRanges: Boolean = false + enableActiveDateRanges: Boolean = false + views: [ViewInput] + usages: [String!] + metadata: Object +} + +type DocumentType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentType + name: String + namespace: String + documentTypeFQN: String + adminName: String + installationPackage: String + version: String + metadata: Object + properties: [Property] +} + +type DocumentTypeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: DocumentTypeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [DocumentType] +} + +input DocumentTypeInput { + name: String + namespace: String + documentTypeFQN: String + adminName: String + installationPackage: String + version: String + metadata: Object + properties: [PropertyInput] +} + +type EntityCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: EntityCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Object!] +} + +type EntityContainer { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: EntityContainer + tenantId: Int! + siteId: Int + masterCatalogId: Int + catalogId: Int + localeCode: String + listFullName: String + userId: String + id: String + item: Object + createBy: String + createDate: DateTime! + updateBy: String + updateDate: DateTime! +} + +type EntityContainerCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: EntityContainerCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [EntityContainer] +} + +type EntityList { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: EntityList + tenantId: Int! + nameSpace: String + name: String + contextLevel: String + useSystemAssignedId: Boolean + idProperty: IndexedProperty + indexA: IndexedProperty + indexB: IndexedProperty + indexC: IndexedProperty + indexD: IndexedProperty + isVisibleInStorefront: Boolean + isLocaleSpecific: Boolean + isShopperSpecific: Boolean + isSandboxDataCloningSupported: Boolean + views: [ListView] + usages: [String!] + metadata: Object + createDate: DateTime! + updateDate: DateTime! +} + +type EntityListCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: EntityListCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [EntityList] +} + +input EntityListInput { + tenantId: Int! + nameSpace: String + name: String + contextLevel: String + useSystemAssignedId: Boolean = false + idProperty: IndexedPropertyInput + indexA: IndexedPropertyInput + indexB: IndexedPropertyInput + indexC: IndexedPropertyInput + indexD: IndexedPropertyInput + isVisibleInStorefront: Boolean = false + isLocaleSpecific: Boolean = false + isShopperSpecific: Boolean = false + isSandboxDataCloningSupported: Boolean = false + views: [ListViewInput] + usages: [String!] + metadata: Object + createDate: DateTime! + updateDate: DateTime! +} + +input ExclusionListEntryLocationCodeInput { + locationCode: String! + orderItemID: Int! +} + +type ExtendedProperty { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ExtendedProperty + key: String + value: String +} + +input ExtendedPropertyInput { + key: String + value: String +} + +type Facet { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Facet + label: String + facetType: String + field: String + values: [FacetValue] +} + +type FacetValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: FacetValue + label: String + isApplied: Boolean + count: Int! + value: String + filterValue: String + rangeQueryValueStart: String + rangeQueryValueEnd: String + parentFacetValue: String + isDisplayed: Boolean + childrenFacetValues: [FacetValue] +} + +input FulfillmentActionInput { + actionName: String + packageIds: [String!] + pickupIds: [String!] + digitalPackageIds: [String!] +} + +type FulfillmentField { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: FulfillmentField + name: String + userEnteredValue: Object + required: Boolean +} + +input FulfillmentFieldInput { + name: String + userEnteredValue: Object + required: Boolean = false +} + +type FulfillmentInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: FulfillmentInfo + fulfillmentContact: Contact + isDestinationCommercial: Boolean + shippingMethodCode: String + shippingMethodName: String + data: Object + auditInfo: CrAuditInfo +} + +input FulfillmentInfoInput { + fulfillmentContact: ContactInput + isDestinationCommercial: Boolean = false + shippingMethodCode: String + shippingMethodName: String + data: Object + auditInfo: CrAuditInfoInput +} + +type FulfillmentShopperNotes { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: FulfillmentShopperNotes + comments: String + deliveryInstructions: String + giftMessage: String +} + +input FulfillmentShopperNotesInput { + comments: String + deliveryInstructions: String + giftMessage: String +} + +type FulfillmentTask { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: FulfillmentTask + links: Object + active: Boolean + attributes: Object + completed: Boolean + completedDate: DateTime + description: String + inputs: [TaskInput] + name: String + skippable: Boolean + subject: String + taskId: String +} + +input FulfillmentTaskInput { + links: Object + active: Boolean = false + attributes: Object + completed: Boolean = false + completedDate: DateTime + description: String + inputs: [TaskInputInput] + name: String + skippable: Boolean = false + subject: String + taskId: String +} + +type GatewayGiftCard { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: GatewayGiftCard + cardNumber: String + amount: Float! + currencyCode: String +} + +input GatewayGiftCardInput { + cardNumber: String + amount: Float! + currencyCode: String +} + +type GiftCard { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: GiftCard + activationDate: DateTime + cardNumber: String + code: String + creditType: String + creditValue: Float + currencyCode: String + currentBalance: Float + customerId: Int + expirationDate: DateTime + initialBalance: Float +} + +input GiftCardInput { + activationDate: DateTime + cardNumber: String + code: String + creditType: String + creditValue: Float + currencyCode: String + currentBalance: Float + customerId: Int + expirationDate: DateTime + initialBalance: Float +} + +type Hours { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Hours + label: String + openTime: String + closeTime: String + isClosed: Boolean +} + +input HoursInput { + label: String + openTime: String + closeTime: String + isClosed: Boolean = false +} + +type InStockNotificationSubscription { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: InStockNotificationSubscription + id: Int + email: String + customerId: Int + productCode: String + locationCode: String + userId: String + auditInfo: CuAuditInfo +} + +type InStockNotificationSubscriptionCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: InStockNotificationSubscriptionCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [InStockNotificationSubscription] +} + +input InStockNotificationSubscriptionInput { + id: Int + email: String + customerId: Int + productCode: String + locationCode: String + userId: String + auditInfo: CuAuditInfoInput +} + +type IndexedProperty { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: IndexedProperty + propertyName: String + dataType: String +} + +input IndexedPropertyInput { + propertyName: String + dataType: String +} + +type InvalidCoupon { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: InvalidCoupon + couponCode: String + reasonCode: Int! + reason: String + createDate: DateTime! + discountId: Int! +} + +input InvalidCouponInput { + couponCode: String + reasonCode: Int! + reason: String + createDate: DateTime! + discountId: Int! +} + +enum InventoryRequestTypeEnum { + ALL + PARTIAL + ANY + ALL_STORES +} + +input ItemsForDestinationInput { + destinationId: String + itemIds: [String!] +} + +type JsonNode { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: JsonNode + array: Boolean + bigDecimal: Boolean + bigInteger: Boolean + binary: Boolean + boolean: Boolean + containerNode: Boolean + double: Boolean + float: Boolean + floatingPointNumber: Boolean + int: Boolean + integralNumber: Boolean + long: Boolean + missingNode: Boolean + nodeType: NodeTypeEnum + null: Boolean + number: Boolean + object: Boolean + pojo: Boolean + short: Boolean + textual: Boolean + valueNode: Boolean +} + +input KeyValuePair2Input { + key: String + value: [String!] +} + +type ListView { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ListView + name: String + usages: [String!] + metaData: Object + security: String + filter: String + defaultSort: String + fields: [ListViewField] +} + +type ListViewCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ListViewCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [ListView] +} + +type ListViewField { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ListViewField + name: String + type: String + target: String +} + +input ListViewFieldInput { + name: String + type: String + target: String +} + +input ListViewInput { + name: String + usages: [String!] + metaData: Object + security: String + filter: String + defaultSort: String + fields: [ListViewFieldInput] +} + +type LoAddress { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAddress + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean +} + +input LoAddressInput { + address1: String + address2: String + address3: String + address4: String + cityOrTown: String + stateOrProvince: String + postalOrZipCode: String + countryCode: String + addressType: String + isValidated: Boolean = false +} + +type LoAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttribute + id: Int + adminName: String + namespace: String + attributeCode: String! + inputType: String + valueType: String! + dataType: String + attributeMetadata: [LoAttributeMetadataItem] + attributeFQN: String + content: LoAttributeLocalizedContent + validation: LoAttributeValidation + vocabularyValues: [LoAttributeVocabularyValue] + auditInfo: LoAuditInfo + isActive: Boolean + isRequired: Boolean + isReadOnly: Boolean + isMultiValued: Boolean + isVisible: Boolean + order: Int + displayGroup: String! +} + +type LoAttributeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [LoAttribute] +} + +input LoAttributeInput { + id: Int + adminName: String + namespace: String + attributeCode: String! + inputType: String + valueType: String! + dataType: String + attributeMetadata: [LoAttributeMetadataItemInput] + attributeFQN: String + content: LoAttributeLocalizedContentInput + validation: LoAttributeValidationInput + vocabularyValues: [LoAttributeVocabularyValueInput] + auditInfo: LoAuditInfoInput + isActive: Boolean = false + isRequired: Boolean = false + isReadOnly: Boolean = false + isMultiValued: Boolean = false + isVisible: Boolean = false + order: Int + displayGroup: String! +} + +type LoAttributeLocalizedContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeLocalizedContent + localeCode: String + value: String +} + +input LoAttributeLocalizedContentInput { + localeCode: String + value: String +} + +type LoAttributeMetadataItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeMetadataItem + key: String! + value: String! +} + +input LoAttributeMetadataItemInput { + key: String! + value: String! +} + +type LoAttributeValidation { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeValidation + regularExpression: String + minStringLength: Int + maxStringLength: Int + minNumericValue: Float + maxNumericValue: Float + minDateTime: DateTime + maxDateTime: DateTime +} + +input LoAttributeValidationInput { + regularExpression: String + minStringLength: Int + maxStringLength: Int + minNumericValue: Float + maxNumericValue: Float + minDateTime: DateTime + maxDateTime: DateTime +} + +type LoAttributeValueLocalizedContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeValueLocalizedContent + localeCode: String! + value: String! +} + +input LoAttributeValueLocalizedContentInput { + localeCode: String! + value: String! +} + +type LoAttributeVocabularyValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAttributeVocabularyValue + value: String! + sequence: Int + isHidden: Boolean + content: LoAttributeValueLocalizedContent +} + +input LoAttributeVocabularyValueInput { + value: String! + sequence: Int + isHidden: Boolean = false + content: LoAttributeValueLocalizedContentInput +} + +type LoAuditInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoAuditInfo + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +input LoAuditInfoInput { + updateDate: DateTime + createDate: DateTime + updateBy: String + createBy: String +} + +type LoFulfillmentType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoFulfillmentType + code: String + name: String +} + +input LoFulfillmentTypeInput { + code: String + name: String +} + +type Location { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Location + code: String + locationTypes: [LocationType] + name: String + description: String + address: LoAddress + geo: Coordinates + phone: String + fax: String + supportsInventory: Boolean + fulfillmentTypes: [LoFulfillmentType] + regularHours: RegularHours + shippingOriginContact: ShippingOriginContact + note: String + tags: [String!] + attributes: [LocationAttribute] + auditInfo: LoAuditInfo + allowFulfillmentWithNoStock: Boolean + isDisabled: Boolean + express: Boolean + transferEnabled: Boolean + includeInInventoryAggregrate: Boolean + includeInLocationExport: Boolean + warehouseEnabled: Boolean + requiresManifest: Boolean +} + +type LocationAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationAttribute + attributeDefinition: LoAttribute + auditInfo: LoAuditInfo + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +input LocationAttributeInput { + attributeDefinition: LoAttributeInput + auditInfo: LoAuditInfoInput + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +type LocationCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Location] +} + +type LocationGroup { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationGroup + locationGroupId: Int! + locationGroupCode: String + siteIds: [Int!] + name: String + locationCodes: [String!] + auditInfo: LoAuditInfo +} + +type LocationGroupCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationGroupCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [LocationGroup] +} + +type LocationGroupConfiguration { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationGroupConfiguration + tenantId: Int! + siteId: Int! + locationGroupId: Int! + locationGroupCode: String + customerFailedToPickupAfterAction: String + customerFailedToPickupDeadline: Int + sendCustomerPickupReminder: Int + enableForSTH: Boolean + enableForISPU: Boolean + enableAdvancedOptionForPickWaveCreation: Boolean + maximumNumberOfOrdersInPickWave: Int + defaultNumberOfOrdersInPickWave: Int + pickWavePrintFormat: String + closePickWavePermissions: [String!] + wmsEnabled: Boolean + enableScanningOfUpcForShipToHome: Boolean + allowReturns: Boolean + returnRefundReduction: Boolean + defaultReturnRefundReductionAmount: Int + maximumReturnRefundReductionAmount: Int + defaultCarrier: String + carriers: [Carrier] + printReturnLabel: Boolean + defaultPrinterType: String + boxTypes: [BoxType] + attributes: [LocationAttribute] + bpmConfigurations: [BpmConfiguration] + auditInfo: LoAuditInfo + autoPackingListPopup: Boolean + blockPartialStock: Boolean + defaultMaxNumberOfShipmentsInPickWave: Int + displayProductImagesInPickWaveDetails: Boolean + enablePnpForSTH: Boolean + enablePnpForBOPIS: Boolean + blockPartialCancel: Boolean + packageSettings: PackageSettings +} + +input LocationGroupInput { + locationGroupId: Int! + locationGroupCode: String + siteIds: [Int!] + name: String + locationCodes: [String!] + auditInfo: LoAuditInfoInput +} + +input LocationInput { + code: String + locationTypes: [LocationTypeInput] + name: String + description: String + address: LoAddressInput + geo: CoordinatesInput + phone: String + fax: String + supportsInventory: Boolean = false + fulfillmentTypes: [LoFulfillmentTypeInput] + regularHours: RegularHoursInput + shippingOriginContact: ShippingOriginContactInput + note: String + tags: [String!] + attributes: [LocationAttributeInput] + auditInfo: LoAuditInfoInput + allowFulfillmentWithNoStock: Boolean = false + isDisabled: Boolean = false + express: Boolean = false + transferEnabled: Boolean = false + includeInInventoryAggregrate: Boolean = false + includeInLocationExport: Boolean = false + warehouseEnabled: Boolean = false + requiresManifest: Boolean = false +} + +type LocationInventory { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationInventory + productCode: String + locationCode: String + stockAvailable: Int + softStockAvailable: Int + sku: String + mfgPartNumber: String +} + +type LocationInventoryCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationInventoryCollection + totalCount: Int! + items: [LocationInventory] +} + +input LocationInventoryQueryInput { + locationCodes: [String!] + productCodes: [String!] +} + +type LocationType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationType + code: String + name: String + auditInfo: LoAuditInfo +} + +input LocationTypeInput { + code: String + name: String + auditInfo: LoAuditInfoInput +} + +type LocationUsage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationUsage + locationUsageTypeCode: String + locationTypeCodes: [String!] + locationCodes: [String!] + auditInfo: LoAuditInfo +} + +type LocationUsageCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LocationUsageCollection + totalCount: Int! + items: [LocationUsage] +} + +input LocationUsageInput { + locationUsageTypeCode: String + locationTypeCodes: [String!] + locationCodes: [String!] + auditInfo: LoAuditInfoInput +} + +type LoginState { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: LoginState + isPasswordChangeRequired: Boolean + lastPasswordChangeOn: DateTime + isLocked: Boolean + lastLockedOn: DateTime + failedLoginAttemptCount: Int! + remainingLoginAttempts: Int! + firstFailedLoginAttemptOn: DateTime + lastLoginOn: DateTime + createdOn: DateTime + updatedOn: DateTime +} + +input MZDBHttpContentInput { + headers: [MZDBStringStringIEnumerableKeyValuePairInput] +} + +input MZDBHttpMethodInput { + method: String +} + +input MZDBHttpRequestMessageInput { + version: String + content: MZDBHttpContentInput + method: MZDBHttpMethodInput + requestUri: DateTime + headers: [MZDBStringStringIEnumerableKeyValuePairInput] + properties: Object +} + +input MZDBStringStringIEnumerableKeyValuePairInput { + key: String + value: [String!] +} + +type Mutation { + createCustomerAccountAttributeDefinition( + attributeInput: CuAttributeInput + ): CuAttribute + updateCustomerAccountAttributeDefinition( + attributeFQN: String! + attributeInput: CuAttributeInput + ): CuAttribute + validateCustomerAddress( + addressValidationRequestInput: AddressValidationRequestInput + ): AddressValidationResponse + validateAddress(addressInput: CuAddressInput): [CuAddress] + createCustomerAuthTicket( + customerUserAuthInfoInput: CustomerUserAuthInfoInput + ): CustomerAuthTicket + refreshCustomerAuthTickets(refreshToken: String): CustomerAuthTicket + createCustomerB2bAccountAttribute( + accountId: Int! + customerAttributeInput: CustomerAttributeInput + ): CustomerAttribute + deleteB2bAccountAttribute(accountId: Int!, attributeFQN: String!): Boolean + updateCustomerB2bAccountAttribute( + accountId: Int! + attributeFQN: String! + customerAttributeInput: CustomerAttributeInput + ): CustomerAttribute + createCustomerB2bAccount(b2BAccountInput: B2BAccountInput): B2BAccount + updateCustomerB2bAccount( + accountId: Int! + b2BAccountInput: B2BAccountInput + ): B2BAccount + createCustomerB2bAccountUser( + accountId: Int! + b2BUserAndAuthInfoInput: B2BUserAndAuthInfoInput + ): B2BUser + updateCustomerB2bAccountUser( + accountId: Int! + userId: String! + b2BUserInput: B2BUserInput + ): B2BUser + removeCustomerB2bAccountUser(accountId: Int!, userId: String!): Boolean + addRoleToCustomerB2bAccount( + accountId: Int! + userId: String! + roleId: Int! + ): Boolean + deleteB2bAccountRole(accountId: Int!, userId: String!, roleId: Int!): Boolean + createCustomerCredit(userId: String, creditInput: CreditInput): Credit + updateCustomerCredit(code: String!, creditInput: CreditInput): Credit + deleteCustomerCredit(code: String!): Boolean + updateCustomerCreditAssociateToShopper(code: String!): Credit + resendCustomerCreditEmail(code: String!, userId: String): Boolean + createCustomerCreditTransaction( + code: String! + creditTransactionInput: CreditTransactionInput + ): CreditTransaction + createCustomerAccountAttribute( + accountId: Int! + userId: String + customerAttributeInput: CustomerAttributeInput + ): CustomerAttribute + deleteCustomerAccountAttribute( + accountId: Int! + attributeFQN: String! + userId: String + ): Boolean + updateCustomerAccountAttribute( + accountId: Int! + attributeFQN: String! + userId: String + customerAttributeInput: CustomerAttributeInput + ): CustomerAttribute + createCustomerAccountCard(accountId: Int!, cardInput: CardInput): Card + updateCustomerAccountCard( + accountId: Int! + cardId: String! + cardInput: CardInput + ): Card + deleteCustomerAccountCard(accountId: Int!, cardId: String!): Boolean + createCustomerAccountContact( + accountId: Int! + customerContactInput: CustomerContactInput + ): CustomerContact + updateCustomerAccountContacts( + accountId: Int! + customerContactInput: CustomerContactInput + ): CustomerContactCollection + updateCustomerAccountContact( + accountId: Int! + contactId: Int! + userId: String + customerContactInput: CustomerContactInput + ): CustomerContact + deleteCustomerAccountContact(accountId: Int!, contactId: Int!): Boolean + createCustomerAccount( + customerAccountInput: CustomerAccountInput + ): CustomerAccount + updateCustomerAccount( + accountId: Int! + customerAccountInput: CustomerAccountInput + ): CustomerAccount + deleteCustomerAccount(accountId: Int!): Boolean + createCustomerAccountTransaction( + accountId: Int! + transactionInput: TransactionInput + ): Transaction + deleteCustomerAccountTransaction( + accountId: Int! + transactionId: String! + ): Boolean + recomputeCustomerAccountLifetimeValue(accountId: Int!): Boolean + createCustomerAccountNote( + accountId: Int! + customerNoteInput: CustomerNoteInput + ): CustomerNote + updateCustomerAccountNote( + accountId: Int! + noteId: Int! + customerNoteInput: CustomerNoteInput + ): CustomerNote + deleteCustomerAccountNote(accountId: Int!, noteId: Int!): Boolean + createCustomerAccountPurchaseOrderAccount( + accountId: Int! + customerPurchaseOrderAccountInput: CustomerPurchaseOrderAccountInput + ): CustomerPurchaseOrderAccount + updateCustomerPurchaseOrderAccount( + accountId: Int! + customerPurchaseOrderAccountInput: CustomerPurchaseOrderAccountInput + ): CustomerPurchaseOrderAccount + createCustomerAccountPurchaseOrderAccountTransaction( + accountId: Int! + purchaseOrderTransactionInput: PurchaseOrderTransactionInput + ): PurchaseOrderTransaction + createPurchaseOrderAccount( + startIndex: Int + pageSize: Int + sortBy: String + accountType: String + ): CustomerPurchaseOrderAccountCollection + changeCustomerAccountPassword( + accountId: Int! + unlockAccount: Boolean + userId: String + passwordInfoInput: PasswordInfoInput + ): Boolean + updateCustomerAccountPasswords( + accountPasswordInfoCollectionInput: AccountPasswordInfoCollectionInput + ): ChangePasswordResultCollection + resetCustomerAccountPassword( + resetPasswordInfoInput: ResetPasswordInfoInput + ): Boolean + createCustomerAccountLogin( + accountId: Int! + customerLoginInfoInput: CustomerLoginInfoInput + ): CustomerAuthTicket + createCustomerAccountAndLogin( + customerAccountAndAuthInfoInput: CustomerAccountAndAuthInfoInput + ): CustomerAuthTicket + setCustomerAccountLoginLocked( + accountId: Int! + userId: String + graphQLBoolean: Boolean + ): Boolean + setCustomerAccountPasswordChangeRequired( + accountId: Int! + userId: String + graphQLBoolean: Boolean + ): Boolean + createCustomerAccounts( + customerAccountAndAuthInfoInput: CustomerAccountAndAuthInfoInput + ): CustomerAccountCollection + createCustomerSegment( + customerSegmentInput: CustomerSegmentInput + ): CustomerSegment + updateCustomerSegment( + id: Int! + customerSegmentInput: CustomerSegmentInput + ): CustomerSegment + deleteCustomerSegment(id: Int!): Boolean + createCustomerSegmentAccount(id: Int!, graphQLInt: Int): Boolean + deleteCustomerSegmentAccount(id: Int!, accountId: Int!): Boolean + createInStockNotification( + inStockNotificationSubscriptionInput: InStockNotificationSubscriptionInput + ): InStockNotificationSubscription + deleteInStockNotification(id: Int!): Boolean + createResolvedPriceList(object: Object): ResolvedPriceList + configureProduct( + productCode: String! + includeOptionDetails: Boolean + skipInventoryCheck: Boolean + quantity: Int + purchaseLocation: String + variationProductCodeFilter: String + productOptionSelectionsInput: ProductOptionSelectionsInput + ): ConfiguredProduct + validateProduct( + productCode: String! + skipInventoryCheck: Boolean + quantity: Int + skipDefaults: Boolean + purchaseLocation: String + productOptionSelectionsInput: ProductOptionSelectionsInput + ): ProductValidationSummary + validateProductDiscounts( + productCode: String! + variationProductCode: String + customerAccountId: Int + allowInactive: Boolean + skipInventoryCheck: Boolean + discountSelectionsInput: DiscountSelectionsInput + ): DiscountValidationSummary + manageLocationProductInventory( + locationInventoryQueryInput: LocationInventoryQueryInput + ): LocationInventoryCollection + createProductCost( + productCostQueryInput: ProductCostQueryInput + ): ProductCostCollection + createCartForUser(userId: String!): Cart + updateUserCart(userId: String!, cartInput: CartInput): Cart + updateCurrentCart(cartInput: CartInput): Cart + deleteCurrentCart: Boolean + updateCart(cartId: String!, cartInput: CartInput): Cart + deleteCart(cartId: String!): Boolean + deleteUserCart(userId: String!): Boolean + rejectCartDiscount(cartId: String!, discountId: Int!): Cart + updateCartCoupon(cartId: String!, couponCode: String!): Cart + deleteCartCoupons(cartId: String!): Cart + deleteCartCoupon(cartId: String!, couponCode: String!): Cart + addExtendedPropertyToCurrentCart( + extendedPropertyInput: ExtendedPropertyInput + ): [ExtendedProperty] + updateCurrentCartExtendedProperties( + upsert: Boolean + extendedPropertyInput: ExtendedPropertyInput + ): [ExtendedProperty] + deleteCurrentCartExtendedProperties(graphQLString: String): Boolean + updateCurrentCartExtendedProperty( + key: String! + upsert: Boolean + extendedPropertyInput: ExtendedPropertyInput + ): ExtendedProperty + deleteCurrentCartExtendedProperty(key: String!): Boolean + deleteCurrentCartItems: Cart + addItemToCurrentCart(cartItemInput: CartItemInput): CartItem + deleteCartItems(cartId: String!): Cart + addItemToCart(cartId: String!, cartItemInput: CartItemInput): CartItem + updateCurrentCartItem( + cartItemId: String! + cartItemInput: CartItemInput + ): CartItem + deleteCurrentCartItem(cartItemId: String!): Boolean + updateCartItem( + cartId: String! + cartItemId: String! + cartItemInput: CartItemInput + ): CartItem + deleteCartItem(cartId: String!, cartItemId: String!): Boolean + addItemsToCurrentCart( + throwErrorOnInvalidItems: Boolean + cartItemInput: CartItemInput + ): Boolean + addItemsToCart( + cartId: String! + throwErrorOnInvalidItems: Boolean + cartItemInput: CartItemInput + ): Boolean + updateCurrentCartItemQuantity(cartItemId: String!, quantity: Int!): CartItem + updateCartItemQuantity( + cartId: String! + cartItemId: String! + quantity: Int! + ): CartItem + deleteCurrentCartMessages: Boolean + deleteCurrentCartMessage(messageId: String!): Boolean + createCommerceChannel(channelInput: ChannelInput): Channel + updateChannel(code: String!, channelInput: ChannelInput): Channel + deleteCommerceChannel(code: String!): Boolean + createCommerceChannelGroup(channelGroupInput: ChannelGroupInput): ChannelGroup + updateChannelGroup( + code: String! + channelGroupInput: ChannelGroupInput + ): ChannelGroup + deleteCommerceChannelGroup(code: String!): Boolean + createCheckoutAttribute( + checkoutId: String! + orderAttributeInput: OrderAttributeInput + ): [OrderAttribute] + updateCheckoutAttributes( + checkoutId: String! + removeMissing: Boolean + orderAttributeInput: OrderAttributeInput + ): [OrderAttribute] + updateCheckout(checkoutId: String!, checkoutInput: CheckoutInput): Checkout + createCheckout(cartId: String): Checkout + createCheckoutShippingMethod( + checkoutId: String! + checkoutGroupShippingMethodInput: CheckoutGroupShippingMethodInput + ): Checkout + createCheckoutAction( + checkoutId: String! + checkoutActionInput: CheckoutActionInput + ): Checkout + updateCheckoutDigitalWalletType( + checkoutId: String! + digitalWalletType: String! + digitalWalletInput: DigitalWalletInput + ): Checkout + updateCheckoutPriceList(checkoutId: String!, graphQLString: String): Checkout + resendCheckoutEmail(checkoutId: String!): Boolean + updateCheckoutCoupon(checkoutId: String!, couponCode: String!): Checkout + deleteCheckoutCoupons(checkoutId: String!): Checkout + deleteCheckoutCoupon(checkoutId: String!, couponCode: String!): Checkout + updateCheckoutDestination( + checkoutId: String! + destinationId: String! + destinationInput: DestinationInput + ): Destination + deleteCheckoutDestination( + checkoutId: String! + destinationId: String! + ): Boolean + createCheckoutDestination( + checkoutId: String! + destinationInput: DestinationInput + ): Destination + createCheckoutItem( + checkoutId: String! + orderItemInput: CrOrderItemInput + ): Checkout + deleteCheckoutItem(checkoutId: String!, itemId: String!): Checkout + updateCheckoutItemDestination( + checkoutId: String! + itemId: String! + destinationId: String! + ): Checkout + createCheckoutItemDestination( + checkoutId: String! + itemsForDestinationInput: ItemsForDestinationInput + ): Checkout + createCheckoutPaymentAction( + checkoutId: String! + paymentActionInput: PaymentActionInput + ): Checkout + updateCheckoutPaymentAction( + checkoutId: String! + paymentId: String! + paymentActionInput: PaymentActionInput + ): Checkout + createOrderPaymentAction( + orderId: String! + paymentActionInput: PaymentActionInput + ): Order + createOrderPaymentPaymentAction( + orderId: String! + paymentId: String! + paymentActionInput: PaymentActionInput + ): Order + createOrderAutoCapture(orderId: String!, forceCapture: Boolean): Order + createOrderPickup(orderId: String!, pickupInput: PickupInput): Pickup + updateOrderPickup( + orderId: String! + pickupId: String! + pickupInput: PickupInput + ): Pickup + deleteOrderPickup(orderId: String!, pickupId: String!): Boolean + createOrderRefund(orderId: String!, refundInput: RefundInput): Refund + updateOrderRefund(orderId: String!, refundId: String!): Boolean + createOrderShipment(orderId: String!, graphQLString: String): [PackageObj] + deleteOrderShipment(orderId: String!, shipmentId: String!): Boolean + repriceOrderShipment( + shipmentNumber: Int! + orderId: String! + repriceShipmentObjectInput: RepriceShipmentObjectInput + ): Shipment + createOrderShipmentAdjustment( + orderId: String! + shipmentNumber: Int! + shipmentAdjustmentInput: ShipmentAdjustmentInput + ): Shipment + createOrderShipmentItemAdjustment( + shipmentNumber: Int! + itemId: Int! + orderId: String! + shipmentItemAdjustmentInput: ShipmentItemAdjustmentInput + ): Shipment + splitOrderShipment( + orderId: String! + shipmentNumber: String! + splitShipmentsObjectInput: SplitShipmentsObjectInput + ): [Shipment] + updateOrderValidationResults( + orderId: String! + orderValidationResultInput: OrderValidationResultInput + ): OrderValidationResult + updateOrderAdjustment( + orderId: String! + updateMode: String + version: String + adjustmentInput: AdjustmentInput + ): Order + deleteOrderAdjustment( + orderId: String! + updateMode: String + version: String + ): Order + updateOrderShippingAdjustment( + orderId: String! + updateMode: String + version: String + adjustmentInput: AdjustmentInput + ): Order + deleteOrderAdjustmentShipping( + orderId: String! + updateMode: String + version: String + ): Order + updateOrderHandlingAdjustment( + orderId: String! + updateMode: String + version: String + adjustmentInput: AdjustmentInput + ): Order + deleteOrderAdjustmentHandling( + orderId: String! + updateMode: String + version: String + ): Order + createOrderAttribute( + orderId: String! + orderAttributeInput: OrderAttributeInput + ): [OrderAttribute] + updateOrderAttributes( + orderId: String! + removeMissing: Boolean + orderAttributeInput: OrderAttributeInput + ): [OrderAttribute] + updateOrderBillingInfo( + orderId: String! + updateMode: String + version: String + billingInfoInput: BillingInfoInput + ): BillingInfo + cancelOrder(orderId: String!, canceledReasonInput: CanceledReasonInput): Order + createOrder(cartId: String, quoteId: String, orderInput: OrderInput): Order + updateUserOrder(orderId: String!): Order + updateOrderPriceList( + orderId: String! + updateMode: String + version: String + graphQLString: String + ): Order + resendOrderEmail( + orderId: String! + orderActionInput: OrderActionInput + ): Boolean + updateOrder( + orderId: String! + updateMode: String + version: String + orderInput: OrderInput + ): Order + updateOrderDigitalWalletTpe( + orderId: String! + digitalWalletType: String! + digitalWalletInput: DigitalWalletInput + ): Order + updateOrderDraft(orderId: String!, version: String): Boolean + createOrderAction(orderId: String!, orderActionInput: OrderActionInput): Order + updateOrderDiscount( + orderId: String! + discountId: Int! + updateMode: String + version: String + appliedDiscountInput: CrAppliedDiscountInput + ): Order + updateOrderPrice(refreshShipping: Boolean, orderInput: OrderInput): Order + updateOrderCoupon( + orderId: String! + couponCode: String! + updateMode: String + version: String + ): Order + deleteOrderCoupons( + orderId: String! + updateMode: String + version: String + ): Order + deleteOrderCoupon( + orderId: String! + couponCode: String! + updateMode: String + version: String + ): Order + createOrderDigitalPackage( + orderId: String! + digitalPackageInput: DigitalPackageInput + ): DigitalPackage + updateOrderDigitalPackage( + orderId: String! + digitalPackageId: String! + digitalPackageInput: DigitalPackageInput + ): DigitalPackage + deleteOrderDigitalPackage( + orderId: String! + digitalPackageId: String! + ): Boolean + createOrderExtendedProperties( + orderId: String! + updateMode: String + version: String + extendedPropertyInput: ExtendedPropertyInput + ): [ExtendedProperty] + updateOrderExtendedProperties( + orderId: String! + updateMode: String + version: String + upsert: Boolean + extendedPropertyInput: ExtendedPropertyInput + ): [ExtendedProperty] + deleteOrderExtendedProperties( + orderId: String! + updateMode: String + version: String + graphQLString: String + ): Boolean + updateOrderExtendedProperty( + orderId: String! + key: String! + updateMode: String + version: String + upsert: Boolean + extendedPropertyInput: ExtendedPropertyInput + ): ExtendedProperty + deleteOrderExtendedProperty( + orderId: String! + key: String! + updateMode: String + version: String + ): Boolean + createOrderFulfillmentAction( + orderId: String! + fulfillmentActionInput: FulfillmentActionInput + ): Order + resendOrderFulfillmentEmail( + orderId: String! + fulfillmentActionInput: FulfillmentActionInput + ): Order + updateOrderFulfillmentInfo( + orderId: String! + updateMode: String + version: String + fulfillmentInfoInput: FulfillmentInfoInput + ): FulfillmentInfo + createOrderItem( + orderId: String! + updateMode: String + version: String + skipInventoryCheck: Boolean + orderItemInput: CrOrderItemInput + ): Order + deleteOrderItem( + orderId: String! + orderItemId: String! + updateMode: String + version: String + ): Order + updateOrderItemPrice( + orderId: String! + orderItemId: String! + price: Float! + updateMode: String + version: String + ): Order + updateOrderItemQuantity( + orderId: String! + orderItemId: String! + quantity: Int! + updateMode: String + version: String + ): Order + updateOrderItemDutyAmount( + orderId: String! + orderItemId: String! + dutyAmount: Float! + updateMode: String + version: String + ): Order + updateOrderItemFulfillment( + orderId: String! + orderItemId: String! + updateMode: String + version: String + orderItemInput: CrOrderItemInput + ): Order + updateOrderItemDiscount( + orderId: String! + orderItemId: String! + discountId: Int! + updateMode: String + version: String + appliedDiscountInput: CrAppliedDiscountInput + ): Order + createOrderNote(orderId: String!, orderNoteInput: OrderNoteInput): OrderNote + updateOrderNotes( + orderId: String! + noteId: String! + orderNoteInput: OrderNoteInput + ): OrderNote + deleteOrderNote(orderId: String!, noteId: String!): Boolean + createOrderPackage( + orderId: String! + packageObjInput: PackageObjInput + ): PackageObj + updateOrderPackage( + orderId: String! + packageId: String! + packageObjInput: PackageObjInput + ): PackageObj + deleteOrderPackage(orderId: String!, packageId: String!): Boolean + validateOrder(orderInput: OrderInput): OrderValidationResult + updateQuote( + quoteId: String! + updateMode: String + quoteInput: QuoteInput + ): Quote + deleteQuote(quoteId: String!, draft: Boolean): Boolean + createQuote(quoteInput: QuoteInput): Quote + createQuoteItem( + quoteId: String! + updateMode: String + orderItemInput: CrOrderItemInput + ): Quote + deleteQuoteItem( + quoteId: String! + quoteItemId: String! + updateMode: String + ): Boolean + createReturn(returnObjInput: ReturnObjInput): ReturnObj + resendReturnEmail(returnActionInput: ReturnActionInput): Boolean + updateReturn(returnId: String!, returnObjInput: ReturnObjInput): ReturnObj + deleteReturn(returnId: String!): Boolean + createReturnAction(returnActionInput: ReturnActionInput): ReturnCollection + setReturnShip( + returnId: String! + returnItemSpecifierInput: ReturnItemSpecifierInput + ): Order + createReturnPaymentAction( + returnId: String! + paymentActionInput: PaymentActionInput + ): ReturnObj + createReturnPaymentPaymentAction( + returnId: String! + paymentId: String! + paymentActionInput: PaymentActionInput + ): ReturnObj + setReturnRestock( + returnId: String! + restockableReturnItemInput: RestockableReturnItemInput + ): ReturnObj + createReturnItem( + returnId: String! + returnItemInput: ReturnItemInput + ): ReturnObj + deleteReturnItem( + returnId: String + returnItemId: String + orderId: String! + orderItemId: String! + ): ReturnObj + createReturnNote(returnId: String!, orderNoteInput: OrderNoteInput): OrderNote + updateReturnNote( + returnId: String! + noteId: String! + orderNoteInput: OrderNoteInput + ): OrderNote + deleteReturnNote(returnId: String!, noteId: String!): Boolean + createReturnPackage( + returnId: String! + packageObjInput: PackageObjInput + ): PackageObj + updateReturnPackage( + returnId: String! + packageId: String! + packageObjInput: PackageObjInput + ): PackageObj + deleteReturnPackage(returnId: String!, packageId: String!): Boolean + createReturnShipment(returnId: String!, graphQLString: String): [PackageObj] + deleteReturnShipment(returnId: String!, shipmentId: String!): Boolean + createWishlist(wishlistInput: WishlistInput): Wishlist + updateWishlist(wishlistId: String!, wishlistInput: WishlistInput): Wishlist + deleteWishlist(wishlistId: String!): Boolean + deleteWishlistItems(wishlistId: String!): Wishlist + createWishlistItem( + wishlistId: String! + wishlistItemInput: WishlistItemInput + ): WishlistItem + updateWishlistItem( + wishlistId: String! + wishlistItemId: String! + wishlistItemInput: WishlistItemInput + ): WishlistItem + deleteWishlistItem(wishlistId: String!, wishlistItemId: String!): Boolean + updateWishlistItemQuantity( + wishlistId: String! + wishlistItemId: String! + quantity: Int! + ): WishlistItem + updateDocumentListDocumentContent( + documentListName: String! + documentId: String! + httpRequestMessageInput: CoHttpRequestMessageInput + ): Boolean + deleteDocumentListDocumentContent( + documentListName: String! + documentId: String! + ): Boolean + updateDocumentListDocumentTreeContent( + documentListName: String! + documentName: String! + httpRequestMessageInput: CoHttpRequestMessageInput + ): Boolean + deleteDocumentListDocumentTreeContent( + documentListName: String! + documentName: String! + httpRequestMessageInput: CoHttpRequestMessageInput + ): Boolean + createDocumentListDocument( + documentListName: String! + documentInput: DocumentInput + ): Document + updateDocumentListDocument( + documentListName: String! + documentId: String! + documentInput: DocumentInput + ): Document + patchDocumentListDocument( + documentListName: String! + documentId: String! + documentInput: DocumentInput + ): Document + deleteDocumentListDocument( + documentListName: String! + documentId: String! + ): Boolean + createDocumentList(documentListInput: DocumentListInput): DocumentList + updateDocumentList( + documentListName: String! + documentListInput: DocumentListInput + ): DocumentList + deleteDocumentList(documentListName: String!): Boolean + createDocumentListType( + documentListTypeInput: DocumentListTypeInput + ): DocumentListType + updateDocumentListType( + documentListTypeFQN: String! + documentListTypeInput: DocumentListTypeInput + ): DocumentListType + createDocumentDraft(documentLists: String, graphQLString: String): Boolean + toggleDocumentPublishing( + documentLists: String + graphQLString: String + ): Boolean + createDocumentType(documentTypeInput: DocumentTypeInput): DocumentType + updateDocumentType( + documentTypeName: String! + documentTypeInput: DocumentTypeInput + ): DocumentType + createPropertyType(propertyTypeInput: PropertyTypeInput): PropertyType + updatePropertyType( + propertyTypeName: String! + propertyTypeInput: PropertyTypeInput + ): PropertyType + deletePropertyType(propertyTypeName: String!): Boolean + adminCreateLocation(locationInput: LocationInput): Location + adminUpdateLocation( + locationCode: String! + locationInput: LocationInput + ): Location + deleteAdminLocation(locationCode: String!): Boolean + adminCreateLocationAttribute(attributeInput: LoAttributeInput): LoAttribute + adminUpdateLocationAttribute( + attributeFQN: String! + attributeInput: LoAttributeInput + ): LoAttribute + adminCreateLocationGroup( + locationGroupInput: LocationGroupInput + ): LocationGroup + updateLocationUsage( + code: String! + locationUsageInput: LocationUsageInput + ): LocationUsage + adminCreateLocationType(locationTypeInput: LocationTypeInput): LocationType + adminUpdateLocationType( + locationTypeCode: String! + locationTypeInput: LocationTypeInput + ): LocationType + deleteAdminLocationType(locationTypeCode: String!): Boolean + updateEntityListEntities( + entityListFullName: String! + id: String! + httpRequestMessageInput: MZDBHttpRequestMessageInput + ): Boolean + deleteEntityListEntity(entityListFullName: String!, id: String!): Boolean + createEntityListEntity( + entityListFullName: String! + httpRequestMessageInput: MZDBHttpRequestMessageInput + ): Boolean + updateEntityList( + entityListFullName: String! + entityListInput: EntityListInput + ): EntityList + deleteEntityList(entityListFullName: String!): Boolean + createEntityList(entityListInput: EntityListInput): EntityList + createEntityListView( + entityListFullName: String! + listViewInput: ListViewInput + ): ListView + updateEntityListView( + entityListFullName: String! + viewName: String! + listViewInput: ListViewInput + ): ListView + deleteEntityListView(entityListFullName: String!, viewName: String!): Boolean + createTargetRule(targetRuleInput: TargetRuleInput): TargetRule + updateTargetRule(code: String!, targetRuleInput: TargetRuleInput): TargetRule + deleteCommerceTargetRule(code: String!): Boolean + validateTargetRule(targetRuleInput: TargetRuleInput): Boolean + createOrderRoutingSuggestion( + returnSuggestionLog: Boolean + suggestionRequestInput: SuggestionRequestInput + ): SuggestionResponse +} + +enum NodeTypeEnum { + ARRAY + BINARY + BOOLEAN + MISSING + NULL + NUMBER + OBJECT + POJO + STRING +} + +""" +Object custom scalar type +""" +scalar Object + +type Order { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Order + orderNumber: Int + locationCode: String + version: String + parentOrderId: String + parentOrderNumber: Int + parentCheckoutId: String + parentCheckoutNumber: Int + partialOrderNumber: Int + partialOrderCount: Int + isPartialOrder: Boolean + parentReturnId: String + parentReturnNumber: Int + originalCartId: String + originalQuoteId: String + originalQuoteNumber: Int + priceListCode: String + availableActions: [String!] + shopperNotes: ShopperNotes + customerAccountId: Int + customerTaxId: String + isTaxExempt: Boolean + email: String + ipAddress: String + sourceDevice: String + acceptsMarketing: Boolean + status: String + type: String + paymentStatus: String + returnStatus: String + isEligibleForReturns: Boolean + totalCollected: Float! + attributes: [OrderAttribute] + adjustment: Adjustment + shippingAdjustment: Adjustment + handlingAdjustment: Adjustment + shippingDiscounts: [ShippingDiscount] + handlingDiscounts: [CrAppliedDiscount] + handlingAmount: Float + handlingSubTotal: Float + handlingTotal: Float + dutyAmount: Float + dutyTotal: Float + fulfillmentStatus: String + submittedDate: DateTime + cancelledDate: DateTime + closedDate: DateTime + acceptedDate: DateTime + notes: [OrderNote] + items: [CrOrderItem] + validationResults: [OrderValidationResult] + billingInfo: BillingInfo + payments: [Payment] + refunds: [Refund] + packages: [PackageObj] + pickups: [Pickup] + digitalPackages: [DigitalPackage] + shipments: [Shipment] + isDraft: Boolean + hasDraft: Boolean + isImport: Boolean + isHistoricalImport: Boolean + importDate: DateTime + isUnified: Boolean + externalId: String + couponCodes: [String!] + invalidCoupons: [InvalidCoupon] + amountAvailableForRefund: Float! + amountRemainingForPayment: Float! + amountRefunded: Float! + readyToCapture: Boolean + isOptInForSms: Boolean + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfo + orderDiscounts: [CrAppliedDiscount] + suggestedDiscounts: [SuggestedDiscount] + rejectedDiscounts: [SuggestedDiscount] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessage] + extendedProperties: [ExtendedProperty] + discountThresholdMessages: [ThresholdMessage] + auditInfo: CrAuditInfo +} + +input OrderActionInput { + actionName: String +} + +type OrderAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderAttribute + auditInfo: CrAuditInfo + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +input OrderAttributeInput { + auditInfo: CrAuditInfoInput + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +type OrderCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Order] +} + +input OrderInput { + orderNumber: Int + locationCode: String + version: String + parentOrderId: String + parentOrderNumber: Int + parentCheckoutId: String + parentCheckoutNumber: Int + partialOrderNumber: Int + partialOrderCount: Int + isPartialOrder: Boolean = false + parentReturnId: String + parentReturnNumber: Int + originalCartId: String + originalQuoteId: String + originalQuoteNumber: Int + priceListCode: String + availableActions: [String!] + shopperNotes: ShopperNotesInput + customerAccountId: Int + customerTaxId: String + isTaxExempt: Boolean = false + email: String + ipAddress: String + sourceDevice: String + acceptsMarketing: Boolean = false + status: String + type: String + paymentStatus: String + returnStatus: String + isEligibleForReturns: Boolean = false + totalCollected: Float! + attributes: [OrderAttributeInput] + adjustment: AdjustmentInput + shippingAdjustment: AdjustmentInput + handlingAdjustment: AdjustmentInput + shippingDiscounts: [ShippingDiscountInput] + handlingDiscounts: [CrAppliedDiscountInput] + handlingAmount: Float + handlingSubTotal: Float + handlingTotal: Float + dutyAmount: Float + dutyTotal: Float + fulfillmentStatus: String + submittedDate: DateTime + cancelledDate: DateTime + closedDate: DateTime + acceptedDate: DateTime + notes: [OrderNoteInput] + items: [CrOrderItemInput] + validationResults: [OrderValidationResultInput] + billingInfo: BillingInfoInput + payments: [PaymentInput] + refunds: [RefundInput] + packages: [PackageObjInput] + pickups: [PickupInput] + digitalPackages: [DigitalPackageInput] + shipments: [ShipmentInput] + isDraft: Boolean = false + hasDraft: Boolean = false + isImport: Boolean = false + isHistoricalImport: Boolean = false + importDate: DateTime + isUnified: Boolean = false + externalId: String + couponCodes: [String!] + invalidCoupons: [InvalidCouponInput] + amountAvailableForRefund: Float! + amountRemainingForPayment: Float! + amountRefunded: Float! + readyToCapture: Boolean = false + isOptInForSms: Boolean = false + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfoInput + orderDiscounts: [CrAppliedDiscountInput] + suggestedDiscounts: [SuggestedDiscountInput] + rejectedDiscounts: [SuggestedDiscountInput] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessageInput] + extendedProperties: [ExtendedPropertyInput] + discountThresholdMessages: [ThresholdMessageInput] + auditInfo: CrAuditInfoInput +} + +type OrderItemCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderItemCollection + totalCount: Int! + items: [CrOrderItem] +} + +input OrderItemInput { + backorderable: Boolean = false + customItemData: Object! + itemDependency: Int! + orderItemID: Int! + partNumber: String! + quantity: Int! + sku: String! + upc: String! +} + +type OrderNote { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderNote + id: String + text: String + auditInfo: CrAuditInfo +} + +input OrderNoteInput { + id: String + text: String + auditInfo: CrAuditInfoInput +} + +type OrderReturnableItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderReturnableItem + productCode: String + productName: String + shipmentNumber: Int + shipmentItemId: Int + quantityOrdered: Int! + quantityFulfilled: Int! + quantityReturned: Int! + quantityReturnable: Int! + fulfillmentStatus: String + orderItemId: String + orderLineId: Int! + orderItemOptionAttributeFQN: String + unitQuantity: Int! + parentProductCode: String + parentProductName: String + fulfillmentFields: [FulfillmentField] + sku: String + mfgPartNumber: String +} + +type OrderReturnableItemCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderReturnableItemCollection + totalCount: Int! + items: [OrderReturnableItem] +} + +enum OrderTypeEnum { + DIRECTSHIP + TRANSFER +} + +type OrderValidationMessage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderValidationMessage + orderItemId: String + messageType: String + message: String +} + +input OrderValidationMessageInput { + orderItemId: String + messageType: String + message: String +} + +type OrderValidationResult { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: OrderValidationResult + validationId: String + validatorName: String + validatorType: String + status: String + createdDate: DateTime + messages: [OrderValidationMessage] +} + +input OrderValidationResultInput { + validationId: String + validatorName: String + validatorType: String + status: String + createdDate: DateTime + messages: [OrderValidationMessageInput] +} + +type PackageItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PackageItem + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +input PackageItemInput { + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +type PackageObj { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PackageObj + shippingMethodCode: String + shippingMethodName: String + shipmentId: String + trackingNumber: String + trackingNumbers: [String!] + packagingType: String + hasLabel: Boolean + measurements: CrPackageMeasurements + carrier: String + signatureRequired: Boolean + trackings: [Tracking] + id: String + code: String + status: String + items: [PackageItem] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfo + availableActions: [String!] + changeMessages: [ChangeMessage] +} + +input PackageObjInput { + shippingMethodCode: String + shippingMethodName: String + shipmentId: String + trackingNumber: String + trackingNumbers: [String!] + packagingType: String + hasLabel: Boolean = false + measurements: CrPackageMeasurementsInput + carrier: String + signatureRequired: Boolean = false + trackings: [TrackingInput] + id: String + code: String + status: String + items: [PackageItemInput] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfoInput + availableActions: [String!] + changeMessages: [ChangeMessageInput] +} + +type PackageSettings { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PackageSettings + unitType: String +} + +input PasswordInfoInput { + oldPassword: String + newPassword: String + externalPassword: String +} + +type Payment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Payment + id: String + groupId: PaymentActionTarget + paymentServiceTransactionId: String + availableActions: [String!] + orderId: String + paymentType: String + paymentWorkflow: String + externalTransactionId: String + billingInfo: BillingInfo + data: Object + status: String + subPayments: [SubPayment] + interactions: [PaymentInteraction] + isRecurring: Boolean + amountCollected: Float! + amountCredited: Float! + amountRequested: Float! + changeMessages: [ChangeMessage] + auditInfo: CrAuditInfo + gatewayGiftCard: GatewayGiftCard +} + +input PaymentActionInput { + actionName: String + currencyCode: String + checkNumber: String + returnUrl: String + cancelUrl: String + amount: Float + interactionDate: DateTime + newBillingInfo: BillingInfoInput + referenceSourcePaymentId: String + manualGatewayInteraction: PaymentGatewayInteractionInput + externalTransactionId: String + data: Object +} + +type PaymentActionTarget { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentActionTarget + targetType: String + targetId: String + targetNumber: Int +} + +input PaymentActionTargetInput { + targetType: String + targetId: String + targetNumber: Int +} + +type PaymentCard { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentCard + paymentServiceCardId: String + isUsedRecurring: Boolean + nameOnCard: String + isCardInfoSaved: Boolean + isTokenized: Boolean + paymentOrCardType: String + cardNumberPartOrMask: String + expireMonth: Int! + expireYear: Int! + bin: String +} + +input PaymentCardInput { + paymentServiceCardId: String + isUsedRecurring: Boolean = false + nameOnCard: String + isCardInfoSaved: Boolean = false + isTokenized: Boolean = false + paymentOrCardType: String + cardNumberPartOrMask: String + expireMonth: Int! + expireYear: Int! + bin: String +} + +type PaymentCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentCollection + totalCount: Int! + items: [Payment] +} + +input PaymentGatewayInteractionInput { + gatewayInteractionId: Int + gatewayTransactionId: String + gatewayAuthCode: String + gatewayAVSCodes: String + gatewayCVV2Codes: String + gatewayResponseCode: String + gatewayResponseText: String +} + +type PaymentGatewayResponseData { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentGatewayResponseData + key: String + value: String +} + +input PaymentGatewayResponseDataInput { + key: String + value: String +} + +input PaymentInput { + id: String + groupId: PaymentActionTargetInput + paymentServiceTransactionId: String + availableActions: [String!] + orderId: String + paymentType: String + paymentWorkflow: String + externalTransactionId: String + billingInfo: BillingInfoInput + data: Object + status: String + subPayments: [SubPaymentInput] + interactions: [PaymentInteractionInput] + isRecurring: Boolean = false + amountCollected: Float! + amountCredited: Float! + amountRequested: Float! + changeMessages: [ChangeMessageInput] + auditInfo: CrAuditInfoInput + gatewayGiftCard: GatewayGiftCardInput +} + +type PaymentInteraction { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentInteraction + id: String + gatewayInteractionId: Int + paymentId: String + orderId: String + target: PaymentActionTarget + currencyCode: String + interactionType: String + checkNumber: String + status: String + paymentEntryStatus: String + isRecurring: Boolean + isManual: Boolean + gatewayTransactionId: String + gatewayAuthCode: String + gatewayAVSCodes: String + gatewayCVV2Codes: String + gatewayResponseCode: String + gatewayResponseText: String + gatewayResponseData: [PaymentGatewayResponseData] + paymentTransactionInteractionIdReference: Int + amount: Float + note: String + interactionDate: DateTime + auditInfo: CrAuditInfo + returnId: String + refundId: String + capturableShipmentsSummary: [CapturableShipmentSummary] +} + +input PaymentInteractionInput { + id: String + gatewayInteractionId: Int + paymentId: String + orderId: String + target: PaymentActionTargetInput + currencyCode: String + interactionType: String + checkNumber: String + status: String + paymentEntryStatus: String + isRecurring: Boolean = false + isManual: Boolean = false + gatewayTransactionId: String + gatewayAuthCode: String + gatewayAVSCodes: String + gatewayCVV2Codes: String + gatewayResponseCode: String + gatewayResponseText: String + gatewayResponseData: [PaymentGatewayResponseDataInput] + paymentTransactionInteractionIdReference: Int + amount: Float + note: String + interactionDate: DateTime + auditInfo: CrAuditInfoInput + returnId: String + refundId: String + capturableShipmentsSummary: [CapturableShipmentSummaryInput] +} + +type PaymentToken { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PaymentToken + paymentServiceTokenId: String + type: String +} + +input PaymentTokenInput { + paymentServiceTokenId: String + type: String +} + +type Pickup { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Pickup + id: String + code: String + status: String + items: [PickupItem] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfo + availableActions: [String!] + changeMessages: [ChangeMessage] +} + +input PickupInput { + id: String + code: String + status: String + items: [PickupItemInput] + fulfillmentDate: DateTime + fulfillmentLocationCode: String + auditInfo: CrAuditInfoInput + availableActions: [String!] + changeMessages: [ChangeMessageInput] +} + +type PickupItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PickupItem + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +input PickupItemInput { + productCode: String + quantity: Int! + fulfillmentItemType: String + lineId: Int + optionAttributeFQN: String +} + +type PrAppliedDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrAppliedDiscount + couponCode: String + discount: PrDiscount + discounts: [PrDiscount] + impact: Float! +} + +type PrAttributeValidation { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrAttributeValidation + regularExpression: String + minStringLength: Int + maxStringLength: Int + minNumericValue: Float + maxNumericValue: Float + minDateValue: DateTime + maxDateValue: DateTime +} + +type PrBundledProduct { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrBundledProduct + content: ProductContent + productCode: String + goodsType: String + quantity: Int! + measurements: PrPackageMeasurements + isPackagedStandAlone: Boolean + inventoryInfo: ProductInventoryInfo + optionAttributeFQN: String + optionValue: Object + creditValue: Float + productType: String +} + +type PrCategory { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrCategory + categoryId: Int! + parentCategory: PrCategory + content: CategoryContent + childrenCategories: [PrCategory] + sequence: Int + isDisplayed: Boolean + categoryCode: String + count: Int + updateDate: DateTime! + shouldSlice: Boolean +} + +type PrDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrDiscount + discountId: Int! + expirationDate: DateTime + name: String + friendlyDescription: String + impact: Float! +} + +type PrMeasurement { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrMeasurement + unit: String + value: Float +} + +type PrPackageMeasurements { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PrPackageMeasurements + packageHeight: PrMeasurement + packageWidth: PrMeasurement + packageLength: PrMeasurement + packageWeight: PrMeasurement +} + +type PriceList { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PriceList + priceListCode: String + priceListId: Int! + enabled: Boolean + name: String + resolvable: Boolean + isIndexed: Boolean + filteredInStoreFront: Boolean + isSiteDefault: Boolean + description: String + ancestors: [PriceListNode] + descendants: [PriceListNode] + validSites: [Int!] +} + +type PriceListNode { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PriceListNode + priceListCode: String + priceListId: Int! + parentPriceListId: Int + priceListLevel: Int! +} + +type PricingAppliedDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingAppliedDiscount + impact: Float! + discount: PricingDiscount + couponCode: String + couponSetId: Int +} + +type PricingAppliedLineItemProductDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingAppliedLineItemProductDiscount + appliesToSalePrice: Boolean + quantity: Int! + impactPerUnit: Float! + isForced: Boolean + normalizedImpact: Float! + impact: Float! + discount: PricingDiscount + couponCode: String + couponSetId: Int +} + +type PricingAppliedLineItemShippingDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingAppliedLineItemShippingDiscount + shippingMethodCode: String + quantity: Int! + impactPerUnit: Float! + isForced: Boolean + normalizedImpact: Float! + impact: Float! + discount: PricingDiscount + couponCode: String + couponSetId: Int +} + +type PricingAppliedOrderShippingDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingAppliedOrderShippingDiscount + shippingMethodCode: String + impact: Float! + discount: PricingDiscount + couponCode: String + couponSetId: Int +} + +type PricingDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingDiscount + discountId: Int! + name: String + friendlyDescription: String + amount: Float! + scope: String + maxRedemptions: Int + maximumUsesPerUser: Int + requiresAuthenticatedUser: Boolean + doesNotApplyToProductsWithSalePrice: Boolean + maximumRedemptionsPerOrder: Int + maximumDiscountValuePerOrder: Float + maxDiscountValuePerRedemption: Float + doesNotApplyToMultiShipToOrders: Boolean + includedPriceLists: [String!] + redemptions: Int! + type: String + amountType: String + target: PricingDiscountTarget + condition: PricingDiscountCondition + expirationDate: DateTime + stackingLayer: Int! +} + +type PricingDiscountCondition { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingDiscountCondition + requiresCoupon: Boolean + couponCode: String + minimumQuantityProductsRequiredInCategories: Int + includedCategoryIds: [Int!] + excludedCategoryIds: [Int!] + minimumQuantityRequiredProducts: Int + includedProductCodes: [String!] + excludedProductCodes: [String!] + paymentWorkflows: [String!] + customerSegmentIds: [Int!] + minimumOrderAmount: Float + maximumOrderAmount: Float + minimumLifetimeValueAmount: Float + startDate: DateTime + expirationDate: DateTime + minimumCategorySubtotalBeforeDiscounts: Float +} + +type PricingDiscountTarget { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingDiscountTarget + type: String + includedCategoryIds: [Int!] + excludedCategoryIds: [Int!] + includedCategoriesOperator: String + excludedCategoriesOperator: String + includedProductCodes: [String!] + excludedProductCodes: [String!] + includeAllProducts: Boolean + shippingMethods: [String!] + shippingZones: [String!] +} + +type PricingProductAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingProductAttribute + inputType: String + valueType: String + dataType: String + name: String + description: String +} + +type PricingProductProperty { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingProductProperty + attributeFQN: String + values: [PricingProductPropertyValue] + attributeDetail: PricingProductAttribute + isHidden: Boolean + isMultiValue: Boolean +} + +type PricingProductPropertyValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingProductPropertyValue + value: Object + stringValue: String +} + +type PricingTaxAttribute { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingTaxAttribute + fullyQualifiedName: String + attributeDefinitionId: Int + values: [Object!] +} + +type PricingTaxContext { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingTaxContext + taxContextId: String + customerId: String + taxExemptId: String + originAddress: CrAddress + destinationAddress: CrAddress +} + +type PricingTaxableLineItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingTaxableLineItem + id: String + productCode: String + variantProductCode: String + productName: String + productProperties: [PricingProductProperty] + quantity: Int! + lineItemPrice: Float! + discountTotal: Float + discountedTotal: Float + shippingAmount: Float! + handlingAmount: Float + feeTotal: Float + isTaxable: Boolean + reason: String + data: Object + productDiscount: PricingAppliedLineItemProductDiscount + shippingDiscount: PricingAppliedLineItemShippingDiscount + productDiscounts: [PricingAppliedLineItemProductDiscount] + shippingDiscounts: [PricingAppliedLineItemShippingDiscount] + originAddress: CrAddress + destinationAddress: CrAddress +} + +type PricingTaxableOrder { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PricingTaxableOrder + orderDate: DateTime! + taxContext: PricingTaxContext + lineItems: [PricingTaxableLineItem] + shippingAmount: Float! + currencyCode: String + handlingFee: Float! + originalDocumentCode: String + orderId: String + orderNumber: Int + originalOrderDate: DateTime! + data: Object + attributes: [PricingTaxAttribute] + shippingDiscounts: [PricingAppliedOrderShippingDiscount] + shippingDiscount: PricingAppliedOrderShippingDiscount + orderDiscounts: [PricingAppliedDiscount] + orderDiscount: PricingAppliedDiscount + handlingDiscounts: [PricingAppliedDiscount] + handlingDiscount: PricingAppliedDiscount + shippingMethodCode: String + shippingMethodName: String + taxRequestType: String +} + +type Product { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Product + productCode: String + purchaseLocation: String + productSequence: Int + productUsage: String + fulfillmentTypesSupported: [String!] + goodsType: String + bundledProducts: [PrBundledProduct] + content: ProductContent + purchasableState: ProductPurchasableState + isActive: Boolean + publishState: String + price: ProductPrice + priceRange: ProductPriceRange + volumePriceBands: [ProductVolumePrice] + volumePriceRange: ProductPriceRange + availableShippingDiscounts: [PrDiscount] + productType: String + productTypeId: Int + isTaxable: Boolean + isRecurring: Boolean + pricingBehavior: ProductPricingBehaviorInfo + inventoryInfo: ProductInventoryInfo + createDate: DateTime! + updateDate: DateTime! + dateFirstAvailableInCatalog: DateTime + catalogStartDate: DateTime + catalogEndDate: DateTime + daysAvailableInCatalog: Int + upc: String + upCs: [String!] + mfgPartNumber: String + mfgPartNumbers: [String!] + variationProductCode: String + categories: [PrCategory] + measurements: PrPackageMeasurements + isPackagedStandAlone: Boolean + properties( + filterAttribute: String + filterOperator: String + filterValue: Object + ): [ProductProperty] + options: [ProductOption] + variations: [VariationSummary] + validPriceLists: [String!] + locationsInStock: [String!] + slicingAttributeFQN: String + productImageGroups: [ProductImageGroup] + sliceValue: String + productCollections: [ProductCollectionInfo] + productCollectionMembers: [ProductCollectionMember] + collectionMembersProductContent: [ProductContent] + score: Float! + personalizationScore: Float! +} + +type ProductCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCollection + nextCursorMark: String + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Product] +} + +type ProductCollectionInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCollectionInfo + productCode: String + isPrimary: Boolean +} + +type ProductCollectionMember { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCollectionMember + memberKey: ProductCollectionMemberKey +} + +type ProductCollectionMemberKey { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCollectionMemberKey + value: String +} + +type ProductContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductContent + productName: String + productFullDescription: String + productShortDescription: String + metaTagTitle: String + metaTagDescription: String + metaTagKeywords: String + seoFriendlyUrl: String + productImages: [ProductImage] +} + +type ProductCost { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCost + productCode: String + cost: Float! +} + +type ProductCostCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductCostCollection + totalCount: Int! + items: [ProductCost] +} + +input ProductCostQueryInput { + productCodes: [String!] +} + +type ProductForIndexing { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductForIndexing + slices: [Product] + productCode: String + purchaseLocation: String + productSequence: Int + productUsage: String + fulfillmentTypesSupported: [String!] + goodsType: String + bundledProducts: [PrBundledProduct] + content: ProductContent + purchasableState: ProductPurchasableState + isActive: Boolean + publishState: String + price: ProductPrice + priceRange: ProductPriceRange + volumePriceBands: [ProductVolumePrice] + volumePriceRange: ProductPriceRange + availableShippingDiscounts: [PrDiscount] + productType: String + productTypeId: Int + isTaxable: Boolean + isRecurring: Boolean + pricingBehavior: ProductPricingBehaviorInfo + inventoryInfo: ProductInventoryInfo + createDate: DateTime! + updateDate: DateTime! + dateFirstAvailableInCatalog: DateTime + catalogStartDate: DateTime + catalogEndDate: DateTime + daysAvailableInCatalog: Int + upc: String + upCs: [String!] + mfgPartNumber: String + mfgPartNumbers: [String!] + variationProductCode: String + categories: [PrCategory] + measurements: PrPackageMeasurements + isPackagedStandAlone: Boolean + properties: [ProductProperty] + options: [ProductOption] + variations: [VariationSummary] + validPriceLists: [String!] + locationsInStock: [String!] + slicingAttributeFQN: String + productImageGroups: [ProductImageGroup] + sliceValue: String + productCollections: [ProductCollectionInfo] + productCollectionMembers: [ProductCollectionMember] + collectionMembersProductContent: [ProductContent] + score: Float! + personalizationScore: Float! +} + +type ProductImage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductImage + imageLabel: String + altText: String + imageUrl: String + cmsId: String + videoUrl: String + mediaType: String + sequence: Int + productImageGroupId: String +} + +type ProductImageGroup { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductImageGroup + productImageGroupId: String! + productImageGroupTags: [ProductImageGroupTag] +} + +type ProductImageGroupTag { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductImageGroupTag + attributeFqn: String + value: String +} + +type ProductInventoryInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductInventoryInfo + manageStock: Boolean + outOfStockBehavior: String + onlineStockAvailable: Int + onlineSoftStockAvailable: Int + onlineLocationCode: String + availableDate: DateTime +} + +type ProductOption { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductOption + attributeFQN: String + isRequired: Boolean + isMultiValue: Boolean + values: [ProductOptionValue] + attributeDetail: AttributeDetail + isProductImageGroupSelector: Boolean +} + +input ProductOptionSelectionInput { + attributeFQN: String + value: Object + attributeValueId: Int + shopperEnteredValue: Object +} + +input ProductOptionSelectionsInput { + variationProductCode: String + options: [ProductOptionSelectionInput] +} + +type ProductOptionValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductOptionValue + value: Object + attributeValueId: Int! + stringValue: String + isEnabled: Boolean + isSelected: Boolean + isDefault: Boolean + deltaWeight: Float + deltaPrice: Float + shopperEnteredValue: Object + bundledProduct: PrBundledProduct + displayInfo: AttributeVocabularyValueDisplayInfo +} + +type ProductPrice { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductPrice + msrp: Float + price: Float + priceType: String + salePrice: Float + salePriceType: String + catalogSalePrice: Float + catalogListPrice: Float + discount: PrAppliedDiscount + creditValue: Float + effectivePricelistCode: String + priceListEntryCode: String + priceListEntryMode: String +} + +type ProductPriceRange { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductPriceRange + lower: ProductPrice + upper: ProductPrice +} + +type ProductPricingBehaviorInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductPricingBehaviorInfo + discountsRestricted: Boolean + discountsRestrictedStartDate: DateTime + discountsRestrictedEndDate: DateTime +} + +type ProductProperty { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductProperty + attributeFQN: String + isHidden: Boolean + isMultiValue: Boolean + attributeDetail: AttributeDetail + values: [ProductPropertyValue] + propertyType: String +} + +type ProductPropertyValue { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductPropertyValue + value: Object + stringValue: String + displayInfo: AttributeVocabularyValueDisplayInfo +} + +type ProductPurchasableState { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductPurchasableState + isPurchasable: Boolean + messages: [ValidationMessage] +} + +type ProductSearchRandomAccessCursor { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductSearchRandomAccessCursor + cursorMarks: [String!] +} + +type ProductSearchResult { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductSearchResult + facets: [Facet] + solrDebugInfo: SolrDebugInfo + searchRedirect: String + searchEngine: String + nextCursorMark: String + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Product] +} + +type ProductStock { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductStock + manageStock: Boolean + isOnBackOrder: Boolean + availableDate: DateTime + stockAvailable: Int + aggregateInventory: Int +} + +input ProductStockInput { + manageStock: Boolean = false + isOnBackOrder: Boolean = false + availableDate: DateTime + stockAvailable: Int + aggregateInventory: Int +} + +type ProductValidationSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductValidationSummary + productCode: String + purchaseLocation: String + productUsage: String + fulfillmentTypesSupported: [String!] + goodsType: String + bundledProducts: [BundledProductSummary] + upc: String + mfgPartNumber: String + variationProductCode: String + purchasableState: ProductPurchasableState + price: ProductPrice + measurements: PrPackageMeasurements + isPackagedStandAlone: Boolean + image: ProductImage + productShortDescription: String + productName: String + categories: [PrCategory] + properties: [ProductProperty] + pricingBehavior: ProductPricingBehaviorInfo + inventoryInfo: ProductInventoryInfo + isTaxable: Boolean + productType: String +} + +type ProductVolumePrice { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ProductVolumePrice + isCurrent: Boolean + minQty: Int! + maxQty: Int + priceRange: ProductPriceRange + price: ProductPrice +} + +type Property { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Property + name: String + isRequired: Boolean + isMultiValued: Boolean + propertyType: PropertyType +} + +input PropertyInput { + name: String + isRequired: Boolean = false + isMultiValued: Boolean = false + propertyType: PropertyTypeInput +} + +type PropertyType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PropertyType + name: String + namespace: String + propertyTypeFQN: String + adminName: String + installationPackage: String + version: String + dataType: String + isQueryable: Boolean + isSortable: Boolean + isAggregatable: Boolean +} + +type PropertyTypeCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PropertyTypeCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [PropertyType] +} + +input PropertyTypeInput { + name: String + namespace: String + propertyTypeFQN: String + adminName: String + installationPackage: String + version: String + dataType: String + isQueryable: Boolean = false + isSortable: Boolean = false + isAggregatable: Boolean = false +} + +type PurchaseOrderCustomField { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PurchaseOrderCustomField + code: String + label: String + value: String +} + +input PurchaseOrderCustomFieldInput { + code: String + label: String + value: String +} + +type PurchaseOrderPayment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PurchaseOrderPayment + purchaseOrderNumber: String + paymentTerm: PurchaseOrderPaymentTerm + customFields: [PurchaseOrderCustomField] +} + +input PurchaseOrderPaymentInput { + purchaseOrderNumber: String + paymentTerm: PurchaseOrderPaymentTermInput + customFields: [PurchaseOrderCustomFieldInput] +} + +type PurchaseOrderPaymentTerm { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PurchaseOrderPaymentTerm + code: String + description: String +} + +input PurchaseOrderPaymentTermInput { + code: String + description: String +} + +type PurchaseOrderTransaction { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PurchaseOrderTransaction + customerPurchaseOrderAccountId: Int! + externalId: String + siteId: Int! + tenantId: Int! + transactionDate: DateTime! + orderId: String + purchaseOrderNumber: String + transactionAmount: Float! + creditLimit: Float! + additionalTransactionDetail: String + availableBalance: Float! + transactionTypeId: Int! + transactionDescription: String + author: String + auditInfo: CuAuditInfo +} + +type PurchaseOrderTransactionCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: PurchaseOrderTransactionCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [PurchaseOrderTransaction] +} + +input PurchaseOrderTransactionInput { + customerPurchaseOrderAccountId: Int! + externalId: String + siteId: Int! + tenantId: Int! + transactionDate: DateTime! + orderId: String + purchaseOrderNumber: String + transactionAmount: Float! + creditLimit: Float! + additionalTransactionDetail: String + availableBalance: Float! + transactionTypeId: Int! + transactionDescription: String + author: String + auditInfo: CuAuditInfoInput +} + +type Query { + customerAccountAttributeDefinitions( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CuAttributeCollection + customerAccountAttributeVocabularyValues( + attributeFQN: String! + ): [CuAttributeVocabularyValue] + customerAccountAttributeDefinition(attributeFQN: String!): CuAttribute + b2bAccountAttributes( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CustomerAttributeCollection + b2bAccountAttributeVocabularyValues( + accountId: Int! + attributeFQN: String! + ): CustomerAttribute + b2bAccounts( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + fields: String + q: String + qLimit: Int + ): B2BAccountCollection + b2bAccount(accountId: Int!): B2BAccount + b2bAccountUsers( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + qLimit: Int + ): B2BUserCollection + b2bAccountUserRoles(accountId: Int!, userId: String!): UserRoleCollection + customerCreditAuditTrail( + code: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CreditAuditEntryCollection + customerCredits( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CreditCollection + customerCredit(code: String!): Credit + customerCreditTransactions( + code: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CreditTransactionCollection + customerAccountAttributes( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + userId: String + ): CustomerAttributeCollection + customerAccountAttribute( + accountId: Int! + attributeFQN: String! + userId: String + ): CustomerAttribute + customerAccountCards(accountId: Int!): CardCollection + customerAccountCard(accountId: Int!, cardId: String!): Card + customerAccountContacts( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + userId: String + ): CustomerContactCollection + customerAccountContact( + accountId: Int! + contactId: Int! + userId: String + ): CustomerContact + customerAccounts( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + fields: String + q: String + qLimit: Int + isAnonymous: Boolean + ): CustomerAccountCollection + customerAccount(accountId: Int!, userId: String): CustomerAccount + getCurrentAccount: CustomerAccount + customerAccountTransactions(accountId: Int!): [Transaction] + customerAccountNotes( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CustomerNoteCollection + customerAccountNote(accountId: Int!, noteId: Int!): CustomerNote + customerAccountSegments( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CustomerSegmentCollection + customerAccountAuditLog( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CustomerAuditEntryCollection + customerPurchaseOrderAccount(accountId: Int!): CustomerPurchaseOrderAccount + customerPurchaseOrderAccountTransaction( + accountId: Int! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): PurchaseOrderTransactionCollection + customerAccountLoginState(accountId: Int!, userId: String): LoginState + customerSegments( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): CustomerSegmentCollection + customerSegment(id: Int!): CustomerSegment + customerSets( + startIndex: Int + pageSize: Int + sortBy: String + ): CustomerSetCollection + customerSet(code: String!): CustomerSet + inStockNotifications( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): InStockNotificationSubscriptionCollection + inStockNotification(id: Int!): InStockNotificationSubscription + authTicket(accountId: Int): CustomerAuthTicket + exchangeRates: [CurrencyExchangeRate] + resolvedPriceList(customerAccountId: Int): ResolvedPriceList + categoriesTree: CategoryCollection + categories( + filter: String + startIndex: Int + pageSize: Int + sortBy: String + ): CategoryPagedCollection + category(categoryId: Int!, allowInactive: Boolean): PrCategory + products( + filter: String + startIndex: Int + pageSize: Int + sortBy: String + responseOptions: String + cursorMark: String + defaultSort: String + mid: String + includeAllImages: Boolean + ): ProductCollection + product( + productCode: String! + variationProductCode: String + allowInactive: Boolean + skipInventoryCheck: Boolean + supressOutOfStock404: Boolean + quantity: Int + acceptVariantProductCode: Boolean + purchaseLocation: String + variationProductCodeFilter: String + sliceValue: String + includeAllImages: Boolean + ): Product + productVersion( + productCode: String! + productVersion: Int + lastModifiedDate: DateTime + ): ProductForIndexing + productLocationInventory( + productCode: String! + locationCodes: String + ): LocationInventoryCollection + suggestionSearch( + query: String + groups: String + pageSize: Int + mid: String + filter: String + ): SearchSuggestionResult + productSearchRandomAccessCursor( + query: String + filter: String + pageSize: Int + ): ProductSearchRandomAccessCursor + productSearch( + query: String + filter: String + facetTemplate: String + facetTemplateSubset: String + facet: String + facetFieldRangeQuery: String + facetHierPrefix: String + facetHierValue: String + facetHierDepth: String + facetStartIndex: String + facetPageSize: String + facetSettings: String + facetValueFilter: String + sortBy: String + pageSize: Int + startIndex: Int + searchSettings: String + enableSearchTuningRules: Boolean + searchTuningRuleContext: String + searchTuningRuleCode: String + facetTemplateExclude: String + facetPrefix: String + responseOptions: String + cursorMark: String + facetValueSort: String + defaultSort: String + sortDefinitionName: String + defaultSortDefinitionName: String + shouldSlice: Boolean + mid: String + omitNamespace: Boolean + ): ProductSearchResult + priceList(priceListCode: String): PriceList + cartsSummary: CartSummary + userCartSummary(userId: String!): CartSummary + cartSummary(cartId: String!): CartSummary + userCart(userId: String!): Cart + currentCart: Cart + cart(cartId: String!): Cart + currentCartExtendedProperties: [ExtendedProperty] + currentCartItems: CartItemCollection + cartItems(cartId: String!): CartItemCollection + currentCartItem(cartItemId: String!): CartItem + cartItem(cartId: String!, cartItemId: String!): CartItem + currentCartMessages: CartChangeMessageCollection + channels( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): ChannelCollection + channel(code: String!): Channel + channelGroups( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): ChannelGroupCollection + channelGroup(code: String!): ChannelGroup + checkoutAttributes(checkoutId: String!): [OrderAttribute] + checkout(checkoutId: String!): Checkout + checkouts( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + qLimit: Int + ): CheckoutCollection + checkoutShippingMethods(checkoutId: String!): [CheckoutGroupRates] + checkoutActions(checkoutId: String!): [String] + checkoutDestination(checkoutId: String!, destinationId: String!): Destination + checkoutDestinations(checkoutId: String!): [Destination] + orderPackageActions(orderId: String!, packageId: String!): [String] + orderPaymentActions(orderId: String!, paymentId: String!): [String] + orderPayment(orderId: String!, paymentId: String!): Payment + orderPayments(orderId: String!): PaymentCollection + orderPickup(orderId: String!, pickupId: String!): Pickup + orderPickupActions(orderId: String!, pickupId: String!): [String] + orderReturnableItems(orderId: String!): OrderReturnableItemCollection + orderShipment(orderId: String!, shipmentId: String!): Shipment + orderShipmentMethods(orderId: String!, draft: Boolean): [ShippingRate] + orderValidationResults(orderId: String!): [OrderValidationResult] + orderAttributes(orderId: String!): [OrderAttribute] + orderBillingInfo(orderId: String!, draft: Boolean): BillingInfo + orderCancelReasons(category: String): CancelReasonCollection + orders( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + qLimit: Int + includeBin: Boolean + mode: String + ): OrderCollection + order( + orderId: String! + draft: Boolean + includeBin: Boolean + mode: String + ): Order + orderActions(orderId: String!): [String] + orderTaxableOrders(orderId: String!): [PricingTaxableOrder] + orderDigitalPackage( + orderId: String! + digitalPackageId: String! + ): DigitalPackage + orderDigitalPackageActions( + orderId: String! + digitalPackageId: String! + ): [String] + orderExtendedProperties(orderId: String!, draft: Boolean): [ExtendedProperty] + orderFulfillmentInfo(orderId: String!, draft: Boolean): FulfillmentInfo + orderItems(orderId: String!, draft: Boolean): OrderItemCollection + orderNotes(orderId: String!): [OrderNote] + orderNote(orderId: String!, noteId: String!): OrderNote + orderPackage(orderId: String!, packageId: String!): PackageObj + orderPackageLabel(orderId: String!, packageId: String!): Boolean + quote(quoteId: String!, draft: Boolean): Quote + quotes( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + qLimit: Int + ): QuoteCollection + customerAccountQuote( + customerAccountId: Int! + quoteName: String! + draft: Boolean + ): Quote + quoteItems( + quoteId: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): [CrOrderItem] + customerAccountQuoteItems( + customerAccountId: Int! + quoteName: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): [CrOrderItem] + quoteItem(quoteId: String!, quoteItemId: String!, draft: Boolean): CrOrderItem + returns( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + ): ReturnCollection + returnReasons: ReasonCollection + returnReason(returnId: String!): ReturnObj + returnActions(returnId: String!): [String] + returnPayments(returnId: String!): PaymentCollection + returnPayment(returnId: String!, paymentId: String!): Payment + returnPaymentActions(returnId: String!, paymentId: String!): [String] + returnShippingLabel(returnId: String!): CarrierServiceGenerateLabelResponse + returnItems(returnId: String!): ReturnItemCollection + returnItem(returnId: String!, returnItemId: String!): ReturnItem + returnNotes(returnId: String!): [OrderNote] + returnNote(returnId: String!, noteId: String!): OrderNote + returnPackage(returnId: String!, packageId: String!): PackageObj + returnPackageLabel( + returnId: String! + packageId: String! + returnAsBase64Png: Boolean + ): Boolean + returnShipment(returnId: String!, shipmentId: String!): Shipment + wishlists( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + q: String + qLimit: Int + ): WishlistCollection + wishlist(wishlistId: String!): Wishlist + customerWishlist(customerAccountId: Int!, wishlistName: String!): Wishlist + wishlistItems( + wishlistId: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): WishlistItemCollection + customerWishlistItems( + customerAccountId: Int! + wishlistName: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): WishlistItemCollection + wishlistItem(wishlistId: String!, wishlistItemId: String!): WishlistItem + orderItem( + orderId: String + lineId: Int + orderItemId: String + draft: Boolean + ): CrOrderItem + documentListDocumentContent( + documentListName: String! + documentId: String! + ): Boolean + documentListDocumentTransform( + documentListName: String! + documentId: String! + width: Int + height: Int + max: Int + maxWidth: Int + maxHeight: Int + crop: String + quality: Int + ): Boolean + documentListTreeDocumentContent( + documentListName: String! + documentName: String! + ): Boolean + documentListTreeDocumentTransform( + documentListName: String! + documentName: String! + width: Int + height: Int + max: Int + maxWidth: Int + maxHeight: Int + crop: String + quality: Int + ): Boolean + documentListDocuments( + documentListName: String! + filter: String + sortBy: String + pageSize: Int + startIndex: Int + includeInactive: Boolean + path: String + includeSubPaths: Boolean + queryScope: String + ): DocumentCollection + documentListDocument( + documentListName: String! + documentId: String! + includeInactive: Boolean + ): Document + documentListTreeDocument( + documentListName: String! + documentName: String! + includeInactive: Boolean + ): Document + documentLists(pageSize: Int, startIndex: Int): DocumentListCollection + documentList(documentListName: String!): DocumentList + documentListViewDocuments( + documentListName: String! + viewName: String! + filter: String + sortBy: String + pageSize: Int + startIndex: Int + includeInactive: Boolean + ): DocumentCollection + documentListTypes(pageSize: Int, startIndex: Int): DocumentListTypeCollection + documentListType(documentListTypeFQN: String!): DocumentListType + documentDrafts( + pageSize: Int + startIndex: Int + documentLists: String + ): DocumentDraftSummaryPagedCollection + documentTypes(pageSize: Int, startIndex: Int): DocumentTypeCollection + documentType(documentTypeName: String!): DocumentType + propertyTypes(pageSize: Int, startIndex: Int): PropertyTypeCollection + propertyType(propertyTypeName: String!): PropertyType + adminLocations( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): LocationCollection + adminLocation(locationCode: String!): Location + adminLocationAttributes( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): LoAttributeCollection + adminLocationAttributeVocabularyValues( + attributeFQN: String! + ): [LoAttributeVocabularyValue] + adminLocationAttribute(attributeFQN: String!): LoAttribute + adminLocationGroups( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): LocationGroupCollection + dslLocation(includeAttributeDefinition: Boolean): Location + spLocations( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + includeAttributeDefinition: Boolean + ): LocationCollection + spLocation( + locationCode: String! + includeAttributeDefinition: Boolean + ): Location + usageTypeLocations( + locationUsageType: String! + startIndex: Int + pageSize: Int + sortBy: String + filter: String + includeAttributeDefinition: Boolean + ): LocationCollection + location(locationCode: String!, includeAttributeDefinition: Boolean): Location + locationUsages: LocationUsageCollection + locationUsage(code: String!): LocationUsage + adminLocationTypes: [LocationType] + adminLocationType(locationTypeCode: String!): LocationType + locationGroupConfig( + locationGroupId: Int + locationGroupCode: String + locationCode: String + ): LocationGroupConfiguration + locationGroup(groupId: Int, locationGroupCode: String): LocationGroup + entityListEntity(entityListFullName: String!, id: String!): Boolean + entityListEntities( + entityListFullName: String! + pageSize: Int + startIndex: Int + filter: String + sortBy: String + ): EntityCollection + entityListEntityContainer( + entityListFullName: String! + id: String! + ): EntityContainer + entityListEntityContainers( + entityListFullName: String! + pageSize: Int + startIndex: Int + filter: String + sortBy: String + ): EntityContainerCollection + entityList(entityListFullName: String!): EntityList + entityLists( + pageSize: Int + startIndex: Int + filter: String + sortBy: String + ): EntityListCollection + entityListViews(entityListFullName: String!): ListViewCollection + entityListView(entityListFullName: String!, viewName: String!): ListView + entityListViewEntityContainers( + entityListFullName: String! + viewName: String! + pageSize: Int + startIndex: Int + filter: String + ): EntityContainerCollection + entityListViewEntities( + entityListFullName: String! + viewName: String! + pageSize: Int + startIndex: Int + filter: String + ): EntityCollection + entityListViewEntityContainer( + entityListFullName: String! + viewName: String! + entityId: String! + ): EntityContainer + entityListViewEntity( + entityListFullName: String! + viewName: String! + entityId: String! + ): Boolean + carrierLocaleServiceTypes( + carrierId: String! + localeCode: String! + ): [ServiceType] + localeServiceTypes(localeCode: String!): [ServiceType] + targetRules( + startIndex: Int + pageSize: Int + sortBy: String + filter: String + ): TargetRuleCollection + targetRule(code: String!): TargetRule + orderRoutingRoutingSuggestionLog( + externalResponseID: String + orderID: Int + responseID: Int + suggestionID: Int + ): [JsonNode] +} + +type Quote { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Quote + id: String + name: String + siteId: Int! + tenantId: Int! + number: Int + submittedDate: DateTime + items: [CrOrderItem] + auditHistory: [AuditRecord] + auditInfo: CrAuditInfo + comments: [QuoteComment] + expirationDate: DateTime + fulfillmentInfo: FulfillmentInfo + userId: String + customerAccountId: Int + email: String + customerTaxId: String + isTaxExempt: Boolean + currencyCode: String + priceListCode: String + data: Object + taxData: Object + channelCode: String + locationCode: String + ipAddress: String + sourceDevice: String + visitId: String + webSessionId: String + customerInteractionType: String + orderDiscounts: [CrAppliedDiscount] + subTotal: Float! + itemLevelProductDiscountTotal: Float! + orderLevelProductDiscountTotal: Float! + itemTaxTotal: Float! + adjustment: Adjustment + itemTotal: Float! + total: Float! + shippingDiscounts: [ShippingDiscount] + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingAmount: Float! + shippingAdjustment: Adjustment + shippingSubTotal: Float! + shippingTax: Float + shippingTaxTotal: Float! + shippingTotal: Float! + handlingDiscounts: [CrAppliedDiscount] + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingAmount: Float + handlingAdjustment: Adjustment + handlingSubTotal: Float! + handlingTax: Float + handlingTaxTotal: Float! + handlingTotal: Float! + dutyAmount: Float + dutyTotal: Float! + feeTotal: Float! + isDraft: Boolean + hasDraft: Boolean + status: String + couponCodes: [String!] + invalidCoupons: [InvalidCoupon] +} + +type QuoteCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: QuoteCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Quote] +} + +type QuoteComment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: QuoteComment + id: String + text: String + auditInfo: CrAuditInfo +} + +input QuoteCommentInput { + id: String + text: String + auditInfo: CrAuditInfoInput +} + +input QuoteInput { + id: String + name: String + siteId: Int! + tenantId: Int! + number: Int + submittedDate: DateTime + items: [CrOrderItemInput] + auditHistory: [AuditRecordInput] + auditInfo: CrAuditInfoInput + comments: [QuoteCommentInput] + expirationDate: DateTime + fulfillmentInfo: FulfillmentInfoInput + userId: String + customerAccountId: Int + email: String + customerTaxId: String + isTaxExempt: Boolean = false + currencyCode: String + priceListCode: String + data: Object + taxData: Object + channelCode: String + locationCode: String + ipAddress: String + sourceDevice: String + visitId: String + webSessionId: String + customerInteractionType: String + orderDiscounts: [CrAppliedDiscountInput] + subTotal: Float! + itemLevelProductDiscountTotal: Float! + orderLevelProductDiscountTotal: Float! + itemTaxTotal: Float! + adjustment: AdjustmentInput + itemTotal: Float! + total: Float! + shippingDiscounts: [ShippingDiscountInput] + itemLevelShippingDiscountTotal: Float! + orderLevelShippingDiscountTotal: Float! + shippingAmount: Float! + shippingAdjustment: AdjustmentInput + shippingSubTotal: Float! + shippingTax: Float + shippingTaxTotal: Float! + shippingTotal: Float! + handlingDiscounts: [CrAppliedDiscountInput] + itemLevelHandlingDiscountTotal: Float! + orderLevelHandlingDiscountTotal: Float! + handlingAmount: Float + handlingAdjustment: AdjustmentInput + handlingSubTotal: Float! + handlingTax: Float + handlingTaxTotal: Float! + handlingTotal: Float! + dutyAmount: Float + dutyTotal: Float! + feeTotal: Float! + isDraft: Boolean = false + hasDraft: Boolean = false + status: String + couponCodes: [String!] + invalidCoupons: [InvalidCouponInput] +} + +type ReasonCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReasonCollection + totalCount: Int! + items: [String!] +} + +type Refund { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Refund + id: String + orderId: String + reason: String + reasonCode: String + payment: Payment + amount: Float! + refundMethod: String + auditInfo: CrAuditInfo +} + +input RefundInput { + id: String + orderId: String + reason: String + reasonCode: String + payment: PaymentInput + amount: Float! + refundMethod: String + auditInfo: CrAuditInfoInput +} + +type RegularHours { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: RegularHours + sunday: Hours + monday: Hours + tuesday: Hours + wednesday: Hours + thursday: Hours + friday: Hours + saturday: Hours + timeZone: String +} + +input RegularHoursInput { + sunday: HoursInput + monday: HoursInput + tuesday: HoursInput + wednesday: HoursInput + thursday: HoursInput + friday: HoursInput + saturday: HoursInput + timeZone: String +} + +input RepriceShipmentObjectInput { + originalShipment: ShipmentInput + newShipment: ShipmentInput +} + +input ResetPasswordInfoInput { + emailAddress: String + userName: String + customerSetCode: String +} + +type ResolvedPriceList { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ResolvedPriceList + priceListCode: String + priceListId: Int! + name: String + description: String +} + +input RestockableReturnItemInput { + returnItemId: String + quantity: Int! + locationCode: String +} + +input ReturnActionInput { + actionName: String + returnIds: [String!] +} + +type ReturnBundle { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnBundle + productCode: String + quantity: Int! +} + +input ReturnBundleInput { + productCode: String + quantity: Int! +} + +type ReturnCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [ReturnObj] +} + +type ReturnItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnItem + id: String + orderItemId: String + orderLineId: Int + orderItemOptionAttributeFQN: String + product: CrProduct + reasons: [ReturnReason] + excludeProductExtras: Boolean + returnType: String + returnNotRequired: Boolean + quantityReceived: Int! + receiveStatus: String + quantityShipped: Int! + replaceStatus: String + quantityRestockable: Int! + quantityRestocked: Int! + refundAmount: Float + refundStatus: String + quantityReplaced: Int + notes: [OrderNote] + productLossAmount: Float + productLossTaxAmount: Float + shippingLossAmount: Float + shippingLossTaxAmount: Float + bundledProducts: [ReturnBundle] + totalWithoutWeightedShippingAndHandling: Float + totalWithWeightedShippingAndHandling: Float + shipmentItemId: Int + shipmentNumber: Int +} + +type ReturnItemCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnItemCollection + totalCount: Int! + items: [ReturnItem] +} + +input ReturnItemInput { + id: String + orderItemId: String + orderLineId: Int + orderItemOptionAttributeFQN: String + product: CrProductInput + reasons: [ReturnReasonInput] + excludeProductExtras: Boolean = false + returnType: String + returnNotRequired: Boolean = false + quantityReceived: Int! + receiveStatus: String + quantityShipped: Int! + replaceStatus: String + quantityRestockable: Int! + quantityRestocked: Int! + refundAmount: Float + refundStatus: String + quantityReplaced: Int + notes: [OrderNoteInput] + productLossAmount: Float + productLossTaxAmount: Float + shippingLossAmount: Float + shippingLossTaxAmount: Float + bundledProducts: [ReturnBundleInput] + totalWithoutWeightedShippingAndHandling: Float + totalWithWeightedShippingAndHandling: Float + shipmentItemId: Int + shipmentNumber: Int +} + +input ReturnItemSpecifierInput { + returnItemId: String + quantity: Int! +} + +type ReturnObj { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnObj + id: String + customerAccountId: Int + visitId: String + webSessionId: String + customerInteractionType: String + availableActions: [String!] + returnNumber: Int + contact: Contact + locationCode: String + originalOrderId: String + originalOrderNumber: Int + returnOrderId: String + currencyCode: String + status: String + receiveStatus: String + refundStatus: String + replaceStatus: String + items: [ReturnItem] + notes: [OrderNote] + rmaDeadline: DateTime + returnType: String + refundAmount: Float + auditInfo: CrAuditInfo + payments: [Payment] + packages: [PackageObj] + productLossTotal: Float + shippingLossTotal: Float + lossTotal: Float + productLossTaxTotal: Float + shippingLossTaxTotal: Float + tenantId: Int + siteId: Int + userId: String + channelCode: String + changeMessages: [ChangeMessage] + actionRequired: Boolean + isUnified: Boolean +} + +input ReturnObjInput { + id: String + customerAccountId: Int + visitId: String + webSessionId: String + customerInteractionType: String + availableActions: [String!] + returnNumber: Int + contact: ContactInput + locationCode: String + originalOrderId: String + originalOrderNumber: Int + returnOrderId: String + currencyCode: String + status: String + receiveStatus: String + refundStatus: String + replaceStatus: String + items: [ReturnItemInput] + notes: [OrderNoteInput] + rmaDeadline: DateTime + returnType: String + refundAmount: Float + auditInfo: CrAuditInfoInput + payments: [PaymentInput] + packages: [PackageObjInput] + productLossTotal: Float + shippingLossTotal: Float + lossTotal: Float + productLossTaxTotal: Float + shippingLossTaxTotal: Float + tenantId: Int + siteId: Int + userId: String + channelCode: String + changeMessages: [ChangeMessageInput] + actionRequired: Boolean = false + isUnified: Boolean = false +} + +type ReturnReason { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ReturnReason + reason: String + quantity: Int! +} + +input ReturnReasonInput { + reason: String + quantity: Int! +} + +type SearchSuggestion { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SearchSuggestion + suggestionType: String + suggestion: Object +} + +type SearchSuggestionGroup { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SearchSuggestionGroup + name: String + suggestions: [SearchSuggestion] +} + +type SearchSuggestionResult { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SearchSuggestionResult + query: String + suggestionGroups: [SearchSuggestionGroup] +} + +type ServiceType { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ServiceType + code: String + deliveryDuration: String + content: ServiceTypeLocalizedContent +} + +type ServiceTypeLocalizedContent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ServiceTypeLocalizedContent + localeCode: String + name: String +} + +type Shipment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Shipment + id: String + externalShipmentId: String + number: Int + orderId: String + orderNumber: Int! + email: String + currencyCode: String + customerAccountId: Int + customerTaxId: String + shipmentType: String + shippingMethodCode: String + shippingMethodName: String + fulfillmentLocationCode: String + origin: Contact + destination: Destination + shipmentStatus: String + shipmentStatusReason: ShipmentStatusReason + transferShipmentNumbers: [Int!] + isTransfer: Boolean + originalShipmentNumber: Int + parentShipmentNumber: Int + fulfillmentStatus: String + workflowProcessId: String + workflowProcessContainerId: String + workflowState: WorkflowState + backorderCreatedDate: Int + fulfillmentDate: DateTime + orderSubmitDate: DateTime + pickStatus: String + pickType: String + changeMessages: [ChangeMessage] + packages: [PackageObj] + items: [ShipmentItem] + canceledItems: [CanceledItem] + data: Object + taxData: Object + auditInfo: CrAuditInfo + shipmentAdjustment: Float! + lineItemSubtotal: Float! + lineItemTaxAdjustment: Float! + lineItemTaxTotal: Float! + lineItemTotal: Float! + shippingAdjustment: Float! + shippingSubtotal: Float! + shippingTaxAdjustment: Float! + shippingTaxTotal: Float! + shippingTotal: Float! + handlingAdjustment: Float! + handlingSubtotal: Float! + handlingTaxAdjustment: Float! + handlingTaxTotal: Float! + handlingTotal: Float! + dutyAdjustment: Float! + dutyTotal: Float! + total: Float! + cost: Float + externalOrderId: String + isExpress: Boolean + readyToCapture: Boolean + pickupInfo: Object + shopperNotes: FulfillmentShopperNotes + customer: Customer +} + +input ShipmentAdjustmentInput { + itemAdjustment: Float + itemTaxAdjustment: Float + shippingAdjustment: Float + shippingTaxAdjustment: Float + handlingAdjustment: Float + handlingTaxAdjustment: Float +} + +input ShipmentInput { + id: String + externalShipmentId: String + number: Int + orderId: String + orderNumber: Int! + email: String + currencyCode: String + customerAccountId: Int + customerTaxId: String + shipmentType: String + shippingMethodCode: String + shippingMethodName: String + fulfillmentLocationCode: String + origin: ContactInput + destination: DestinationInput + shipmentStatus: String + shipmentStatusReason: ShipmentStatusReasonInput + transferShipmentNumbers: [Int!] + isTransfer: Boolean = false + originalShipmentNumber: Int + parentShipmentNumber: Int + fulfillmentStatus: String + workflowProcessId: String + workflowProcessContainerId: String + workflowState: WorkflowStateInput + backorderCreatedDate: Int + fulfillmentDate: DateTime + orderSubmitDate: DateTime + pickStatus: String + pickType: String + changeMessages: [ChangeMessageInput] + packages: [PackageObjInput] + items: [ShipmentItemInput] + canceledItems: [CanceledItemInput] + data: Object + taxData: Object + auditInfo: CrAuditInfoInput + shipmentAdjustment: Float! + lineItemSubtotal: Float! + lineItemTaxAdjustment: Float! + lineItemTaxTotal: Float! + lineItemTotal: Float! + shippingAdjustment: Float! + shippingSubtotal: Float! + shippingTaxAdjustment: Float! + shippingTaxTotal: Float! + shippingTotal: Float! + handlingAdjustment: Float! + handlingSubtotal: Float! + handlingTaxAdjustment: Float! + handlingTaxTotal: Float! + handlingTotal: Float! + dutyAdjustment: Float! + dutyTotal: Float! + total: Float! + cost: Float + externalOrderId: String + isExpress: Boolean = false + readyToCapture: Boolean = false + pickupInfo: Object + shopperNotes: FulfillmentShopperNotesInput + customer: CustomerInput +} + +type ShipmentItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShipmentItem + lineId: Int! + originalOrderItemId: String + parentId: String + productCode: String + variationProductCode: String + optionAttributeFQN: String + name: String + auditInfo: CrAuditInfo + fulfillmentLocationCode: String + imageUrl: String + isTaxable: Boolean + quantity: Int! + unitPrice: Float! + actualPrice: Float! + overridePrice: Float + itemDiscount: Float! + lineItemCost: Float! + itemTax: Float! + shipping: Float! + shippingDiscount: Float! + shippingTax: Float! + handling: Float! + handlingDiscount: Float! + handlingTax: Float! + duty: Float! + isPackagedStandAlone: Boolean + readyForPickupQuantity: Int + backorderReleaseDate: DateTime + measurements: CrPackageMeasurements + options: [CrProductOption] + data: Object + taxData: Object + weightedShipmentAdjustment: Float! + weightedLineItemTaxAdjustment: Float! + weightedShippingAdjustment: Float! + weightedShippingTaxAdjustment: Float! + weightedHandlingAdjustment: Float! + weightedHandlingTaxAdjustment: Float! + weightedDutyAdjustment: Float! + taxableShipping: Float! + taxableLineItemCost: Float! + taxableHandling: Float! + fulfillmentFields: [FulfillmentField] + isAssemblyRequired: Boolean + parentItemId: String + childItemIds: [String!] + giftCards: [GiftCard] +} + +input ShipmentItemAdjustmentInput { + overridePrice: Float +} + +input ShipmentItemInput { + lineId: Int! + originalOrderItemId: String + parentId: String + productCode: String + variationProductCode: String + optionAttributeFQN: String + name: String + auditInfo: CrAuditInfoInput + fulfillmentLocationCode: String + imageUrl: String + isTaxable: Boolean = false + quantity: Int! + unitPrice: Float! + actualPrice: Float! + overridePrice: Float + itemDiscount: Float! + lineItemCost: Float! + itemTax: Float! + shipping: Float! + shippingDiscount: Float! + shippingTax: Float! + handling: Float! + handlingDiscount: Float! + handlingTax: Float! + duty: Float! + isPackagedStandAlone: Boolean = false + readyForPickupQuantity: Int + backorderReleaseDate: DateTime + measurements: CrPackageMeasurementsInput + options: [CrProductOptionInput] + data: Object + taxData: Object + weightedShipmentAdjustment: Float! + weightedLineItemTaxAdjustment: Float! + weightedShippingAdjustment: Float! + weightedShippingTaxAdjustment: Float! + weightedHandlingAdjustment: Float! + weightedHandlingTaxAdjustment: Float! + weightedDutyAdjustment: Float! + taxableShipping: Float! + taxableLineItemCost: Float! + taxableHandling: Float! + fulfillmentFields: [FulfillmentFieldInput] + isAssemblyRequired: Boolean = false + parentItemId: String + childItemIds: [String!] + giftCards: [GiftCardInput] +} + +type ShipmentStatusReason { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShipmentStatusReason + reasonCode: String + moreInfo: String +} + +input ShipmentStatusReasonInput { + reasonCode: String + moreInfo: String +} + +input ShippingAddressInput { + addressID: Int! + addressLine1: String! + city: String! + countryCode: String! + customerID: Int! + latitude: Float! + longitude: Float! + phone: String! + postalCode: String! + state: String! +} + +type ShippingDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShippingDiscount + methodCode: String + discount: CrAppliedDiscount +} + +input ShippingDiscountInput { + methodCode: String + discount: CrAppliedDiscountInput +} + +type ShippingMethodMappings { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShippingMethodMappings + shippingMethods: [String!] + returnLabelShippingMethod: String + standardDefault: String + express1DayDefault: String + express2DayDefault: String + express3DayDefault: String + enableSmartPost: Boolean + internationalUsReturnLabelShippingMethod: String +} + +type ShippingOriginContact { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShippingOriginContact + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumber: String + email: String +} + +input ShippingOriginContactInput { + firstName: String + middleNameOrInitial: String + lastNameOrSurname: String + companyOrOrganization: String + phoneNumber: String + email: String +} + +type ShippingRate { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShippingRate + shippingMethodCode: String + shippingMethodName: String + shippingZoneCode: String + isValid: Boolean + messages: [String!] + data: Object + currencyCode: String + price: Float +} + +input ShippingRateInput { + shippingMethodCode: String + shippingMethodName: String + shippingZoneCode: String + isValid: Boolean = false + messages: [String!] + data: Object + currencyCode: String + price: Float +} + +type ShopperNotes { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ShopperNotes + giftMessage: String + comments: String + deliveryInstructions: String +} + +input ShopperNotesInput { + giftMessage: String + comments: String + deliveryInstructions: String +} + +type SolrDebugInfo { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SolrDebugInfo + searchTuningRuleCode: String + boostedProductCodes: [String!] + blockedProductCodes: [String!] + boostQueries: [String!] + boostFunctions: [String!] +} + +input SplitShipmentsObjectInput { + originalShipment: ShipmentInput + newShipments: [ShipmentInput] +} + +type SubPayment { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SubPayment + status: String + amountCollected: Float! + amountCredited: Float! + amountRequested: Float! + amountRefunded: Float! + target: PaymentActionTarget +} + +input SubPaymentInput { + status: String + amountCollected: Float! + amountCredited: Float! + amountRequested: Float! + amountRefunded: Float! + target: PaymentActionTargetInput +} + +type SuggestedDiscount { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SuggestedDiscount + productCode: String + autoAdd: Boolean + discountId: Int! + hasMultipleProducts: Boolean + hasOptions: Boolean +} + +input SuggestedDiscountInput { + productCode: String + autoAdd: Boolean = false + discountId: Int! + hasMultipleProducts: Boolean = false + hasOptions: Boolean = false +} + +type SuggestionEvent { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SuggestionEvent + causeID: Int! + errors: [String!]! + name: String! + type: TypeEnum +} + +type SuggestionLog { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SuggestionLog + created: DateTime! + creatorUsername: String! + environmentID: Int! + events: [SuggestionEvent]! + externalResponseID: String! + orderID: Int! + pathString: String! + persisted: Boolean + siteID: Int! + suggestionID: Int! + tenantID: Int! + updated: DateTime! + updaterUsername: String! +} + +input SuggestionRequestInput { + bundlingStrategy: BundlingStrategyEnum + customData: Object! + environmentID: Int! + exclusionListLocationCode: [ExclusionListEntryLocationCodeInput]! + externalResponseID: String! + fraud: Int! + inventoryRequestType: InventoryRequestTypeEnum + isExpress: Boolean = false + items: [OrderItemInput]! + locationCodeWhiteList: [String!]! + numShipmentsNotInRequest: Int! + orderID: Int! + orderType: OrderTypeEnum + pickupLocationCode: String! + shippingAddress: ShippingAddressInput + total: Float! +} + +type SuggestionResponse { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: SuggestionResponse + assignmentSuggestions: Object! + availableLocations: [Int!]! + externalResponseID: String! + responseID: Int! + stateChangeSuggestions: Object! + suggestionLog: SuggestionLog +} + +type TargetRule { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: TargetRule + code: String + description: String + domain: String + expression: String +} + +type TargetRuleCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: TargetRuleCollection + totalCount: Int! + items: [TargetRule] +} + +input TargetRuleInput { + code: String + description: String + domain: String + expression: String +} + +type TaskInput { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: TaskInput + helpMessage: String + label: String + maxLength: Int + maximum: Float! + minLength: Int + minimum: Float! + name: String + options: [Object!] + pattern: String + required: Boolean + type: String +} + +input TaskInputInput { + helpMessage: String + label: String + maxLength: Int + maximum: Float! + minLength: Int + minimum: Float! + name: String + options: [Object!] + pattern: String + required: Boolean = false + type: String +} + +type ThresholdMessage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ThresholdMessage + discountId: Int! + message: String + thresholdValue: Float! + showOnCheckout: Boolean + showInCart: Boolean + requiresCouponCode: Boolean +} + +input ThresholdMessageInput { + discountId: Int! + message: String + thresholdValue: Float! + showOnCheckout: Boolean = false + showInCart: Boolean = false + requiresCouponCode: Boolean = false +} + +type Tracking { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Tracking + attributes: Object + number: String + url: String +} + +input TrackingInput { + attributes: Object + number: String + url: String +} + +type Transaction { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Transaction + transactionId: String + visitId: String + transactionType: String + interactionType: String + amount: Float! + date: DateTime! + currencyCode: String +} + +input TransactionInput { + transactionId: String + visitId: String + transactionType: String + interactionType: String + amount: Float! + date: DateTime! + currencyCode: String +} + +enum TypeEnum { + NEW_REQUEST + ROUTE_SELECTED + MAKE_LOCATIONS_AVAILABLE + NO_ROUTE_FOUND + REMOVED_INACTIVE_LOCATIONS + REMOVED_ON_HOLD_LOCATIONS + REMOVED_OVERFULFILLED_LOCATIONS + GROUP + GROUP_FILTER + GROUP_SORT + FILTER + SORT + AFTER_ACTION + FOUND_FULL_ORDER_LOCATION + RESPONSE + AFTER_ACTION_SORT + DEFAULT_RESPONSE + MAX_SPLITS_EXCEEDED + AUTO_ASSIGN_LIMIT_EXCEEDED + INVENTORY_REQUEST + REMOVED_INTERNATIONAL_LOCATIONS +} + +type UserRole { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: UserRole + userId: String + assignedInScope: UserScope + roleId: Int! + roleName: String + roleTags: [String!] + auditInfo: CuAuditInfo +} + +type UserRoleCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: UserRoleCollection + totalCount: Int! + items: [UserRole] +} + +input UserRoleInput { + userId: String + assignedInScope: UserScopeInput + roleId: Int! + roleName: String + roleTags: [String!] + auditInfo: CuAuditInfoInput +} + +type UserScope { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: UserScope + type: String + id: Int + name: String +} + +input UserScopeInput { + type: String + id: Int + name: String +} + +type ValidationMessage { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ValidationMessage + severity: String + source: String + message: String + validationType: String + sourceId: String +} + +type VariationOption { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: VariationOption + valueSequence: Int! + attributeFQN: String + value: Object +} + +type VariationSummary { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: VariationSummary + productCode: String + options: [VariationOption] + inventoryInfo: ProductInventoryInfo +} + +type View { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: View + name: String + usages: [String!] + metadata: Object + isVisibleInStorefront: Boolean + filter: String + includeInactiveMode: String + isAdminDefault: Boolean + fields: [ViewField] +} + +type ViewField { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: ViewField + name: String + target: String +} + +input ViewFieldInput { + name: String + target: String +} + +input ViewInput { + name: String + usages: [String!] + metadata: Object + isVisibleInStorefront: Boolean = false + filter: String + includeInactiveMode: String + isAdminDefault: Boolean = false + fields: [ViewFieldInput] +} + +type Wishlist { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: Wishlist + customerAccountId: Int + typeTag: String + name: String + items: [WishlistItem] + privacyType: String + sortOrder: Int + version: String + isImport: Boolean + importDate: DateTime + externalId: String + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfo + orderDiscounts: [CrAppliedDiscount] + suggestedDiscounts: [SuggestedDiscount] + rejectedDiscounts: [SuggestedDiscount] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessage] + extendedProperties: [ExtendedProperty] + discountThresholdMessages: [ThresholdMessage] + auditInfo: CrAuditInfo +} + +type WishlistCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: WishlistCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [Wishlist] +} + +input WishlistInput { + customerAccountId: Int + typeTag: String + name: String + items: [WishlistItemInput] + privacyType: String + sortOrder: Int + version: String + isImport: Boolean = false + importDate: DateTime + externalId: String + userId: String + id: String + tenantId: Int + siteId: Int + channelCode: String + currencyCode: String + visitId: String + webSessionId: String + customerInteractionType: String + fulfillmentInfo: FulfillmentInfoInput + orderDiscounts: [CrAppliedDiscountInput] + suggestedDiscounts: [SuggestedDiscountInput] + rejectedDiscounts: [SuggestedDiscountInput] + data: Object + taxData: Object + subtotal: Float + discountedSubtotal: Float + discountTotal: Float + discountedTotal: Float + shippingTotal: Float + shippingSubTotal: Float + shippingTaxTotal: Float + handlingTaxTotal: Float + itemTaxTotal: Float + taxTotal: Float + feeTotal: Float + total: Float + lineItemSubtotalWithOrderAdjustments: Float + shippingAmountBeforeDiscountsAndAdjustments: Float + lastValidationDate: DateTime + expirationDate: DateTime + changeMessages: [ChangeMessageInput] + extendedProperties: [ExtendedPropertyInput] + discountThresholdMessages: [ThresholdMessageInput] + auditInfo: CrAuditInfoInput +} + +type WishlistItem { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: WishlistItem + id: String + comments: String + priorityType: String + purchasableStatusType: String + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProduct + quantity: Int! + isRecurring: Boolean + isTaxable: Boolean + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPrice + productDiscount: AppliedLineItemProductDiscount + productDiscounts: [AppliedLineItemProductDiscount] + shippingDiscounts: [AppliedLineItemShippingDiscount] + data: Object + taxData: Object + auditInfo: CrAuditInfo + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean + childItemIds: [String!] + parentItemId: String +} + +type WishlistItemCollection { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: WishlistItemCollection + startIndex: Int! + pageSize: Int! + pageCount: Int! + totalCount: Int! + items: [WishlistItem] +} + +input WishlistItemInput { + id: String + comments: String + priorityType: String + purchasableStatusType: String + localeCode: String + purchaseLocation: String + lineId: Int + product: CrProductInput + quantity: Int! + isRecurring: Boolean = false + isTaxable: Boolean = false + subtotal: Float + extendedTotal: Float + taxableTotal: Float + discountTotal: Float + discountedTotal: Float + itemTaxTotal: Float + shippingTaxTotal: Float + shippingTotal: Float + handlingAmount: Float + feeTotal: Float + total: Float + unitPrice: CommerceUnitPriceInput + productDiscount: AppliedLineItemProductDiscountInput + productDiscounts: [AppliedLineItemProductDiscountInput] + shippingDiscounts: [AppliedLineItemShippingDiscountInput] + data: Object + taxData: Object + auditInfo: CrAuditInfoInput + shippingAmountBeforeDiscountsAndAdjustments: Float + weightedOrderAdjustment: Float + weightedOrderDiscount: Float + adjustedLineItemSubtotal: Float + totalWithoutWeightedShippingAndHandling: Float + weightedOrderTax: Float + weightedOrderShipping: Float + weightedOrderShippingDiscount: Float + weightedOrderShippingManualAdjustment: Float + weightedOrderShippingTax: Float + weightedOrderHandlingFee: Float + weightedOrderHandlingFeeTax: Float + weightedOrderHandlingFeeDiscount: Float + weightedOrderDuty: Float + totalWithWeightedShippingAndHandling: Float + weightedOrderHandlingAdjustment: Float + autoAddDiscountId: Int + isAssemblyRequired: Boolean = false + childItemIds: [String!] + parentItemId: String +} + +type WorkflowState { + _get( + path: String! + defaultValue: AnyScalar + allowUndefined: Boolean + ): AnyScalar + _root: WorkflowState + attributes: Object + auditInfo: CrAuditInfo + completedDate: DateTime + processInstanceId: String + shipmentState: String + taskList: [FulfillmentTask] +} + +input WorkflowStateInput { + attributes: Object + auditInfo: CrAuditInfoInput + completedDate: DateTime + processInstanceId: String + shipmentState: String + taskList: [FulfillmentTaskInput] +} diff --git a/packages/kibocommerce/src/api/endpoints/cart/add-item.ts b/packages/kibocommerce/src/api/endpoints/cart/add-item.ts new file mode 100644 index 0000000..6dfea1e --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/cart/add-item.ts @@ -0,0 +1,101 @@ +import { normalizeCart } from '../../../lib/normalize' +import type { CartEndpoint } from '.' +import addToCurrentCartMutation from '../../../api/mutations/addToCart-mutation' + +import { getProductQuery } from '../../../api/queries/get-product-query' +import { getCartQuery } from '../../../api/queries/get-cart-query' +import CookieHandler from '../../../api/utils/cookie-handler' + +const buildAddToCartVariables = ({ + productId, + variantId, + quantity = 1, + productResponse, +}: { + productId: string + variantId: string + quantity: number + productResponse: any +}) => { + const { product } = productResponse.data + + const selectedOptions = product.variations?.find( + (v: any) => v.productCode === variantId + ).options + + let options: any[] = [] + selectedOptions?.forEach((each: any) => { + product?.options + .filter((option: any) => { + return option.attributeFQN == each.attributeFQN + }) + .forEach((po: any) => { + options.push({ + attributeFQN: po.attributeFQN, + name: po.attributeDetail.name, + value: po.values?.find((v: any) => v.value == each.value).value, + }) + }) + }) + + return { + productToAdd: { + product: { + productCode: productId, + variationProductCode: variantId ? variantId : null, + options, + }, + quantity, + fulfillmentMethod: 'Ship', + }, + } +} + +const addItem: CartEndpoint['handlers']['addItem'] = async ({ + req, + res, + body: { cartId, item }, + config, +}) => { + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + if (!item.quantity) item.quantity = 1 + + const productResponse = await config.fetch(getProductQuery, { + variables: { productCode: item?.productId }, + }) + + const cookieHandler = new CookieHandler(config, req, res) + let accessToken = null + + if (!cookieHandler.getAccessToken()) { + let anonymousShopperTokenResponse = await cookieHandler.getAnonymousToken() + accessToken = anonymousShopperTokenResponse.accessToken; + } else { + accessToken = cookieHandler.getAccessToken() + } + + const addToCartResponse = await config.fetch( + addToCurrentCartMutation, + { + variables: buildAddToCartVariables({ ...item, productResponse }), + }, + { headers: { 'x-vol-user-claims': accessToken } } + ) + let currentCart = null + if (addToCartResponse.data.addItemToCurrentCart) { + let result = await config.fetch( + getCartQuery, + {}, + { headers: { 'x-vol-user-claims': accessToken } } + ) + currentCart = result?.data?.currentCart + } + res.status(200).json({ data: normalizeCart(currentCart) }) +} + +export default addItem diff --git a/packages/kibocommerce/src/api/endpoints/cart/get-cart.ts b/packages/kibocommerce/src/api/endpoints/cart/get-cart.ts new file mode 100644 index 0000000..6a6ec3a --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/cart/get-cart.ts @@ -0,0 +1,41 @@ +import CookieHandler from '../../../api/utils/cookie-handler' +import { normalizeCart } from '../../../lib/normalize' +import { Cart } from '../../../../schema' +import type { CartEndpoint } from '.' +import { getCartQuery } from '../../queries/get-cart-query' + +const getCart: CartEndpoint['handlers']['getCart'] = async ({ + req, + res, + body: { cartId }, + config, +}) => { + let currentCart: Cart = {} + try { + const cookieHandler = new CookieHandler(config, req, res) + let accessToken = null + + if (!cookieHandler.getAccessToken()) { + let anonymousShopperTokenResponse = await cookieHandler.getAnonymousToken() + const response = anonymousShopperTokenResponse.response + accessToken = anonymousShopperTokenResponse.accessToken + cookieHandler.setAnonymousShopperCookie(response) + } else { + accessToken = cookieHandler.getAccessToken() + } + + let result = await config.fetch( + getCartQuery, + {}, + { headers: { 'x-vol-user-claims': accessToken } } + ) + currentCart = result?.data?.currentCart + } catch (error) { + throw error + } + res.status(200).json({ + data: currentCart ? normalizeCart(currentCart) : null, + }) +} + +export default getCart diff --git a/packages/kibocommerce/src/api/endpoints/cart/index.ts b/packages/kibocommerce/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..d4e8118 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/cart/index.ts @@ -0,0 +1,25 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import cartEndpoint from '@vercel/commerce/api/endpoints/cart' +import type { KiboCommerceAPI } from '../..' +import getCart from './get-cart'; +import addItem from './add-item'; +import updateItem from './update-item' +import removeItem from './remove-item' + +export type CartAPI = GetAPISchema + +export type CartEndpoint = CartAPI['endpoint'] + +export const handlers: CartEndpoint['handlers'] = { + getCart, + addItem, + updateItem, + removeItem, +} + +const cartApi = createEndpoint({ + handler: cartEndpoint, + handlers, +}) + +export default cartApi diff --git a/packages/kibocommerce/src/api/endpoints/cart/remove-item.ts b/packages/kibocommerce/src/api/endpoints/cart/remove-item.ts new file mode 100644 index 0000000..62f6afd --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/cart/remove-item.ts @@ -0,0 +1,45 @@ +import { normalizeCart } from '../../../lib/normalize' +import type { CartEndpoint } from '.' +import removeItemFromCartMutation from '../../../api/mutations/removeItemFromCart-mutation' +import { getCartQuery } from '../../../api/queries/get-cart-query' + +const removeItem: CartEndpoint['handlers']['removeItem'] = async ({ + req, + res, + body: { cartId, itemId }, + config, +}) => { + if (!itemId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + const encodedToken = req.cookies[config.customerCookie] + const token = encodedToken + ? Buffer.from(encodedToken, 'base64').toString('ascii') + : null + + const accessToken = token ? JSON.parse(token).accessToken : null + + const removeItemResponse = await config.fetch( + removeItemFromCartMutation, + { + variables: { id: itemId }, + }, + { headers: { 'x-vol-user-claims': accessToken } } + ) + + let currentCart = null + if (removeItemResponse.data.deleteCurrentCartItem) { + let result = await config.fetch( + getCartQuery, + {}, + { headers: { 'x-vol-user-claims': accessToken } } + ) + currentCart = result?.data?.currentCart + } + res.status(200).json({ data: normalizeCart(currentCart) }) +} + +export default removeItem diff --git a/packages/kibocommerce/src/api/endpoints/cart/update-item.ts b/packages/kibocommerce/src/api/endpoints/cart/update-item.ts new file mode 100644 index 0000000..b42ff34 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/cart/update-item.ts @@ -0,0 +1,45 @@ +import { normalizeCart } from '../../../lib/normalize' +import type { CartEndpoint } from '.' +import { getCartQuery } from '../../../api/queries/get-cart-query' +import updateCartItemQuantityMutation from '../../../api/mutations/updateCartItemQuantity-mutation' + +const updateItem: CartEndpoint['handlers']['updateItem'] = async ({ + req, + res, + body: { cartId, itemId, item }, + config, +}) => { + if (!itemId || !item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + const encodedToken = req.cookies[config.customerCookie] + const token = encodedToken + ? Buffer.from(encodedToken, 'base64').toString('ascii') + : null + + const accessToken = token ? JSON.parse(token).accessToken : null + + const updateItemResponse = await config.fetch( + updateCartItemQuantityMutation, + { + variables: { itemId: itemId, quantity: item.quantity }, + }, + { headers: { 'x-vol-user-claims': accessToken } } + ) + + let currentCart = null + if (updateItemResponse.data) { + let result = await config.fetch( + getCartQuery, + {}, + { headers: { 'x-vol-user-claims': accessToken } } + ) + currentCart = result?.data?.currentCart + } + res.status(200).json({ data: normalizeCart(currentCart) }) +} + +export default updateItem diff --git a/packages/kibocommerce/src/api/endpoints/catalog/products/index.ts b/packages/kibocommerce/src/api/endpoints/catalog/products/index.ts new file mode 100644 index 0000000..a838eb5 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/catalog/products/index.ts @@ -0,0 +1,17 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import productsEndpoint from '@vercel/commerce/api/endpoints/catalog/products' +import type { KiboCommerceAPI } from '../../..' +import getProducts from '../products/products' + +export type ProductsAPI = GetAPISchema + +export type ProductsEndpoint = ProductsAPI['endpoint'] + +export const handlers: ProductsEndpoint['handlers'] = { getProducts } + +const productsApi = createEndpoint({ + handler: productsEndpoint, + handlers, +}) + +export default productsApi diff --git a/packages/kibocommerce/src/api/endpoints/catalog/products/products.ts b/packages/kibocommerce/src/api/endpoints/catalog/products/products.ts new file mode 100644 index 0000000..189922d --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/catalog/products/products.ts @@ -0,0 +1,31 @@ +import { Product } from '@vercel/commerce/types/product' +import { ProductsEndpoint } from '.' +import productSearchQuery from '../../../queries/product-search-query' +import { buildProductSearchVars } from '../../../../lib/product-search-vars' +import {normalizeProduct} from '../../../../lib/normalize' + +const getProducts: ProductsEndpoint['handlers']['getProducts'] = async ({ + res, + body: { search, categoryId, brandId, sort }, + config, +}) => { + const pageSize = 100; + const filters = {}; + const startIndex = 0; + const variables = buildProductSearchVars({ + categoryCode: categoryId, + pageSize, + search, + sort, + filters, + startIndex, + }) + const {data} = await config.fetch(productSearchQuery, { variables }); + const found = data?.products?.items?.length > 0 ? true : false; + let productsResponse= data?.products?.items.map((item: any) =>normalizeProduct(item,config)); + const products: Product[] = found ? productsResponse : []; + + res.status(200).json({ data: { products, found } }); +} + +export default getProducts diff --git a/packages/kibocommerce/src/api/endpoints/checkout/index.ts b/packages/kibocommerce/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/checkout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/customer/address.ts b/packages/kibocommerce/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/customer/card.ts b/packages/kibocommerce/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/kibocommerce/src/api/endpoints/customer/customer.ts b/packages/kibocommerce/src/api/endpoints/customer/customer.ts new file mode 100644 index 0000000..c2e6db7 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/customer/customer.ts @@ -0,0 +1,36 @@ +import CookieHandler from '../../../api/utils/cookie-handler' +import type { CustomerEndpoint } from '.' +import { getCustomerAccountQuery } from '../../queries/get-customer-account-query' +import { normalizeCustomer } from '../../../lib/normalize' + +const getLoggedInCustomer: CustomerEndpoint['handlers']['getLoggedInCustomer'] = async ({ + req, + res, + config, +}) => { + const cookieHandler = new CookieHandler(config, req, res) + let accessToken = cookieHandler.getAccessToken(); + + if (!cookieHandler.isShopperCookieAnonymous()) { + const { data } = await config.fetch(getCustomerAccountQuery, undefined, { + headers: { + 'x-vol-user-claims': accessToken, + }, + }) + + const customer = normalizeCustomer(data?.customerAccount) + + if (!customer.id) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Customer not found', code: 'not_found' }], + }) + } + + return res.status(200).json({ data: { customer } }) + } + + res.status(200).json({ data: null }) +} + +export default getLoggedInCustomer diff --git a/packages/kibocommerce/src/api/endpoints/customer/index.ts b/packages/kibocommerce/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..20bd44d --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/customer/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import customerEndpoint from '@vercel/commerce/api/endpoints/customer' +import type { CustomerSchema } from '../../../types/customer' +import type { KiboCommerceAPI } from '../..' +import getLoggedInCustomer from './customer' + +export type CustomerAPI = GetAPISchema + +export type CustomerEndpoint = CustomerAPI['endpoint'] + +export const handlers: CustomerEndpoint['handlers'] = { getLoggedInCustomer } + +const customerApi = createEndpoint({ + handler: customerEndpoint, + handlers, +}) + +export default customerApi diff --git a/packages/kibocommerce/src/api/endpoints/login/index.ts b/packages/kibocommerce/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..679a92d --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/login/index.ts @@ -0,0 +1,20 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import loginEndpoint from '@vercel/commerce/api/endpoints/login' +import type { LoginSchema } from '../../../types/login' +import type { KiboCommerceAPI } from '../..' +import login from './login' + +export type LoginAPI = GetAPISchema + +export type LoginEndpoint = LoginAPI['endpoint'] + +export const handlers: LoginEndpoint['handlers'] = { login } + +const loginApi = createEndpoint({ + handler: loginEndpoint, + handlers, +}) + +export default loginApi; + + diff --git a/packages/kibocommerce/src/api/endpoints/login/login.ts b/packages/kibocommerce/src/api/endpoints/login/login.ts new file mode 100644 index 0000000..7a08069 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/login/login.ts @@ -0,0 +1,66 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { LoginEndpoint } from '.' +import { loginMutation } from '../../mutations/login-mutation' +import { prepareSetCookie } from '../../../lib/prepare-set-cookie'; +import { setCookies } from '../../../lib/set-cookie' +import { getCookieExpirationDate } from '../../../lib/get-cookie-expiration-date' + +const invalidCredentials = /invalid credentials/i + +const login: LoginEndpoint['handlers']['login'] = async ({ + req, + res, + body: { email, password }, + config, + commerce, +}) => { + + if (!(email && password)) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + let response; + try { + + const variables = { loginInput : { username: email, password }}; + response = await config.fetch(loginMutation, { variables }) + const { account: token } = response.data; + + // Set Cookie + const cookieExpirationDate = getCookieExpirationDate(config.customerCookieMaxAgeInDays) + + const authCookie = prepareSetCookie( + config.customerCookie, + JSON.stringify(token), + token.accessTokenExpiration ? { expires: cookieExpirationDate }: {}, + ) + setCookies(res, [authCookie]) + + } catch (error) { + // Check if the email and password didn't match an existing account + if ( + error instanceof FetcherError && + invalidCredentials.test(error.message) + ) { + return res.status(401).json({ + data: null, + errors: [ + { + message: + 'Cannot find an account that matches the provided credentials', + code: 'invalid_credentials', + }, + ], + }) + } + + throw error + } + + res.status(200).json({ data: response }) +} + +export default login diff --git a/packages/kibocommerce/src/api/endpoints/logout/index.ts b/packages/kibocommerce/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..00804af --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/logout/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import logoutEndpoint from '@vercel/commerce/api/endpoints/logout' +import type { LogoutSchema } from '../../../types/logout' +import type { KiboCommerceAPI } from '../..' +import logout from './logout' + +export type LogoutAPI = GetAPISchema + +export type LogoutEndpoint = LogoutAPI['endpoint'] + +export const handlers: LogoutEndpoint['handlers'] = { logout } + +const logoutApi = createEndpoint({ + handler: logoutEndpoint, + handlers, +}) + +export default logoutApi diff --git a/packages/kibocommerce/src/api/endpoints/logout/logout.ts b/packages/kibocommerce/src/api/endpoints/logout/logout.ts new file mode 100644 index 0000000..1b0835e --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/logout/logout.ts @@ -0,0 +1,22 @@ +import type { LogoutEndpoint } from '.' +import {prepareSetCookie} from '../../../lib/prepare-set-cookie'; +import {setCookies} from '../../../lib/set-cookie' + +const logout: LogoutEndpoint['handlers']['logout'] = async ({ + res, + body: { redirectTo }, + config, +}) => { + // Remove the cookie + const authCookie = prepareSetCookie(config.customerCookie,'',{ maxAge: -1, path: '/' }) + setCookies(res, [authCookie]) + + // Only allow redirects to a relative URL + if (redirectTo?.startsWith('/')) { + res.redirect(redirectTo) + } else { + res.status(200).json({ data: null }) + } +} + +export default logout diff --git a/packages/kibocommerce/src/api/endpoints/signup/index.ts b/packages/kibocommerce/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..8b2fec0 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/signup/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import signupEndpoint from '@vercel/commerce/api/endpoints/signup' +import type { SignupSchema } from '../../../types/signup' +import type { KiboCommerceAPI } from '../..' +import signup from './signup' + +export type SignupAPI = GetAPISchema + +export type SignupEndpoint = SignupAPI['endpoint'] + +export const handlers: SignupEndpoint['handlers'] = { signup } + +const singupApi = createEndpoint({ + handler: signupEndpoint, + handlers, +}) + +export default singupApi diff --git a/packages/kibocommerce/src/api/endpoints/signup/signup.ts b/packages/kibocommerce/src/api/endpoints/signup/signup.ts new file mode 100644 index 0000000..b3d9884 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/signup/signup.ts @@ -0,0 +1,91 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { SignupEndpoint } from '.' +import { registerUserMutation, registerUserLoginMutation } from '../../mutations/signup-mutation' +import { prepareSetCookie } from '../../../lib/prepare-set-cookie'; +import { setCookies } from '../../../lib/set-cookie' +import { getCookieExpirationDate } from '../../../lib/get-cookie-expiration-date' + +const invalidCredentials = /invalid credentials/i + +const signup: SignupEndpoint['handlers']['signup'] = async ({ + req, + res, + body: { email, password, firstName, lastName }, + config, + commerce, +}) => { + + if (!(email && password)) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + let response; + try { + + // Register user + const registerUserVariables = { + customerAccountInput: { + emailAddress: email, + firstName: firstName, + lastName: lastName, + acceptsMarketing: true, + id: 0 + } + } + + const registerUserResponse = await config.fetch(registerUserMutation, { variables: registerUserVariables}) + const accountId = registerUserResponse.data?.account?.id; + + // Login user + const registerUserLoginVairables = { + accountId: accountId, + customerLoginInfoInput: { + emailAddress: email, + username: email, + password: password, + isImport: false + } + } + + response = await config.fetch(registerUserLoginMutation, { variables: registerUserLoginVairables}) + const { account: token } = response.data; + + // Set Cookie + const cookieExpirationDate = getCookieExpirationDate(config.customerCookieMaxAgeInDays) + + const authCookie = prepareSetCookie( + config.customerCookie, + JSON.stringify(token), + token.accessTokenExpiration ? { expires: cookieExpirationDate }: {}, + ) + + setCookies(res, [authCookie]) + + } catch (error) { + // Check if the email and password didn't match an existing account + if ( + error instanceof FetcherError && + invalidCredentials.test(error.message) + ) { + return res.status(401).json({ + data: null, + errors: [ + { + message: + 'Cannot find an account that matches the provided credentials', + code: 'invalid_credentials', + }, + ], + }) + } + + throw error + } + + res.status(200).json({ data: response }) +} + +export default signup diff --git a/packages/kibocommerce/src/api/endpoints/wishlist/add-item.ts b/packages/kibocommerce/src/api/endpoints/wishlist/add-item.ts new file mode 100644 index 0000000..49cfc37 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/wishlist/add-item.ts @@ -0,0 +1,124 @@ +import getCustomerWishlist from '../../operations/get-customer-wishlist' +import getCustomerId from '../../utils/get-customer-id' +import type { WishlistEndpoint } from '.' +import { normalizeWishlistItem } from '../../../lib/normalize' +import { getProductQuery } from '../../../api/queries/get-product-query' +import addItemToWishlistMutation from '../../mutations/addItemToWishlist-mutation' +import createWishlist from '../../mutations/create-wishlist-mutation' + +// Return wishlist info +const buildAddToWishlistVariables = ({ + productId, + variantId, + productResponse, + wishlist +}: { + productId: string + variantId: string + productResponse: any + wishlist: any +}) => { + const { product } = productResponse.data + + const selectedOptions = product.variations?.find( + (v: any) => v.productCode === variantId + ).options + const quantity=1 + let options: any[] = [] + selectedOptions?.forEach((each: any) => { + product?.options + .filter((option: any) => { + return option.attributeFQN == each.attributeFQN + }) + .forEach((po: any) => { + options.push({ + attributeFQN: po.attributeFQN, + name: po.attributeDetail.name, + value: po.values?.find((v: any) => v.value == each.value).value, + }) + }) + }) + + return { + wishlistId: wishlist?.id, + wishlistItemInput: { + quantity, + product: { + productCode: productId, + variationProductCode: variantId ? variantId : null, + options, + } + }, + } +} + +const addItem: WishlistEndpoint['handlers']['addItem'] = async ({ + res, + body: { customerToken, item }, + config, + commerce, +}) => { + const token = customerToken ? Buffer.from(customerToken, 'base64').toString('ascii'): null; + const accessToken = token ? JSON.parse(token).accessToken : null; + let result: { data?: any } = {} + let wishlist: any + + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + const customerId = customerToken && (await getCustomerId({ customerToken, config })) + const wishlistName= config.defaultWishlistName + + if (!customerId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + const wishlistResponse = await commerce.getCustomerWishlist({ + variables: { customerId, wishlistName }, + config, + }) + wishlist= wishlistResponse?.wishlist + if(Object.keys(wishlist).length === 0) { + const createWishlistResponse= await config.fetch(createWishlist, {variables: { + wishlistInput: { + customerAccountId: customerId, + name: wishlistName + } + } + }, {headers: { 'x-vol-user-claims': accessToken } }) + wishlist= createWishlistResponse?.data?.createWishlist + } + + const productResponse = await config.fetch(getProductQuery, { + variables: { productCode: item?.productId }, + }) + + const addItemToWishlistResponse = await config.fetch( + addItemToWishlistMutation, + { + variables: buildAddToWishlistVariables({ ...item, productResponse, wishlist }), + }, + { headers: { 'x-vol-user-claims': accessToken } } + ) + + if(addItemToWishlistResponse?.data?.createWishlistItem){ + const wishlistResponse= await commerce.getCustomerWishlist({ + variables: { customerId, wishlistName }, + config, + }) + wishlist= wishlistResponse?.wishlist + } + + result = { data: {...wishlist, items: wishlist?.items?.map((item:any) => normalizeWishlistItem(item, config))} } + + res.status(200).json({ data: result?.data }) +} + +export default addItem diff --git a/packages/kibocommerce/src/api/endpoints/wishlist/get-wishlist.ts b/packages/kibocommerce/src/api/endpoints/wishlist/get-wishlist.ts new file mode 100644 index 0000000..be4c403 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/wishlist/get-wishlist.ts @@ -0,0 +1,35 @@ +import type { WishlistEndpoint } from '.' +import getCustomerId from '../../utils/get-customer-id' +import { normalizeWishlistItem } from '../../../lib/normalize' + +// Return wishlist info +const getWishlist: WishlistEndpoint['handlers']['getWishlist'] = async ({ + res, + body: { customerToken, includeProducts }, + config, + commerce, +}) => { + let result: { data?: any } = {} + if (customerToken) { + const customerId = customerToken && (await getCustomerId({ customerToken, config })) + const wishlistName= config.defaultWishlistName + if (!customerId) { + // If the customerToken is invalid, then this request is too + return res.status(404).json({ + data: null, + errors: [{ message: 'Wishlist not found' }], + }) + } + const { wishlist } = await commerce.getCustomerWishlist({ + variables: { customerId, wishlistName }, + includeProducts, + config, + }) + + result = { data: {...wishlist, items: wishlist?.items?.map((item:any) => normalizeWishlistItem(item, config, includeProducts))} } + } + + res.status(200).json({ data: result?.data ?? null }) +} + +export default getWishlist diff --git a/packages/kibocommerce/src/api/endpoints/wishlist/index.ts b/packages/kibocommerce/src/api/endpoints/wishlist/index.ts new file mode 100644 index 0000000..58344be --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/wishlist/index.ts @@ -0,0 +1,23 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import wishlistEndpoint from '@vercel/commerce/api/endpoints/wishlist' +import type { KiboCommerceAPI } from '../..' +import getWishlist from './get-wishlist' +import addItem from './add-item' +import removeItem from './remove-item' + +export type WishlistAPI = GetAPISchema + +export type WishlistEndpoint = WishlistAPI['endpoint'] + +export const handlers: WishlistEndpoint['handlers'] = { + getWishlist, + addItem, + removeItem, +} + +const wishlistApi = createEndpoint({ + handler: wishlistEndpoint, + handlers, +}) + +export default wishlistApi diff --git a/packages/kibocommerce/src/api/endpoints/wishlist/remove-item.ts b/packages/kibocommerce/src/api/endpoints/wishlist/remove-item.ts new file mode 100644 index 0000000..ae6a8d8 --- /dev/null +++ b/packages/kibocommerce/src/api/endpoints/wishlist/remove-item.ts @@ -0,0 +1,60 @@ +import getCustomerId from '../../utils/get-customer-id' +import type { WishlistEndpoint } from '.' +import { normalizeWishlistItem } from '../../../lib/normalize' +import removeItemFromWishlistMutation from '../../mutations/removeItemFromWishlist-mutation' + +// Return wishlist info +const removeItem: WishlistEndpoint['handlers']['removeItem'] = async ({ + res, + body: { customerToken, itemId }, + config, + commerce, +}) => { + const token = customerToken ? Buffer.from(customerToken, 'base64').toString('ascii'): null; + const accessToken = token ? JSON.parse(token).accessToken : null; + let result: { data?: any } = {} + let wishlist: any + + const customerId = customerToken && (await getCustomerId({ customerToken, config })) + const wishlistName= config.defaultWishlistName + const wishlistResponse = await commerce.getCustomerWishlist({ + variables: { customerId, wishlistName }, + config, + }) + wishlist= wishlistResponse?.wishlist + + if (!wishlist || !itemId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + const removedItem = wishlist?.items?.find( + (item:any) => { + return item.product.productCode === itemId; + } + ); + + const removeItemFromWishlistResponse = await config.fetch( + removeItemFromWishlistMutation, + { + variables: { + wishlistId: wishlist?.id, + wishlistItemId: removedItem?.id + }, + }, + { headers: { 'x-vol-user-claims': accessToken } } + ) + + if(removeItemFromWishlistResponse?.data?.deleteWishlistItem){ + const wishlistResponse= await commerce.getCustomerWishlist({ + variables: { customerId, wishlistName }, + config, + }) + wishlist= wishlistResponse?.wishlist + } + result = { data: {...wishlist, items: wishlist?.items?.map((item:any) => normalizeWishlistItem(item, config))} } + res.status(200).json({ data: result?.data }) +} + +export default removeItem diff --git a/packages/kibocommerce/src/api/fragments/cartItemDetails.ts b/packages/kibocommerce/src/api/fragments/cartItemDetails.ts new file mode 100644 index 0000000..9518130 --- /dev/null +++ b/packages/kibocommerce/src/api/fragments/cartItemDetails.ts @@ -0,0 +1,11 @@ +import { productDetails } from '../fragments/productDetails' +export const cartItemDetails = /*GraphQL*/` +fragment cartItemDetails on CartItem { + id + product { + ...productDetails + } + quantity +} +${productDetails} +`; diff --git a/packages/kibocommerce/src/api/fragments/category.ts b/packages/kibocommerce/src/api/fragments/category.ts new file mode 100644 index 0000000..e6be159 --- /dev/null +++ b/packages/kibocommerce/src/api/fragments/category.ts @@ -0,0 +1,11 @@ +export const CategoryInfo = /* GraphQL */` +fragment categoryInfo on PrCategory { + categoryId + categoryCode + isDisplayed + content { + name + slug + description + } +}`; \ No newline at end of file diff --git a/packages/kibocommerce/src/api/fragments/product.ts b/packages/kibocommerce/src/api/fragments/product.ts new file mode 100644 index 0000000..b69d008 --- /dev/null +++ b/packages/kibocommerce/src/api/fragments/product.ts @@ -0,0 +1,98 @@ +export const productPrices = /* GraphQL */` +fragment productPrices on Product { + price { + price + salePrice + } + priceRange { + lower { price, salePrice} + upper { price, salePrice } + } + } +`; +export const productAttributes = /* GraphQL */` +fragment productAttributes on Product { + properties { + attributeFQN + attributeDetail { + name + } + isHidden + values { + value + stringValue + } + } +} +`; +export const productContent = /* GraphQL */` +fragment productContent on Product { + content { + productFullDescription + productShortDescription + seoFriendlyUrl + productName + productImages { + imageUrl + imageLabel + mediaType + } + } +} +`; +export const productOptions = /* GraphQL */` +fragment productOptions on Product { + options { + attributeFQN + attributeDetail { + name + } + isProductImageGroupSelector + isRequired + isMultiValue + values { + value + isSelected + deltaPrice + stringValue + } + } +} +`; +export const productInfo = /* GraphQL */` +fragment productInfo on Product { + productCode + productUsage + + purchasableState { + isPurchasable + } + + variations { + productCode, + options { + __typename + attributeFQN + value + } + } + + categories { + categoryCode + categoryId + content { + name + slug + } + } + + ...productPrices + ...productAttributes + ...productContent + ...productOptions +} +${productPrices} +${productAttributes} +${productContent} +${productOptions} +`; diff --git a/packages/kibocommerce/src/api/fragments/productDetails.ts b/packages/kibocommerce/src/api/fragments/productDetails.ts new file mode 100644 index 0000000..e29ffa7 --- /dev/null +++ b/packages/kibocommerce/src/api/fragments/productDetails.ts @@ -0,0 +1,30 @@ +export const productDetails = /* GraphQL */ ` + fragment productDetails on CrProduct { + productCode + name + description + imageUrl + imageAlternateText + sku + variationProductCode + price { + price + salePrice + } + options { + attributeFQN + name + value + } + properties { + attributeFQN + name + values { + value + } + } + categories { + id + } +} +` diff --git a/packages/kibocommerce/src/api/fragments/search.ts b/packages/kibocommerce/src/api/fragments/search.ts new file mode 100644 index 0000000..dee242a --- /dev/null +++ b/packages/kibocommerce/src/api/fragments/search.ts @@ -0,0 +1,32 @@ +import { productInfo } from './product'; + +export const searchFacets = /* GraphQL */` +fragment searchFacets on Facet { + label + field + values { + label + value + isApplied + filterValue + isDisplayed + count + } +}`; + +export const searchResults = /* GraphQL */` +fragment searchResults on ProductSearchResult { + totalCount + pageSize + pageCount + startIndex + items { + ...productInfo + } + facets { + ...searchFacets + } +} +${searchFacets} +${productInfo} +`; diff --git a/packages/kibocommerce/src/api/index.ts b/packages/kibocommerce/src/api/index.ts new file mode 100644 index 0000000..aa6d960 --- /dev/null +++ b/packages/kibocommerce/src/api/index.ts @@ -0,0 +1,64 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' +import createFetchGraphqlApi from './utils/fetch-graphql-api' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' +import type { RequestInit } from '@vercel/fetch' + +export interface KiboCommerceConfig extends CommerceAPIConfig { + apiHost?: string + clientId?: string + sharedSecret?: string + customerCookieMaxAgeInDays: number, + currencyCode: string, + documentListName: string, + defaultWishlistName: string, + authUrl?: string +} + +const config: KiboCommerceConfig = { + commerceUrl: process.env.KIBO_API_URL || '', + apiToken: process.env.KIBO_API_TOKEN || '', + cartCookie: process.env.KIBO_CART_COOKIE || '', + customerCookie: process.env.KIBO_CUSTOMER_COOKIE || '', + cartCookieMaxAge: 2592000, + documentListName: 'siteSnippets@mozu', + fetch: createFetchGraphqlApi(() => getCommerceApi().getConfig()), + authUrl: process.env.KIBO_AUTH_URL || '', + // REST API + apiHost: process.env.KIBO_API_HOST || '', + clientId: process.env.KIBO_CLIENT_ID || '', + sharedSecret: process.env.KIBO_SHARED_SECRET || '', + customerCookieMaxAgeInDays: 30, + currencyCode: 'USD', + defaultWishlistName: 'My Wishlist' +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type KiboCommerceProvider = typeof provider +export type KiboCommerceAPI< + P extends KiboCommerceProvider = KiboCommerceProvider + > = CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): KiboCommerceAPI

{ + return commerceApi(customProvider as any) +} diff --git a/packages/kibocommerce/src/api/mutations/addItemToWishlist-mutation.ts b/packages/kibocommerce/src/api/mutations/addItemToWishlist-mutation.ts new file mode 100644 index 0000000..f9088b0 --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/addItemToWishlist-mutation.ts @@ -0,0 +1,21 @@ +import {productDetails} from '../fragments/productDetails' +const addItemToWishlistMutation = /* GraphQL */` + mutation createWishlistItem( + $wishlistId: String! + $wishlistItemInput: WishlistItemInput + ) { + createWishlistItem( + wishlistId: $wishlistId + wishlistItemInput: $wishlistItemInput + ) { + id + quantity + product { + ...productDetails + } + } + } +${productDetails} +`; + +export default addItemToWishlistMutation; diff --git a/packages/kibocommerce/src/api/mutations/addToCart-mutation.ts b/packages/kibocommerce/src/api/mutations/addToCart-mutation.ts new file mode 100644 index 0000000..7cbf688 --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/addToCart-mutation.ts @@ -0,0 +1,12 @@ +import { cartItemDetails } from './../fragments/cartItemDetails' + +const addToCurrentCartMutation = /*GraphQL*/ ` +${cartItemDetails} + +mutation addToCart($productToAdd:CartItemInput!){ + addItemToCurrentCart(cartItemInput: $productToAdd) { + ...cartItemDetails + } +}` + +export default addToCurrentCartMutation diff --git a/packages/kibocommerce/src/api/mutations/create-wishlist-mutation.ts b/packages/kibocommerce/src/api/mutations/create-wishlist-mutation.ts new file mode 100644 index 0000000..66ad883 --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/create-wishlist-mutation.ts @@ -0,0 +1,11 @@ +const createWishlist = /*GraphQL*/` +mutation createWishlist($wishlistInput:WishlistInput!) { + createWishlist(wishlistInput:$wishlistInput){ + id + name + customerAccountId + } + } +`; + +export default createWishlist; \ No newline at end of file diff --git a/packages/kibocommerce/src/api/mutations/login-mutation.ts b/packages/kibocommerce/src/api/mutations/login-mutation.ts new file mode 100644 index 0000000..730aded --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/login-mutation.ts @@ -0,0 +1,20 @@ + +export const loginMutation = /* GraphQL */` +mutation login($loginInput:CustomerUserAuthInfoInput!) { + account:createCustomerAuthTicket(customerUserAuthInfoInput:$loginInput) { + accessToken + userId + refreshToken + refreshTokenExpiration + accessTokenExpiration + customerAccount { + id + firstName + lastName + emailAddress + userName + } + } + } +` + diff --git a/packages/kibocommerce/src/api/mutations/removeItemFromCart-mutation.ts b/packages/kibocommerce/src/api/mutations/removeItemFromCart-mutation.ts new file mode 100644 index 0000000..3cf5c5a --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/removeItemFromCart-mutation.ts @@ -0,0 +1,9 @@ +/* +* Delete cart based on current user session +*/ +const removeItemFromCartMutation = /*GraphQL*/` +mutation deleteCartItem($id: String!) { + deleteCurrentCartItem(cartItemId:$id) +}`; + +export default removeItemFromCartMutation; diff --git a/packages/kibocommerce/src/api/mutations/removeItemFromWishlist-mutation.ts b/packages/kibocommerce/src/api/mutations/removeItemFromWishlist-mutation.ts new file mode 100644 index 0000000..ce3d994 --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/removeItemFromWishlist-mutation.ts @@ -0,0 +1,8 @@ +const removeItemFromWishlistMutation = /* GraphQL */` +mutation deletewishlistitem($wishlistId: String!, $wishlistItemId: String!) { + deleteWishlistItem(wishlistId: $wishlistId, wishlistItemId:$wishlistItemId) + } +`; + +export default removeItemFromWishlistMutation; + diff --git a/packages/kibocommerce/src/api/mutations/signup-mutation.ts b/packages/kibocommerce/src/api/mutations/signup-mutation.ts new file mode 100644 index 0000000..bb25534 --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/signup-mutation.ts @@ -0,0 +1,41 @@ + +const registerUserMutation = /* GraphQL */` +mutation registerUser($customerAccountInput: CustomerAccountInput!) { + account:createCustomerAccount(customerAccountInput:$customerAccountInput) { + emailAddress + userName + firstName + lastName + localeCode + userId + id + isAnonymous + attributes { + values + fullyQualifiedName + } + } +}`; + +const registerUserLoginMutation = /* GraphQL */` +mutation registerUserLogin($accountId: Int!, $customerLoginInfoInput: CustomerLoginInfoInput!) { + account:createCustomerAccountLogin(accountId:$accountId, customerLoginInfoInput:$customerLoginInfoInput) { + accessToken + accessTokenExpiration + refreshToken + refreshTokenExpiration + userId + customerAccount { + id + emailAddress + firstName + userName + } + } +}`; + +export { + registerUserMutation, + registerUserLoginMutation +}; + diff --git a/packages/kibocommerce/src/api/mutations/updateCartItemQuantity-mutation.ts b/packages/kibocommerce/src/api/mutations/updateCartItemQuantity-mutation.ts new file mode 100644 index 0000000..7b2cd5c --- /dev/null +++ b/packages/kibocommerce/src/api/mutations/updateCartItemQuantity-mutation.ts @@ -0,0 +1,9 @@ +const updateCartItemQuantityMutation = /*GraphQL*/` +mutation updateCartItemQuantity($itemId:String!, $quantity: Int!){ + updateCurrentCartItemQuantity(cartItemId:$itemId, quantity:$quantity){ + id + quantity + } +}`; + +export default updateCartItemQuantityMutation; diff --git a/packages/kibocommerce/src/api/operations/get-all-pages.ts b/packages/kibocommerce/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..7607e19 --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-all-pages.ts @@ -0,0 +1,38 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { KiboCommerceConfig } from '../index' +import { getAllPagesQuery } from '../queries/get-all-pages-query' +import { GetPagesQueryParams } from "../../types/page"; +import { normalizePage } from '../../lib/normalize' + +export type GetAllPagesResult< + T extends { pages: any[] } = { pages: any[] } + > = T + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + + async function getAllPages({ + query = getAllPagesQuery, + config, + variables, + }: { + url?: string + config?: Partial + variables?: GetPagesQueryParams + preview?: boolean + query?: string + } = {}): Promise { + const cfg = commerce.getConfig(config) + variables = { + documentListName: cfg.documentListName + } + const { data } = await cfg.fetch(query, { variables }); + + const pages = data.documentListDocuments.items.map(normalizePage); + + return { pages } + } + + return getAllPages +} diff --git a/packages/kibocommerce/src/api/operations/get-all-product-paths.ts b/packages/kibocommerce/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..3067b67 --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,26 @@ +import { KiboCommerceConfig } from '../index' +import { getAllProductsQuery } from '../queries/get-all-products-query'; +import { normalizeProduct } from '../../lib/normalize' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation({commerce,}: any) { + async function getAllProductPaths({ config }: {config?: KiboCommerceConfig } = {}): Promise { + + const cfg = commerce.getConfig(config) + + const productVariables = {startIndex: 0, pageSize: 100}; + const { data } = await cfg.fetch(getAllProductsQuery, { variables: productVariables }); + + const normalizedProducts = data.products.items ? data.products.items.map( (item:any) => normalizeProduct(item, cfg)) : []; + const products = normalizedProducts.map((product: any) => ({ path: product.path })) + + return Promise.resolve({ + products: products + }) + } + + return getAllProductPaths +} diff --git a/packages/kibocommerce/src/api/operations/get-all-products.ts b/packages/kibocommerce/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..bddafbf --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-all-products.ts @@ -0,0 +1,32 @@ +import { Product } from '@vercel/commerce/types/product' +import { GetAllProductsOperation } from '@vercel/commerce/types/product' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { KiboCommerceConfig } from '../index' +import { getAllProductsQuery } from '../queries/get-all-products-query'; +import { normalizeProduct } from '../../lib/normalize' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts({ + query = getAllProductsQuery, + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + + const cfg = commerce.getConfig(config) + const { data } = await cfg.fetch(query); + + let normalizedProducts = data.products.items ? data.products.items.map( (item:any) => normalizeProduct(item, cfg)) : []; + + return { + products: normalizedProducts, + } + } + return getAllProducts +} diff --git a/packages/kibocommerce/src/api/operations/get-customer-wishlist.ts b/packages/kibocommerce/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..c2792ad --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,57 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { + GetCustomerWishlistOperation, + Wishlist, +} from '@vercel/commerce/types/wishlist' +// import type { RecursivePartial, RecursiveRequired } from '../utils/types' +import { KiboCommerceConfig } from '..' +// import getAllProducts, { ProductEdge } from './get-all-products' +import {getCustomerWishlistQuery} from '../queries/get-customer-wishlist-query' + +export default function getCustomerWishlistOperation({ + commerce, +}: OperationContext) { + async function getCustomerWishlist< + T extends GetCustomerWishlistOperation + >(opts: { + variables: T['variables'] + config?: KiboCommerceConfig + includeProducts?: boolean + }): Promise + + async function getCustomerWishlist( + opts: { + variables: T['variables'] + config?: KiboCommerceConfig + includeProducts?: boolean + } & OperationOptions + ): Promise + + async function getCustomerWishlist({ + config, + variables, + includeProducts, + }: { + url?: string + variables: T['variables'] + config?: KiboCommerceConfig + includeProducts?: boolean + }): Promise { + let customerWishlist ={} + try { + + config = commerce.getConfig(config) + const result= await config?.fetch(getCustomerWishlistQuery,{variables}) + customerWishlist= result?.data?.customerWishlist; + } catch(e) { + customerWishlist= {} + } + + return { wishlist: customerWishlist as any } + } + + return getCustomerWishlist +} diff --git a/packages/kibocommerce/src/api/operations/get-page.ts b/packages/kibocommerce/src/api/operations/get-page.ts new file mode 100644 index 0000000..69289cb --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-page.ts @@ -0,0 +1,40 @@ +import type { + OperationContext, +} from '@vercel/commerce/api/operations' +import type { KiboCommerceConfig, KiboCommerceProvider } from '..' +import { normalizePage } from '../../lib/normalize' +import { getPageQuery } from '../queries/get-page-query' +import type { Page, GetPageQueryParams } from "../../types/page"; +import type { Document } from '../../../schema' + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage({ + url, + variables, + config, + preview, + }: { + url?: string + variables: GetPageQueryParams + config?: Partial + preview?: boolean + }): Promise { + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `url` + const cfg = commerce.getConfig(config) + const pageVariables = { documentListName: cfg.documentListName, filter: `id eq ${variables.id}` } + + const { data } = await cfg.fetch(getPageQuery, { variables: pageVariables }) + + const firstPage = data.documentListDocuments.items?.[0]; + const page = firstPage as Document + if (preview || page?.properties?.is_visible) { + return { page: normalizePage(page as any) } + } + return {} + } + + return getPage +} diff --git a/packages/kibocommerce/src/api/operations/get-product.ts b/packages/kibocommerce/src/api/operations/get-product.ts new file mode 100644 index 0000000..c41b1bf --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-product.ts @@ -0,0 +1,35 @@ +import type { KiboCommerceConfig } from '../index' +import { Product } from '@vercel/commerce/types/product' +import { GetProductOperation } from '@vercel/commerce/types/product' +import type { OperationContext } from '@vercel/commerce/api/operations' +import { getProductQuery } from '../queries/get-product-query' +import { normalizeProduct } from '../../lib/normalize' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + + async function getProduct({ + query = getProductQuery, + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + const productVariables = { productCode: variables?.slug} + + const cfg = commerce.getConfig(config) + const { data } = await cfg.fetch(query, { variables: productVariables }); + + const normalizedProduct = normalizeProduct(data.product, cfg) + + return { + product: normalizedProduct + } + } + + return getProduct +} diff --git a/packages/kibocommerce/src/api/operations/get-site-info.ts b/packages/kibocommerce/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..6b72d3b --- /dev/null +++ b/packages/kibocommerce/src/api/operations/get-site-info.ts @@ -0,0 +1,35 @@ +import { OperationContext } from '@vercel/commerce/api/operations' +import { Category } from '@vercel/commerce/types/site' +import { KiboCommerceConfig } from '../index' +import {categoryTreeQuery} from '../queries/get-categories-tree-query' +import { normalizeCategory } from '../../lib/normalize' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({commerce}: OperationContext) { + async function getSiteInfo({ + query= categoryTreeQuery, + variables, + config, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + const cfg = commerce.getConfig(config) + const { data } = await cfg.fetch(query); + const categories= data.categories.items.map(normalizeCategory); + return Promise.resolve({ + categories: categories ?? [], + brands: [], + }) + } + + return getSiteInfo +} diff --git a/packages/kibocommerce/src/api/operations/index.ts b/packages/kibocommerce/src/api/operations/index.ts new file mode 100644 index 0000000..086fdf8 --- /dev/null +++ b/packages/kibocommerce/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getAllPages } from './get-all-pages' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/kibocommerce/src/api/queries/get-all-pages-query.ts b/packages/kibocommerce/src/api/queries/get-all-pages-query.ts new file mode 100644 index 0000000..6926914 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-all-pages-query.ts @@ -0,0 +1,11 @@ +export const getAllPagesQuery = /* GraphQL */` +query($documentListName: String!) { + documentListDocuments(documentListName:$documentListName){ + items { + id + name + listFQN + properties + } + } + }`; \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-all-products-query.ts b/packages/kibocommerce/src/api/queries/get-all-products-query.ts new file mode 100644 index 0000000..3c6599e --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-all-products-query.ts @@ -0,0 +1,21 @@ +import { productInfo } from '../fragments/product'; + +export const getAllProductsQuery = /* GraphQL */` +${productInfo} + +query products( + $filter: String + $startIndex: Int + $pageSize: Int +) { + products( + filter: $filter + startIndex: $startIndex + pageSize: $pageSize + ) { + items { + ...productInfo + } + } +} +` \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-anonymous-shopper-token-query.ts b/packages/kibocommerce/src/api/queries/get-anonymous-shopper-token-query.ts new file mode 100644 index 0000000..031ffc0 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-anonymous-shopper-token-query.ts @@ -0,0 +1,11 @@ +export const getAnonymousShopperTokenQuery = /* GraphQL */ ` + query { + getAnonymousShopperToken { + accessToken + accessTokenExpiration + refreshToken + refreshTokenExpiration + jwtAccessToken + } + } +` diff --git a/packages/kibocommerce/src/api/queries/get-cart-query.ts b/packages/kibocommerce/src/api/queries/get-cart-query.ts new file mode 100644 index 0000000..5bbf5bb --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-cart-query.ts @@ -0,0 +1,32 @@ +import { productDetails } from '../fragments/productDetails' +export const getCartQuery = /* GraphQL */` +query cart { + currentCart { + id + userId + orderDiscounts { + impact + discount { + id + name + } + couponCode + } + subtotal + shippingTotal + total + items { + id + subtotal + unitPrice{ + extendedAmount + } + product { + ...productDetails + } + quantity + } + } + } +${productDetails} +` diff --git a/packages/kibocommerce/src/api/queries/get-categories-tree-query.ts b/packages/kibocommerce/src/api/queries/get-categories-tree-query.ts new file mode 100644 index 0000000..9848336 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-categories-tree-query.ts @@ -0,0 +1,29 @@ +import { CategoryInfo } from '../fragments/category' + +export const categoryTreeQuery = /* GraphQL */` +query GetCategoryTree { + categories: categoriesTree { + items { + ...categoryInfo + childrenCategories { + ...categoryInfo + childrenCategories { + ...categoryInfo + childrenCategories { + ...categoryInfo + childrenCategories { + ...categoryInfo + childrenCategories { + ...categoryInfo + childrenCategories { + ...categoryInfo + } + } + } + } + } + } + } + } +} +${CategoryInfo}`; \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-customer-account-query.ts b/packages/kibocommerce/src/api/queries/get-customer-account-query.ts new file mode 100644 index 0000000..9528b84 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-customer-account-query.ts @@ -0,0 +1,12 @@ +export const getCustomerAccountQuery = /* GraphQL */` +query getUser { + customerAccount:getCurrentAccount { + id + firstName + lastName + emailAddress + userName + isAnonymous + } +} +` \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-customer-wishlist-query.ts b/packages/kibocommerce/src/api/queries/get-customer-wishlist-query.ts new file mode 100644 index 0000000..d2ae3ed --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-customer-wishlist-query.ts @@ -0,0 +1,25 @@ +import {productDetails} from '../fragments/productDetails' +export const getCustomerWishlistQuery= /* GraphQL */` +query wishlist($customerId: Int!, $wishlistName: String!) { + customerWishlist(customerAccountId:$customerId ,wishlistName: $wishlistName){ + customerAccountId + name + id + userId + items { + id + quantity + total + subtotal + unitPrice{ + extendedAmount + } + quantity + product { + ...productDetails + } + } + } + } +${productDetails} +` \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-page-query.ts b/packages/kibocommerce/src/api/queries/get-page-query.ts new file mode 100644 index 0000000..69371d0 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-page-query.ts @@ -0,0 +1,14 @@ +export const getPageQuery = /* GraphQL */` +query($documentListName: String!, $filter: String!) { + documentListDocuments(documentListName: $documentListName, filter: $filter){ + startIndex + totalCount + items { + id + name + listFQN + properties + } + } + } +`; \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/get-product-query.ts b/packages/kibocommerce/src/api/queries/get-product-query.ts new file mode 100644 index 0000000..47db311 --- /dev/null +++ b/packages/kibocommerce/src/api/queries/get-product-query.ts @@ -0,0 +1,15 @@ +import { productInfo } from '../fragments/product'; + +export const getProductQuery = /* GraphQL */` +${productInfo} + + query product( + $productCode: String! + ) { + product( + productCode: $productCode + ) { + ...productInfo + } + } +` \ No newline at end of file diff --git a/packages/kibocommerce/src/api/queries/product-search-query.ts b/packages/kibocommerce/src/api/queries/product-search-query.ts new file mode 100644 index 0000000..d22f0ef --- /dev/null +++ b/packages/kibocommerce/src/api/queries/product-search-query.ts @@ -0,0 +1,20 @@ +import { searchResults } from '../fragments/search' + +const query = /* GraphQL */` +query ProductSearch($query:String, $startIndex:Int, + $pageSize:Int, $sortBy:String, $filter:String,$facetTemplate:String,$facetValueFilter:String ) { + products:productSearch ( + query:$query, + startIndex: $startIndex, + pageSize:$pageSize, + sortBy: $sortBy, + filter:$filter, + facetTemplate:$facetTemplate, + facetValueFilter:$facetValueFilter + ) { + ...searchResults + } + } + ${searchResults} +`; +export default query; diff --git a/packages/kibocommerce/src/api/utils/api-auth-helper.ts b/packages/kibocommerce/src/api/utils/api-auth-helper.ts new file mode 100644 index 0000000..20cfc74 --- /dev/null +++ b/packages/kibocommerce/src/api/utils/api-auth-helper.ts @@ -0,0 +1,110 @@ +import type { KiboCommerceConfig } from '../index' +import type { FetchOptions } from '@vercel/fetch' +import fetch from './fetch' + +// This object is persisted during development +const authCache: { kiboAuthTicket?: AppAuthTicket } = {} + +interface AppAuthTicket { + access_token: string + token_type: string + expires_in: number + expires_at: number + refresh_token: string | null +} + +interface AuthTicketCache { + getAuthTicket: () => Promise + setAuthTicket: (kiboAuthTicket: AppAuthTicket) => void +} + +class RuntimeMemCache implements AuthTicketCache { + constructor() {} + async getAuthTicket() { + return authCache.kiboAuthTicket + } + setAuthTicket(kiboAuthTicket: AppAuthTicket) { + authCache.kiboAuthTicket = kiboAuthTicket + } +} + +export class APIAuthenticationHelper { + private _clientId: string + private _sharedSecret: string + private _authUrl: string + private _authTicketCache!: AuthTicketCache + + constructor( + { clientId = '', sharedSecret = '', authUrl = '' }: KiboCommerceConfig, + authTicketCache?: AuthTicketCache + ) { + this._clientId = clientId + this._sharedSecret = sharedSecret + this._authUrl = authUrl + if(!authTicketCache) { + this._authTicketCache = new RuntimeMemCache(); + } + } + private _buildFetchOptions(body: any = {}): FetchOptions { + return { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + } + } + private _calculateTicketExpiration(kiboAuthTicket: AppAuthTicket) { + //calculate how many milliseconds until auth expires + const millisecsUntilExpiration = kiboAuthTicket.expires_in * 1000 + kiboAuthTicket.expires_at = Date.now() + millisecsUntilExpiration + + return kiboAuthTicket + } + public async authenticate(): Promise { + // create oauth fetch options + const options = this._buildFetchOptions({ + client_id: this._clientId, + client_secret: this._sharedSecret, + grant_type: 'client_credentials', + }) + // perform authentication + const authTicket = await fetch( + `${this._authUrl}/api/platform/applications/authtickets/oauth`, + options + ).then((response) => response.json()) + // set expiration time in ms on auth ticket + this._calculateTicketExpiration(authTicket) + // set authentication ticket on next server runtime object + this._authTicketCache.setAuthTicket(authTicket) + + return authTicket + } + public async refreshTicket(kiboAuthTicket: AppAuthTicket) { + // create oauth refresh fetch options + const options = this._buildFetchOptions({ + refreshToken: kiboAuthTicket?.refresh_token, + }) + // perform auth ticket refresh + const refreshedTicket = await fetch( + `${this._authUrl}/api/platform/applications/authtickets/refresh-ticket`, + options + ).then((response) => response.json()) + + return refreshedTicket + } + public async getAccessToken(): Promise { + // get current Kibo API auth ticket + let authTicket = await this._authTicketCache.getAuthTicket() + + // if no current ticket, perform auth + // or if ticket expired, refresh auth + if (!authTicket) { + authTicket = await this.authenticate() + } else if (authTicket.expires_at < Date.now()) { + authTicket = await this.refreshTicket(authTicket) + } + + return authTicket!.access_token + } +} diff --git a/packages/kibocommerce/src/api/utils/cookie-handler.ts b/packages/kibocommerce/src/api/utils/cookie-handler.ts new file mode 100644 index 0000000..b4c950f --- /dev/null +++ b/packages/kibocommerce/src/api/utils/cookie-handler.ts @@ -0,0 +1,61 @@ +import { KiboCommerceConfig } from './../index' +import { getCookieExpirationDate } from '../../lib/get-cookie-expiration-date' +import { prepareSetCookie } from '../../lib/prepare-set-cookie' +import { setCookies } from '../../lib/set-cookie' +import { NextApiRequest } from 'next' +import getAnonymousShopperToken from './get-anonymous-shopper-token' + +const parseCookie = (cookieValue?: any) => { + return cookieValue + ? JSON.parse(Buffer.from(cookieValue, 'base64').toString('ascii')) + : null +} +export default class CookieHandler { + config: KiboCommerceConfig + request: NextApiRequest + response: any + accessToken: any + constructor(config: any, req: NextApiRequest, res: any) { + this.config = config + this.request = req + this.response = res + const encodedToken = req.cookies[config.customerCookie] + const token = parseCookie(encodedToken) + this.accessToken = token ? token.accessToken : null + } + + async getAnonymousToken() { + const response: any = await getAnonymousShopperToken({ + config: this.config, + }) + let anonymousAccessToken = response?.accessToken + return { + response, + accessToken: anonymousAccessToken, + } + } + isShopperCookieAnonymous() { + const customerCookieKey = this.config.customerCookie + const shopperCookie = this.request.cookies[customerCookieKey] + const shopperSession = parseCookie(shopperCookie); + const isAnonymous = shopperSession?.customerAccount ? false : true + return isAnonymous + } + setAnonymousShopperCookie(anonymousShopperTokenResponse: any) { + const cookieExpirationDate = getCookieExpirationDate( + this.config.customerCookieMaxAgeInDays + ) + + const authCookie = prepareSetCookie( + this.config.customerCookie, + JSON.stringify(anonymousShopperTokenResponse), + anonymousShopperTokenResponse?.accessTokenExpiration + ? { expires: cookieExpirationDate } + : {} + ) + setCookies(this.response, [authCookie]) + } + getAccessToken() { + return this.accessToken + } +} diff --git a/packages/kibocommerce/src/api/utils/fetch-graphql-api.ts b/packages/kibocommerce/src/api/utils/fetch-graphql-api.ts new file mode 100644 index 0000000..cf84f5e --- /dev/null +++ b/packages/kibocommerce/src/api/utils/fetch-graphql-api.ts @@ -0,0 +1,43 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { KiboCommerceConfig } from '../index' +import fetch from './fetch' +import { APIAuthenticationHelper } from './api-auth-helper'; + +const fetchGraphqlApi: ( + getConfig: () => KiboCommerceConfig +) => GraphQLFetcher = (getConfig) => async ( + query: string, + { variables, preview } = {}, + fetchOptions +) => { + const config = getConfig() + const authHelper = new APIAuthenticationHelper(config); + const apiToken = await authHelper.getAccessToken(); + const res = await fetch(config.commerceUrl + (preview ? '/preview' : ''), { + ...fetchOptions, + method: 'POST', + headers: { + ...fetchOptions?.headers, + Authorization: `Bearer ${apiToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + console.warn(`Kibo API Request Correlation ID: ${res.headers.get('x-vol-correlation')}`); + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch KiboCommerce API' }], + status: res.status, + }) + } + + return { data: json.data, res } +} + +export default fetchGraphqlApi diff --git a/packages/kibocommerce/src/api/utils/fetch-local.ts b/packages/kibocommerce/src/api/utils/fetch-local.ts new file mode 100644 index 0000000..fa3a214 --- /dev/null +++ b/packages/kibocommerce/src/api/utils/fetch-local.ts @@ -0,0 +1,36 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { KiboCommerceConfig } from '../index' +import fetch from './fetch' + +const fetchGraphqlApi: (getConfig: () => KiboCommerceConfig) => GraphQLFetcher = + (getConfig) => + async (query: string, { variables, preview } = {}, fetchOptions) => { + const config = getConfig() + const res = await fetch(config.commerceUrl, { + //const res = await fetch(config.commerceUrl + (preview ? '/preview' : ''), { + ...fetchOptions, + method: 'POST', + headers: { + Authorization: `Bearer ${config.apiToken}`, + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch KiboCommerce API' }], + status: res.status, + }) + } + + return { data: json.data, res } + } + +export default fetchGraphqlApi diff --git a/packages/kibocommerce/src/api/utils/fetch.ts b/packages/kibocommerce/src/api/utils/fetch.ts new file mode 100644 index 0000000..9d9fff3 --- /dev/null +++ b/packages/kibocommerce/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import zeitFetch from '@vercel/fetch' + +export default zeitFetch() diff --git a/packages/kibocommerce/src/api/utils/get-anonymous-shopper-token.ts b/packages/kibocommerce/src/api/utils/get-anonymous-shopper-token.ts new file mode 100644 index 0000000..9325a4e --- /dev/null +++ b/packages/kibocommerce/src/api/utils/get-anonymous-shopper-token.ts @@ -0,0 +1,13 @@ +import type { KiboCommerceConfig } from '../' +import { getAnonymousShopperTokenQuery } from '../queries/get-anonymous-shopper-token-query' + +async function getAnonymousShopperToken({ + config, +}: { + config: KiboCommerceConfig +}): Promise { + const { data } = await config.fetch(getAnonymousShopperTokenQuery) + return data?.getAnonymousShopperToken +} + +export default getAnonymousShopperToken diff --git a/packages/kibocommerce/src/api/utils/get-customer-id.ts b/packages/kibocommerce/src/api/utils/get-customer-id.ts new file mode 100644 index 0000000..5ba3d77 --- /dev/null +++ b/packages/kibocommerce/src/api/utils/get-customer-id.ts @@ -0,0 +1,26 @@ +import type { KiboCommerceConfig } from '..' +import { getCustomerAccountQuery } from '../queries/get-customer-account-query' + +async function getCustomerId({ + customerToken, + config, +}: { + customerToken: string + config: KiboCommerceConfig +}): Promise { + const token = customerToken ? Buffer.from(customerToken, 'base64').toString('ascii'): null; + const accessToken = token ? JSON.parse(token).accessToken : null; + const { data } = await config.fetch( + getCustomerAccountQuery, + undefined, + { + headers: { + 'x-vol-user-claims': accessToken, + }, + } + ) + + return data?.customerAccount?.id +} + +export default getCustomerId diff --git a/packages/kibocommerce/src/auth/index.ts b/packages/kibocommerce/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/kibocommerce/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/kibocommerce/src/auth/use-login.tsx b/packages/kibocommerce/src/auth/use-login.tsx new file mode 100644 index 0000000..c9d1fac --- /dev/null +++ b/packages/kibocommerce/src/auth/use-login.tsx @@ -0,0 +1,43 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' + +import { useCallback } from 'react' +import { CommerceError } from '@vercel/commerce/utils/errors' +import type { LoginHook } from '../types/login' +import useCustomer from '../customer/use-customer' +import useCart from '../cart/use-cart' +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/login', + method: 'POST', + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'An email and password are required to login', + }) + } + + return fetch({ + ...options, + body: { email, password }, + }) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + const { mutate: mutateCart } = useCart() + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + await mutateCart() + return data + }, + [fetch, mutate, mutateCart] + ) + }, +} diff --git a/packages/kibocommerce/src/auth/use-logout.tsx b/packages/kibocommerce/src/auth/use-logout.tsx new file mode 100644 index 0000000..83e5a4b --- /dev/null +++ b/packages/kibocommerce/src/auth/use-logout.tsx @@ -0,0 +1,29 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import type { LogoutHook } from '../types/logout' +import useCustomer from '../customer/use-customer' +import useCart from '../cart/use-cart' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/logout', + method: 'GET', + }, + useHook: ({ fetch }) => () => { + const { mutate } = useCustomer() + const { mutate: mutateCart } = useCart() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + await mutateCart(null, false) + return data + }, + [fetch, mutate, mutateCart] + ) + }, +} diff --git a/packages/kibocommerce/src/auth/use-signup.tsx b/packages/kibocommerce/src/auth/use-signup.tsx new file mode 100644 index 0000000..b06126d --- /dev/null +++ b/packages/kibocommerce/src/auth/use-signup.tsx @@ -0,0 +1,46 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import type { SignupHook } from '../types/signup' +import useCustomer from '../customer/use-customer' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/signup', + method: 'POST', + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } + + return fetch({ + ...options, + body: { firstName, lastName, email, password }, + }) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/kibocommerce/src/cart/index.ts b/packages/kibocommerce/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/kibocommerce/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/kibocommerce/src/cart/use-add-item.tsx b/packages/kibocommerce/src/cart/use-add-item.tsx new file mode 100644 index 0000000..bb7b8be --- /dev/null +++ b/packages/kibocommerce/src/cart/use-add-item.tsx @@ -0,0 +1,44 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { AddItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/cart', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: ({ fetch }) => () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/kibocommerce/src/cart/use-cart.tsx b/packages/kibocommerce/src/cart/use-cart.tsx new file mode 100644 index 0000000..0af0738 --- /dev/null +++ b/packages/kibocommerce/src/cart/use-cart.tsx @@ -0,0 +1,33 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + method: 'GET', + url: '/api/cart', + }, + async fetcher({ options, fetch }) { + return await fetch({ ...options }) + }, + useHook: ({ useData }) => (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/kibocommerce/src/cart/use-remove-item.tsx b/packages/kibocommerce/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..3fa883c --- /dev/null +++ b/packages/kibocommerce/src/cart/use-remove-item.tsx @@ -0,0 +1,56 @@ +import { useCallback } from 'react' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' + +export type RemoveItemFn = T extends LineItem + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends LineItem + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + url: '/api/cart', + method: 'DELETE', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ ...options, body: { itemId } }) + }, + useHook: ({ fetch }: MutationHookContext) => < + T extends LineItem | undefined = undefined + >( + ctx: { item?: T } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + await mutate(data, false) + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/kibocommerce/src/cart/use-update-item.tsx b/packages/kibocommerce/src/cart/use-update-item.tsx new file mode 100644 index 0000000..931782c --- /dev/null +++ b/packages/kibocommerce/src/cart/use-update-item.tsx @@ -0,0 +1,84 @@ +import { useCallback } from 'react' +import debounce from 'lodash.debounce' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' +import type { LineItem, UpdateItemHook } from '@vercel/commerce/types/cart' +import { handler as removeItemHandler } from './use-remove-item' +import useCart from './use-cart' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler = { + fetchOptions: { + url: '/api/cart', + method: 'PUT', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + + return await fetch({ + ...options, + body: { itemId, item }, + }) + }, + useHook: ({ fetch }: MutationHookContext) => < + T extends LineItem | undefined = undefined + >( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + itemId, + item: { productId, variantId, quantity: input.quantity }, + }, + }) + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/kibocommerce/src/checkout/use-checkout.tsx b/packages/kibocommerce/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..cab52bb --- /dev/null +++ b/packages/kibocommerce/src/checkout/use-checkout.tsx @@ -0,0 +1,14 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { UseCheckout } from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/kibocommerce/src/commerce.config.json b/packages/kibocommerce/src/commerce.config.json new file mode 100644 index 0000000..cd58f1e --- /dev/null +++ b/packages/kibocommerce/src/commerce.config.json @@ -0,0 +1,9 @@ +{ + "provider": "kibocommerce", + "features": { + "wishlist": true, + "cart": true, + "search": true, + "customerAuth": true + } +} \ No newline at end of file diff --git a/packages/kibocommerce/src/customer/address/use-add-item.tsx b/packages/kibocommerce/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..fabd11b --- /dev/null +++ b/packages/kibocommerce/src/customer/address/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/kibocommerce/src/customer/card/use-add-item.tsx b/packages/kibocommerce/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..938e6cd --- /dev/null +++ b/packages/kibocommerce/src/customer/card/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/kibocommerce/src/customer/index.ts b/packages/kibocommerce/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/kibocommerce/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/kibocommerce/src/customer/use-customer.tsx b/packages/kibocommerce/src/customer/use-customer.tsx new file mode 100644 index 0000000..73e804a --- /dev/null +++ b/packages/kibocommerce/src/customer/use-customer.tsx @@ -0,0 +1,24 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' +import type { CustomerHook } from '../types/customer' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/customer', + method: 'GET', + }, + async fetcher({ options, fetch }) { + const data = await fetch(options) + return data?.customer ?? null + }, + useHook: ({ useData }) => (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/kibocommerce/src/fetcher.ts b/packages/kibocommerce/src/fetcher.ts new file mode 100644 index 0000000..bc8a6b9 --- /dev/null +++ b/packages/kibocommerce/src/fetcher.ts @@ -0,0 +1,41 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { Fetcher } from '@vercel/commerce/utils/types' + +async function getText(res: Response) { + try { + return (await res.text()) || res.statusText + } catch (error) { + return res.statusText + } +} + +async function getError(res: Response) { + if (res.headers.get('Content-Type')?.includes('application/json')) { + const data = await res.json() + return new FetcherError({ errors: data.errors, status: res.status }) + } + return new FetcherError({ message: await getText(res), status: res.status }) +} + +const fetcher: Fetcher = async ({ + url, + method = 'GET', + variables, + body: bodyObj, +}) => { + const hasBody = Boolean(variables || bodyObj) + const body = hasBody + ? JSON.stringify(variables ? { variables } : bodyObj) + : undefined + const headers = hasBody ? { 'Content-Type': 'application/json' } : undefined + const res = await fetch(url!, { method, body, headers }) + + if (res.ok) { + const { data } = await res.json() + return data + } + + throw await getError(res) +} + +export default fetcher diff --git a/packages/kibocommerce/src/index.tsx b/packages/kibocommerce/src/index.tsx new file mode 100644 index 0000000..43077a5 --- /dev/null +++ b/packages/kibocommerce/src/index.tsx @@ -0,0 +1,9 @@ +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' +import { kiboCommerceProvider, KibocommerceProvider } from './provider' + +export { kiboCommerceProvider } +export type { KibocommerceProvider } + +export const CommerceProvider = getCommerceProvider(kiboCommerceProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/kibocommerce/src/lib/get-cookie-expiration-date.ts b/packages/kibocommerce/src/lib/get-cookie-expiration-date.ts new file mode 100644 index 0000000..89fd245 --- /dev/null +++ b/packages/kibocommerce/src/lib/get-cookie-expiration-date.ts @@ -0,0 +1,8 @@ +export function getCookieExpirationDate(maxAgeInDays: number){ + const today = new Date(); + const expirationDate = new Date(); + + const cookieExpirationDate = new Date ( expirationDate.setDate(today.getDate() + maxAgeInDays) ) + + return cookieExpirationDate; +} \ No newline at end of file diff --git a/packages/kibocommerce/src/lib/get-slug.ts b/packages/kibocommerce/src/lib/get-slug.ts new file mode 100644 index 0000000..329c5a2 --- /dev/null +++ b/packages/kibocommerce/src/lib/get-slug.ts @@ -0,0 +1,5 @@ +// Remove trailing and leading slash, usually included in nodes +// returned by the BigCommerce API +const getSlug = (path: string) => path.replace(/^\/|\/$/g, '') + +export default getSlug diff --git a/packages/kibocommerce/src/lib/normalize.ts b/packages/kibocommerce/src/lib/normalize.ts new file mode 100644 index 0000000..363589f --- /dev/null +++ b/packages/kibocommerce/src/lib/normalize.ts @@ -0,0 +1,180 @@ +import type { PrCategory, CustomerAccountInput, Document } from '../../schema' +import { Page } from '../types/page'; +import { Customer } from '../types/customer' + +export function normalizeProduct(productNode: any, config: any): any { + const product = { + id: productNode.productCode, + name: productNode.content.productName, + vendor: '', + path: `/${productNode.productCode}`, + slug: productNode.productCode, + price: { + value: productNode?.price?.price, + currencyCode: config.currencyCode, + }, + descriptionHtml: productNode.content.productShortDescription, + + images: productNode.content.productImages.map((p: any) => ({ + url: `http:${p.imageUrl}`, + altText: p.imageLabel, + })), + + variants: productNode.variations?.map((v: any) => ({ + id: v.productCode, + options: v.options.map((o: any) => ({ + ['__typename']: 'MultipleChoiceOption', + id: o.attributeFQN, + displayName: + o.attributeFQN.split('~')[1][0].toUpperCase() + + o.attributeFQN.split('~')[1].slice(1).toLowerCase(), + values: [{ label: o.value.toString() }], + })), + })) || [ + { + id: '', + }, + ], + + options: + productNode.options?.map((o: any) => ({ + id: o.attributeFQN, + displayName: o.attributeDetail.name, + values: o.values.map((v: any) => ({ + label: v.value.toString(), + hexColors: '', + })), + })) || [], + } + + return product +} + +export function normalizePage(page: Document): Page { + return { + id: String(page.id), + name: String(page.name), + url: page.properties.url, + body: page.properties.body, + is_visible: page.properties.is_visible, + sort_order: page.properties.sort_order + } +} + +export function normalizeCart(data: any): any { + return { + id: data.id, + customerId: data.userId, + email: data?.email, + createdAt: data?.created_time, + currency: { + code: 'USD', + }, + taxesIncluded: true, + lineItems: data.items.map(normalizeLineItem), + lineItemsSubtotalPrice: data?.items.reduce( + (acc: number, obj: { subtotal: number }) => acc + obj.subtotal, + 0 + ), + subtotalPrice: data?.subtotal, + totalPrice: data?.total, + discounts: data.orderDiscounts?.map((discount: any) => ({ + value: discount.impact, + })), + } +} + +export function normalizeCustomer(customer: CustomerAccountInput): Customer { + return { + id: customer.id, + firstName: customer.firstName, + lastName: customer.lastName, + email: customer.emailAddress, + userName: customer.userName, + isAnonymous: customer.isAnonymous + } +} + +function normalizeLineItem(item: any): any { + return { + id: item.id, + variantId: item.product.variationProductCode, + productId: String(item.product.productCode), + name: item.product.name, + quantity: item.quantity, + variant: { + id: item.product.variationProductCode, + sku: item.product?.sku, + name: item.product.name, + image: { + url: item?.product?.imageUrl, + }, + requiresShipping: item?.is_require_shipping, + price: item?.unitPrice.extendedAmount, + listPrice: 0, + }, + options: item.product.options, + path: `${item.product.productCode}`, + discounts: item?.discounts?.map((discount: any) => ({ + value: discount.discounted_amount, + })), + } +} + +export function normalizeCategory(category: PrCategory): any { + return { + id: category?.categoryCode, + name: category?.content?.name, + slug: category?.content?.slug, + path: `/${category?.content?.slug}`, + } +} + +export function normalizeWishlistItem( + item: any, + config: any, + includeProducts=false +): any { + if (includeProducts) { + return { + id: item.id, + product: getProuducts(item, config), + } + } else { + return getProuducts(item, config) + } +} + +function getProuducts(item: any, config: any): any { + return { + variant_id: item.product.variationProductCode || '', + id: String(item.product.productCode), + product_id: String(item.product.productCode), + name: item.product.name, + quantity: item.quantity, + images: [ + { + url: `http:${item.product.imageUrl}`, + alt: item.product.imageAlternateText, + }, + ], + price: { + value: item.product.price.price, + retailPrice: item.product.price.retailPrice || 0, + currencyCode: config.currencyCode, + }, + variants: [ + { + id: item.product.variationProductCode || '', + sku: item.product?.sku, + name: item.product.name, + image: { + url: item?.product.imageUrl, + }, + }, + ], + options: item.product.options, + path: `/${item.product.productCode}`, + description: item.product.description, + } +} diff --git a/packages/kibocommerce/src/lib/prepare-set-cookie.ts b/packages/kibocommerce/src/lib/prepare-set-cookie.ts new file mode 100644 index 0000000..c1aeb1c --- /dev/null +++ b/packages/kibocommerce/src/lib/prepare-set-cookie.ts @@ -0,0 +1,15 @@ +export function prepareSetCookie(name: string, value: string, options: any = {}): string { + const encodedValue = Buffer.from(value).toString('base64') + const cookieValue = [`${name}=${encodedValue}`]; + + if (options.maxAge) { + cookieValue.push(`Max-Age=${options.maxAge}`); + } + + if (options.expires && !options.maxAge) { + cookieValue.push(`Expires=${options.expires.toUTCString()}`); + } + + const cookie = cookieValue.join('; ') + return cookie +} \ No newline at end of file diff --git a/packages/kibocommerce/src/lib/product-search-vars.ts b/packages/kibocommerce/src/lib/product-search-vars.ts new file mode 100644 index 0000000..37c4d81 --- /dev/null +++ b/packages/kibocommerce/src/lib/product-search-vars.ts @@ -0,0 +1,55 @@ +function getFacetValueFilter(categoryCode: string, filters = []) { + let facetValueFilter = ''; + if (categoryCode) { + facetValueFilter = `categoryCode:${categoryCode},`; + } + return facetValueFilter + filters.join(','); +} + +export const buildProductSearchVars = ({ + categoryCode = '', + pageSize = 5, + filters = {} as any, + startIndex = 0, + sort = '', + search = '', +}) => { + let facetTemplate = ''; + let filter = ''; + let sortBy; + if (categoryCode) { + facetTemplate = `categoryCode:${categoryCode}`; + filter = `categoryCode req ${categoryCode}`; + } + const facetFilterList = Object.keys(filters).filter(k => filters[k].length).reduce((accum, k): any => { + return [...accum, ...filters[k].map((facetValue: any) => `Tenant~${k}:${facetValue}`)]; + }, []); + + const facetValueFilter = getFacetValueFilter(categoryCode, facetFilterList); + + switch(sort) { + case 'latest-desc': + sortBy= 'createDate desc'; + break; + case 'price-asc': + sortBy= 'price asc'; + break; + case 'price-desc': + sortBy= 'price desc'; + break; + case 'trending-desc': + default: + sortBy= ''; + break; + } + + return { + query: search, + startIndex, + pageSize, + sortBy, + filter: filter, + facetTemplate, + facetValueFilter + } +} diff --git a/packages/kibocommerce/src/lib/set-cookie.ts b/packages/kibocommerce/src/lib/set-cookie.ts new file mode 100644 index 0000000..2c194c9 --- /dev/null +++ b/packages/kibocommerce/src/lib/set-cookie.ts @@ -0,0 +1,3 @@ +export function setCookies(res: any, cookies: string[]): void { + res.setHeader('Set-Cookie', cookies); +} \ No newline at end of file diff --git a/packages/kibocommerce/src/next.config.cjs b/packages/kibocommerce/src/next.config.cjs new file mode 100644 index 0000000..79a348c --- /dev/null +++ b/packages/kibocommerce/src/next.config.cjs @@ -0,0 +1,12 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + serverRuntimeConfig: { + // Will only be available on the server side + kiboAuthTicket: null + }, + images: { + domains: ['d1slj7rdbjyb5l.cloudfront.net', 'cdn-tp1.mozu.com', 'cdn-sb.mozu.com'], + }, +} diff --git a/packages/kibocommerce/src/product/index.ts b/packages/kibocommerce/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/kibocommerce/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/kibocommerce/src/product/use-price.tsx b/packages/kibocommerce/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/kibocommerce/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/kibocommerce/src/product/use-search.tsx b/packages/kibocommerce/src/product/use-search.tsx new file mode 100644 index 0000000..4a9107b --- /dev/null +++ b/packages/kibocommerce/src/product/use-search.tsx @@ -0,0 +1,37 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + method: 'GET', + url: '/api/catalog/products', + }, + fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (search) url.searchParams.set('search', search) + if (Number.isInteger(Number(categoryId))) + url.searchParams.set('categoryId', String(categoryId)) + if (Number.isInteger(brandId)) + url.searchParams.set('brandId', String(brandId)) + if (sort) url.searchParams.set('sort', sort) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: ({ useData }) => (input) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + }, +} diff --git a/packages/kibocommerce/src/provider.ts b/packages/kibocommerce/src/provider.ts new file mode 100644 index 0000000..8ca1ddf --- /dev/null +++ b/packages/kibocommerce/src/provider.ts @@ -0,0 +1,30 @@ +import fetcher from './fetcher' +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' +import { handler as useWishlist } from './wishlist/use-wishlist' +import { handler as useWishlistAddItem } from './wishlist/use-add-item' +import { handler as useWishlistRemoveItem } from './wishlist/use-remove-item' + +export const kiboCommerceProvider = { + locale: 'en-us', + cartCookie: 'kibo_cart', + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + wishlist: { + useWishlist, + useAddItem: useWishlistAddItem, + useRemoveItem: useWishlistRemoveItem, + }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type KibocommerceProvider = typeof kiboCommerceProvider diff --git a/packages/kibocommerce/src/types/customer.ts b/packages/kibocommerce/src/types/customer.ts new file mode 100644 index 0000000..29f68fe --- /dev/null +++ b/packages/kibocommerce/src/types/customer.ts @@ -0,0 +1,27 @@ +import * as Core from '@vercel/commerce/types/customer' +export type Maybe = T | null +export * from '@vercel/commerce/types/customer' +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** The `AnyScalar` type allows any scalar value by examining the input and passing the serialize, parseValue, and parseLiteral operations to their respective types. */ + AnyScalar: any + /** DateTime custom scalar type */ + DateTime: any + /** Object custom scalar type */ + Object: any +} + +export type Customer = { + id: Scalars['Int'], + firstName?: Maybe, + lastName?: Maybe, + email?: Maybe, + userName?: Maybe, + isAnonymous?: Maybe +} + +export type CustomerSchema = Core.CustomerSchema diff --git a/packages/kibocommerce/src/types/login.ts b/packages/kibocommerce/src/types/login.ts new file mode 100644 index 0000000..2e7b198 --- /dev/null +++ b/packages/kibocommerce/src/types/login.ts @@ -0,0 +1,8 @@ +import * as Core from '@vercel/commerce/types/login' +import type { CustomerUserAuthInfoInput } from '../../schema' + +export * from '@vercel/commerce/types/login' + +export type LoginOperation = Core.LoginOperation & { + variables: CustomerUserAuthInfoInput +} diff --git a/packages/kibocommerce/src/types/logout.ts b/packages/kibocommerce/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/kibocommerce/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/kibocommerce/src/types/page.ts b/packages/kibocommerce/src/types/page.ts new file mode 100644 index 0000000..f311eb8 --- /dev/null +++ b/packages/kibocommerce/src/types/page.ts @@ -0,0 +1,35 @@ +import * as Core from '@vercel/commerce/types/page' +export type Maybe = T | null +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** The `AnyScalar` type allows any scalar value by examining the input and passing the serialize, parseValue, and parseLiteral operations to their respective types. */ + AnyScalar: any + /** DateTime custom scalar type */ + DateTime: any + /** Object custom scalar type */ + Object: any +} + +export * from '@vercel/commerce/types/page' + +export type Page = Core.Page + +export type PageTypes = { + page: Page +} + +export type GetPagesQueryParams = { + documentListName: Maybe +} + +export type GetPageQueryParams = { + id: Maybe + documentListName: Maybe +} + +export type GetAllPagesOperation = Core.GetAllPagesOperation +export type GetPageOperation = Core.GetPageOperation diff --git a/packages/kibocommerce/src/types/signup.ts b/packages/kibocommerce/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/kibocommerce/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/kibocommerce/src/wishlist/index.ts b/packages/kibocommerce/src/wishlist/index.ts new file mode 100644 index 0000000..241af3c --- /dev/null +++ b/packages/kibocommerce/src/wishlist/index.ts @@ -0,0 +1,3 @@ +export { default as useAddItem } from './use-add-item' +export { default as useWishlist } from './use-wishlist' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/kibocommerce/src/wishlist/use-add-item.tsx b/packages/kibocommerce/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..3f634e3 --- /dev/null +++ b/packages/kibocommerce/src/wishlist/use-add-item.tsx @@ -0,0 +1,38 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/wishlist/use-add-item' +import type { AddItemHook } from '@vercel/commerce/types/wishlist' +import useCustomer from '../customer/use-customer' +import useWishlist from './use-wishlist' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'POST', + }, + useHook: + ({ fetch }) => + () => { + const { data: customer } = useCustomer() + const { mutate } = useWishlist() + + return useCallback( + async function addItem(item) { + if (!customer) { + // A signed customer is required in order to have a wishlist + throw new CommerceError({ + message: 'Signed customer not found', + }) + } + // TODO: add validations before doing the fetch + const data = await fetch({ input: { item } }) + await mutate() + return data + }, + [fetch, mutate, customer] + ) + }, +} diff --git a/packages/kibocommerce/src/wishlist/use-remove-item.tsx b/packages/kibocommerce/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..490154a --- /dev/null +++ b/packages/kibocommerce/src/wishlist/use-remove-item.tsx @@ -0,0 +1,40 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/wishlist/use-remove-item' +import type { RemoveItemHook } from '@vercel/commerce/types/wishlist' +import useCustomer from '../customer/use-customer' +import useWishlist from './use-wishlist' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'DELETE', + }, + useHook: + ({ fetch }) => + ({ wishlist } = {}) => { + const { data: customer } = useCustomer() + const { mutate } = useWishlist(wishlist) + + return useCallback( + async function removeItem(input) { + if (!customer) { + // A signed customer is required in order to have a wishlist + throw new CommerceError({ + message: 'Signed customer not found', + }) + } + + const data = await fetch({ input: { itemId: String(input.id) } }) + await mutate() + return data + }, + [fetch, mutate, customer] + ) + }, +} diff --git a/packages/kibocommerce/src/wishlist/use-wishlist.tsx b/packages/kibocommerce/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..a91eb41 --- /dev/null +++ b/packages/kibocommerce/src/wishlist/use-wishlist.tsx @@ -0,0 +1,52 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useWishlist, { UseWishlist } from '@vercel/commerce/wishlist/use-wishlist' +import type { GetWishlistHook } from '@vercel/commerce/types/wishlist' +import useCustomer from '../customer/use-customer' + +export default useWishlist as UseWishlist + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/wishlist', + method: 'GET', + }, + fetcher({ input: { customerId, includeProducts}, options, fetch }) { + if (!customerId) return null + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (includeProducts) url.searchParams.set('products', '1') + if(customerId) url.searchParams.set('customerId', customerId) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: ({ useData }) => (input) => { + const { data: customer } = useCustomer() + const response = useData({ + input: [ + ['customerId', customer?.id], + ['includeProducts', input?.includeProducts], + ], + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.items?.length || 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/kibocommerce/taskfile.js b/packages/kibocommerce/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/kibocommerce/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/kibocommerce/tsconfig.json b/packages/kibocommerce/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/kibocommerce/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/local/.env.template b/packages/local/.env.template new file mode 100644 index 0000000..a6272a1 --- /dev/null +++ b/packages/local/.env.template @@ -0,0 +1 @@ +COMMERCE_PROVIDER=@vercel/commerce-local \ No newline at end of file diff --git a/packages/local/.prettierignore b/packages/local/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/local/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/local/.prettierrc b/packages/local/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/local/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/local/README.md b/packages/local/README.md new file mode 100644 index 0000000..a3bc1db --- /dev/null +++ b/packages/local/README.md @@ -0,0 +1 @@ +# Next.js Local Provider diff --git a/packages/local/package.json b/packages/local/package.json new file mode 100644 index 0000000..3ec3e69 --- /dev/null +++ b/packages/local/package.json @@ -0,0 +1,79 @@ +{ + "name": "@vercel/commerce-local", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/local/src/api/endpoints/cart/index.ts b/packages/local/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/cart/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/catalog/index.ts b/packages/local/src/api/endpoints/catalog/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/catalog/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/catalog/products.ts b/packages/local/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/checkout/index.ts b/packages/local/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/checkout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/address.ts b/packages/local/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/card.ts b/packages/local/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/customer/index.ts b/packages/local/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/login/index.ts b/packages/local/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/login/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/logout/index.ts b/packages/local/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/signup/index.ts b/packages/local/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/endpoints/wishlist/index.tsx b/packages/local/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/local/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/local/src/api/index.ts b/packages/local/src/api/index.ts new file mode 100644 index 0000000..3b24a30 --- /dev/null +++ b/packages/local/src/api/index.ts @@ -0,0 +1,42 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' +import createFetcher from './utils/fetch-local' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface LocalConfig extends CommerceAPIConfig {} +const config: LocalConfig = { + commerceUrl: '', + apiToken: '', + cartCookie: '', + customerCookie: '', + cartCookieMaxAge: 2592000, + fetch: createFetcher(() => getCommerceApi().getConfig()), +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider +export type LocalAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): LocalAPI

{ + return commerceApi(customProvider as any) +} diff --git a/packages/local/src/api/operations/get-all-pages.ts b/packages/local/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..b258fe7 --- /dev/null +++ b/packages/local/src/api/operations/get-all-pages.ts @@ -0,0 +1,19 @@ +export type Page = { url: string } +export type GetAllPagesResult = { pages: Page[] } +import type { LocalConfig } from '../index' + +export default function getAllPagesOperation() { + function getAllPages({ + config, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + }): Promise { + return Promise.resolve({ + pages: [], + }) + } + return getAllPages +} diff --git a/packages/local/src/api/operations/get-all-product-paths.ts b/packages/local/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..fff24e7 --- /dev/null +++ b/packages/local/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,15 @@ +import data from '../../data.json' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation() { + function getAllProductPaths(): Promise { + return Promise.resolve({ + products: data.products.map(({ path }) => ({ path })), + }) + } + + return getAllProductPaths +} diff --git a/packages/local/src/api/operations/get-all-products.ts b/packages/local/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..2d11950 --- /dev/null +++ b/packages/local/src/api/operations/get-all-products.ts @@ -0,0 +1,25 @@ +import { Product } from '@vercel/commerce/types/product' +import { GetAllProductsOperation } from '@vercel/commerce/types/product' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { LocalConfig, Provider } from '../index' +import data from '../../data.json' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts({ + query = '', + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + return { + products: data.products, + } + } + return getAllProducts +} diff --git a/packages/local/src/api/operations/get-customer-wishlist.ts b/packages/local/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..8c34b9e --- /dev/null +++ b/packages/local/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,6 @@ +export default function getCustomerWishlistOperation() { + function getCustomerWishlist(): any { + return { wishlist: {} } + } + return getCustomerWishlist +} diff --git a/packages/local/src/api/operations/get-page.ts b/packages/local/src/api/operations/get-page.ts new file mode 100644 index 0000000..b0cfdf5 --- /dev/null +++ b/packages/local/src/api/operations/get-page.ts @@ -0,0 +1,13 @@ +export type Page = any +export type GetPageResult = { page?: Page } + +export type PageVariables = { + id: number +} + +export default function getPageOperation() { + function getPage(): Promise { + return Promise.resolve({}) + } + return getPage +} diff --git a/packages/local/src/api/operations/get-product.ts b/packages/local/src/api/operations/get-product.ts new file mode 100644 index 0000000..b77be3a --- /dev/null +++ b/packages/local/src/api/operations/get-product.ts @@ -0,0 +1,26 @@ +import type { LocalConfig } from '../index' +import { Product } from '@vercel/commerce/types/product' +import { GetProductOperation } from '@vercel/commerce/types/product' +import data from '../../data.json' +import type { OperationContext } from '@vercel/commerce/api/operations' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + query = '', + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + return { + product: data.products.find(({ slug }) => slug === variables!.slug), + } + } + + return getProduct +} diff --git a/packages/local/src/api/operations/get-site-info.ts b/packages/local/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..c07a479 --- /dev/null +++ b/packages/local/src/api/operations/get-site-info.ts @@ -0,0 +1,43 @@ +import { OperationContext } from '@vercel/commerce/api/operations' +import { Category } from '@vercel/commerce/types/site' +import { LocalConfig } from '../index' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({}: OperationContext) { + function getSiteInfo({ + query, + variables, + config: cfg, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + return Promise.resolve({ + categories: [ + { + id: 'new-arrivals', + name: 'New Arrivals', + slug: 'new-arrivals', + path: '/new-arrivals', + }, + { + id: 'featured', + name: 'Featured', + slug: 'featured', + path: '/featured', + }, + ], + brands: [], + }) + } + + return getSiteInfo +} diff --git a/packages/local/src/api/operations/index.ts b/packages/local/src/api/operations/index.ts new file mode 100644 index 0000000..086fdf8 --- /dev/null +++ b/packages/local/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getAllPages } from './get-all-pages' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/local/src/api/utils/fetch-local.ts b/packages/local/src/api/utils/fetch-local.ts new file mode 100644 index 0000000..ae84fff --- /dev/null +++ b/packages/local/src/api/utils/fetch-local.ts @@ -0,0 +1,34 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { LocalConfig } from '../index' +import fetch from './fetch' + +const fetchGraphqlApi: (getConfig: () => LocalConfig) => GraphQLFetcher = + (getConfig) => + async (query: string, { variables, preview } = {}, fetchOptions) => { + const config = getConfig() + const res = await fetch(config.commerceUrl, { + ...fetchOptions, + method: 'POST', + headers: { + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch for API' }], + status: res.status, + }) + } + + return { data: json.data, res } + } + +export default fetchGraphqlApi diff --git a/packages/local/src/api/utils/fetch.ts b/packages/local/src/api/utils/fetch.ts new file mode 100644 index 0000000..9d9fff3 --- /dev/null +++ b/packages/local/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import zeitFetch from '@vercel/fetch' + +export default zeitFetch() diff --git a/packages/local/src/auth/index.ts b/packages/local/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/local/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/local/src/auth/use-login.tsx b/packages/local/src/auth/use-login.tsx new file mode 100644 index 0000000..20e3ed2 --- /dev/null +++ b/packages/local/src/auth/use-login.tsx @@ -0,0 +1,16 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: () => () => { + return async function () {} + }, +} diff --git a/packages/local/src/auth/use-logout.tsx b/packages/local/src/auth/use-logout.tsx new file mode 100644 index 0000000..4e74908 --- /dev/null +++ b/packages/local/src/auth/use-logout.tsx @@ -0,0 +1,17 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + async () => {}, +} diff --git a/packages/local/src/auth/use-signup.tsx b/packages/local/src/auth/use-signup.tsx new file mode 100644 index 0000000..e488114 --- /dev/null +++ b/packages/local/src/auth/use-signup.tsx @@ -0,0 +1,19 @@ +import { useCallback } from 'react' +import useCustomer from '../customer/use-customer' +import { MutationHook } from '@vercel/commerce/utils/types' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + () => {}, +} diff --git a/packages/local/src/cart/index.ts b/packages/local/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/local/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/local/src/cart/use-add-item.tsx b/packages/local/src/cart/use-add-item.tsx new file mode 100644 index 0000000..2be6e0a --- /dev/null +++ b/packages/local/src/cart/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/local/src/cart/use-cart.tsx b/packages/local/src/cart/use-cart.tsx new file mode 100644 index 0000000..8f92de3 --- /dev/null +++ b/packages/local/src/cart/use-cart.tsx @@ -0,0 +1,42 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return { + id: '', + createdAt: '', + currency: { code: '' }, + taxesIncluded: '', + lineItems: [], + lineItemsSubtotalPrice: '', + subtotalPrice: 0, + totalPrice: 0, + } + }, + useHook: + ({ useData }) => + (input) => { + return useMemo( + () => + Object.create( + {}, + { + isEmpty: { + get() { + return true + }, + enumerable: true, + }, + } + ), + [] + ) + }, +} diff --git a/packages/local/src/cart/use-remove-item.tsx b/packages/local/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..92d52c9 --- /dev/null +++ b/packages/local/src/cart/use-remove-item.tsx @@ -0,0 +1,20 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function removeItem(input) { + return {} + } + }, +} diff --git a/packages/local/src/cart/use-update-item.tsx b/packages/local/src/cart/use-update-item.tsx new file mode 100644 index 0000000..950f422 --- /dev/null +++ b/packages/local/src/cart/use-update-item.tsx @@ -0,0 +1,20 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/local/src/checkout/use-checkout.tsx b/packages/local/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..76997be --- /dev/null +++ b/packages/local/src/checkout/use-checkout.tsx @@ -0,0 +1,16 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/local/src/commerce.config.json b/packages/local/src/commerce.config.json new file mode 100644 index 0000000..0e77dd1 --- /dev/null +++ b/packages/local/src/commerce.config.json @@ -0,0 +1,10 @@ +{ + "provider": "local", + "features": { + "wishlist": false, + "cart": false, + "search": false, + "customerAuth": false, + "customCheckout": false + } +} diff --git a/packages/local/src/customer/address/use-add-item.tsx b/packages/local/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..4f85c84 --- /dev/null +++ b/packages/local/src/customer/address/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/local/src/customer/card/use-add-item.tsx b/packages/local/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..77d149e --- /dev/null +++ b/packages/local/src/customer/card/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/local/src/customer/index.ts b/packages/local/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/local/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/local/src/customer/use-customer.tsx b/packages/local/src/customer/use-customer.tsx new file mode 100644 index 0000000..04c4894 --- /dev/null +++ b/packages/local/src/customer/use-customer.tsx @@ -0,0 +1,17 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { + UseCustomer, +} from '@vercel/commerce/customer/use-customer' + +export default useCustomer as UseCustomer +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: () => () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/local/src/data.json b/packages/local/src/data.json new file mode 100644 index 0000000..18c8ee7 --- /dev/null +++ b/packages/local/src/data.json @@ -0,0 +1,235 @@ +{ + "products": [ + { + "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzU0NDczMjUwMjQ0MjA=", + "name": "New Short Sleeve T-Shirt", + "vendor": "Next.js", + "path": "/new-short-sleeve-t-shirt", + "slug": "new-short-sleeve-t-shirt", + "price": { "value": 25, "currencyCode": "USD" }, + "descriptionHtml": "

Show off your love for Next.js and Vercel with this unique, limited edition t-shirt. This design is part of a limited run, numbered drop at the June 2021 Next.js Conf. It features a unique, handcrafted triangle design. Get it while supplies last – only 200 of these shirts will be made! All proceeds will be donated to charity.

", + "images": [ + { + "url": "/assets/drop-shirt-0.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/drop-shirt-1.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/drop-shirt-2.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + } + ], + "variants": [ + { + "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzU0NDczMjUwMjQ0MjAss=", + "options": [ + { + "__typename": "MultipleChoiceOption", + "id": "asd", + "displayName": "Size", + "values": [ + { + "label": "XL" + } + ] + } + ] + } + ], + "options": [ + { + "id": "option-color", + "displayName": "Color", + "values": [ + { + "label": "color", + "hexColors": ["#222"] + } + ] + }, + { + "id": "option-size", + "displayName": "Size", + "values": [ + { + "label": "S" + }, + { + "label": "M" + }, + { + "label": "L" + } + ] + } + ] + }, + { + "id": "Z2lkOi8vc2hvcGlmeS9Qcm9ksdWN0LzU0NDczMjUwMjQ0MjA=", + "name": "Lightweight Jacket", + "vendor": "Next.js", + "path": "/lightweight-jacket", + "slug": "lightweight-jacket", + "price": { "value": 249.99, "currencyCode": "USD" }, + "descriptionHtml": "

Show off your love for Next.js and Vercel with this unique, limited edition t-shirt. This design is part of a limited run, numbered drop at the June 2021 Next.js Conf. It features a unique, handcrafted triangle design. Get it while supplies last – only 200 of these shirts will be made! All proceeds will be donated to charity.

", + "images": [ + { + "url": "/assets/lightweight-jacket-0.png", + "altText": "Lightweight Jacket", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/lightweight-jacket-1.png", + "altText": "Lightweight Jacket", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/lightweight-jacket-2.png", + "altText": "Lightweight Jacket", + "width": 1000, + "height": 1000 + } + ], + "variants": [ + { + "id": "Z2lkOid8vc2hvcGlmeS9Qcm9kdWN0LzU0NDczMjUwMjQ0MjAss=", + "options": [ + { + "__typename": "MultipleChoiceOption", + "id": "asd", + "displayName": "Size", + "values": [ + { + "label": "XL" + } + ] + } + ] + } + ], + "options": [ + { + "id": "option-color", + "displayName": "Color", + "values": [ + { + "label": "color", + "hexColors": ["#222"] + } + ] + }, + { + "id": "option-size", + "displayName": "Size", + "values": [ + { + "label": "S" + }, + { + "label": "M" + }, + { + "label": "L" + } + ] + } + ] + }, + { + "id": "Z2lkOis8vc2hvcGlmsddeS9Qcm9kdWN0LzU0NDczMjUwMjQ0MjA=", + "name": "Shirt", + "vendor": "Next.js", + "path": "/shirt", + "slug": "shirt", + "price": { "value": 25, "currencyCode": "USD" }, + "descriptionHtml": "

Show off your love for Next.js and Vercel with this unique, limited edition t-shirt. This design is part of a limited run, numbered drop at the June 2021 Next.js Conf. It features a unique, handcrafted triangle design. Get it while supplies last – only 200 of these shirts will be made! All proceeds will be donated to charity.

", + "images": [ + { + "url": "/assets/t-shirt-0.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/t-shirt-1.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/t-shirt-2.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/t-shirt-3.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + }, + { + "url": "/assets/t-shirt-4.png", + "altText": "Shirt", + "width": 1000, + "height": 1000 + } + ], + "variants": [ + { + "id": "Z2lkOi8vc2hvcGlmeS9Qcms9kdWN0LzU0NDczMjUwMjQ0MjAss=", + "options": [ + { + "__typename": "MultipleChoiceOption", + "id": "asd", + "displayName": "Size", + "values": [ + { + "label": "XL" + } + ] + } + ] + } + ], + "options": [ + { + "id": "option-color", + "displayName": "Color", + "values": [ + { + "label": "color", + "hexColors": ["#222"] + } + ] + }, + { + "id": "option-size", + "displayName": "Size", + "values": [ + { + "label": "S" + }, + { + "label": "M" + }, + { + "label": "L" + } + ] + } + ] + } + ] +} diff --git a/packages/local/src/fetcher.ts b/packages/local/src/fetcher.ts new file mode 100644 index 0000000..27f3ceb --- /dev/null +++ b/packages/local/src/fetcher.ts @@ -0,0 +1,11 @@ +import { Fetcher } from '@vercel/commerce/utils/types' + +export const fetcher: Fetcher = async () => { + console.log('FETCHER') + const res = await fetch('./data.json') + if (res.ok) { + const { data } = await res.json() + return data + } + throw res +} diff --git a/packages/local/src/index.tsx b/packages/local/src/index.tsx new file mode 100644 index 0000000..ae3df81 --- /dev/null +++ b/packages/local/src/index.tsx @@ -0,0 +1,12 @@ +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { localProvider, LocalProvider } from './provider' + +export { localProvider } +export type { LocalProvider } + +export const CommerceProvider = getCommerceProvider(localProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/local/src/next.config.cjs b/packages/local/src/next.config.cjs new file mode 100644 index 0000000..ce46b70 --- /dev/null +++ b/packages/local/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['localhost'], + }, +} diff --git a/packages/local/src/product/index.ts b/packages/local/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/local/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/local/src/product/use-price.tsx b/packages/local/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/local/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/local/src/product/use-search.tsx b/packages/local/src/product/use-search.tsx new file mode 100644 index 0000000..b84889c --- /dev/null +++ b/packages/local/src/product/use-search.tsx @@ -0,0 +1,17 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: () => () => { + return { + data: { + products: [], + }, + } + }, +} diff --git a/packages/local/src/provider.ts b/packages/local/src/provider.ts new file mode 100644 index 0000000..53dc7f5 --- /dev/null +++ b/packages/local/src/provider.ts @@ -0,0 +1,22 @@ +import { fetcher } from './fetcher' +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +export const localProvider = { + locale: 'en-us', + cartCookie: 'session', + fetcher: fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type LocalProvider = typeof localProvider diff --git a/packages/local/src/wishlist/use-add-item.tsx b/packages/local/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/local/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/local/src/wishlist/use-remove-item.tsx b/packages/local/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/local/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/local/src/wishlist/use-wishlist.tsx b/packages/local/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..b2785d4 --- /dev/null +++ b/packages/local/src/wishlist/use-wishlist.tsx @@ -0,0 +1,43 @@ +import { HookFetcher } from '@vercel/commerce/utils/types' +import type { Product } from '@vercel/commerce/types/product' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/local/taskfile.js b/packages/local/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/local/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/local/tsconfig.json b/packages/local/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/local/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/ordercloud/.env.template b/packages/ordercloud/.env.template new file mode 100644 index 0000000..1423065 --- /dev/null +++ b/packages/ordercloud/.env.template @@ -0,0 +1,6 @@ +COMMERCE_PROVIDER=@vercel/commerce-ordercloud + +ORDERCLOUD_BUYER_CLIENT_ID= +ORDERCLOUD_MIDDLEWARE_CLIENT_ID= +ORDERCLOUD_MIDDLEWARE_CLIENT_SECRET= +STRIPE_SECRET= diff --git a/packages/ordercloud/.prettierignore b/packages/ordercloud/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/ordercloud/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/ordercloud/.prettierrc b/packages/ordercloud/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/ordercloud/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/ordercloud/README.md b/packages/ordercloud/README.md new file mode 100644 index 0000000..ca1438e --- /dev/null +++ b/packages/ordercloud/README.md @@ -0,0 +1,3 @@ +# Next.js Ordercloud Provider + +Create your own store from [here](https://nextjs.org/commerce) diff --git a/packages/ordercloud/package.json b/packages/ordercloud/package.json new file mode 100644 index 0000000..43eeac9 --- /dev/null +++ b/packages/ordercloud/package.json @@ -0,0 +1,82 @@ +{ + "name": "@vercel/commerce-ordercloud", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "stripe": "^8.197.0", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/ordercloud/src/api/endpoints/cart/add-item.ts b/packages/ordercloud/src/api/endpoints/cart/add-item.ts new file mode 100644 index 0000000..28d372b --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/cart/add-item.ts @@ -0,0 +1,99 @@ +import type { CartEndpoint } from '.' +import type { RawVariant } from '../../../types/product' +import type { OrdercloudLineItem } from '../../../types/cart' + +import { serialize } from 'cookie' + +import { formatCart } from '../../utils/cart' + +const addItem: CartEndpoint['handlers']['addItem'] = async ({ + res, + body: { cartId, item }, + config: { restBuyerFetch, cartCookie, tokenCookie }, +}) => { + // Return an error if no item is present + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + // Store token + let token + + // Set the quantity if not present + if (!item.quantity) item.quantity = 1 + + // Create an order if it doesn't exist + if (!cartId) { + const { ID, meta } = await restBuyerFetch( + 'POST', + `/orders/Outgoing`, + {} + ).then((response: { ID: string; meta: { token: string } }) => response) + + // Set the cart id and token + cartId = ID + token = meta.token + + // Set the cart and token cookie + res.setHeader('Set-Cookie', [ + serialize(tokenCookie, meta.token, { + maxAge: 60 * 60 * 24 * 30, + expires: new Date(Date.now() + 60 * 60 * 24 * 30 * 1000), + secure: process.env.NODE_ENV === 'production', + path: '/', + sameSite: 'lax', + }), + serialize(cartCookie, cartId, { + maxAge: 60 * 60 * 24 * 30, + expires: new Date(Date.now() + 60 * 60 * 24 * 30 * 1000), + secure: process.env.NODE_ENV === 'production', + path: '/', + sameSite: 'lax', + }), + ]) + } + + // Store specs + let specs: RawVariant['Specs'] = [] + + // If a variant is present, fetch its specs + if (item.variantId) { + specs = await restBuyerFetch( + 'GET', + `/me/products/${item.productId}/variants/${item.variantId}`, + null, + { token } + ).then((res: RawVariant) => res.Specs) + } + + // Add the item to the order + await restBuyerFetch( + 'POST', + `/orders/Outgoing/${cartId}/lineitems`, + { + ProductID: item.productId, + Quantity: item.quantity, + Specs: specs, + }, + { token } + ) + + // Get cart + const [cart, lineItems] = await Promise.all([ + restBuyerFetch('GET', `/orders/Outgoing/${cartId}`, null, { token }), + restBuyerFetch('GET', `/orders/Outgoing/${cartId}/lineitems`, null, { + token, + }).then((response: { Items: OrdercloudLineItem[] }) => response.Items), + ]) + + // Format cart + const formattedCart = formatCart(cart, lineItems) + + // Return cart and errors + res.status(200).json({ data: formattedCart, errors: [] }) +} + +export default addItem diff --git a/packages/ordercloud/src/api/endpoints/cart/get-cart.ts b/packages/ordercloud/src/api/endpoints/cart/get-cart.ts new file mode 100644 index 0000000..7ea077b --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/cart/get-cart.ts @@ -0,0 +1,65 @@ +import type { OrdercloudLineItem } from '../../../types/cart' +import type { CartEndpoint } from '.' + +import { serialize } from 'cookie' + +import { formatCart } from '../../utils/cart' + +// Return current cart info +const getCart: CartEndpoint['handlers']['getCart'] = async ({ + req, + res, + body: { cartId }, + config: { restBuyerFetch, cartCookie, tokenCookie }, +}) => { + if (!cartId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + try { + // Get token from cookies + const token = req.cookies[tokenCookie] + + // Get cart + const cart = await restBuyerFetch( + 'GET', + `/orders/Outgoing/${cartId}`, + null, + { token } + ) + + // Get line items + const lineItems = await restBuyerFetch( + 'GET', + `/orders/Outgoing/${cartId}/lineitems`, + null, + { token } + ).then((response: { Items: OrdercloudLineItem[] }) => response.Items) + + // Format cart + const formattedCart = formatCart(cart, lineItems) + + // Return cart and errors + res.status(200).json({ data: formattedCart, errors: [] }) + } catch (error) { + // Reset cart and token cookie + res.setHeader('Set-Cookie', [ + serialize(cartCookie, cartId, { + maxAge: -1, + path: '/', + }), + serialize(tokenCookie, cartId, { + maxAge: -1, + path: '/', + }), + ]) + + // Return empty cart + res.status(200).json({ data: null, errors: [] }) + } +} + +export default getCart diff --git a/packages/ordercloud/src/api/endpoints/cart/index.ts b/packages/ordercloud/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..f36364c --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/cart/index.ts @@ -0,0 +1,28 @@ +import type { CartSchema } from '../../../types/cart' +import type { OrdercloudAPI } from '../..' + +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import cartEndpoint from '@vercel/commerce/api/endpoints/cart' + +import getCart from './get-cart' +import addItem from './add-item' +import updateItem from './update-item' +import removeItem from './remove-item' + +export type CartAPI = GetAPISchema + +export type CartEndpoint = CartAPI['endpoint'] + +export const handlers: CartEndpoint['handlers'] = { + getCart, + addItem, + updateItem, + removeItem, +} + +const cartApi = createEndpoint({ + handler: cartEndpoint, + handlers, +}) + +export default cartApi diff --git a/packages/ordercloud/src/api/endpoints/cart/remove-item.ts b/packages/ordercloud/src/api/endpoints/cart/remove-item.ts new file mode 100644 index 0000000..ea9c46e --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/cart/remove-item.ts @@ -0,0 +1,45 @@ +import type { CartEndpoint } from '.' + +import { formatCart } from '../../utils/cart' +import { OrdercloudLineItem } from '../../../types/cart' + +const removeItem: CartEndpoint['handlers']['removeItem'] = async ({ + req, + res, + body: { cartId, itemId }, + config: { restBuyerFetch, tokenCookie }, +}) => { + if (!cartId || !itemId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + // Get token from cookies + const token = req.cookies[tokenCookie] + + // Remove the item to the order + await restBuyerFetch( + 'DELETE', + `/orders/Outgoing/${cartId}/lineitems/${itemId}`, + null, + { token } + ) + + // Get cart + const [cart, lineItems] = await Promise.all([ + restBuyerFetch('GET', `/orders/Outgoing/${cartId}`, null, { token }), + restBuyerFetch('GET', `/orders/Outgoing/${cartId}/lineitems`, null, { + token, + }).then((response: { Items: OrdercloudLineItem[] }) => response.Items), + ]) + + // Format cart + const formattedCart = formatCart(cart, lineItems) + + // Return cart and errors + res.status(200).json({ data: formattedCart, errors: [] }) +} + +export default removeItem diff --git a/packages/ordercloud/src/api/endpoints/cart/update-item.ts b/packages/ordercloud/src/api/endpoints/cart/update-item.ts new file mode 100644 index 0000000..20113ba --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/cart/update-item.ts @@ -0,0 +1,63 @@ +import type { OrdercloudLineItem } from '../../../types/cart' +import type { RawVariant } from '../../../types/product' +import type { CartEndpoint } from '.' + +import { formatCart } from '../../utils/cart' + +const updateItem: CartEndpoint['handlers']['updateItem'] = async ({ + req, + res, + body: { cartId, itemId, item }, + config: { restBuyerFetch, tokenCookie }, +}) => { + if (!cartId || !itemId || !item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Invalid request' }], + }) + } + + // Get token from cookies + const token = req.cookies[tokenCookie] + + // Store specs + let specs: RawVariant['Specs'] = [] + + // If a variant is present, fetch its specs + if (item.variantId) { + specs = await restBuyerFetch( + 'GET', + `/me/products/${item.productId}/variants/${item.variantId}`, + null, + { token } + ).then((res: RawVariant) => res.Specs) + } + + // Add the item to the order + await restBuyerFetch( + 'PATCH', + `/orders/Outgoing/${cartId}/lineitems/${itemId}`, + { + ProductID: item.productId, + Quantity: item.quantity, + Specs: specs, + }, + { token } + ) + + // Get cart + const [cart, lineItems] = await Promise.all([ + restBuyerFetch('GET', `/orders/Outgoing/${cartId}`, null, { token }), + restBuyerFetch('GET', `/orders/Outgoing/${cartId}/lineitems`, null, { + token, + }).then((response: { Items: OrdercloudLineItem[] }) => response.Items), + ]) + + // Format cart + const formattedCart = formatCart(cart, lineItems) + + // Return cart and errors + res.status(200).json({ data: formattedCart, errors: [] }) +} + +export default updateItem diff --git a/packages/ordercloud/src/api/endpoints/catalog/products/get-products.ts b/packages/ordercloud/src/api/endpoints/catalog/products/get-products.ts new file mode 100644 index 0000000..ad8d391 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/catalog/products/get-products.ts @@ -0,0 +1,37 @@ +import { normalize as normalizeProduct } from '../../../../utils/product' +import { ProductsEndpoint } from '.' + +// Get products for the product list page. Search and category filter implemented. Sort and brand filter not implemented. +const getProducts: ProductsEndpoint['handlers']['getProducts'] = async ({ + req, + res, + body: { search, categoryId, brandId, sort }, + config: { restBuyerFetch, cartCookie, tokenCookie }, +}) => { + //Use a dummy base as we only care about the relative path + const url = new URL('/me/products', 'http://a') + + if (search) { + url.searchParams.set('search', search) + } + if (categoryId) { + url.searchParams.set('categoryID', String(categoryId)) + } + + // Get token from cookies + const token = req.cookies[tokenCookie] + + var rawProducts = await restBuyerFetch( + 'GET', + url.pathname + url.search, + null, + { token } + ) + + const products = rawProducts.Items.map(normalizeProduct) + const found = rawProducts?.Items?.length > 0 + + res.status(200).json({ data: { products, found } }) +} + +export default getProducts diff --git a/packages/ordercloud/src/api/endpoints/catalog/products/index.ts b/packages/ordercloud/src/api/endpoints/catalog/products/index.ts new file mode 100644 index 0000000..d775d6f --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/catalog/products/index.ts @@ -0,0 +1,19 @@ +import type { OrdercloudAPI } from '../../../../api' + +import { createEndpoint, GetAPISchema } from '@vercel/commerce/api' +import { ProductsSchema } from '@vercel/commerce/types/product' +import getProducts from './get-products' +import productsEndpoint from '@vercel/commerce/api/endpoints/catalog/products' + +export type ProductsAPI = GetAPISchema + +export type ProductsEndpoint = ProductsAPI['endpoint'] + +export const handlers: ProductsEndpoint['handlers'] = { getProducts } + +const productsApi = createEndpoint({ + handler: productsEndpoint, + handlers, +}) + +export default productsApi diff --git a/packages/ordercloud/src/api/endpoints/checkout/get-checkout.ts b/packages/ordercloud/src/api/endpoints/checkout/get-checkout.ts new file mode 100644 index 0000000..c0ab1a4 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/checkout/get-checkout.ts @@ -0,0 +1,47 @@ +import type { CheckoutEndpoint } from '.' + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ + req, + res, + body: { cartId }, + config: { restBuyerFetch, tokenCookie }, +}) => { + // Return an error if no item is present + if (!cartId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing cookie' }], + }) + } + + // Get token from cookies + const token = req.cookies[tokenCookie] + + // Register credit card + const payments = await restBuyerFetch( + 'GET', + `/orders/Outgoing/${cartId}/payments`, + null, + { token } + ).then((response: { Items: unknown[] }) => response.Items) + + const address = await restBuyerFetch( + 'GET', + `/orders/Outgoing/${cartId}`, + null, + { token } + ).then( + (response: { ShippingAddressID: string }) => response.ShippingAddressID + ) + + // Return cart and errors + res.status(200).json({ + data: { + hasPayment: payments.length > 0, + hasShipping: Boolean(address), + }, + errors: [], + }) +} + +export default getCheckout diff --git a/packages/ordercloud/src/api/endpoints/checkout/index.ts b/packages/ordercloud/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..44a9a69 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/checkout/index.ts @@ -0,0 +1,23 @@ +import type { CheckoutSchema } from '../../../types/checkout' +import type { OrdercloudAPI } from '../..' + +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' + +import getCheckout from './get-checkout' +import submitCheckout from './submit-checkout' + +export type CheckoutAPI = GetAPISchema +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { + getCheckout, + submitCheckout, +} + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/ordercloud/src/api/endpoints/checkout/submit-checkout.ts b/packages/ordercloud/src/api/endpoints/checkout/submit-checkout.ts new file mode 100644 index 0000000..8cd9be5 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/checkout/submit-checkout.ts @@ -0,0 +1,32 @@ +import type { CheckoutEndpoint } from '.' + +const submitCheckout: CheckoutEndpoint['handlers']['submitCheckout'] = async ({ + req, + res, + body: { cartId }, + config: { restBuyerFetch, tokenCookie }, +}) => { + // Return an error if no item is present + if (!cartId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + // Get token from cookies + const token = req.cookies[tokenCookie] + + // Submit order + await restBuyerFetch( + 'POST', + `/orders/Outgoing/${cartId}/submit`, + {}, + { token } + ) + + // Return cart and errors + res.status(200).json({ data: null, errors: [] }) +} + +export default submitCheckout diff --git a/packages/ordercloud/src/api/endpoints/customer/address/add-item.ts b/packages/ordercloud/src/api/endpoints/customer/address/add-item.ts new file mode 100644 index 0000000..434c240 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/address/add-item.ts @@ -0,0 +1,47 @@ +import type { CustomerAddressEndpoint } from '.' + +const addItem: CustomerAddressEndpoint['handlers']['addItem'] = async ({ + res, + body: { item, cartId }, + config: { restBuyerFetch }, +}) => { + // Return an error if no item is present + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + // Return an error if no item is present + if (!cartId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Cookie not found' }], + }) + } + + // Register address + const address = await restBuyerFetch('POST', `/me/addresses`, { + AddressName: 'main address', + CompanyName: item.company, + FirstName: item.firstName, + LastName: item.lastName, + Street1: item.streetNumber, + Street2: item.streetNumber, + City: item.city, + State: item.city, + Zip: item.zipCode, + Country: item.country.slice(0, 2).toLowerCase(), + Shipping: true, + }).then((response: { ID: string }) => response.ID) + + // Assign address to order + await restBuyerFetch('PATCH', `/orders/Outgoing/${cartId}`, { + ShippingAddressID: address, + }) + + return res.status(200).json({ data: null, errors: [] }) +} + +export default addItem diff --git a/packages/ordercloud/src/api/endpoints/customer/address/get-addresses.ts b/packages/ordercloud/src/api/endpoints/customer/address/get-addresses.ts new file mode 100644 index 0000000..2e27591 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/address/get-addresses.ts @@ -0,0 +1,9 @@ +import type { CustomerAddressEndpoint } from '.' + +const getCards: CustomerAddressEndpoint['handlers']['getAddresses'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default getCards diff --git a/packages/ordercloud/src/api/endpoints/customer/address/index.ts b/packages/ordercloud/src/api/endpoints/customer/address/index.ts new file mode 100644 index 0000000..f6ab7e3 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/address/index.ts @@ -0,0 +1,30 @@ +import type { CustomerAddressSchema } from '../../../../types/customer/address' +import type { OrdercloudAPI } from '../../..' + +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import customerAddressEndpoint from '@vercel/commerce/api/endpoints/customer/address' + +import getAddresses from './get-addresses' +import addItem from './add-item' +import updateItem from './update-item' +import removeItem from './remove-item' + +export type CustomerAddressAPI = GetAPISchema< + OrdercloudAPI, + CustomerAddressSchema +> +export type CustomerAddressEndpoint = CustomerAddressAPI['endpoint'] + +export const handlers: CustomerAddressEndpoint['handlers'] = { + getAddresses, + addItem, + updateItem, + removeItem, +} + +const customerAddressApi = createEndpoint({ + handler: customerAddressEndpoint, + handlers, +}) + +export default customerAddressApi diff --git a/packages/ordercloud/src/api/endpoints/customer/address/remove-item.ts b/packages/ordercloud/src/api/endpoints/customer/address/remove-item.ts new file mode 100644 index 0000000..fba4e11 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/address/remove-item.ts @@ -0,0 +1,9 @@ +import type { CustomerAddressEndpoint } from '.' + +const removeItem: CustomerAddressEndpoint['handlers']['removeItem'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default removeItem diff --git a/packages/ordercloud/src/api/endpoints/customer/address/update-item.ts b/packages/ordercloud/src/api/endpoints/customer/address/update-item.ts new file mode 100644 index 0000000..4c4b4b9 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/address/update-item.ts @@ -0,0 +1,9 @@ +import type { CustomerAddressEndpoint } from '.' + +const updateItem: CustomerAddressEndpoint['handlers']['updateItem'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default updateItem diff --git a/packages/ordercloud/src/api/endpoints/customer/card/add-item.ts b/packages/ordercloud/src/api/endpoints/customer/card/add-item.ts new file mode 100644 index 0000000..ad7dead --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/card/add-item.ts @@ -0,0 +1,74 @@ +import type { CustomerCardEndpoint } from '.' +import type { OredercloudCreditCard } from '../../../../types/customer/card' + +import Stripe from 'stripe' + +const stripe = new Stripe(process.env.STRIPE_SECRET as string, { + apiVersion: '2020-08-27', +}) + +const addItem: CustomerCardEndpoint['handlers']['addItem'] = async ({ + res, + body: { item, cartId }, + config: { restBuyerFetch, restMiddlewareFetch }, +}) => { + // Return an error if no item is present + if (!item) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Missing item' }], + }) + } + + // Return an error if no item is present + if (!cartId) { + return res.status(400).json({ + data: null, + errors: [{ message: 'Cookie not found' }], + }) + } + + // Get token + const token = await stripe.tokens + .create({ + card: { + number: item.cardNumber, + exp_month: item.cardExpireDate.split('/')[0], + exp_year: item.cardExpireDate.split('/')[1], + cvc: item.cardCvc, + }, + }) + .then((res: { id: string }) => res.id) + + // Register credit card + const creditCard = await restBuyerFetch('POST', `/me/creditcards`, { + Token: token, + CardType: 'credit', + PartialAccountNumber: item.cardNumber.slice(-4), + CardholderName: item.cardHolder, + ExpirationDate: item.cardExpireDate, + }).then((response: OredercloudCreditCard) => response.ID) + + // Assign payment to order + const payment = await restBuyerFetch( + 'POST', + `/orders/All/${cartId}/payments`, + { + Type: 'CreditCard', + CreditCardID: creditCard, + } + ).then((response: { ID: string }) => response.ID) + + // Accept payment to order + await restMiddlewareFetch( + 'PATCH', + `/orders/All/${cartId}/payments/${payment}`, + { + Accepted: true, + } + ) + + return res.status(200).json({ data: null, errors: [] }) +} + +export default addItem diff --git a/packages/ordercloud/src/api/endpoints/customer/card/get-cards.ts b/packages/ordercloud/src/api/endpoints/customer/card/get-cards.ts new file mode 100644 index 0000000..e775208 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/card/get-cards.ts @@ -0,0 +1,9 @@ +import type { CustomerCardEndpoint } from '.' + +const getCards: CustomerCardEndpoint['handlers']['getCards'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default getCards diff --git a/packages/ordercloud/src/api/endpoints/customer/card/index.ts b/packages/ordercloud/src/api/endpoints/customer/card/index.ts new file mode 100644 index 0000000..7116e3c --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/card/index.ts @@ -0,0 +1,27 @@ +import type { CustomerCardSchema } from '../../../../types/customer/card' +import type { OrdercloudAPI } from '../../..' + +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import customerCardEndpoint from '@vercel/commerce/api/endpoints/customer/card' + +import getCards from './get-cards' +import addItem from './add-item' +import updateItem from './update-item' +import removeItem from './remove-item' + +export type CustomerCardAPI = GetAPISchema +export type CustomerCardEndpoint = CustomerCardAPI['endpoint'] + +export const handlers: CustomerCardEndpoint['handlers'] = { + getCards, + addItem, + updateItem, + removeItem, +} + +const customerCardApi = createEndpoint({ + handler: customerCardEndpoint, + handlers, +}) + +export default customerCardApi diff --git a/packages/ordercloud/src/api/endpoints/customer/card/remove-item.ts b/packages/ordercloud/src/api/endpoints/customer/card/remove-item.ts new file mode 100644 index 0000000..1a81d1c --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/card/remove-item.ts @@ -0,0 +1,9 @@ +import type { CustomerCardEndpoint } from '.' + +const removeItem: CustomerCardEndpoint['handlers']['removeItem'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default removeItem diff --git a/packages/ordercloud/src/api/endpoints/customer/card/update-item.ts b/packages/ordercloud/src/api/endpoints/customer/card/update-item.ts new file mode 100644 index 0000000..9770644 --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/card/update-item.ts @@ -0,0 +1,9 @@ +import type { CustomerCardEndpoint } from '.' + +const updateItem: CustomerCardEndpoint['handlers']['updateItem'] = async ({ + res, +}) => { + return res.status(200).json({ data: null, errors: [] }) +} + +export default updateItem diff --git a/packages/ordercloud/src/api/endpoints/customer/index.ts b/packages/ordercloud/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/login/index.ts b/packages/ordercloud/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/login/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/logout/index.ts b/packages/ordercloud/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/signup/index.ts b/packages/ordercloud/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/endpoints/wishlist/index.tsx b/packages/ordercloud/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/ordercloud/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/ordercloud/src/api/index.ts b/packages/ordercloud/src/api/index.ts new file mode 100644 index 0000000..d1a809e --- /dev/null +++ b/packages/ordercloud/src/api/index.ts @@ -0,0 +1,71 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' +import { createBuyerFetcher, createMiddlewareFetcher } from './utils/fetch-rest' +import createGraphqlFetcher from './utils/fetch-graphql' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +import { + API_URL, + API_VERSION, + CART_COOKIE, + CUSTOMER_COOKIE, + TOKEN_COOKIE, +} from '../constants' + +export interface OrdercloudConfig extends CommerceAPIConfig { + restBuyerFetch: ( + method: string, + resource: string, + body?: Record, + fetchOptions?: Record + ) => Promise + restMiddlewareFetch: ( + method: string, + resource: string, + body?: Record, + fetchOptions?: Record + ) => Promise + apiVersion: string + tokenCookie: string +} + +const config: OrdercloudConfig = { + commerceUrl: API_URL, + apiToken: '', + apiVersion: API_VERSION, + cartCookie: CART_COOKIE, + customerCookie: CUSTOMER_COOKIE, + tokenCookie: TOKEN_COOKIE, + cartCookieMaxAge: 2592000, + restBuyerFetch: createBuyerFetcher(() => getCommerceApi().getConfig()), + restMiddlewareFetch: createMiddlewareFetcher(() => + getCommerceApi().getConfig() + ), + fetch: createGraphqlFetcher(() => getCommerceApi().getConfig()), +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider +export type OrdercloudAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): OrdercloudAPI

{ + return commerceApi(customProvider as any) +} diff --git a/packages/ordercloud/src/api/operations/get-all-pages.ts b/packages/ordercloud/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..2720e52 --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-all-pages.ts @@ -0,0 +1,22 @@ +import type { OrdercloudConfig } from '../' + +import { GetAllPagesOperation } from '@vercel/commerce/types/page' + +export type Page = { url: string } +export type GetAllPagesResult = { pages: Page[] } + +export default function getAllPagesOperation() { + async function getAllPages({ + config, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + return Promise.resolve({ + pages: [], + }) + } + return getAllPages +} diff --git a/packages/ordercloud/src/api/operations/get-all-product-paths.ts b/packages/ordercloud/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..8a79bee --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,34 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { GetAllProductPathsOperation } from '@vercel/commerce/types/product' + +import type { RawProduct } from '../../types/product' +import type { OrdercloudConfig, Provider } from '../' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths({ + config, + }: { + config?: Partial + } = {}): Promise { + // Get fetch from the config + const { restBuyerFetch } = commerce.getConfig(config) + + // Get all products + const rawProducts: RawProduct[] = await restBuyerFetch<{ + Items: RawProduct[] + }>('GET', '/me/products').then((response) => response.Items) + + return { + // Match a path for every product retrieved + products: rawProducts.map((product) => ({ path: `/${product.ID}` })), + } + } + + return getAllProductPaths +} diff --git a/packages/ordercloud/src/api/operations/get-all-products.ts b/packages/ordercloud/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..5b4861f --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-all-products.ts @@ -0,0 +1,35 @@ +import type { GetAllProductsOperation } from '@vercel/commerce/types/product' +import type { OperationContext } from '@vercel/commerce/api/operations' + +import type { RawProduct } from '../../types/product' +import type { OrdercloudConfig, Provider } from '../index' + +import { normalize as normalizeProduct } from '../../utils/product' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts({ + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + // Get fetch from the config + const { restBuyerFetch } = commerce.getConfig(config) + + // Get all products + const rawProducts: RawProduct[] = await restBuyerFetch<{ + Items: RawProduct[] + }>('GET', '/me/products').then((response) => response.Items) + + return { + // Normalize products to commerce schema + products: rawProducts.map(normalizeProduct), + } + } + + return getAllProducts +} diff --git a/packages/ordercloud/src/api/operations/get-page.ts b/packages/ordercloud/src/api/operations/get-page.ts new file mode 100644 index 0000000..e403d16 --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-page.ts @@ -0,0 +1,15 @@ +import { GetPageOperation } from '@vercel/commerce/types/page' + +export type Page = any +export type GetPageResult = { page?: Page } + +export type PageVariables = { + id: number +} + +export default function getPageOperation() { + async function getPage(): Promise { + return Promise.resolve({}) + } + return getPage +} diff --git a/packages/ordercloud/src/api/operations/get-product.ts b/packages/ordercloud/src/api/operations/get-product.ts new file mode 100644 index 0000000..b63b86c --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-product.ts @@ -0,0 +1,60 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { GetProductOperation } from '@vercel/commerce/types/product' + +import type { RawProduct, RawSpec, RawVariant } from '../../types/product' +import type { OrdercloudConfig, Provider } from '../index' + +import { normalize as normalizeProduct } from '../../utils/product' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + config, + variables, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + // Get fetch from the config + const { restBuyerFetch } = commerce.getConfig(config) + + // Get a single product + const productPromise = restBuyerFetch( + 'GET', + `/me/products/${variables?.slug}` + ) + + // Get product specs + const specsPromise = restBuyerFetch<{ Items: RawSpec[] }>( + 'GET', + `/me/products/${variables?.slug}/specs` + ).then((res) => res.Items) + + // Get product variants + const variantsPromise = restBuyerFetch<{ Items: RawVariant[] }>( + 'GET', + `/me/products/${variables?.slug}/variants` + ).then((res) => res.Items) + + // Execute all promises in parallel + const [product, specs, variants] = await Promise.all([ + productPromise, + specsPromise, + variantsPromise, + ]) + + // Hydrate product + product.xp.Specs = specs + product.xp.Variants = variants + + return { + // Normalize product to commerce schema + product: normalizeProduct(product), + } + } + + return getProduct +} diff --git a/packages/ordercloud/src/api/operations/get-site-info.ts b/packages/ordercloud/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..ec0ed5d --- /dev/null +++ b/packages/ordercloud/src/api/operations/get-site-info.ts @@ -0,0 +1,46 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Category, GetSiteInfoOperation } from '@vercel/commerce/types/site' + +import type { RawCategory } from '../../types/category' +import type { OrdercloudConfig, Provider } from '../index' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo({ + config, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + // Get fetch from the config + const { restBuyerFetch } = commerce.getConfig(config) + + // Get list of categories + const rawCategories: RawCategory[] = await restBuyerFetch<{ + Items: RawCategory[] + }>('GET', `/me/categories`).then((response) => response.Items) + + return { + // Normalize categories + categories: rawCategories.map((category) => ({ + id: category.ID, + name: category.Name, + slug: category.ID, + path: `/${category.ID}`, + })), + brands: [], + } + } + + return getSiteInfo +} diff --git a/packages/ordercloud/src/api/operations/index.ts b/packages/ordercloud/src/api/operations/index.ts new file mode 100644 index 0000000..84b04a9 --- /dev/null +++ b/packages/ordercloud/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getAllPages } from './get-all-pages' +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/ordercloud/src/api/utils/cart.ts b/packages/ordercloud/src/api/utils/cart.ts new file mode 100644 index 0000000..716f352 --- /dev/null +++ b/packages/ordercloud/src/api/utils/cart.ts @@ -0,0 +1,41 @@ +import type { Cart, OrdercloudCart, OrdercloudLineItem } from '../../types/cart' + +export function formatCart( + cart: OrdercloudCart, + lineItems: OrdercloudLineItem[] +): Cart { + return { + id: cart.ID, + customerId: cart.FromUserID, + email: cart.FromUser.Email, + createdAt: cart.DateCreated, + currency: { + code: cart.FromUser?.xp?.currency ?? 'USD', + }, + taxesIncluded: cart.TaxCost === 0, + lineItems: lineItems.map((lineItem) => ({ + id: lineItem.ID, + variantId: lineItem.Variant ? String(lineItem.Variant.ID) : '', + productId: lineItem.ProductID, + name: lineItem.Product.Name, + quantity: lineItem.Quantity, + discounts: [], + path: lineItem.ProductID, + variant: { + id: lineItem.Variant ? String(lineItem.Variant.ID) : '', + sku: lineItem.ID, + name: lineItem.Product.Name, + image: { + url: lineItem.Product.xp?.Images?.[0]?.url, + }, + requiresShipping: Boolean(lineItem.ShippingAddress), + price: lineItem.UnitPrice, + listPrice: lineItem.UnitPrice, + }, + })), + lineItemsSubtotalPrice: cart.Subtotal, + subtotalPrice: cart.Subtotal, + totalPrice: cart.Total, + discounts: [], + } +} diff --git a/packages/ordercloud/src/api/utils/fetch-graphql.ts b/packages/ordercloud/src/api/utils/fetch-graphql.ts new file mode 100644 index 0000000..3c1058d --- /dev/null +++ b/packages/ordercloud/src/api/utils/fetch-graphql.ts @@ -0,0 +1,14 @@ +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { OrdercloudConfig } from '../' + +import { FetcherError } from '@vercel/commerce/utils/errors' + +const fetchGraphqlApi: (getConfig: () => OrdercloudConfig) => GraphQLFetcher = + () => async () => { + throw new FetcherError({ + errors: [{ message: 'GraphQL fetch is not implemented' }], + status: 500, + }) + } + +export default fetchGraphqlApi diff --git a/packages/ordercloud/src/api/utils/fetch-rest.ts b/packages/ordercloud/src/api/utils/fetch-rest.ts new file mode 100644 index 0000000..5b70b9d --- /dev/null +++ b/packages/ordercloud/src/api/utils/fetch-rest.ts @@ -0,0 +1,180 @@ +import vercelFetch from '@vercel/fetch' +import { FetcherError } from '@vercel/commerce/utils/errors' +import { CustomNodeJsGlobal } from '../../types/node'; + +import { OrdercloudConfig } from '../index' + +// Get an instance to vercel fetch +const fetch = vercelFetch() + +// Get token util +async function getToken({ + baseUrl, + clientId, + clientSecret, +}: { + baseUrl: string + clientId: string + clientSecret?: string +}): Promise { + // If not, get a new one and store it + const authResponse = await fetch(`${baseUrl}/oauth/token`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Accept: 'application/json', + }, + body: `client_id=${clientId}&client_secret=${clientSecret}&grant_type=client_credentials`, + }) + + // If something failed getting the auth response + if (!authResponse.ok) { + // Get the body of it + const error = await authResponse.json() + + // And return an error + throw new FetcherError({ + errors: [{ message: error.error_description.Code }], + status: error.error_description.HttpStatus, + }) + } + + // Return the token + return authResponse + .json() + .then((response: { access_token: string }) => response.access_token) +} + +export async function fetchData(opts: { + token: string + path: string + method: string + config: OrdercloudConfig + fetchOptions?: Record + body?: Record +}): Promise { + // Destructure opts + const { path, body, fetchOptions, config, token, method = 'GET' } = opts + + // Do the request with the correct headers + const dataResponse = await fetch( + `${config.commerceUrl}/${config.apiVersion}${path}`, + { + ...fetchOptions, + method, + headers: { + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + accept: 'application/json, text/plain, */*', + authorization: `Bearer ${token}`, + }, + body: body ? JSON.stringify(body) : undefined, + } + ) + + // If something failed getting the data response + if (!dataResponse.ok) { + // Get the body of it + const error = await dataResponse.textConverted() + + // And return an error + throw new FetcherError({ + errors: [{ message: error || dataResponse.statusText }], + status: dataResponse.status, + }) + } + + try { + // Return data response as json + return (await dataResponse.json()) as Promise + } catch (error) { + // If response is empty return it as text + return null as unknown as Promise + } +} + +export const createMiddlewareFetcher: ( + getConfig: () => OrdercloudConfig +) => ( + method: string, + path: string, + body?: Record, + fetchOptions?: Record +) => Promise = + (getConfig) => + async ( + method: string, + path: string, + body?: Record, + fetchOptions?: Record + ) => { + // Get provider config + const config = getConfig() + + // Get a token + const token = await getToken({ + baseUrl: config.commerceUrl, + clientId: process.env.ORDERCLOUD_MIDDLEWARE_CLIENT_ID as string, + clientSecret: process.env.ORDERCLOUD_MIDDLEWARE_CLIENT_SECRET, + }) + + // Return the data and specify the expected type + return fetchData({ + token, + fetchOptions, + method, + config, + path, + body, + }) + } + +export const createBuyerFetcher: ( + getConfig: () => OrdercloudConfig +) => ( + method: string, + path: string, + body?: Record, + fetchOptions?: Record +) => Promise = + (getConfig) => + async ( + method: string, + path: string, + body?: Record, + fetchOptions?: Record + ) => { + const customGlobal = global as unknown as CustomNodeJsGlobal; + + // Get provider config + const config = getConfig() + + + // If a token was passed, set it on global + if (fetchOptions?.token) { + customGlobal.token = fetchOptions.token + } + + // Get a token + if (!customGlobal.token) { + customGlobal.token = await getToken({ + baseUrl: config.commerceUrl, + clientId: process.env.ORDERCLOUD_BUYER_CLIENT_ID as string, + }) + } + + // Return the data and specify the expected type + const data = await fetchData({ + token: customGlobal.token as string, + fetchOptions, + config, + method, + path, + body, + }) + + return { + ...data, + meta: { token: customGlobal.token as string }, + } + } diff --git a/packages/ordercloud/src/auth/index.ts b/packages/ordercloud/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/ordercloud/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/ordercloud/src/auth/use-login.tsx b/packages/ordercloud/src/auth/use-login.tsx new file mode 100644 index 0000000..20e3ed2 --- /dev/null +++ b/packages/ordercloud/src/auth/use-login.tsx @@ -0,0 +1,16 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: () => () => { + return async function () {} + }, +} diff --git a/packages/ordercloud/src/auth/use-logout.tsx b/packages/ordercloud/src/auth/use-logout.tsx new file mode 100644 index 0000000..4e74908 --- /dev/null +++ b/packages/ordercloud/src/auth/use-logout.tsx @@ -0,0 +1,17 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + async () => {}, +} diff --git a/packages/ordercloud/src/auth/use-signup.tsx b/packages/ordercloud/src/auth/use-signup.tsx new file mode 100644 index 0000000..e488114 --- /dev/null +++ b/packages/ordercloud/src/auth/use-signup.tsx @@ -0,0 +1,19 @@ +import { useCallback } from 'react' +import useCustomer from '../customer/use-customer' +import { MutationHook } from '@vercel/commerce/utils/types' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + () => {}, +} diff --git a/packages/ordercloud/src/cart/index.ts b/packages/ordercloud/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/ordercloud/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/ordercloud/src/cart/use-add-item.tsx b/packages/ordercloud/src/cart/use-add-item.tsx new file mode 100644 index 0000000..c9d3153 --- /dev/null +++ b/packages/ordercloud/src/cart/use-add-item.tsx @@ -0,0 +1,48 @@ +import type { AddItemHook } from '@vercel/commerce/types/cart' +import type { MutationHook } from '@vercel/commerce/utils/types' + +import { useCallback } from 'react' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import useCart from './use-cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/cart', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: ({ fetch }) => + function useHook() { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + + await mutate(data, false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/cart/use-cart.tsx b/packages/ordercloud/src/cart/use-cart.tsx new file mode 100644 index 0000000..01c3a1c --- /dev/null +++ b/packages/ordercloud/src/cart/use-cart.tsx @@ -0,0 +1,33 @@ +import type { GetCartHook } from '@vercel/commerce/types/cart' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/cart', + method: 'GET', + }, + useHook: ({ useData }) => + function useHook(input) { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems?.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/ordercloud/src/cart/use-remove-item.tsx b/packages/ordercloud/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..fba15f8 --- /dev/null +++ b/packages/ordercloud/src/cart/use-remove-item.tsx @@ -0,0 +1,60 @@ +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import type { Cart, LineItem, RemoveItemHook } from '@vercel/commerce/types/cart' + +import { useCallback } from 'react' + +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' + +import useCart from './use-cart' + +export type RemoveItemFn = T extends LineItem + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends LineItem + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + url: '/api/cart', + method: 'DELETE', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ ...options, body: { itemId } }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook( + ctx: { item?: T } = {} + ) { + const { item } = ctx + const { mutate } = useCart() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + + await mutate(data, false) + + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/ordercloud/src/cart/use-update-item.tsx b/packages/ordercloud/src/cart/use-update-item.tsx new file mode 100644 index 0000000..7a5f6fc --- /dev/null +++ b/packages/ordercloud/src/cart/use-update-item.tsx @@ -0,0 +1,93 @@ +import type { + HookFetcherContext, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import type { UpdateItemHook, LineItem } from '@vercel/commerce/types/cart' + +import { useCallback } from 'react' +import debounce from 'lodash.debounce' + +import { MutationHook } from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' + +import { handler as removeItemHandler } from './use-remove-item' +import useCart from './use-cart' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/cart', + method: 'PUT', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + + return await fetch({ + ...options, + body: { itemId, item }, + }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook( + ctx: { + item?: T + wait?: number + } = {} + ) { + const { item } = ctx + const { mutate } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + + if (!itemId || !productId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + itemId, + item: { + productId, + variantId: variantId || '', + quantity: input.quantity, + }, + }, + }) + + await mutate(data, false) + + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/checkout/index.ts b/packages/ordercloud/src/checkout/index.ts new file mode 100644 index 0000000..3066210 --- /dev/null +++ b/packages/ordercloud/src/checkout/index.ts @@ -0,0 +1,2 @@ +export { default as useSubmitCheckout } from './use-submit-checkout' +export { default as useCheckout } from './use-checkout' diff --git a/packages/ordercloud/src/checkout/use-checkout.tsx b/packages/ordercloud/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..f60ebfd --- /dev/null +++ b/packages/ordercloud/src/checkout/use-checkout.tsx @@ -0,0 +1,41 @@ +import type { GetCheckoutHook } from '@vercel/commerce/types/checkout' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { UseCheckout } from '@vercel/commerce/checkout/use-checkout' +import useSubmitCheckout from './use-submit-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/checkout', + method: 'GET', + }, + useHook: ({ useData }) => + function useHook(input) { + const submit = useSubmitCheckout() + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems?.length ?? 0) <= 0 + }, + enumerable: true, + }, + submit: { + get() { + return submit + }, + enumerable: true, + }, + }), + [response, submit] + ) + }, +} diff --git a/packages/ordercloud/src/checkout/use-submit-checkout.tsx b/packages/ordercloud/src/checkout/use-submit-checkout.tsx new file mode 100644 index 0000000..79c4384 --- /dev/null +++ b/packages/ordercloud/src/checkout/use-submit-checkout.tsx @@ -0,0 +1,38 @@ +import type { SubmitCheckoutHook } from '@vercel/commerce/types/checkout' +import type { MutationHook } from '@vercel/commerce/utils/types' + +import { useCallback } from 'react' +import useSubmitCheckout, { + UseSubmitCheckout, +} from '@vercel/commerce/checkout/use-submit-checkout' + +export default useSubmitCheckout as UseSubmitCheckout + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/checkout', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + // @TODO: Make form validations in here, import generic error like import { CommerceError } from '@vercel/commerce/utils/errors' + // Get payment and delivery information in here + + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: ({ fetch }) => + function useHook() { + return useCallback( + async function onSubmitCheckout(input) { + const data = await fetch({ input }) + + return data + }, + [fetch] + ) + }, +} diff --git a/packages/ordercloud/src/commerce.config.json b/packages/ordercloud/src/commerce.config.json new file mode 100644 index 0000000..e329bd4 --- /dev/null +++ b/packages/ordercloud/src/commerce.config.json @@ -0,0 +1,10 @@ +{ + "provider": "ordercloud", + "features": { + "wishlist": false, + "cart": true, + "search": true, + "customerAuth": false, + "customCheckout": true + } +} diff --git a/packages/ordercloud/src/constants.ts b/packages/ordercloud/src/constants.ts new file mode 100644 index 0000000..d89b13f --- /dev/null +++ b/packages/ordercloud/src/constants.ts @@ -0,0 +1,6 @@ +export const CART_COOKIE = 'ordercloud.cart' +export const TOKEN_COOKIE = 'ordercloud.token' +export const CUSTOMER_COOKIE = 'ordercloud.customer' +export const API_URL = 'https://sandboxapi.ordercloud.io' +export const API_VERSION = 'v1' +export const LOCALE = 'en-us' diff --git a/packages/ordercloud/src/customer/address/index.ts b/packages/ordercloud/src/customer/address/index.ts new file mode 100644 index 0000000..02c73e5 --- /dev/null +++ b/packages/ordercloud/src/customer/address/index.ts @@ -0,0 +1,4 @@ +export { default as useAddresses } from './use-addresses' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/ordercloud/src/customer/address/use-add-item.tsx b/packages/ordercloud/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..798f5fe --- /dev/null +++ b/packages/ordercloud/src/customer/address/use-add-item.tsx @@ -0,0 +1,38 @@ +import type { AddItemHook } from '@vercel/commerce/types/customer/address' +import type { MutationHook } from '@vercel/commerce/utils/types' + +import { useCallback } from 'react' +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import useAddresses from './use-addresses' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/customer/address', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: ({ fetch }) => + function useHook() { + const { mutate } = useAddresses() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + + await mutate([data], false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/customer/address/use-addresses.tsx b/packages/ordercloud/src/customer/address/use-addresses.tsx new file mode 100644 index 0000000..fd6807a --- /dev/null +++ b/packages/ordercloud/src/customer/address/use-addresses.tsx @@ -0,0 +1,35 @@ +import type { GetAddressesHook } from '@vercel/commerce/types/customer/address' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useAddresses, { + UseAddresses, +} from '@vercel/commerce/customer/address/use-addresses' + +export default useAddresses as UseAddresses + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/customer/address', + method: 'GET', + }, + useHook: ({ useData }) => + function useHook(input) { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/ordercloud/src/customer/address/use-remove-item.tsx b/packages/ordercloud/src/customer/address/use-remove-item.tsx new file mode 100644 index 0000000..ac805db --- /dev/null +++ b/packages/ordercloud/src/customer/address/use-remove-item.tsx @@ -0,0 +1,62 @@ +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import type { Address, RemoveItemHook } from '@vercel/commerce/types/customer/address' + +import { useCallback } from 'react' + +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/customer/address/use-remove-item' + +import useAddresses from './use-addresses' + +export type RemoveItemFn = T extends Address + ? (input?: RemoveItemActionInput) => Promise

+ : (input: RemoveItemActionInput) => Promise
+ +export type RemoveItemActionInput = T extends Address + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + url: '/api/customer/address', + method: 'DELETE', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ ...options, body: { itemId } }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook( + ctx: { item?: T } = {} + ) { + const { item } = ctx + const { mutate } = useAddresses() + const removeItem: RemoveItemFn
= async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + + await mutate([], false) + + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/ordercloud/src/customer/address/use-update-item.tsx b/packages/ordercloud/src/customer/address/use-update-item.tsx new file mode 100644 index 0000000..d65956b --- /dev/null +++ b/packages/ordercloud/src/customer/address/use-update-item.tsx @@ -0,0 +1,52 @@ +import type { + HookFetcherContext, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import type { UpdateItemHook, Address } from '@vercel/commerce/types/customer/address' + +import { useCallback } from 'react' + +import { MutationHook } from '@vercel/commerce/utils/types' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/customer/address/use-update-item' + +import useAddresses from './use-addresses' + +export type UpdateItemActionInput = T extends Address + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/customer/address', + method: 'PUT', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ + ...options, + body: { itemId, item }, + }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook() { + const { mutate } = useAddresses() + + return useCallback( + async function updateItem(input) { + const data = await fetch({ input }) + + await mutate([], false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/customer/card/index.ts b/packages/ordercloud/src/customer/card/index.ts new file mode 100644 index 0000000..357d305 --- /dev/null +++ b/packages/ordercloud/src/customer/card/index.ts @@ -0,0 +1,4 @@ +export { default as useCards } from './use-cards' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/ordercloud/src/customer/card/use-add-item.tsx b/packages/ordercloud/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..8e7d278 --- /dev/null +++ b/packages/ordercloud/src/customer/card/use-add-item.tsx @@ -0,0 +1,38 @@ +import type { AddItemHook } from '@vercel/commerce/types/customer/card' +import type { MutationHook } from '@vercel/commerce/utils/types' + +import { useCallback } from 'react' +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import useCards from './use-cards' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/customer/card', + method: 'POST', + }, + async fetcher({ input: item, options, fetch }) { + const data = await fetch({ + ...options, + body: { item }, + }) + + return data + }, + useHook: ({ fetch }) => + function useHook() { + const { mutate } = useCards() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + + await mutate([data], false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/customer/card/use-cards.tsx b/packages/ordercloud/src/customer/card/use-cards.tsx new file mode 100644 index 0000000..6438543 --- /dev/null +++ b/packages/ordercloud/src/customer/card/use-cards.tsx @@ -0,0 +1,33 @@ +import type { GetCardsHook } from '@vercel/commerce/types/customer/card' + +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCard, { UseCards } from '@vercel/commerce/customer/card/use-cards' + +export default useCard as UseCards + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/customer/card', + method: 'GET', + }, + useHook: ({ useData }) => + function useHook(input) { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/ordercloud/src/customer/card/use-remove-item.tsx b/packages/ordercloud/src/customer/card/use-remove-item.tsx new file mode 100644 index 0000000..23979bf --- /dev/null +++ b/packages/ordercloud/src/customer/card/use-remove-item.tsx @@ -0,0 +1,62 @@ +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import type { Card, RemoveItemHook } from '@vercel/commerce/types/customer/card' + +import { useCallback } from 'react' + +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/customer/card/use-remove-item' + +import useCards from './use-cards' + +export type RemoveItemFn = T extends Card + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends Card + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + url: '/api/customer/card', + method: 'DELETE', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ ...options, body: { itemId } }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook( + ctx: { item?: T } = {} + ) { + const { item } = ctx + const { mutate } = useCards() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + + await mutate([], false) + + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/ordercloud/src/customer/card/use-update-item.tsx b/packages/ordercloud/src/customer/card/use-update-item.tsx new file mode 100644 index 0000000..faa9007 --- /dev/null +++ b/packages/ordercloud/src/customer/card/use-update-item.tsx @@ -0,0 +1,52 @@ +import type { + HookFetcherContext, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import type { UpdateItemHook, Card } from '@vercel/commerce/types/customer/card' + +import { useCallback } from 'react' + +import { MutationHook } from '@vercel/commerce/utils/types' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/customer/card/use-update-item' + +import useCards from './use-cards' + +export type UpdateItemActionInput = T extends Card + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + fetchOptions: { + url: '/api/customer/card', + method: 'PUT', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + return await fetch({ + ...options, + body: { itemId, item }, + }) + }, + useHook: ({ fetch }: MutationHookContext) => + function useHook() { + const { mutate } = useCards() + + return useCallback( + async function updateItem(input) { + const data = await fetch({ input }) + + await mutate([], false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/ordercloud/src/customer/index.ts b/packages/ordercloud/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/ordercloud/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/ordercloud/src/customer/use-customer.tsx b/packages/ordercloud/src/customer/use-customer.tsx new file mode 100644 index 0000000..6eaede1 --- /dev/null +++ b/packages/ordercloud/src/customer/use-customer.tsx @@ -0,0 +1,15 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' + +export default useCustomer as UseCustomer +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: () => () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/ordercloud/src/fetcher.ts b/packages/ordercloud/src/fetcher.ts new file mode 100644 index 0000000..1da3571 --- /dev/null +++ b/packages/ordercloud/src/fetcher.ts @@ -0,0 +1,17 @@ +import { Fetcher } from '@vercel/commerce/utils/types' + +const clientFetcher: Fetcher = async ({ method, url, body }) => { + const response = await fetch(url!, { + method, + body: body ? JSON.stringify(body) : undefined, + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => response.json()) + .then((response) => response.data) + + return response +} + +export default clientFetcher diff --git a/packages/ordercloud/src/index.tsx b/packages/ordercloud/src/index.tsx new file mode 100644 index 0000000..b282942 --- /dev/null +++ b/packages/ordercloud/src/index.tsx @@ -0,0 +1,9 @@ +import { ordercloudProvider, OrdercloudProvider } from './provider' +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' + +export { ordercloudProvider } +export type { OrdercloudProvider } + +export const CommerceProvider = getCommerceProvider(ordercloudProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/ordercloud/src/next.config.cjs b/packages/ordercloud/src/next.config.cjs new file mode 100644 index 0000000..793a458 --- /dev/null +++ b/packages/ordercloud/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['localhost', 'ocdevops.blob.core.windows.net'], + }, +} diff --git a/packages/ordercloud/src/product/index.ts b/packages/ordercloud/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/ordercloud/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/ordercloud/src/product/use-price.tsx b/packages/ordercloud/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/ordercloud/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/ordercloud/src/product/use-search.tsx b/packages/ordercloud/src/product/use-search.tsx new file mode 100644 index 0000000..0cb54e9 --- /dev/null +++ b/packages/ordercloud/src/product/use-search.tsx @@ -0,0 +1,41 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import { SearchProductsHook } from '@vercel/commerce/types/product' +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/catalog/products', + method: 'GET', + }, + fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (search) url.searchParams.set('search', String(search)) + if (categoryId) url.searchParams.set('categoryId', String(categoryId)) + if (brandId) url.searchParams.set('brandId', String(brandId)) + if (sort) url.searchParams.set('sort', String(sort)) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/ordercloud/src/provider.ts b/packages/ordercloud/src/provider.ts new file mode 100644 index 0000000..7ae3f1d --- /dev/null +++ b/packages/ordercloud/src/provider.ts @@ -0,0 +1,62 @@ +import { handler as useCart } from './cart/use-cart' +import { handler as useAddCartItem } from './cart/use-add-item' +import { handler as useUpdateCartItem } from './cart/use-update-item' +import { handler as useRemoveCartItem } from './cart/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import { handler as useCheckout } from './checkout/use-checkout' +import { handler as useSubmitCheckout } from './checkout/use-submit-checkout' + +import { handler as useCards } from './customer/card/use-cards' +import { handler as useAddCardItem } from './customer/card/use-add-item' +import { handler as useUpdateCardItem } from './customer/card/use-update-item' +import { handler as useRemoveCardItem } from './customer/card/use-remove-item' + +import { handler as useAddresses } from './customer/address/use-addresses' +import { handler as useAddAddressItem } from './customer/address/use-add-item' +import { handler as useUpdateAddressItem } from './customer/address/use-update-item' +import { handler as useRemoveAddressItem } from './customer/address/use-remove-item' + +import { CART_COOKIE, LOCALE } from './constants' +import { default as fetcher } from './fetcher' + +export const ordercloudProvider = { + locale: LOCALE, + cartCookie: CART_COOKIE, + fetcher, + cart: { + useCart, + useAddItem: useAddCartItem, + useUpdateItem: useUpdateCartItem, + useRemoveItem: useRemoveCartItem, + }, + checkout: { + useCheckout, + useSubmitCheckout, + }, + customer: { + useCustomer, + card: { + useCards, + useAddItem: useAddCardItem, + useUpdateItem: useUpdateCardItem, + useRemoveItem: useRemoveCardItem, + }, + address: { + useAddresses, + useAddItem: useAddAddressItem, + useUpdateItem: useUpdateAddressItem, + useRemoveItem: useRemoveAddressItem, + }, + }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type OrdercloudProvider = typeof ordercloudProvider diff --git a/packages/ordercloud/src/types/cart.ts b/packages/ordercloud/src/types/cart.ts new file mode 100644 index 0000000..389a5a6 --- /dev/null +++ b/packages/ordercloud/src/types/cart.ts @@ -0,0 +1,126 @@ +import * as Core from '@vercel/commerce/types/cart' + +export * from '@vercel/commerce/types/cart' + +export interface OrdercloudCart { + ID: string + FromUser: { + ID: string + Username: string + Password: null + FirstName: string + LastName: string + Email: string + Phone: null + TermsAccepted: null + Active: true + xp: { + something: string + currency: string + } + AvailableRoles: null + DateCreated: string + PasswordLastSetDate: null + } + FromCompanyID: string + ToCompanyID: string + FromUserID: string + BillingAddressID: null + BillingAddress: null + ShippingAddressID: null + Comments: null + LineItemCount: number + Status: string + DateCreated: string + DateSubmitted: null + DateApproved: null + DateDeclined: null + DateCanceled: null + DateCompleted: null + LastUpdated: string + Subtotal: number + ShippingCost: number + TaxCost: number + PromotionDiscount: number + Total: number + IsSubmitted: false + xp: { + productId: string + variantId: string + quantity: 1 + } +} + +export interface OrdercloudLineItem { + ID: string + ProductID: string + Quantity: 1 + DateAdded: string + QuantityShipped: number + UnitPrice: number + PromotionDiscount: number + LineTotal: number + LineSubtotal: number + CostCenter: null + DateNeeded: null + ShippingAccount: null + ShippingAddressID: null + ShipFromAddressID: null + Product: { + ID: string + Name: string + Description: string + QuantityMultiplier: number + ShipWeight: number + ShipHeight: null + ShipWidth: null + ShipLength: null + xp: { + Images: { + url: string + }[] + } + } + Variant: null | { + ID: string + Name: null + Description: null + ShipWeight: null + ShipHeight: null + ShipWidth: null + ShipLength: null + xp: null + } + ShippingAddress: null + ShipFromAddress: null + SupplierID: null + Specs: [] + xp: null +} + +/** + * Extend core cart types + */ + +export type Cart = Core.Cart & { + lineItems: Core.LineItem[] + url?: string +} + +export type CartTypes = Core.CartTypes + +export type CartHooks = Core.CartHooks + +export type GetCartHook = CartHooks['getCart'] +export type AddItemHook = CartHooks['addItem'] +export type UpdateItemHook = CartHooks['updateItem'] +export type RemoveItemHook = CartHooks['removeItem'] + +export type CartSchema = Core.CartSchema + +export type CartHandlers = Core.CartHandlers + +export type GetCartHandler = CartHandlers['getCart'] +export type AddItemHandler = CartHandlers['addItem'] +export type UpdateItemHandler = CartHandlers['updateItem'] +export type RemoveItemHandler = CartHandlers['removeItem'] diff --git a/packages/ordercloud/src/types/category.ts b/packages/ordercloud/src/types/category.ts new file mode 100644 index 0000000..247844a --- /dev/null +++ b/packages/ordercloud/src/types/category.ts @@ -0,0 +1,10 @@ +export interface RawCategory { + ID: string + Name: string + Description: null | string + ListOrder: number + Active: boolean + ParentID: null + ChildCount: number + xp: null +} diff --git a/packages/ordercloud/src/types/checkout.ts b/packages/ordercloud/src/types/checkout.ts new file mode 100644 index 0000000..976d78e --- /dev/null +++ b/packages/ordercloud/src/types/checkout.ts @@ -0,0 +1,4 @@ +import * as Core from '@vercel/commerce/types/checkout' + +export type CheckoutTypes = Core.CheckoutTypes +export type CheckoutSchema = Core.CheckoutSchema diff --git a/packages/ordercloud/src/types/customer/address.ts b/packages/ordercloud/src/types/customer/address.ts new file mode 100644 index 0000000..3576b67 --- /dev/null +++ b/packages/ordercloud/src/types/customer/address.ts @@ -0,0 +1,32 @@ +import * as Core from '@vercel/commerce/types/customer/address' + +export type CustomerAddressTypes = Core.CustomerAddressTypes +export type CustomerAddressSchema = + Core.CustomerAddressSchema + +export interface OrdercloudAddress { + ID: string + FromCompanyID: string + ToCompanyID: string + FromUserID: string + BillingAddressID: null + BillingAddress: null + ShippingAddressID: null + Comments: null + LineItemCount: number + Status: string + DateCreated: string + DateSubmitted: null + DateApproved: null + DateDeclined: null + DateCanceled: null + DateCompleted: null + LastUpdated: string + Subtotal: number + ShippingCost: number + TaxCost: number + PromotionDiscount: number + Total: number + IsSubmitted: false + xp: null +} diff --git a/packages/ordercloud/src/types/customer/card.ts b/packages/ordercloud/src/types/customer/card.ts new file mode 100644 index 0000000..293d504 --- /dev/null +++ b/packages/ordercloud/src/types/customer/card.ts @@ -0,0 +1,16 @@ +import * as Core from '@vercel/commerce/types/customer/card' + +export type CustomerCardTypes = Core.CustomerCardTypes +export type CustomerCardSchema = Core.CustomerCardSchema + +export interface OredercloudCreditCard { + ID: string + Editable: boolean + Token: string + DateCreated: string + CardType: string + PartialAccountNumber: string + CardholderName: string + ExpirationDate: string + xp: null +} diff --git a/packages/ordercloud/src/types/node.d.ts b/packages/ordercloud/src/types/node.d.ts new file mode 100644 index 0000000..ee2452c --- /dev/null +++ b/packages/ordercloud/src/types/node.d.ts @@ -0,0 +1,3 @@ +export interface CustomNodeJsGlobal extends NodeJS.Global { + token: string | null | undefined +} diff --git a/packages/ordercloud/src/types/product.ts b/packages/ordercloud/src/types/product.ts new file mode 100644 index 0000000..8ccb778 --- /dev/null +++ b/packages/ordercloud/src/types/product.ts @@ -0,0 +1,55 @@ +interface RawVariantSpec { + SpecID: string + Name: string + OptionID: string + Value: string + PriceMarkupType: string + PriceMarkup: string | null +} + +export interface RawSpec { + ID: string + Name: string + Options: { + ID: string + Value: string + xp: { + hexColor?: string + } + }[] +} + +export interface RawVariant { + ID: string + Specs: RawVariantSpec[] +} + +export interface RawProduct { + OwnerID: string + DefaultPriceScheduleID: string | null + AutoForward: boolean + ID: string + Name: string + Description: string + QuantityMultiplier: number + ShipWeight: null + ShipHeight: null + ShipWidth: null + ShipLength: null + Active: boolean + SpecCount: number + VariantCount: number + ShipFromAddressID: null + Inventory: null + DefaultSupplierID: null + AllSuppliersCanSell: boolean + xp: { + Price: number + PriceCurrency: string + Images: { + url: string + }[] + Variants?: RawVariant[] + Specs?: RawSpec[] + } +} diff --git a/packages/ordercloud/src/utils/product.ts b/packages/ordercloud/src/utils/product.ts new file mode 100644 index 0000000..6da3bf8 --- /dev/null +++ b/packages/ordercloud/src/utils/product.ts @@ -0,0 +1,47 @@ +import type { Product } from '@vercel/commerce/types/product' + +import type { RawProduct } from '../types/product' + +export function normalize(product: RawProduct): Product { + return { + id: product.ID, + name: product.Name, + description: product.Description, + slug: product.ID, + images: product.xp.Images, + price: { + value: product.xp.Price, + currencyCode: product.xp.PriceCurrency, + }, + variants: product.xp.Variants?.length + ? product.xp.Variants.map((variant) => ({ + id: variant.ID, + options: variant.Specs.map((spec) => ({ + id: spec.SpecID, + __typename: 'MultipleChoiceOption', + displayName: spec.Name, + values: [ + { + label: spec.Value, + }, + ], + })), + })) + : [ + { + id: '', + options: [], + }, + ], + options: product.xp.Specs?.length + ? product.xp.Specs.map((spec) => ({ + id: spec.ID, + displayName: spec.Name, + values: spec.Options.map((option) => ({ + label: option.Value, + ...(option.xp?.hexColor && { hexColors: [option.xp.hexColor] }), + })), + })) + : [], + } +} diff --git a/packages/ordercloud/src/wishlist/use-add-item.tsx b/packages/ordercloud/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/ordercloud/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/ordercloud/src/wishlist/use-remove-item.tsx b/packages/ordercloud/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/ordercloud/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/ordercloud/src/wishlist/use-wishlist.tsx b/packages/ordercloud/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..b2785d4 --- /dev/null +++ b/packages/ordercloud/src/wishlist/use-wishlist.tsx @@ -0,0 +1,43 @@ +import { HookFetcher } from '@vercel/commerce/utils/types' +import type { Product } from '@vercel/commerce/types/product' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/ordercloud/taskfile.js b/packages/ordercloud/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/ordercloud/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/ordercloud/tsconfig.json b/packages/ordercloud/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/ordercloud/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/saleor/.env.template b/packages/saleor/.env.template new file mode 100644 index 0000000..a3ab112 --- /dev/null +++ b/packages/saleor/.env.template @@ -0,0 +1,4 @@ +COMMERCE_PROVIDER=@vercel/commerce-saleor + +NEXT_SALEOR_API_URL= +NEXT_SALEOR_CHANNEL= diff --git a/packages/saleor/.prettierignore b/packages/saleor/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/saleor/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/saleor/.prettierrc b/packages/saleor/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/saleor/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/saleor/README.md b/packages/saleor/README.md new file mode 100644 index 0000000..2776396 --- /dev/null +++ b/packages/saleor/README.md @@ -0,0 +1,22 @@ +## Saleor Provider + +**Demo:** https://saleor.vercel.store/ + +You need a [Saleor](https://saleor.io/) instance, either in the cloud or self-hosted. + +This provider requires Saleor **3.x** or higher. + +Copy the `.env.template` file in this directory to `.env.local` in the main directory (which will be ignored by Git): + +```bash +cp packages/saleor/.env.template .env.local +``` + +Then, set the environment following variables in your `.env.local`. Both, `NEXT_PUBLIC_SALEOR_API_URL` and `COMMERCE_IMAGE_HOST` must point to your own Saleor instance. + +``` +COMMERCE_PROVIDER=saleor +NEXT_PUBLIC_SALEOR_API_URL=https://vercel.saleor.cloud/graphql/ +NEXT_PUBLIC_SALEOR_CHANNEL=default-channel +COMMERCE_IMAGE_HOST=vercel.saleor.cloud +``` diff --git a/packages/saleor/codegen.json b/packages/saleor/codegen.json new file mode 100644 index 0000000..abbbbf1 --- /dev/null +++ b/packages/saleor/codegen.json @@ -0,0 +1,33 @@ +{ + "schema": { + "https://master.staging.saleor.cloud/graphql/": {} + }, + "documents": [ + { + "./src/utils/queries/get-all-products-query.ts": { + "noRequire": true + } + }, + { + "./src/utils/queries/get-all-products-paths-query.ts": { + "noRequire": true + } + }, + { + "./src/utils/queries/get-products.ts": { + "noRequire": true + } + } + ], + "generates": { + "./schema.d.ts": { + "plugins": ["typescript", "typescript-operations"] + }, + "./schema.graphql": { + "plugins": ["schema-ast"] + } + }, + "hooks": { + "afterAllFileWrite": ["prettier --write"] + } +} diff --git a/packages/saleor/package.json b/packages/saleor/package.json new file mode 100644 index 0000000..16fb0a6 --- /dev/null +++ b/packages/saleor/package.json @@ -0,0 +1,87 @@ +{ + "name": "@vercel/commerce-saleor", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write .", + "generate": "graphql-codegen" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist", + "schema.d.ts" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@graphql-codegen/cli": "^2.3.1", + "@graphql-codegen/schema-ast": "^2.4.1", + "@graphql-codegen/typescript": "^2.4.2", + "@graphql-codegen/typescript-operations": "^2.2.2", + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/saleor/schema.d.ts b/packages/saleor/schema.d.ts new file mode 100644 index 0000000..339e726 --- /dev/null +++ b/packages/saleor/schema.d.ts @@ -0,0 +1,11488 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & { [SubKey in K]: Maybe } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** + * The `Date` scalar type represents a Date + * value as specified by + * [iso8601](https://en.wikipedia.org/wiki/ISO_8601). + */ + Date: any + /** + * The `DateTime` scalar type represents a DateTime + * value as specified by + * [iso8601](https://en.wikipedia.org/wiki/ISO_8601). + */ + DateTime: any + /** + * The `GenericScalar` scalar type represents a generic + * GraphQL scalar value that could be: + * String, Boolean, Int, Float, List or Object. + */ + GenericScalar: any + /** + * Allows use of a JSON String for input / output from the GraphQL schema. + * + * Use of this type is *not recommended* as you lose the benefits of having a defined, static + * schema (one of the key benefits of GraphQL). + */ + JSONString: any + /** + * Positive Decimal scalar implementation. + * + * Should be used in places where value must be positive. + */ + PositiveDecimal: any + UUID: any + /** Variables of this type must be set to null in mutations. They will be replaced with a filename from a following multipart part containing a binary file. See: https://github.com/jaydenseric/graphql-multipart-request-spec. */ + Upload: any + WeightScalar: any + /** Anything */ + _Any: any +} + +/** Create a new address for the customer. */ +export type AccountAddressCreate = { + __typename?: 'AccountAddressCreate' + /** A user instance for which the address was created. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +/** Delete an address of the logged-in user. */ +export type AccountAddressDelete = { + __typename?: 'AccountAddressDelete' + /** A user instance for which the address was deleted. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +/** Updates an address of the logged-in user. */ +export type AccountAddressUpdate = { + __typename?: 'AccountAddressUpdate' + /** A user object for which the address was edited. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +/** Remove user account. */ +export type AccountDelete = { + __typename?: 'AccountDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +export type AccountError = { + __typename?: 'AccountError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: AccountErrorCode + /** A type of address that causes the error. */ + addressType?: Maybe +} + +/** An enumeration. */ +export enum AccountErrorCode { + ActivateOwnAccount = 'ACTIVATE_OWN_ACCOUNT', + ActivateSuperuserAccount = 'ACTIVATE_SUPERUSER_ACCOUNT', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + DeactivateOwnAccount = 'DEACTIVATE_OWN_ACCOUNT', + DeactivateSuperuserAccount = 'DEACTIVATE_SUPERUSER_ACCOUNT', + DeleteNonStaffUser = 'DELETE_NON_STAFF_USER', + DeleteOwnAccount = 'DELETE_OWN_ACCOUNT', + DeleteStaffAccount = 'DELETE_STAFF_ACCOUNT', + DeleteSuperuserAccount = 'DELETE_SUPERUSER_ACCOUNT', + GraphqlError = 'GRAPHQL_ERROR', + Inactive = 'INACTIVE', + Invalid = 'INVALID', + InvalidPassword = 'INVALID_PASSWORD', + LeftNotManageablePermission = 'LEFT_NOT_MANAGEABLE_PERMISSION', + InvalidCredentials = 'INVALID_CREDENTIALS', + NotFound = 'NOT_FOUND', + OutOfScopeUser = 'OUT_OF_SCOPE_USER', + OutOfScopeGroup = 'OUT_OF_SCOPE_GROUP', + OutOfScopePermission = 'OUT_OF_SCOPE_PERMISSION', + PasswordEntirelyNumeric = 'PASSWORD_ENTIRELY_NUMERIC', + PasswordTooCommon = 'PASSWORD_TOO_COMMON', + PasswordTooShort = 'PASSWORD_TOO_SHORT', + PasswordTooSimilar = 'PASSWORD_TOO_SIMILAR', + Required = 'REQUIRED', + Unique = 'UNIQUE', + JwtSignatureExpired = 'JWT_SIGNATURE_EXPIRED', + JwtInvalidToken = 'JWT_INVALID_TOKEN', + JwtDecodeError = 'JWT_DECODE_ERROR', + JwtMissingToken = 'JWT_MISSING_TOKEN', + JwtInvalidCsrfToken = 'JWT_INVALID_CSRF_TOKEN', + ChannelInactive = 'CHANNEL_INACTIVE', + MissingChannelSlug = 'MISSING_CHANNEL_SLUG', +} + +export type AccountInput = { + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** Billing address of the customer. */ + defaultBillingAddress?: Maybe + /** Shipping address of the customer. */ + defaultShippingAddress?: Maybe + /** User language code. */ + languageCode?: Maybe +} + +/** Register a new user. */ +export type AccountRegister = { + __typename?: 'AccountRegister' + /** Informs whether users need to confirm their email address. */ + requiresConfirmation?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +export type AccountRegisterInput = { + /** The email address of the user. */ + email: Scalars['String'] + /** Password. */ + password: Scalars['String'] + /** Base of frontend URL that will be needed to create confirmation URL. */ + redirectUrl?: Maybe + /** User language code. */ + languageCode?: Maybe + /** User public metadata. */ + metadata?: Maybe> + /** Slug of a channel which will be used to notify users. Optional when only one channel exists. */ + channel?: Maybe +} + +/** Sends an email with the account removal link for the logged-in user. */ +export type AccountRequestDeletion = { + __typename?: 'AccountRequestDeletion' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Sets a default address for the authenticated user. */ +export type AccountSetDefaultAddress = { + __typename?: 'AccountSetDefaultAddress' + /** An updated user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Updates the account of the logged-in user. */ +export type AccountUpdate = { + __typename?: 'AccountUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +/** Represents user address data. */ +export type Address = Node & { + __typename?: 'Address' + /** The ID of the object. */ + id: Scalars['ID'] + firstName: Scalars['String'] + lastName: Scalars['String'] + companyName: Scalars['String'] + streetAddress1: Scalars['String'] + streetAddress2: Scalars['String'] + city: Scalars['String'] + cityArea: Scalars['String'] + postalCode: Scalars['String'] + /** Shop's default country. */ + country: CountryDisplay + countryArea: Scalars['String'] + phone?: Maybe + /** Address is user's default shipping address. */ + isDefaultShippingAddress?: Maybe + /** Address is user's default billing address. */ + isDefaultBillingAddress?: Maybe +} + +/** Creates user address. */ +export type AddressCreate = { + __typename?: 'AddressCreate' + /** A user instance for which the address was created. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +/** Deletes an address. */ +export type AddressDelete = { + __typename?: 'AddressDelete' + /** A user instance for which the address was deleted. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +export type AddressInput = { + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** Company or organization. */ + companyName?: Maybe + /** Address. */ + streetAddress1?: Maybe + /** Address. */ + streetAddress2?: Maybe + /** City. */ + city?: Maybe + /** District. */ + cityArea?: Maybe + /** Postal code. */ + postalCode?: Maybe + /** Country. */ + country?: Maybe + /** State or province. */ + countryArea?: Maybe + /** Phone number. */ + phone?: Maybe +} + +/** Sets a default address for the given user. */ +export type AddressSetDefault = { + __typename?: 'AddressSetDefault' + /** An updated user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum AddressTypeEnum { + Billing = 'BILLING', + Shipping = 'SHIPPING', +} + +/** Updates an address. */ +export type AddressUpdate = { + __typename?: 'AddressUpdate' + /** A user object for which the address was edited. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + address?: Maybe
+} + +export type AddressValidationData = { + __typename?: 'AddressValidationData' + countryCode?: Maybe + countryName?: Maybe + addressFormat?: Maybe + addressLatinFormat?: Maybe + allowedFields?: Maybe>> + requiredFields?: Maybe>> + upperFields?: Maybe>> + countryAreaType?: Maybe + countryAreaChoices?: Maybe>> + cityType?: Maybe + cityChoices?: Maybe>> + cityAreaType?: Maybe + cityAreaChoices?: Maybe>> + postalCodeType?: Maybe + postalCodeMatchers?: Maybe>> + postalCodeExamples?: Maybe>> + postalCodePrefix?: Maybe +} + +/** Represents allocation. */ +export type Allocation = Node & { + __typename?: 'Allocation' + /** The ID of the object. */ + id: Scalars['ID'] + /** Quantity allocated for orders. */ + quantity: Scalars['Int'] + /** The warehouse were items were allocated. */ + warehouse: Warehouse +} + +/** Represents app data. */ +export type App = Node & + ObjectWithMetadata & { + __typename?: 'App' + /** The ID of the object. */ + id: Scalars['ID'] + /** Name of the app. */ + name?: Maybe + /** The date and time when the app was created. */ + created?: Maybe + /** Determine if app will be set active or not. */ + isActive?: Maybe + /** List of the app's permissions. */ + permissions?: Maybe>> + /** Last 4 characters of the tokens. */ + tokens?: Maybe>> + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Type of the app. */ + type?: Maybe + /** List of webhooks assigned to this app. */ + webhooks?: Maybe>> + /** Description of this app. */ + aboutApp?: Maybe + /** Description of the data privacy defined for this app. */ + dataPrivacy?: Maybe + /** Url to details about the privacy policy on the app owner page. */ + dataPrivacyUrl?: Maybe + /** Homepage of the app. */ + homepageUrl?: Maybe + /** Support page for the app. */ + supportUrl?: Maybe + /** Url to iframe with the configuration for the app. */ + configurationUrl?: Maybe + /** Url to iframe with the app. */ + appUrl?: Maybe + /** Version number of the app. */ + version?: Maybe + /** JWT token used to authenticate by thridparty app. */ + accessToken?: Maybe + } + +/** Activate the app. */ +export type AppActivate = { + __typename?: 'AppActivate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + app?: Maybe +} + +export type AppCountableConnection = { + __typename?: 'AppCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type AppCountableEdge = { + __typename?: 'AppCountableEdge' + /** The item at the end of the edge. */ + node: App + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new app. */ +export type AppCreate = { + __typename?: 'AppCreate' + /** The newly created authentication token. */ + authToken?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + app?: Maybe +} + +/** Deactivate the app. */ +export type AppDeactivate = { + __typename?: 'AppDeactivate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + app?: Maybe +} + +/** Deletes an app. */ +export type AppDelete = { + __typename?: 'AppDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + app?: Maybe +} + +/** Delete failed installation. */ +export type AppDeleteFailedInstallation = { + __typename?: 'AppDeleteFailedInstallation' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + appInstallation?: Maybe +} + +export type AppError = { + __typename?: 'AppError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: AppErrorCode + /** List of permissions which causes the error. */ + permissions?: Maybe> +} + +/** An enumeration. */ +export enum AppErrorCode { + Forbidden = 'FORBIDDEN', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + InvalidStatus = 'INVALID_STATUS', + InvalidPermission = 'INVALID_PERMISSION', + InvalidUrlFormat = 'INVALID_URL_FORMAT', + InvalidManifestFormat = 'INVALID_MANIFEST_FORMAT', + ManifestUrlCantConnect = 'MANIFEST_URL_CANT_CONNECT', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + OutOfScopeApp = 'OUT_OF_SCOPE_APP', + OutOfScopePermission = 'OUT_OF_SCOPE_PERMISSION', +} + +/** Fetch and validate manifest. */ +export type AppFetchManifest = { + __typename?: 'AppFetchManifest' + manifest?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array +} + +export type AppFilterInput = { + search?: Maybe + isActive?: Maybe + type?: Maybe +} + +export type AppInput = { + /** Name of the app. */ + name?: Maybe + /** List of permission code names to assign to this app. */ + permissions?: Maybe>> +} + +/** Install new app by using app manifest. */ +export type AppInstall = { + __typename?: 'AppInstall' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + appInstallation?: Maybe +} + +export type AppInstallInput = { + /** Name of the app to install. */ + appName?: Maybe + /** Url to app's manifest in JSON format. */ + manifestUrl?: Maybe + /** Determine if app will be set active or not. */ + activateAfterInstallation?: Maybe + /** List of permission code names to assign to this app. */ + permissions?: Maybe>> +} + +/** Represents ongoing installation of app. */ +export type AppInstallation = Node & + Job & { + __typename?: 'AppInstallation' + appName: Scalars['String'] + manifestUrl: Scalars['String'] + /** The ID of the object. */ + id: Scalars['ID'] + /** Job status. */ + status: JobStatusEnum + /** Created date time of job in ISO 8601 format. */ + createdAt: Scalars['DateTime'] + /** Date time of job last update in ISO 8601 format. */ + updatedAt: Scalars['DateTime'] + /** Job message. */ + message?: Maybe + } + +/** Retry failed installation of new app. */ +export type AppRetryInstall = { + __typename?: 'AppRetryInstall' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + appInstallation?: Maybe +} + +export enum AppSortField { + /** Sort apps by name. */ + Name = 'NAME', + /** Sort apps by creation date. */ + CreationDate = 'CREATION_DATE', +} + +export type AppSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort apps by the selected field. */ + field: AppSortField +} + +/** Represents token data. */ +export type AppToken = Node & { + __typename?: 'AppToken' + /** Name of the authenticated token. */ + name?: Maybe + /** Last 4 characters of the token. */ + authToken?: Maybe + /** The ID of the object. */ + id: Scalars['ID'] +} + +/** Creates a new token. */ +export type AppTokenCreate = { + __typename?: 'AppTokenCreate' + /** The newly created authentication token. */ + authToken?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + appToken?: Maybe +} + +/** Deletes an authentication token assigned to app. */ +export type AppTokenDelete = { + __typename?: 'AppTokenDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + appToken?: Maybe +} + +export type AppTokenInput = { + /** Name of the token. */ + name?: Maybe + /** ID of app. */ + app: Scalars['ID'] +} + +/** Verify provided app token. */ +export type AppTokenVerify = { + __typename?: 'AppTokenVerify' + /** Determine if token is valid or not. */ + valid: Scalars['Boolean'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array +} + +/** Enum determining type of your App. */ +export enum AppTypeEnum { + /** Local Saleor App. The app is fully manageable from dashboard. You can change assigned permissions, add webhooks, or authentication token */ + Local = 'LOCAL', + /** Third party external App. Installation is fully automated. Saleor uses a defined App manifest to gather all required information. */ + Thirdparty = 'THIRDPARTY', +} + +/** Updates an existing app. */ +export type AppUpdate = { + __typename?: 'AppUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + appErrors: Array + errors: Array + app?: Maybe +} + +/** An enumeration. */ +export enum AreaUnitsEnum { + SqCm = 'SQ_CM', + SqM = 'SQ_M', + SqKm = 'SQ_KM', + SqFt = 'SQ_FT', + SqYd = 'SQ_YD', + SqInch = 'SQ_INCH', +} + +/** Assigns storefront's navigation menus. */ +export type AssignNavigation = { + __typename?: 'AssignNavigation' + /** Assigned navigation menu. */ + menu?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array +} + +/** Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. */ +export type Attribute = Node & + ObjectWithMetadata & { + __typename?: 'Attribute' + /** The ID of the object. */ + id: Scalars['ID'] + productTypes: ProductTypeCountableConnection + productVariantTypes: ProductTypeCountableConnection + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** The input type to use for entering attribute values in the dashboard. */ + inputType?: Maybe + /** The entity type which can be used as a reference. */ + entityType?: Maybe + /** Name of an attribute displayed in the interface. */ + name?: Maybe + /** Internal representation of an attribute name. */ + slug?: Maybe + /** The attribute type. */ + type?: Maybe + /** The unit of attribute values. */ + unit?: Maybe + /** List of attribute's values. */ + values?: Maybe>> + /** Whether the attribute requires values to be passed or not. */ + valueRequired: Scalars['Boolean'] + /** Whether the attribute should be visible or not in storefront. */ + visibleInStorefront: Scalars['Boolean'] + /** Whether the attribute can be filtered in storefront. */ + filterableInStorefront: Scalars['Boolean'] + /** Whether the attribute can be filtered in dashboard. */ + filterableInDashboard: Scalars['Boolean'] + /** Whether the attribute can be displayed in the admin product list. */ + availableInGrid: Scalars['Boolean'] + /** Returns translated attribute fields for the given language code. */ + translation?: Maybe + /** The position of the attribute in the storefront navigation (0 by default). */ + storefrontSearchPosition: Scalars['Int'] + } + +/** Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. */ +export type AttributeProductTypesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. */ +export type AttributeProductVariantTypesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. */ +export type AttributeTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Deletes attributes. */ +export type AttributeBulkDelete = { + __typename?: 'AttributeBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array +} + +export type AttributeCountableConnection = { + __typename?: 'AttributeCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type AttributeCountableEdge = { + __typename?: 'AttributeCountableEdge' + /** The item at the end of the edge. */ + node: Attribute + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates an attribute. */ +export type AttributeCreate = { + __typename?: 'AttributeCreate' + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array +} + +export type AttributeCreateInput = { + /** The input type to use for entering attribute values in the dashboard. */ + inputType?: Maybe + /** The entity type which can be used as a reference. */ + entityType?: Maybe + /** Name of an attribute displayed in the interface. */ + name: Scalars['String'] + /** Internal representation of an attribute name. */ + slug?: Maybe + /** The attribute type. */ + type: AttributeTypeEnum + /** The unit of attribute values. */ + unit?: Maybe + /** List of attribute's values. */ + values?: Maybe>> + /** Whether the attribute requires values to be passed or not. */ + valueRequired?: Maybe + /** Whether the attribute is for variants only. */ + isVariantOnly?: Maybe + /** Whether the attribute should be visible or not in storefront. */ + visibleInStorefront?: Maybe + /** Whether the attribute can be filtered in storefront. */ + filterableInStorefront?: Maybe + /** Whether the attribute can be filtered in dashboard. */ + filterableInDashboard?: Maybe + /** The position of the attribute in the storefront navigation (0 by default). */ + storefrontSearchPosition?: Maybe + /** Whether the attribute can be displayed in the admin product list. */ + availableInGrid?: Maybe +} + +/** Deletes an attribute. */ +export type AttributeDelete = { + __typename?: 'AttributeDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array + attribute?: Maybe +} + +/** An enumeration. */ +export enum AttributeEntityTypeEnum { + Page = 'PAGE', + Product = 'PRODUCT', +} + +export type AttributeError = { + __typename?: 'AttributeError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: AttributeErrorCode +} + +/** An enumeration. */ +export enum AttributeErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +export type AttributeFilterInput = { + valueRequired?: Maybe + isVariantOnly?: Maybe + visibleInStorefront?: Maybe + filterableInStorefront?: Maybe + filterableInDashboard?: Maybe + availableInGrid?: Maybe + metadata?: Maybe>> + search?: Maybe + ids?: Maybe>> + type?: Maybe + inCollection?: Maybe + inCategory?: Maybe + /** Specifies the channel by which the data should be sorted. */ + channel?: Maybe +} + +export type AttributeInput = { + /** Internal representation of an attribute name. */ + slug: Scalars['String'] + /** Internal representation of a value (unique per attribute). */ + values?: Maybe>> + /** The range that the returned values should be in. */ + valuesRange?: Maybe +} + +/** An enumeration. */ +export enum AttributeInputTypeEnum { + Dropdown = 'DROPDOWN', + Multiselect = 'MULTISELECT', + File = 'FILE', + Reference = 'REFERENCE', + Numeric = 'NUMERIC', + RichText = 'RICH_TEXT', +} + +/** Reorder the values of an attribute. */ +export type AttributeReorderValues = { + __typename?: 'AttributeReorderValues' + /** Attribute from which values are reordered. */ + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array +} + +export enum AttributeSortField { + /** Sort attributes by name */ + Name = 'NAME', + /** Sort attributes by slug */ + Slug = 'SLUG', + /** Sort attributes by the value required flag */ + ValueRequired = 'VALUE_REQUIRED', + /** Sort attributes by the variant only flag */ + IsVariantOnly = 'IS_VARIANT_ONLY', + /** Sort attributes by visibility in the storefront */ + VisibleInStorefront = 'VISIBLE_IN_STOREFRONT', + /** Sort attributes by the filterable in storefront flag */ + FilterableInStorefront = 'FILTERABLE_IN_STOREFRONT', + /** Sort attributes by the filterable in dashboard flag */ + FilterableInDashboard = 'FILTERABLE_IN_DASHBOARD', + /** Sort attributes by their position in storefront */ + StorefrontSearchPosition = 'STOREFRONT_SEARCH_POSITION', + /** Sort attributes based on whether they can be displayed or not in a product grid. */ + AvailableInGrid = 'AVAILABLE_IN_GRID', +} + +export type AttributeSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort attributes by the selected field. */ + field: AttributeSortField +} + +export type AttributeTranslatableContent = Node & { + __typename?: 'AttributeTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Returns translated attribute fields for the given language code. */ + translation?: Maybe + /** Custom attribute of a product. */ + attribute?: Maybe +} + +export type AttributeTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for attribute. */ +export type AttributeTranslate = { + __typename?: 'AttributeTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + attribute?: Maybe +} + +export type AttributeTranslation = Node & { + __typename?: 'AttributeTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Translation language. */ + language: LanguageDisplay +} + +/** An enumeration. */ +export enum AttributeTypeEnum { + ProductType = 'PRODUCT_TYPE', + PageType = 'PAGE_TYPE', +} + +/** Updates attribute. */ +export type AttributeUpdate = { + __typename?: 'AttributeUpdate' + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array +} + +export type AttributeUpdateInput = { + /** Name of an attribute displayed in the interface. */ + name?: Maybe + /** Internal representation of an attribute name. */ + slug?: Maybe + /** The unit of attribute values. */ + unit?: Maybe + /** IDs of values to be removed from this attribute. */ + removeValues?: Maybe>> + /** New values to be created for this attribute. */ + addValues?: Maybe>> + /** Whether the attribute requires values to be passed or not. */ + valueRequired?: Maybe + /** Whether the attribute is for variants only. */ + isVariantOnly?: Maybe + /** Whether the attribute should be visible or not in storefront. */ + visibleInStorefront?: Maybe + /** Whether the attribute can be filtered in storefront. */ + filterableInStorefront?: Maybe + /** Whether the attribute can be filtered in dashboard. */ + filterableInDashboard?: Maybe + /** The position of the attribute in the storefront navigation (0 by default). */ + storefrontSearchPosition?: Maybe + /** Whether the attribute can be displayed in the admin product list. */ + availableInGrid?: Maybe +} + +/** Represents a value of an attribute. */ +export type AttributeValue = Node & { + __typename?: 'AttributeValue' + /** The ID of the object. */ + id: Scalars['ID'] + /** Name of a value displayed in the interface. */ + name?: Maybe + /** Internal representation of a value (unique per attribute). */ + slug?: Maybe + /** Represents the value of the attribute value. */ + value?: Maybe + /** Returns translated attribute value fields for the given language code. */ + translation?: Maybe + /** The input type to use for entering attribute values in the dashboard. */ + inputType?: Maybe + /** The ID of the attribute reference. */ + reference?: Maybe + /** Represents file URL and content type (if attribute value is a file). */ + file?: Maybe + /** Represents the text (JSON) of the attribute value. */ + richText?: Maybe +} + +/** Represents a value of an attribute. */ +export type AttributeValueTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Deletes values of attributes. */ +export type AttributeValueBulkDelete = { + __typename?: 'AttributeValueBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array +} + +/** Creates a value for an attribute. */ +export type AttributeValueCreate = { + __typename?: 'AttributeValueCreate' + /** The updated attribute. */ + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array + attributeValue?: Maybe +} + +export type AttributeValueCreateInput = { + /** Name of a value displayed in the interface. */ + name: Scalars['String'] + /** Represents the value of the attribute value. */ + value?: Maybe + /** Represents the text (JSON) of the attribute value. */ + richText?: Maybe +} + +/** Deletes a value of an attribute. */ +export type AttributeValueDelete = { + __typename?: 'AttributeValueDelete' + /** The updated attribute. */ + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array + attributeValue?: Maybe +} + +export type AttributeValueInput = { + /** ID of the selected attribute. */ + id?: Maybe + /** The value or slug of an attribute to resolve. If the passed value is non-existent, it will be created. */ + values?: Maybe>> + /** URL of the file attribute. Every time, a new value is created. */ + file?: Maybe + /** File content type. */ + contentType?: Maybe + /** List of entity IDs that will be used as references. */ + references?: Maybe> + /** Text content in JSON format. */ + richText?: Maybe +} + +export type AttributeValueTranslatableContent = Node & { + __typename?: 'AttributeValueTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Returns translated attribute value fields for the given language code. */ + translation?: Maybe + /** Represents a value of an attribute. */ + attributeValue?: Maybe +} + +export type AttributeValueTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for attribute value. */ +export type AttributeValueTranslate = { + __typename?: 'AttributeValueTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + attributeValue?: Maybe +} + +export type AttributeValueTranslation = Node & { + __typename?: 'AttributeValueTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + richText?: Maybe + /** Translation language. */ + language: LanguageDisplay +} + +export type AttributeValueTranslationInput = { + name?: Maybe + richText?: Maybe +} + +/** Updates value of an attribute. */ +export type AttributeValueUpdate = { + __typename?: 'AttributeValueUpdate' + /** The updated attribute. */ + attribute?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + attributeErrors: Array + errors: Array + attributeValue?: Maybe +} + +export type BulkAttributeValueInput = { + /** ID of the selected attribute. */ + id?: Maybe + /** The value or slug of an attribute to resolve. If the passed value is non-existent, it will be created. */ + values: Array> +} + +export type BulkProductError = { + __typename?: 'BulkProductError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ProductErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> + /** Index of an input list item that caused the error. */ + index?: Maybe + /** List of warehouse IDs which causes the error. */ + warehouses?: Maybe> + /** List of channel IDs which causes the error. */ + channels?: Maybe> +} + +export type BulkStockError = { + __typename?: 'BulkStockError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ProductErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> + /** Index of an input list item that caused the error. */ + index?: Maybe +} + +export type CatalogueInput = { + /** Products related to the discount. */ + products?: Maybe>> + /** Categories related to the discount. */ + categories?: Maybe>> + /** Collections related to the discount. */ + collections?: Maybe>> +} + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type Category = Node & + ObjectWithMetadata & { + __typename?: 'Category' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + slug: Scalars['String'] + parent?: Maybe + level: Scalars['Int'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** + * Description of the category (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** List of ancestors of the category. */ + ancestors?: Maybe + /** List of products in the category. */ + products?: Maybe + /** List of children of the category. */ + children?: Maybe + backgroundImage?: Maybe + /** Returns translated category fields for the given language code. */ + translation?: Maybe + } + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type CategoryAncestorsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type CategoryProductsArgs = { + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type CategoryChildrenArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type CategoryBackgroundImageArgs = { + size?: Maybe +} + +/** Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. */ +export type CategoryTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Deletes categories. */ +export type CategoryBulkDelete = { + __typename?: 'CategoryBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type CategoryCountableConnection = { + __typename?: 'CategoryCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type CategoryCountableEdge = { + __typename?: 'CategoryCountableEdge' + /** The item at the end of the edge. */ + node: Category + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new category. */ +export type CategoryCreate = { + __typename?: 'CategoryCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + category?: Maybe +} + +/** Deletes a category. */ +export type CategoryDelete = { + __typename?: 'CategoryDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + category?: Maybe +} + +export type CategoryFilterInput = { + search?: Maybe + metadata?: Maybe>> + ids?: Maybe>> +} + +export type CategoryInput = { + /** Category description (JSON). */ + description?: Maybe + /** Category name. */ + name?: Maybe + /** Category slug. */ + slug?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** Background image file. */ + backgroundImage?: Maybe + /** Alt text for a product media. */ + backgroundImageAlt?: Maybe +} + +export enum CategorySortField { + /** Sort categories by name. */ + Name = 'NAME', + /** Sort categories by product count. */ + ProductCount = 'PRODUCT_COUNT', + /** Sort categories by subcategory count. */ + SubcategoryCount = 'SUBCATEGORY_COUNT', +} + +export type CategorySortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Specifies the channel in which to sort the data. */ + channel?: Maybe + /** Sort categories by the selected field. */ + field: CategorySortField +} + +export type CategoryTranslatableContent = Node & { + __typename?: 'CategoryTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** + * Description of the category (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** Returns translated category fields for the given language code. */ + translation?: Maybe + /** Represents a single category of products. */ + category?: Maybe +} + +export type CategoryTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Category. */ +export type CategoryTranslate = { + __typename?: 'CategoryTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + category?: Maybe +} + +export type CategoryTranslation = Node & { + __typename?: 'CategoryTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** Translation language. */ + language: LanguageDisplay + /** + * Translated description of the product (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe +} + +/** Updates a category. */ +export type CategoryUpdate = { + __typename?: 'CategoryUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + category?: Maybe +} + +/** Represents channel. */ +export type Channel = Node & { + __typename?: 'Channel' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + isActive: Scalars['Boolean'] + slug: Scalars['String'] + currencyCode: Scalars['String'] + /** Whether a channel has associated orders. */ + hasOrders: Scalars['Boolean'] +} + +/** Activate a channel. */ +export type ChannelActivate = { + __typename?: 'ChannelActivate' + /** Activated channel. */ + channel?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + channelErrors: Array + errors: Array +} + +/** Creates new channel. */ +export type ChannelCreate = { + __typename?: 'ChannelCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + channelErrors: Array + errors: Array + channel?: Maybe +} + +export type ChannelCreateInput = { + /** isActive flag. */ + isActive?: Maybe + /** Name of the channel. */ + name: Scalars['String'] + /** Slug of the channel. */ + slug: Scalars['String'] + /** Currency of the channel. */ + currencyCode: Scalars['String'] + /** List of shipping zones to assign to the channel. */ + addShippingZones?: Maybe> +} + +/** Deactivate a channel. */ +export type ChannelDeactivate = { + __typename?: 'ChannelDeactivate' + /** Deactivated channel. */ + channel?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + channelErrors: Array + errors: Array +} + +/** Delete a channel. Orders associated with the deleted channel will be moved to the target channel. Checkouts, product availability, and pricing will be removed. */ +export type ChannelDelete = { + __typename?: 'ChannelDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + channelErrors: Array + errors: Array + channel?: Maybe +} + +export type ChannelDeleteInput = { + /** ID of channel to migrate orders from origin channel. */ + targetChannel: Scalars['ID'] +} + +export type ChannelError = { + __typename?: 'ChannelError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ChannelErrorCode + /** List of shipping zone IDs which causes the error. */ + shippingZones?: Maybe> +} + +/** An enumeration. */ +export enum ChannelErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + ChannelTargetIdMustBeDifferent = 'CHANNEL_TARGET_ID_MUST_BE_DIFFERENT', + ChannelsCurrencyMustBeTheSame = 'CHANNELS_CURRENCY_MUST_BE_THE_SAME', + ChannelWithOrders = 'CHANNEL_WITH_ORDERS', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', +} + +/** Update a channel. */ +export type ChannelUpdate = { + __typename?: 'ChannelUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + channelErrors: Array + errors: Array + channel?: Maybe +} + +export type ChannelUpdateInput = { + /** isActive flag. */ + isActive?: Maybe + /** Name of the channel. */ + name?: Maybe + /** Slug of the channel. */ + slug?: Maybe + /** List of shipping zones to assign to the channel. */ + addShippingZones?: Maybe> + /** List of shipping zones to unassign from the channel. */ + removeShippingZones?: Maybe> +} + +/** Checkout object. */ +export type Checkout = Node & + ObjectWithMetadata & { + __typename?: 'Checkout' + created: Scalars['DateTime'] + lastChange: Scalars['DateTime'] + user?: Maybe + channel: Channel + billingAddress?: Maybe
+ shippingAddress?: Maybe
+ note: Scalars['String'] + discount?: Maybe + discountName?: Maybe + translatedDiscountName?: Maybe + voucherCode?: Maybe + /** List of gift cards associated with this checkout. */ + giftCards?: Maybe>> + /** The ID of the object. */ + id: Scalars['ID'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Shipping methods that can be used with this order. */ + availableShippingMethods: Array> + /** List of available payment gateways. */ + availablePaymentGateways: Array + /** Email of a customer. */ + email: Scalars['String'] + /** Returns True, if checkout requires shipping. */ + isShippingRequired: Scalars['Boolean'] + /** The number of items purchased. */ + quantity: Scalars['Int'] + /** A list of checkout lines, each containing information about an item in the checkout. */ + lines?: Maybe>> + /** The price of the shipping, with all the taxes included. */ + shippingPrice?: Maybe + /** The shipping method related with checkout. */ + shippingMethod?: Maybe + /** The price of the checkout before shipping, with taxes included. */ + subtotalPrice?: Maybe + /** The checkout's token. */ + token: Scalars['UUID'] + /** The sum of the the checkout line prices, with all the taxes,shipping costs, and discounts included. */ + totalPrice?: Maybe + /** Checkout language code. */ + languageCode: LanguageCodeEnum + } + +/** Adds a gift card or a voucher to a checkout. */ +export type CheckoutAddPromoCode = { + __typename?: 'CheckoutAddPromoCode' + /** The checkout with the added gift card or voucher. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Update billing address in the existing checkout. */ +export type CheckoutBillingAddressUpdate = { + __typename?: 'CheckoutBillingAddressUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Completes the checkout. As a result a new order is created and a payment charge is made. This action requires a successful payment before it can be performed. In case additional confirmation step as 3D secure is required confirmationNeeded flag will be set to True and no order created until payment is confirmed with second call of this mutation. */ +export type CheckoutComplete = { + __typename?: 'CheckoutComplete' + /** Placed order. */ + order?: Maybe + /** Set to true if payment needs to be confirmed before checkout is complete. */ + confirmationNeeded: Scalars['Boolean'] + /** Confirmation data used to process additional authorization steps. */ + confirmationData?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +export type CheckoutCountableConnection = { + __typename?: 'CheckoutCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type CheckoutCountableEdge = { + __typename?: 'CheckoutCountableEdge' + /** The item at the end of the edge. */ + node: Checkout + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Create a new checkout. */ +export type CheckoutCreate = { + __typename?: 'CheckoutCreate' + /** Whether the checkout was created or the current active one was returned. Refer to checkoutLinesAdd and checkoutLinesUpdate to merge a cart with an active checkout.DEPRECATED: Will be removed in Saleor 4.0. Always returns True. */ + created?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array + checkout?: Maybe +} + +export type CheckoutCreateInput = { + /** Slug of a channel in which to create a checkout. */ + channel?: Maybe + /** A list of checkout lines, each containing information about an item in the checkout. */ + lines: Array> + /** The customer's email address. */ + email?: Maybe + /** The mailing address to where the checkout will be shipped. Note: the address will be ignored if the checkout doesn't contain shippable items. */ + shippingAddress?: Maybe + /** Billing address of the customer. */ + billingAddress?: Maybe + /** Checkout language code. */ + languageCode?: Maybe +} + +/** Sets the customer as the owner of the checkout. */ +export type CheckoutCustomerAttach = { + __typename?: 'CheckoutCustomerAttach' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Removes the user assigned as the owner of the checkout. */ +export type CheckoutCustomerDetach = { + __typename?: 'CheckoutCustomerDetach' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Updates email address in the existing checkout object. */ +export type CheckoutEmailUpdate = { + __typename?: 'CheckoutEmailUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +export type CheckoutError = { + __typename?: 'CheckoutError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: CheckoutErrorCode + /** List of varint IDs which causes the error. */ + variants?: Maybe> + /** A type of address that causes the error. */ + addressType?: Maybe +} + +/** An enumeration. */ +export enum CheckoutErrorCode { + BillingAddressNotSet = 'BILLING_ADDRESS_NOT_SET', + CheckoutNotFullyPaid = 'CHECKOUT_NOT_FULLY_PAID', + GraphqlError = 'GRAPHQL_ERROR', + ProductNotPublished = 'PRODUCT_NOT_PUBLISHED', + ProductUnavailableForPurchase = 'PRODUCT_UNAVAILABLE_FOR_PURCHASE', + InsufficientStock = 'INSUFFICIENT_STOCK', + Invalid = 'INVALID', + InvalidShippingMethod = 'INVALID_SHIPPING_METHOD', + NotFound = 'NOT_FOUND', + PaymentError = 'PAYMENT_ERROR', + QuantityGreaterThanLimit = 'QUANTITY_GREATER_THAN_LIMIT', + Required = 'REQUIRED', + ShippingAddressNotSet = 'SHIPPING_ADDRESS_NOT_SET', + ShippingMethodNotApplicable = 'SHIPPING_METHOD_NOT_APPLICABLE', + ShippingMethodNotSet = 'SHIPPING_METHOD_NOT_SET', + ShippingNotRequired = 'SHIPPING_NOT_REQUIRED', + TaxError = 'TAX_ERROR', + Unique = 'UNIQUE', + VoucherNotApplicable = 'VOUCHER_NOT_APPLICABLE', + ZeroQuantity = 'ZERO_QUANTITY', + MissingChannelSlug = 'MISSING_CHANNEL_SLUG', + ChannelInactive = 'CHANNEL_INACTIVE', + UnavailableVariantInChannel = 'UNAVAILABLE_VARIANT_IN_CHANNEL', +} + +/** Update language code in the existing checkout. */ +export type CheckoutLanguageCodeUpdate = { + __typename?: 'CheckoutLanguageCodeUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Represents an item in the checkout. */ +export type CheckoutLine = Node & { + __typename?: 'CheckoutLine' + /** The ID of the object. */ + id: Scalars['ID'] + variant: ProductVariant + quantity: Scalars['Int'] + /** The sum of the checkout line price, taxes and discounts. */ + totalPrice?: Maybe + /** Indicates whether the item need to be delivered. */ + requiresShipping?: Maybe +} + +export type CheckoutLineCountableConnection = { + __typename?: 'CheckoutLineCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type CheckoutLineCountableEdge = { + __typename?: 'CheckoutLineCountableEdge' + /** The item at the end of the edge. */ + node: CheckoutLine + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Deletes a CheckoutLine. */ +export type CheckoutLineDelete = { + __typename?: 'CheckoutLineDelete' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +export type CheckoutLineInput = { + /** The number of items purchased. */ + quantity: Scalars['Int'] + /** ID of the product variant. */ + variantId: Scalars['ID'] +} + +/** Adds a checkout line to the existing checkout. */ +export type CheckoutLinesAdd = { + __typename?: 'CheckoutLinesAdd' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Updates checkout line in the existing checkout. */ +export type CheckoutLinesUpdate = { + __typename?: 'CheckoutLinesUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Create a new payment for given checkout. */ +export type CheckoutPaymentCreate = { + __typename?: 'CheckoutPaymentCreate' + /** Related checkout object. */ + checkout?: Maybe + /** A newly created payment. */ + payment?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + paymentErrors: Array + errors: Array +} + +/** Remove a gift card or a voucher from a checkout. */ +export type CheckoutRemovePromoCode = { + __typename?: 'CheckoutRemovePromoCode' + /** The checkout with the removed gift card or voucher. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Update shipping address in the existing checkout. */ +export type CheckoutShippingAddressUpdate = { + __typename?: 'CheckoutShippingAddressUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +/** Updates the shipping address of the checkout. */ +export type CheckoutShippingMethodUpdate = { + __typename?: 'CheckoutShippingMethodUpdate' + /** An updated checkout. */ + checkout?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + checkoutErrors: Array + errors: Array +} + +export type ChoiceValue = { + __typename?: 'ChoiceValue' + raw?: Maybe + verbose?: Maybe +} + +/** Represents a collection of products. */ +export type Collection = Node & + ObjectWithMetadata & { + __typename?: 'Collection' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + slug: Scalars['String'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** + * Description of the collection (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** List of products in this collection. */ + products?: Maybe + backgroundImage?: Maybe + /** Returns translated collection fields for the given language code. */ + translation?: Maybe + /** List of channels in which the collection is available. */ + channelListings?: Maybe> + } + +/** Represents a collection of products. */ +export type CollectionProductsArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents a collection of products. */ +export type CollectionBackgroundImageArgs = { + size?: Maybe +} + +/** Represents a collection of products. */ +export type CollectionTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Adds products to a collection. */ +export type CollectionAddProducts = { + __typename?: 'CollectionAddProducts' + /** Collection to which products will be added. */ + collection?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array +} + +/** Deletes collections. */ +export type CollectionBulkDelete = { + __typename?: 'CollectionBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array +} + +/** Represents collection channel listing. */ +export type CollectionChannelListing = Node & { + __typename?: 'CollectionChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + publicationDate?: Maybe + isPublished: Scalars['Boolean'] + channel: Channel +} + +export type CollectionChannelListingError = { + __typename?: 'CollectionChannelListingError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ProductErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> + /** List of channels IDs which causes the error. */ + channels?: Maybe> +} + +/** Manage collection's availability in channels. */ +export type CollectionChannelListingUpdate = { + __typename?: 'CollectionChannelListingUpdate' + /** An updated collection instance. */ + collection?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionChannelListingErrors: Array + errors: Array +} + +export type CollectionChannelListingUpdateInput = { + /** List of channels to which the collection should be assigned. */ + addChannels?: Maybe> + /** List of channels from which the collection should be unassigned. */ + removeChannels?: Maybe> +} + +export type CollectionCountableConnection = { + __typename?: 'CollectionCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type CollectionCountableEdge = { + __typename?: 'CollectionCountableEdge' + /** The item at the end of the edge. */ + node: Collection + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new collection. */ +export type CollectionCreate = { + __typename?: 'CollectionCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array + collection?: Maybe +} + +export type CollectionCreateInput = { + /** Informs whether a collection is published. */ + isPublished?: Maybe + /** Name of the collection. */ + name?: Maybe + /** Slug of the collection. */ + slug?: Maybe + /** Description of the collection (JSON). */ + description?: Maybe + /** Background image file. */ + backgroundImage?: Maybe + /** Alt text for an image. */ + backgroundImageAlt?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe + /** List of products to be added to the collection. */ + products?: Maybe>> +} + +/** Deletes a collection. */ +export type CollectionDelete = { + __typename?: 'CollectionDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array + collection?: Maybe +} + +export type CollectionError = { + __typename?: 'CollectionError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** List of products IDs which causes the error. */ + products?: Maybe> + /** The error code. */ + code: CollectionErrorCode +} + +/** An enumeration. */ +export enum CollectionErrorCode { + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + CannotManageProductWithoutVariant = 'CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT', +} + +export type CollectionFilterInput = { + published?: Maybe + search?: Maybe + metadata?: Maybe>> + ids?: Maybe>> + /** Specifies the channel by which the data should be sorted. */ + channel?: Maybe +} + +export type CollectionInput = { + /** Informs whether a collection is published. */ + isPublished?: Maybe + /** Name of the collection. */ + name?: Maybe + /** Slug of the collection. */ + slug?: Maybe + /** Description of the collection (JSON). */ + description?: Maybe + /** Background image file. */ + backgroundImage?: Maybe + /** Alt text for an image. */ + backgroundImageAlt?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe +} + +export enum CollectionPublished { + Published = 'PUBLISHED', + Hidden = 'HIDDEN', +} + +/** Remove products from a collection. */ +export type CollectionRemoveProducts = { + __typename?: 'CollectionRemoveProducts' + /** Collection from which products will be removed. */ + collection?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array +} + +/** Reorder the products of a collection. */ +export type CollectionReorderProducts = { + __typename?: 'CollectionReorderProducts' + /** Collection from which products are reordered. */ + collection?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array +} + +export enum CollectionSortField { + /** Sort collections by name. */ + Name = 'NAME', + /** Sort collections by availability. */ + Availability = 'AVAILABILITY', + /** Sort collections by product count. */ + ProductCount = 'PRODUCT_COUNT', + /** Sort collections by publication date. */ + PublicationDate = 'PUBLICATION_DATE', +} + +export type CollectionSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Specifies the channel in which to sort the data. */ + channel?: Maybe + /** Sort collections by the selected field. */ + field: CollectionSortField +} + +export type CollectionTranslatableContent = Node & { + __typename?: 'CollectionTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** + * Description of the collection (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** Returns translated collection fields for the given language code. */ + translation?: Maybe + /** Represents a collection of products. */ + collection?: Maybe +} + +export type CollectionTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for collection. */ +export type CollectionTranslate = { + __typename?: 'CollectionTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + collection?: Maybe +} + +export type CollectionTranslation = Node & { + __typename?: 'CollectionTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** Translation language. */ + language: LanguageDisplay + /** + * Translated description of the product (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe +} + +/** Updates a collection. */ +export type CollectionUpdate = { + __typename?: 'CollectionUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + collectionErrors: Array + errors: Array + collection?: Maybe +} + +/** Stores information about a single configuration field. */ +export type ConfigurationItem = { + __typename?: 'ConfigurationItem' + /** Name of the field. */ + name: Scalars['String'] + /** Current value of the field. */ + value?: Maybe + /** Type of the field. */ + type?: Maybe + /** Help text for the field. */ + helpText?: Maybe + /** Label for the field. */ + label?: Maybe +} + +export type ConfigurationItemInput = { + /** Name of the field to update. */ + name: Scalars['String'] + /** Value of the given field to update. */ + value?: Maybe +} + +/** An enumeration. */ +export enum ConfigurationTypeFieldEnum { + String = 'STRING', + Multiline = 'MULTILINE', + Boolean = 'BOOLEAN', + Secret = 'SECRET', + Password = 'PASSWORD', + Secretmultiline = 'SECRETMULTILINE', + Output = 'OUTPUT', +} + +/** Confirm user account with token sent by email during registration. */ +export type ConfirmAccount = { + __typename?: 'ConfirmAccount' + /** An activated user account. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Confirm the email change of the logged-in user. */ +export type ConfirmEmailChange = { + __typename?: 'ConfirmEmailChange' + /** A user instance with a new email. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum CountryCode { + Af = 'AF', + Ax = 'AX', + Al = 'AL', + Dz = 'DZ', + As = 'AS', + Ad = 'AD', + Ao = 'AO', + Ai = 'AI', + Aq = 'AQ', + Ag = 'AG', + Ar = 'AR', + Am = 'AM', + Aw = 'AW', + Au = 'AU', + At = 'AT', + Az = 'AZ', + Bs = 'BS', + Bh = 'BH', + Bd = 'BD', + Bb = 'BB', + By = 'BY', + Be = 'BE', + Bz = 'BZ', + Bj = 'BJ', + Bm = 'BM', + Bt = 'BT', + Bo = 'BO', + Bq = 'BQ', + Ba = 'BA', + Bw = 'BW', + Bv = 'BV', + Br = 'BR', + Io = 'IO', + Bn = 'BN', + Bg = 'BG', + Bf = 'BF', + Bi = 'BI', + Cv = 'CV', + Kh = 'KH', + Cm = 'CM', + Ca = 'CA', + Ky = 'KY', + Cf = 'CF', + Td = 'TD', + Cl = 'CL', + Cn = 'CN', + Cx = 'CX', + Cc = 'CC', + Co = 'CO', + Km = 'KM', + Cg = 'CG', + Cd = 'CD', + Ck = 'CK', + Cr = 'CR', + Ci = 'CI', + Hr = 'HR', + Cu = 'CU', + Cw = 'CW', + Cy = 'CY', + Cz = 'CZ', + Dk = 'DK', + Dj = 'DJ', + Dm = 'DM', + Do = 'DO', + Ec = 'EC', + Eg = 'EG', + Sv = 'SV', + Gq = 'GQ', + Er = 'ER', + Ee = 'EE', + Sz = 'SZ', + Et = 'ET', + Eu = 'EU', + Fk = 'FK', + Fo = 'FO', + Fj = 'FJ', + Fi = 'FI', + Fr = 'FR', + Gf = 'GF', + Pf = 'PF', + Tf = 'TF', + Ga = 'GA', + Gm = 'GM', + Ge = 'GE', + De = 'DE', + Gh = 'GH', + Gi = 'GI', + Gr = 'GR', + Gl = 'GL', + Gd = 'GD', + Gp = 'GP', + Gu = 'GU', + Gt = 'GT', + Gg = 'GG', + Gn = 'GN', + Gw = 'GW', + Gy = 'GY', + Ht = 'HT', + Hm = 'HM', + Va = 'VA', + Hn = 'HN', + Hk = 'HK', + Hu = 'HU', + Is = 'IS', + In = 'IN', + Id = 'ID', + Ir = 'IR', + Iq = 'IQ', + Ie = 'IE', + Im = 'IM', + Il = 'IL', + It = 'IT', + Jm = 'JM', + Jp = 'JP', + Je = 'JE', + Jo = 'JO', + Kz = 'KZ', + Ke = 'KE', + Ki = 'KI', + Kw = 'KW', + Kg = 'KG', + La = 'LA', + Lv = 'LV', + Lb = 'LB', + Ls = 'LS', + Lr = 'LR', + Ly = 'LY', + Li = 'LI', + Lt = 'LT', + Lu = 'LU', + Mo = 'MO', + Mg = 'MG', + Mw = 'MW', + My = 'MY', + Mv = 'MV', + Ml = 'ML', + Mt = 'MT', + Mh = 'MH', + Mq = 'MQ', + Mr = 'MR', + Mu = 'MU', + Yt = 'YT', + Mx = 'MX', + Fm = 'FM', + Md = 'MD', + Mc = 'MC', + Mn = 'MN', + Me = 'ME', + Ms = 'MS', + Ma = 'MA', + Mz = 'MZ', + Mm = 'MM', + Na = 'NA', + Nr = 'NR', + Np = 'NP', + Nl = 'NL', + Nc = 'NC', + Nz = 'NZ', + Ni = 'NI', + Ne = 'NE', + Ng = 'NG', + Nu = 'NU', + Nf = 'NF', + Kp = 'KP', + Mk = 'MK', + Mp = 'MP', + No = 'NO', + Om = 'OM', + Pk = 'PK', + Pw = 'PW', + Ps = 'PS', + Pa = 'PA', + Pg = 'PG', + Py = 'PY', + Pe = 'PE', + Ph = 'PH', + Pn = 'PN', + Pl = 'PL', + Pt = 'PT', + Pr = 'PR', + Qa = 'QA', + Re = 'RE', + Ro = 'RO', + Ru = 'RU', + Rw = 'RW', + Bl = 'BL', + Sh = 'SH', + Kn = 'KN', + Lc = 'LC', + Mf = 'MF', + Pm = 'PM', + Vc = 'VC', + Ws = 'WS', + Sm = 'SM', + St = 'ST', + Sa = 'SA', + Sn = 'SN', + Rs = 'RS', + Sc = 'SC', + Sl = 'SL', + Sg = 'SG', + Sx = 'SX', + Sk = 'SK', + Si = 'SI', + Sb = 'SB', + So = 'SO', + Za = 'ZA', + Gs = 'GS', + Kr = 'KR', + Ss = 'SS', + Es = 'ES', + Lk = 'LK', + Sd = 'SD', + Sr = 'SR', + Sj = 'SJ', + Se = 'SE', + Ch = 'CH', + Sy = 'SY', + Tw = 'TW', + Tj = 'TJ', + Tz = 'TZ', + Th = 'TH', + Tl = 'TL', + Tg = 'TG', + Tk = 'TK', + To = 'TO', + Tt = 'TT', + Tn = 'TN', + Tr = 'TR', + Tm = 'TM', + Tc = 'TC', + Tv = 'TV', + Ug = 'UG', + Ua = 'UA', + Ae = 'AE', + Gb = 'GB', + Um = 'UM', + Us = 'US', + Uy = 'UY', + Uz = 'UZ', + Vu = 'VU', + Ve = 'VE', + Vn = 'VN', + Vg = 'VG', + Vi = 'VI', + Wf = 'WF', + Eh = 'EH', + Ye = 'YE', + Zm = 'ZM', + Zw = 'ZW', +} + +export type CountryDisplay = { + __typename?: 'CountryDisplay' + /** Country code. */ + code: Scalars['String'] + /** Country name. */ + country: Scalars['String'] + /** Country tax. */ + vat?: Maybe +} + +/** Create JWT token. */ +export type CreateToken = { + __typename?: 'CreateToken' + /** JWT token, required to authenticate. */ + token?: Maybe + /** JWT refresh token, required to re-generate access token. */ + refreshToken?: Maybe + /** CSRF token required to re-generate access token. */ + csrfToken?: Maybe + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +export type CreditCard = { + __typename?: 'CreditCard' + /** Card brand. */ + brand: Scalars['String'] + /** First 4 digits of the card number. */ + firstDigits?: Maybe + /** Last 4 digits of the card number. */ + lastDigits: Scalars['String'] + /** Two-digit number representing the card’s expiration month. */ + expMonth?: Maybe + /** Four-digit number representing the card’s expiration year. */ + expYear?: Maybe +} + +/** Deletes customers. */ +export type CustomerBulkDelete = { + __typename?: 'CustomerBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Creates a new customer. */ +export type CustomerCreate = { + __typename?: 'CustomerCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +/** Deletes a customer. */ +export type CustomerDelete = { + __typename?: 'CustomerDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +/** History log of the customer. */ +export type CustomerEvent = Node & { + __typename?: 'CustomerEvent' + /** The ID of the object. */ + id: Scalars['ID'] + /** Date when event happened at in ISO 8601 format. */ + date?: Maybe + /** Customer event type. */ + type?: Maybe + /** User who performed the action. */ + user?: Maybe + /** Content of the event. */ + message?: Maybe + /** Number of objects concerned by the event. */ + count?: Maybe + /** The concerned order. */ + order?: Maybe + /** The concerned order line. */ + orderLine?: Maybe +} + +/** An enumeration. */ +export enum CustomerEventsEnum { + AccountCreated = 'ACCOUNT_CREATED', + PasswordResetLinkSent = 'PASSWORD_RESET_LINK_SENT', + PasswordReset = 'PASSWORD_RESET', + EmailChangedRequest = 'EMAIL_CHANGED_REQUEST', + PasswordChanged = 'PASSWORD_CHANGED', + EmailChanged = 'EMAIL_CHANGED', + PlacedOrder = 'PLACED_ORDER', + NoteAddedToOrder = 'NOTE_ADDED_TO_ORDER', + DigitalLinkDownloaded = 'DIGITAL_LINK_DOWNLOADED', + CustomerDeleted = 'CUSTOMER_DELETED', + NameAssigned = 'NAME_ASSIGNED', + EmailAssigned = 'EMAIL_ASSIGNED', + NoteAdded = 'NOTE_ADDED', +} + +export type CustomerFilterInput = { + dateJoined?: Maybe + numberOfOrders?: Maybe + placedOrders?: Maybe + search?: Maybe +} + +export type CustomerInput = { + /** Billing address of the customer. */ + defaultBillingAddress?: Maybe + /** Shipping address of the customer. */ + defaultShippingAddress?: Maybe + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** The unique email address of the user. */ + email?: Maybe + /** User account is active. */ + isActive?: Maybe + /** A note about the user. */ + note?: Maybe + /** User language code. */ + languageCode?: Maybe +} + +/** Updates an existing customer. */ +export type CustomerUpdate = { + __typename?: 'CustomerUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array + user?: Maybe +} + +export type DateRangeInput = { + /** Start date. */ + gte?: Maybe + /** End date. */ + lte?: Maybe +} + +export type DateTimeRangeInput = { + /** Start date. */ + gte?: Maybe + /** End date. */ + lte?: Maybe +} + +/** Deactivate all JWT tokens of the currently authenticated user. */ +export type DeactivateAllUserTokens = { + __typename?: 'DeactivateAllUserTokens' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Delete metadata of an object. */ +export type DeleteMetadata = { + __typename?: 'DeleteMetadata' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + metadataErrors: Array + errors: Array + item?: Maybe +} + +/** Delete object's private metadata. */ +export type DeletePrivateMetadata = { + __typename?: 'DeletePrivateMetadata' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + metadataErrors: Array + errors: Array + item?: Maybe +} + +export type DigitalContent = Node & + ObjectWithMetadata & { + __typename?: 'DigitalContent' + useDefaultSettings: Scalars['Boolean'] + automaticFulfillment: Scalars['Boolean'] + contentFile: Scalars['String'] + maxDownloads?: Maybe + urlValidDays?: Maybe + /** List of URLs for the digital variant. */ + urls?: Maybe>> + /** The ID of the object. */ + id: Scalars['ID'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Product variant assigned to digital content. */ + productVariant: ProductVariant + } + +export type DigitalContentCountableConnection = { + __typename?: 'DigitalContentCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type DigitalContentCountableEdge = { + __typename?: 'DigitalContentCountableEdge' + /** The item at the end of the edge. */ + node: DigitalContent + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Create new digital content. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ +export type DigitalContentCreate = { + __typename?: 'DigitalContentCreate' + variant?: Maybe + content?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Remove digital content assigned to given variant. */ +export type DigitalContentDelete = { + __typename?: 'DigitalContentDelete' + variant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type DigitalContentInput = { + /** Use default digital content settings for this product. */ + useDefaultSettings: Scalars['Boolean'] + /** Determines how many times a download link can be accessed by a customer. */ + maxDownloads?: Maybe + /** Determines for how many days a download link is active since it was generated. */ + urlValidDays?: Maybe + /** Overwrite default automatic_fulfillment setting for variant. */ + automaticFulfillment?: Maybe +} + +/** Update digital content. */ +export type DigitalContentUpdate = { + __typename?: 'DigitalContentUpdate' + variant?: Maybe + content?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type DigitalContentUploadInput = { + /** Use default digital content settings for this product. */ + useDefaultSettings: Scalars['Boolean'] + /** Determines how many times a download link can be accessed by a customer. */ + maxDownloads?: Maybe + /** Determines for how many days a download link is active since it was generated. */ + urlValidDays?: Maybe + /** Overwrite default automatic_fulfillment setting for variant. */ + automaticFulfillment?: Maybe + /** Represents an file in a multipart request. */ + contentFile: Scalars['Upload'] +} + +export type DigitalContentUrl = Node & { + __typename?: 'DigitalContentUrl' + content: DigitalContent + created: Scalars['DateTime'] + downloadNum: Scalars['Int'] + /** The ID of the object. */ + id: Scalars['ID'] + /** URL for digital content. */ + url?: Maybe + /** UUID of digital content. */ + token: Scalars['UUID'] +} + +/** Generate new URL to digital content. */ +export type DigitalContentUrlCreate = { + __typename?: 'DigitalContentUrlCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + digitalContentUrl?: Maybe +} + +export type DigitalContentUrlCreateInput = { + /** Digital content ID which URL will belong to. */ + content: Scalars['ID'] +} + +export type DiscountError = { + __typename?: 'DiscountError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** List of products IDs which causes the error. */ + products?: Maybe> + /** The error code. */ + code: DiscountErrorCode + /** List of channels IDs which causes the error. */ + channels?: Maybe> +} + +/** An enumeration. */ +export enum DiscountErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + CannotManageProductWithoutVariant = 'CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', +} + +export enum DiscountStatusEnum { + Active = 'ACTIVE', + Expired = 'EXPIRED', + Scheduled = 'SCHEDULED', +} + +export enum DiscountValueTypeEnum { + Fixed = 'FIXED', + Percentage = 'PERCENTAGE', +} + +/** An enumeration. */ +export enum DistanceUnitsEnum { + Cm = 'CM', + M = 'M', + Km = 'KM', + Ft = 'FT', + Yd = 'YD', + Inch = 'INCH', +} + +/** Represents shop's domain. */ +export type Domain = { + __typename?: 'Domain' + /** The host name of the domain. */ + host: Scalars['String'] + /** Inform if SSL is enabled. */ + sslEnabled: Scalars['Boolean'] + /** Shop's absolute URL. */ + url: Scalars['String'] +} + +/** Deletes draft orders. */ +export type DraftOrderBulkDelete = { + __typename?: 'DraftOrderBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Completes creating an order. */ +export type DraftOrderComplete = { + __typename?: 'DraftOrderComplete' + /** Completed order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Creates a new draft order. */ +export type DraftOrderCreate = { + __typename?: 'DraftOrderCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array + order?: Maybe +} + +export type DraftOrderCreateInput = { + /** Billing address of the customer. */ + billingAddress?: Maybe + user?: Maybe + /** Email address of the customer. */ + userEmail?: Maybe + /** Discount amount for the order. */ + discount?: Maybe + /** Shipping address of the customer. */ + shippingAddress?: Maybe + /** ID of a selected shipping method. */ + shippingMethod?: Maybe + /** ID of the voucher associated with the order. */ + voucher?: Maybe + /** A note from a customer. Visible by customers in the order summary. */ + customerNote?: Maybe + /** ID of the channel associated with the order. */ + channel?: Maybe + /** URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. */ + redirectUrl?: Maybe + /** Variant line input consisting of variant ID and quantity of products. */ + lines?: Maybe>> +} + +/** Deletes a draft order. */ +export type DraftOrderDelete = { + __typename?: 'DraftOrderDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array + order?: Maybe +} + +export type DraftOrderInput = { + /** Billing address of the customer. */ + billingAddress?: Maybe + user?: Maybe + /** Email address of the customer. */ + userEmail?: Maybe + /** Discount amount for the order. */ + discount?: Maybe + /** Shipping address of the customer. */ + shippingAddress?: Maybe + /** ID of a selected shipping method. */ + shippingMethod?: Maybe + /** ID of the voucher associated with the order. */ + voucher?: Maybe + /** A note from a customer. Visible by customers in the order summary. */ + customerNote?: Maybe + /** ID of the channel associated with the order. */ + channel?: Maybe + /** URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. */ + redirectUrl?: Maybe +} + +/** Deletes order lines. */ +export type DraftOrderLinesBulkDelete = { + __typename?: 'DraftOrderLinesBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Updates a draft order. */ +export type DraftOrderUpdate = { + __typename?: 'DraftOrderUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array + order?: Maybe +} + +export type ExportError = { + __typename?: 'ExportError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ExportErrorCode +} + +/** An enumeration. */ +export enum ExportErrorCode { + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', +} + +/** History log of export file. */ +export type ExportEvent = Node & { + __typename?: 'ExportEvent' + /** The ID of the object. */ + id: Scalars['ID'] + /** Date when event happened at in ISO 8601 format. */ + date: Scalars['DateTime'] + /** Export event type. */ + type: ExportEventsEnum + /** User who performed the action. */ + user?: Maybe + /** App which performed the action. */ + app?: Maybe + /** Content of the event. */ + message: Scalars['String'] +} + +/** An enumeration. */ +export enum ExportEventsEnum { + ExportPending = 'EXPORT_PENDING', + ExportSuccess = 'EXPORT_SUCCESS', + ExportFailed = 'EXPORT_FAILED', + ExportDeleted = 'EXPORT_DELETED', + ExportedFileSent = 'EXPORTED_FILE_SENT', + ExportFailedInfoSent = 'EXPORT_FAILED_INFO_SENT', +} + +/** Represents a job data of exported file. */ +export type ExportFile = Node & + Job & { + __typename?: 'ExportFile' + /** The ID of the object. */ + id: Scalars['ID'] + user?: Maybe + app?: Maybe + /** Job status. */ + status: JobStatusEnum + /** Created date time of job in ISO 8601 format. */ + createdAt: Scalars['DateTime'] + /** Date time of job last update in ISO 8601 format. */ + updatedAt: Scalars['DateTime'] + /** Job message. */ + message?: Maybe + /** The URL of field to download. */ + url?: Maybe + /** List of events associated with the export. */ + events?: Maybe> + } + +export type ExportFileCountableConnection = { + __typename?: 'ExportFileCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type ExportFileCountableEdge = { + __typename?: 'ExportFileCountableEdge' + /** The item at the end of the edge. */ + node: ExportFile + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type ExportFileFilterInput = { + createdAt?: Maybe + updatedAt?: Maybe + status?: Maybe + user?: Maybe + app?: Maybe +} + +export enum ExportFileSortField { + /** Sort export file by status. */ + Status = 'STATUS', + /** Sort export file by created at. */ + CreatedAt = 'CREATED_AT', + /** Sort export file by updated at. */ + UpdatedAt = 'UPDATED_AT', +} + +export type ExportFileSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort export file by the selected field. */ + field: ExportFileSortField +} + +export type ExportInfoInput = { + /** List of attribute ids witch should be exported. */ + attributes?: Maybe> + /** List of warehouse ids witch should be exported. */ + warehouses?: Maybe> + /** List of channels ids which should be exported. */ + channels?: Maybe> + /** List of product fields witch should be exported. */ + fields?: Maybe> +} + +/** Export products to csv file. */ +export type ExportProducts = { + __typename?: 'ExportProducts' + /** The newly created export file job which is responsible for export data. */ + exportFile?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + exportErrors: Array + errors: Array +} + +export type ExportProductsInput = { + /** Determine which products should be exported. */ + scope: ExportScope + /** Filtering options for products. */ + filter?: Maybe + /** List of products IDS to export. */ + ids?: Maybe> + /** Input with info about fields which should be exported. */ + exportInfo?: Maybe + /** Type of exported file. */ + fileType: FileTypesEnum +} + +export enum ExportScope { + /** Export all products. */ + All = 'ALL', + /** Export products with given ids. */ + Ids = 'IDS', + /** Export the filtered products. */ + Filter = 'FILTER', +} + +export type ExternalAuthentication = { + __typename?: 'ExternalAuthentication' + /** ID of external authentication plugin. */ + id: Scalars['String'] + /** Name of external authentication plugin. */ + name?: Maybe +} + +/** Prepare external authentication url for user by custom plugin. */ +export type ExternalAuthenticationUrl = { + __typename?: 'ExternalAuthenticationUrl' + /** The data returned by authentication plugin. */ + authenticationData?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Logout user by custom plugin. */ +export type ExternalLogout = { + __typename?: 'ExternalLogout' + /** The data returned by authentication plugin. */ + logoutData?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Obtain external access tokens for user by custom plugin. */ +export type ExternalObtainAccessTokens = { + __typename?: 'ExternalObtainAccessTokens' + /** The token, required to authenticate. */ + token?: Maybe + /** The refresh token, required to re-generate external access token. */ + refreshToken?: Maybe + /** CSRF token required to re-generate external access token. */ + csrfToken?: Maybe + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Refresh user's access by custom plugin. */ +export type ExternalRefresh = { + __typename?: 'ExternalRefresh' + /** The token, required to authenticate. */ + token?: Maybe + /** The refresh token, required to re-generate external access token. */ + refreshToken?: Maybe + /** CSRF token required to re-generate external access token. */ + csrfToken?: Maybe + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Verify external authentication data by plugin. */ +export type ExternalVerify = { + __typename?: 'ExternalVerify' + /** User assigned to data. */ + user?: Maybe + /** Determine if authentication data is valid or not. */ + isValid: Scalars['Boolean'] + /** External data. */ + verifyData?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +export type File = { + __typename?: 'File' + /** The URL of the file. */ + url: Scalars['String'] + /** Content type of the file. */ + contentType?: Maybe +} + +/** An enumeration. */ +export enum FileTypesEnum { + Csv = 'CSV', + Xlsx = 'XLSX', +} + +/** Upload a file. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ +export type FileUpload = { + __typename?: 'FileUpload' + uploadedFile?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + uploadErrors: Array + errors: Array +} + +/** Represents order fulfillment. */ +export type Fulfillment = Node & + ObjectWithMetadata & { + __typename?: 'Fulfillment' + /** The ID of the object. */ + id: Scalars['ID'] + fulfillmentOrder: Scalars['Int'] + status: FulfillmentStatus + trackingNumber: Scalars['String'] + created: Scalars['DateTime'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** List of lines for the fulfillment. */ + lines?: Maybe>> + /** User-friendly fulfillment status. */ + statusDisplay?: Maybe + /** Warehouse from fulfillment was fulfilled. */ + warehouse?: Maybe + } + +/** Cancels existing fulfillment and optionally restocks items. */ +export type FulfillmentCancel = { + __typename?: 'FulfillmentCancel' + /** A canceled fulfillment. */ + fulfillment?: Maybe + /** Order which fulfillment was cancelled. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type FulfillmentCancelInput = { + /** ID of warehouse where items will be restock. */ + warehouseId: Scalars['ID'] +} + +/** Represents line of the fulfillment. */ +export type FulfillmentLine = Node & { + __typename?: 'FulfillmentLine' + /** The ID of the object. */ + id: Scalars['ID'] + quantity: Scalars['Int'] + orderLine?: Maybe +} + +/** Refund products. */ +export type FulfillmentRefundProducts = { + __typename?: 'FulfillmentRefundProducts' + /** A refunded fulfillment. */ + fulfillment?: Maybe + /** Order which fulfillment was refunded. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Return products. */ +export type FulfillmentReturnProducts = { + __typename?: 'FulfillmentReturnProducts' + /** A return fulfillment. */ + returnFulfillment?: Maybe + /** A replace fulfillment. */ + replaceFulfillment?: Maybe + /** Order which fulfillment was returned. */ + order?: Maybe + /** A draft order which was created for products with replace flag. */ + replaceOrder?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum FulfillmentStatus { + /** Fulfilled */ + Fulfilled = 'FULFILLED', + /** Refunded */ + Refunded = 'REFUNDED', + /** Returned */ + Returned = 'RETURNED', + /** Replaced */ + Replaced = 'REPLACED', + /** Refunded and returned */ + RefundedAndReturned = 'REFUNDED_AND_RETURNED', + /** Canceled */ + Canceled = 'CANCELED', +} + +/** Updates a fulfillment for an order. */ +export type FulfillmentUpdateTracking = { + __typename?: 'FulfillmentUpdateTracking' + /** A fulfillment with updated tracking. */ + fulfillment?: Maybe + /** Order for which fulfillment was updated. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type FulfillmentUpdateTrackingInput = { + /** Fulfillment tracking number. */ + trackingNumber?: Maybe + /** If true, send an email notification to the customer. */ + notifyCustomer?: Maybe +} + +/** Payment gateway client configuration key and value pair. */ +export type GatewayConfigLine = { + __typename?: 'GatewayConfigLine' + /** Gateway config key. */ + field: Scalars['String'] + /** Gateway config value for key. */ + value?: Maybe +} + +/** A gift card is a prepaid electronic payment card accepted in stores. They can be used during checkout by providing a valid gift card codes. */ +export type GiftCard = Node & { + __typename?: 'GiftCard' + /** Gift card code. */ + code?: Maybe + /** The customer who bought a gift card. */ + user?: Maybe + created: Scalars['DateTime'] + startDate: Scalars['Date'] + endDate?: Maybe + lastUsedOn?: Maybe + isActive: Scalars['Boolean'] + initialBalance?: Maybe + currentBalance?: Maybe + /** The ID of the object. */ + id: Scalars['ID'] + /** Code in format which allows displaying in a user interface. */ + displayCode?: Maybe +} + +/** Activate a gift card. */ +export type GiftCardActivate = { + __typename?: 'GiftCardActivate' + /** A gift card to activate. */ + giftCard?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + giftCardErrors: Array + errors: Array +} + +export type GiftCardCountableConnection = { + __typename?: 'GiftCardCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type GiftCardCountableEdge = { + __typename?: 'GiftCardCountableEdge' + /** The item at the end of the edge. */ + node: GiftCard + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new gift card. */ +export type GiftCardCreate = { + __typename?: 'GiftCardCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + giftCardErrors: Array + errors: Array + giftCard?: Maybe +} + +export type GiftCardCreateInput = { + /** Start date of the gift card in ISO 8601 format. */ + startDate?: Maybe + /** End date of the gift card in ISO 8601 format. */ + endDate?: Maybe + /** Value of the gift card. */ + balance?: Maybe + /** The customer's email of the gift card buyer. */ + userEmail?: Maybe + /** Code to use the gift card. */ + code?: Maybe +} + +/** Deactivate a gift card. */ +export type GiftCardDeactivate = { + __typename?: 'GiftCardDeactivate' + /** A gift card to deactivate. */ + giftCard?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + giftCardErrors: Array + errors: Array +} + +export type GiftCardError = { + __typename?: 'GiftCardError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: GiftCardErrorCode +} + +/** An enumeration. */ +export enum GiftCardErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +/** Update a gift card. */ +export type GiftCardUpdate = { + __typename?: 'GiftCardUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + giftCardErrors: Array + errors: Array + giftCard?: Maybe +} + +export type GiftCardUpdateInput = { + /** Start date of the gift card in ISO 8601 format. */ + startDate?: Maybe + /** End date of the gift card in ISO 8601 format. */ + endDate?: Maybe + /** Value of the gift card. */ + balance?: Maybe + /** The customer's email of the gift card buyer. */ + userEmail?: Maybe +} + +/** Represents permission group data. */ +export type Group = Node & { + __typename?: 'Group' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** List of group permissions */ + permissions?: Maybe>> + /** List of group users */ + users?: Maybe>> + /** True, if the currently authenticated user has rights to manage a group. */ + userCanManage: Scalars['Boolean'] +} + +export type GroupCountableConnection = { + __typename?: 'GroupCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type GroupCountableEdge = { + __typename?: 'GroupCountableEdge' + /** The item at the end of the edge. */ + node: Group + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Represents an image. */ +export type Image = { + __typename?: 'Image' + /** The URL of the image. */ + url: Scalars['String'] + /** Alt text for an image. */ + alt?: Maybe +} + +export type IntRangeInput = { + /** Value greater than or equal to. */ + gte?: Maybe + /** Value less than or equal to. */ + lte?: Maybe +} + +/** Represents an Invoice. */ +export type Invoice = ObjectWithMetadata & + Job & + Node & { + __typename?: 'Invoice' + /** The ID of the object. */ + id: Scalars['ID'] + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Job status. */ + status: JobStatusEnum + number?: Maybe + externalUrl?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** Created date time of job in ISO 8601 format. */ + createdAt: Scalars['DateTime'] + /** Date time of job last update in ISO 8601 format. */ + updatedAt: Scalars['DateTime'] + /** Job message. */ + message?: Maybe + /** URL to download an invoice. */ + url?: Maybe + } + +/** Creates a ready to send invoice. */ +export type InvoiceCreate = { + __typename?: 'InvoiceCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +export type InvoiceCreateInput = { + /** Invoice number. */ + number: Scalars['String'] + /** URL of an invoice to download. */ + url: Scalars['String'] +} + +/** Deletes an invoice. */ +export type InvoiceDelete = { + __typename?: 'InvoiceDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +export type InvoiceError = { + __typename?: 'InvoiceError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: InvoiceErrorCode +} + +/** An enumeration. */ +export enum InvoiceErrorCode { + Required = 'REQUIRED', + NotReady = 'NOT_READY', + UrlNotSet = 'URL_NOT_SET', + EmailNotSet = 'EMAIL_NOT_SET', + NumberNotSet = 'NUMBER_NOT_SET', + NotFound = 'NOT_FOUND', + InvalidStatus = 'INVALID_STATUS', +} + +/** Request an invoice for the order using plugin. */ +export type InvoiceRequest = { + __typename?: 'InvoiceRequest' + /** Order related to an invoice. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +/** Requests deletion of an invoice. */ +export type InvoiceRequestDelete = { + __typename?: 'InvoiceRequestDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +/** Send an invoice notification to the customer. */ +export type InvoiceSendNotification = { + __typename?: 'InvoiceSendNotification' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +/** Updates an invoice. */ +export type InvoiceUpdate = { + __typename?: 'InvoiceUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + invoiceErrors: Array + errors: Array + invoice?: Maybe +} + +export type Job = { + /** Job status. */ + status: JobStatusEnum + /** Created date time of job in ISO 8601 format. */ + createdAt: Scalars['DateTime'] + /** Date time of job last update in ISO 8601 format. */ + updatedAt: Scalars['DateTime'] + /** Job message. */ + message?: Maybe +} + +/** An enumeration. */ +export enum JobStatusEnum { + Pending = 'PENDING', + Success = 'SUCCESS', + Failed = 'FAILED', + Deleted = 'DELETED', +} + +/** An enumeration. */ +export enum LanguageCodeEnum { + Ar = 'AR', + Az = 'AZ', + Bg = 'BG', + Bn = 'BN', + Ca = 'CA', + Cs = 'CS', + Da = 'DA', + De = 'DE', + El = 'EL', + En = 'EN', + Es = 'ES', + EsCo = 'ES_CO', + Et = 'ET', + Fa = 'FA', + Fi = 'FI', + Fr = 'FR', + Hi = 'HI', + Hu = 'HU', + Hy = 'HY', + Id = 'ID', + Is = 'IS', + It = 'IT', + Ja = 'JA', + Ka = 'KA', + Km = 'KM', + Ko = 'KO', + Lt = 'LT', + Mn = 'MN', + My = 'MY', + Nb = 'NB', + Nl = 'NL', + Pl = 'PL', + Pt = 'PT', + PtBr = 'PT_BR', + Ro = 'RO', + Ru = 'RU', + Sk = 'SK', + Sl = 'SL', + Sq = 'SQ', + Sr = 'SR', + Sv = 'SV', + Sw = 'SW', + Ta = 'TA', + Th = 'TH', + Tr = 'TR', + Uk = 'UK', + Vi = 'VI', + ZhHans = 'ZH_HANS', + ZhHant = 'ZH_HANT', +} + +export type LanguageDisplay = { + __typename?: 'LanguageDisplay' + /** ISO 639 representation of the language name. */ + code: LanguageCodeEnum + /** Full name of the language. */ + language: Scalars['String'] +} + +export type LimitInfo = { + __typename?: 'LimitInfo' + /** Defines the current resource usage. */ + currentUsage: Limits + /** Defines the allowed maximum resource usage, null means unlimited. */ + allowedUsage: Limits +} + +export type Limits = { + __typename?: 'Limits' + channels?: Maybe + orders?: Maybe + productVariants?: Maybe + staffUsers?: Maybe + warehouses?: Maybe +} + +/** The manifest definition. */ +export type Manifest = { + __typename?: 'Manifest' + identifier: Scalars['String'] + version: Scalars['String'] + name: Scalars['String'] + about?: Maybe + permissions?: Maybe>> + appUrl?: Maybe + configurationUrl?: Maybe + tokenTargetUrl?: Maybe + dataPrivacy?: Maybe + dataPrivacyUrl?: Maybe + homepageUrl?: Maybe + supportUrl?: Maybe +} + +export type Margin = { + __typename?: 'Margin' + start?: Maybe + stop?: Maybe +} + +/** An enumeration. */ +export enum MeasurementUnitsEnum { + Cm = 'CM', + M = 'M', + Km = 'KM', + Ft = 'FT', + Yd = 'YD', + Inch = 'INCH', + SqCm = 'SQ_CM', + SqM = 'SQ_M', + SqKm = 'SQ_KM', + SqFt = 'SQ_FT', + SqYd = 'SQ_YD', + SqInch = 'SQ_INCH', + CubicMillimeter = 'CUBIC_MILLIMETER', + CubicCentimeter = 'CUBIC_CENTIMETER', + CubicDecimeter = 'CUBIC_DECIMETER', + CubicMeter = 'CUBIC_METER', + Liter = 'LITER', + CubicFoot = 'CUBIC_FOOT', + CubicInch = 'CUBIC_INCH', + CubicYard = 'CUBIC_YARD', + Qt = 'QT', + Pint = 'PINT', + FlOz = 'FL_OZ', + AcreIn = 'ACRE_IN', + AcreFt = 'ACRE_FT', + G = 'G', + Lb = 'LB', + Oz = 'OZ', + Kg = 'KG', + Tonne = 'TONNE', +} + +/** Represents a single menu - an object that is used to help navigate through the store. */ +export type Menu = Node & + ObjectWithMetadata & { + __typename?: 'Menu' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + slug: Scalars['String'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + items?: Maybe>> + } + +/** Deletes menus. */ +export type MenuBulkDelete = { + __typename?: 'MenuBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array +} + +export type MenuCountableConnection = { + __typename?: 'MenuCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type MenuCountableEdge = { + __typename?: 'MenuCountableEdge' + /** The item at the end of the edge. */ + node: Menu + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new Menu. */ +export type MenuCreate = { + __typename?: 'MenuCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menu?: Maybe +} + +export type MenuCreateInput = { + /** Name of the menu. */ + name: Scalars['String'] + /** Slug of the menu. Will be generated if not provided. */ + slug?: Maybe + /** List of menu items. */ + items?: Maybe>> +} + +/** Deletes a menu. */ +export type MenuDelete = { + __typename?: 'MenuDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menu?: Maybe +} + +export type MenuError = { + __typename?: 'MenuError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: MenuErrorCode +} + +/** An enumeration. */ +export enum MenuErrorCode { + CannotAssignNode = 'CANNOT_ASSIGN_NODE', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + InvalidMenuItem = 'INVALID_MENU_ITEM', + NoMenuItemProvided = 'NO_MENU_ITEM_PROVIDED', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + TooManyMenuItems = 'TOO_MANY_MENU_ITEMS', + Unique = 'UNIQUE', +} + +export type MenuFilterInput = { + search?: Maybe + slug?: Maybe>> + metadata?: Maybe>> +} + +export type MenuInput = { + /** Name of the menu. */ + name?: Maybe + /** Slug of the menu. */ + slug?: Maybe +} + +/** Represents a single item of the related menu. Can store categories, collection or pages. */ +export type MenuItem = Node & + ObjectWithMetadata & { + __typename?: 'MenuItem' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + menu: Menu + parent?: Maybe + category?: Maybe + collection?: Maybe + page?: Maybe + level: Scalars['Int'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + children?: Maybe>> + /** URL to the menu item. */ + url?: Maybe + /** Returns translated menu item fields for the given language code. */ + translation?: Maybe + } + +/** Represents a single item of the related menu. Can store categories, collection or pages. */ +export type MenuItemTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Deletes menu items. */ +export type MenuItemBulkDelete = { + __typename?: 'MenuItemBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array +} + +export type MenuItemCountableConnection = { + __typename?: 'MenuItemCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type MenuItemCountableEdge = { + __typename?: 'MenuItemCountableEdge' + /** The item at the end of the edge. */ + node: MenuItem + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new menu item. */ +export type MenuItemCreate = { + __typename?: 'MenuItemCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menuItem?: Maybe +} + +export type MenuItemCreateInput = { + /** Name of the menu item. */ + name: Scalars['String'] + /** URL of the pointed item. */ + url?: Maybe + /** Category to which item points. */ + category?: Maybe + /** Collection to which item points. */ + collection?: Maybe + /** Page to which item points. */ + page?: Maybe + /** Menu to which item belongs. */ + menu: Scalars['ID'] + /** ID of the parent menu. If empty, menu will be top level menu. */ + parent?: Maybe +} + +/** Deletes a menu item. */ +export type MenuItemDelete = { + __typename?: 'MenuItemDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menuItem?: Maybe +} + +export type MenuItemFilterInput = { + search?: Maybe + metadata?: Maybe>> +} + +export type MenuItemInput = { + /** Name of the menu item. */ + name?: Maybe + /** URL of the pointed item. */ + url?: Maybe + /** Category to which item points. */ + category?: Maybe + /** Collection to which item points. */ + collection?: Maybe + /** Page to which item points. */ + page?: Maybe +} + +/** Moves items of menus. */ +export type MenuItemMove = { + __typename?: 'MenuItemMove' + /** Assigned menu to move within. */ + menu?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array +} + +export type MenuItemMoveInput = { + /** The menu item ID to move. */ + itemId: Scalars['ID'] + /** ID of the parent menu. If empty, menu will be top level menu. */ + parentId?: Maybe + /** The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. */ + sortOrder?: Maybe +} + +export type MenuItemSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort menu items by the selected field. */ + field: MenuItemsSortField +} + +export type MenuItemTranslatableContent = Node & { + __typename?: 'MenuItemTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Returns translated menu item fields for the given language code. */ + translation?: Maybe + /** Represents a single item of the related menu. Can store categories, collection or pages. */ + menuItem?: Maybe +} + +export type MenuItemTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Menu Item. */ +export type MenuItemTranslate = { + __typename?: 'MenuItemTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + menuItem?: Maybe +} + +export type MenuItemTranslation = Node & { + __typename?: 'MenuItemTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Translation language. */ + language: LanguageDisplay +} + +/** Updates a menu item. */ +export type MenuItemUpdate = { + __typename?: 'MenuItemUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menuItem?: Maybe +} + +export enum MenuItemsSortField { + /** Sort menu items by name. */ + Name = 'NAME', +} + +export enum MenuSortField { + /** Sort menus by name. */ + Name = 'NAME', + /** Sort menus by items count. */ + ItemsCount = 'ITEMS_COUNT', +} + +export type MenuSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort menus by the selected field. */ + field: MenuSortField +} + +/** Updates a menu. */ +export type MenuUpdate = { + __typename?: 'MenuUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + menuErrors: Array + errors: Array + menu?: Maybe +} + +export type MetadataError = { + __typename?: 'MetadataError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: MetadataErrorCode +} + +/** An enumeration. */ +export enum MetadataErrorCode { + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', +} + +export type MetadataInput = { + /** Key of a metadata item. */ + key: Scalars['String'] + /** Value of a metadata item. */ + value: Scalars['String'] +} + +export type MetadataItem = { + __typename?: 'MetadataItem' + /** Key of a metadata item. */ + key: Scalars['String'] + /** Value of a metadata item. */ + value: Scalars['String'] +} + +/** Represents amount of money in specific currency. */ +export type Money = { + __typename?: 'Money' + /** Currency code. */ + currency: Scalars['String'] + /** Amount of money. */ + amount: Scalars['Float'] +} + +/** Represents a range of amounts of money. */ +export type MoneyRange = { + __typename?: 'MoneyRange' + /** Lower bound of a price range. */ + start?: Maybe + /** Upper bound of a price range. */ + stop?: Maybe +} + +export type MoveProductInput = { + /** The ID of the product to move. */ + productId: Scalars['ID'] + /** The relative sorting position of the product (from -inf to +inf) starting from the first given product's actual position.1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. */ + sortOrder?: Maybe +} + +export type Mutation = { + __typename?: 'Mutation' + /** Creates a new webhook subscription. */ + webhookCreate?: Maybe + /** Deletes a webhook subscription. */ + webhookDelete?: Maybe + /** Updates a webhook subscription. */ + webhookUpdate?: Maybe + /** Creates new warehouse. */ + createWarehouse?: Maybe + /** Updates given warehouse. */ + updateWarehouse?: Maybe + /** Deletes selected warehouse. */ + deleteWarehouse?: Maybe + /** Add shipping zone to given warehouse. */ + assignWarehouseShippingZone?: Maybe + /** Remove shipping zone from given warehouse. */ + unassignWarehouseShippingZone?: Maybe + /** Creates a new staff notification recipient. */ + staffNotificationRecipientCreate?: Maybe + /** Updates a staff notification recipient. */ + staffNotificationRecipientUpdate?: Maybe + /** Delete staff notification recipient. */ + staffNotificationRecipientDelete?: Maybe + /** Updates site domain of the shop. */ + shopDomainUpdate?: Maybe + /** Updates shop settings. */ + shopSettingsUpdate?: Maybe + /** Fetch tax rates. */ + shopFetchTaxRates?: Maybe + /** Creates/Updates translations for Shop Settings. */ + shopSettingsTranslate?: Maybe + /** Update the shop's address. If the `null` value is passed, the currently selected address will be deleted. */ + shopAddressUpdate?: Maybe + /** Update shop order settings. */ + orderSettingsUpdate?: Maybe + /** Manage shipping method's availability in channels. */ + shippingMethodChannelListingUpdate?: Maybe + /** Creates a new shipping price. */ + shippingPriceCreate?: Maybe + /** Deletes a shipping price. */ + shippingPriceDelete?: Maybe + /** Deletes shipping prices. */ + shippingPriceBulkDelete?: Maybe + /** Updates a new shipping price. */ + shippingPriceUpdate?: Maybe + /** Creates/Updates translations for shipping method. */ + shippingPriceTranslate?: Maybe + /** Exclude products from shipping price. */ + shippingPriceExcludeProducts?: Maybe + /** Remove product from excluded list for shipping price. */ + shippingPriceRemoveProductFromExclude?: Maybe + /** Creates a new shipping zone. */ + shippingZoneCreate?: Maybe + /** Deletes a shipping zone. */ + shippingZoneDelete?: Maybe + /** Deletes shipping zones. */ + shippingZoneBulkDelete?: Maybe + /** Updates a new shipping zone. */ + shippingZoneUpdate?: Maybe + /** Assign attributes to a given product type. */ + productAttributeAssign?: Maybe + /** Un-assign attributes from a given product type. */ + productAttributeUnassign?: Maybe + /** Creates a new category. */ + categoryCreate?: Maybe + /** Deletes a category. */ + categoryDelete?: Maybe + /** Deletes categories. */ + categoryBulkDelete?: Maybe + /** Updates a category. */ + categoryUpdate?: Maybe + /** Creates/Updates translations for Category. */ + categoryTranslate?: Maybe + /** Adds products to a collection. */ + collectionAddProducts?: Maybe + /** Creates a new collection. */ + collectionCreate?: Maybe + /** Deletes a collection. */ + collectionDelete?: Maybe + /** Reorder the products of a collection. */ + collectionReorderProducts?: Maybe + /** Deletes collections. */ + collectionBulkDelete?: Maybe + /** Remove products from a collection. */ + collectionRemoveProducts?: Maybe + /** Updates a collection. */ + collectionUpdate?: Maybe + /** Creates/Updates translations for collection. */ + collectionTranslate?: Maybe + /** Manage collection's availability in channels. */ + collectionChannelListingUpdate?: Maybe + /** Creates a new product. */ + productCreate?: Maybe + /** Deletes a product. */ + productDelete?: Maybe + /** Deletes products. */ + productBulkDelete?: Maybe + /** Updates an existing product. */ + productUpdate?: Maybe + /** Creates/Updates translations for Product. */ + productTranslate?: Maybe + /** Manage product's availability in channels. */ + productChannelListingUpdate?: Maybe + /** Create a media object (image or video URL) associated with product. For image, this mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ + productMediaCreate?: Maybe + /** Reorder the variants of a product. Mutation updates updated_at on product and triggers PRODUCT_UPDATED webhook. */ + productVariantReorder?: Maybe + /** Deletes a product media. */ + productMediaDelete?: Maybe + /** Deletes product media. */ + productMediaBulkDelete?: Maybe + /** Changes ordering of the product media. */ + productMediaReorder?: Maybe + /** Updates a product media. */ + productMediaUpdate?: Maybe + /** Creates a new product type. */ + productTypeCreate?: Maybe + /** Deletes a product type. */ + productTypeDelete?: Maybe + /** Deletes product types. */ + productTypeBulkDelete?: Maybe + /** Updates an existing product type. */ + productTypeUpdate?: Maybe + /** Reorder the attributes of a product type. */ + productTypeReorderAttributes?: Maybe + /** Reorder product attribute values. */ + productReorderAttributeValues?: Maybe + /** Create new digital content. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ + digitalContentCreate?: Maybe + /** Remove digital content assigned to given variant. */ + digitalContentDelete?: Maybe + /** Update digital content. */ + digitalContentUpdate?: Maybe + /** Generate new URL to digital content. */ + digitalContentUrlCreate?: Maybe + /** Creates a new variant for a product. */ + productVariantCreate?: Maybe + /** Deletes a product variant. */ + productVariantDelete?: Maybe + /** Creates product variants for a given product. */ + productVariantBulkCreate?: Maybe + /** Deletes product variants. */ + productVariantBulkDelete?: Maybe + /** Creates stocks for product variant. */ + productVariantStocksCreate?: Maybe + /** Delete stocks from product variant. */ + productVariantStocksDelete?: Maybe + /** Update stocks for product variant. */ + productVariantStocksUpdate?: Maybe + /** Updates an existing variant for product. */ + productVariantUpdate?: Maybe + /** Set default variant for a product. Mutation triggers PRODUCT_UPDATED webhook. */ + productVariantSetDefault?: Maybe + /** Creates/Updates translations for Product Variant. */ + productVariantTranslate?: Maybe + /** Manage product variant prices in channels. */ + productVariantChannelListingUpdate?: Maybe + /** Reorder product variant attribute values. */ + productVariantReorderAttributeValues?: Maybe + /** Assign an media to a product variant. */ + variantMediaAssign?: Maybe + /** Unassign an media from a product variant. */ + variantMediaUnassign?: Maybe + /** Captures the authorized payment amount. */ + paymentCapture?: Maybe + /** Refunds the captured payment amount. */ + paymentRefund?: Maybe + /** Voids the authorized payment. */ + paymentVoid?: Maybe + /** Initializes payment process when it is required by gateway. */ + paymentInitialize?: Maybe + /** Creates a new page. */ + pageCreate?: Maybe + /** Deletes a page. */ + pageDelete?: Maybe + /** Deletes pages. */ + pageBulkDelete?: Maybe + /** Publish pages. */ + pageBulkPublish?: Maybe + /** Updates an existing page. */ + pageUpdate?: Maybe + /** Creates/Updates translations for Page. */ + pageTranslate?: Maybe + /** Create a new page type. */ + pageTypeCreate?: Maybe + /** Update page type. */ + pageTypeUpdate?: Maybe + /** Delete a page type. */ + pageTypeDelete?: Maybe + /** Delete page types. */ + pageTypeBulkDelete?: Maybe + /** Assign attributes to a given page type. */ + pageAttributeAssign?: Maybe + /** Unassign attributes from a given page type. */ + pageAttributeUnassign?: Maybe + /** Reorder the attributes of a page type. */ + pageTypeReorderAttributes?: Maybe + /** Reorder page attribute values. */ + pageReorderAttributeValues?: Maybe + /** Completes creating an order. */ + draftOrderComplete?: Maybe + /** Creates a new draft order. */ + draftOrderCreate?: Maybe + /** Deletes a draft order. */ + draftOrderDelete?: Maybe + /** Deletes draft orders. */ + draftOrderBulkDelete?: Maybe + /** Deletes order lines. */ + draftOrderLinesBulkDelete?: Maybe + /** Updates a draft order. */ + draftOrderUpdate?: Maybe + /** Adds note to the order. */ + orderAddNote?: Maybe + /** Cancel an order. */ + orderCancel?: Maybe + /** Capture an order. */ + orderCapture?: Maybe + /** Confirms an unconfirmed order by changing status to unfulfilled. */ + orderConfirm?: Maybe + /** Creates new fulfillments for an order. */ + orderFulfill?: Maybe + /** Cancels existing fulfillment and optionally restocks items. */ + orderFulfillmentCancel?: Maybe + /** Updates a fulfillment for an order. */ + orderFulfillmentUpdateTracking?: Maybe + /** Refund products. */ + orderFulfillmentRefundProducts?: Maybe + /** Return products. */ + orderFulfillmentReturnProducts?: Maybe + /** Create order lines for an order. */ + orderLinesCreate?: Maybe + /** Deletes an order line from an order. */ + orderLineDelete?: Maybe + /** Updates an order line of an order. */ + orderLineUpdate?: Maybe + /** Adds discount to the order. */ + orderDiscountAdd?: Maybe + /** Update discount for the order. */ + orderDiscountUpdate?: Maybe + /** Remove discount from the order. */ + orderDiscountDelete?: Maybe + /** Update discount for the order line. */ + orderLineDiscountUpdate?: Maybe + /** Remove discount applied to the order line. */ + orderLineDiscountRemove?: Maybe + /** Mark order as manually paid. */ + orderMarkAsPaid?: Maybe + /** Refund an order. */ + orderRefund?: Maybe + /** Updates an order. */ + orderUpdate?: Maybe + /** Updates a shipping method of the order. */ + orderUpdateShipping?: Maybe + /** Void an order. */ + orderVoid?: Maybe + /** Cancels orders. */ + orderBulkCancel?: Maybe + /** Delete metadata of an object. */ + deleteMetadata?: Maybe + /** Delete object's private metadata. */ + deletePrivateMetadata?: Maybe + /** Updates metadata of an object. */ + updateMetadata?: Maybe + /** Updates private metadata of an object. */ + updatePrivateMetadata?: Maybe + /** Assigns storefront's navigation menus. */ + assignNavigation?: Maybe + /** Creates a new Menu. */ + menuCreate?: Maybe + /** Deletes a menu. */ + menuDelete?: Maybe + /** Deletes menus. */ + menuBulkDelete?: Maybe + /** Updates a menu. */ + menuUpdate?: Maybe + /** Creates a new menu item. */ + menuItemCreate?: Maybe + /** Deletes a menu item. */ + menuItemDelete?: Maybe + /** Deletes menu items. */ + menuItemBulkDelete?: Maybe + /** Updates a menu item. */ + menuItemUpdate?: Maybe + /** Creates/Updates translations for Menu Item. */ + menuItemTranslate?: Maybe + /** Moves items of menus. */ + menuItemMove?: Maybe + /** Request an invoice for the order using plugin. */ + invoiceRequest?: Maybe + /** Requests deletion of an invoice. */ + invoiceRequestDelete?: Maybe + /** Creates a ready to send invoice. */ + invoiceCreate?: Maybe + /** Deletes an invoice. */ + invoiceDelete?: Maybe + /** Updates an invoice. */ + invoiceUpdate?: Maybe + /** Send an invoice notification to the customer. */ + invoiceSendNotification?: Maybe + /** Activate a gift card. */ + giftCardActivate?: Maybe + /** Creates a new gift card. */ + giftCardCreate?: Maybe + /** Deactivate a gift card. */ + giftCardDeactivate?: Maybe + /** Update a gift card. */ + giftCardUpdate?: Maybe + /** Update plugin configuration. */ + pluginUpdate?: Maybe + /** Creates a new sale. */ + saleCreate?: Maybe + /** Deletes a sale. */ + saleDelete?: Maybe + /** Deletes sales. */ + saleBulkDelete?: Maybe + /** Updates a sale. */ + saleUpdate?: Maybe + /** Adds products, categories, collections to a voucher. */ + saleCataloguesAdd?: Maybe + /** Removes products, categories, collections from a sale. */ + saleCataloguesRemove?: Maybe + /** Creates/updates translations for a sale. */ + saleTranslate?: Maybe + /** Manage sale's availability in channels. */ + saleChannelListingUpdate?: Maybe + /** Creates a new voucher. */ + voucherCreate?: Maybe + /** Deletes a voucher. */ + voucherDelete?: Maybe + /** Deletes vouchers. */ + voucherBulkDelete?: Maybe + /** Updates a voucher. */ + voucherUpdate?: Maybe + /** Adds products, categories, collections to a voucher. */ + voucherCataloguesAdd?: Maybe + /** Removes products, categories, collections from a voucher. */ + voucherCataloguesRemove?: Maybe + /** Creates/Updates translations for Voucher. */ + voucherTranslate?: Maybe + /** Manage voucher's availability in channels. */ + voucherChannelListingUpdate?: Maybe + /** Export products to csv file. */ + exportProducts?: Maybe + /** Upload a file. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ + fileUpload?: Maybe + /** Adds a gift card or a voucher to a checkout. */ + checkoutAddPromoCode?: Maybe + /** Update billing address in the existing checkout. */ + checkoutBillingAddressUpdate?: Maybe + /** Completes the checkout. As a result a new order is created and a payment charge is made. This action requires a successful payment before it can be performed. In case additional confirmation step as 3D secure is required confirmationNeeded flag will be set to True and no order created until payment is confirmed with second call of this mutation. */ + checkoutComplete?: Maybe + /** Create a new checkout. */ + checkoutCreate?: Maybe + /** Sets the customer as the owner of the checkout. */ + checkoutCustomerAttach?: Maybe + /** Removes the user assigned as the owner of the checkout. */ + checkoutCustomerDetach?: Maybe + /** Updates email address in the existing checkout object. */ + checkoutEmailUpdate?: Maybe + /** Deletes a CheckoutLine. */ + checkoutLineDelete?: Maybe + /** Adds a checkout line to the existing checkout. */ + checkoutLinesAdd?: Maybe + /** Updates checkout line in the existing checkout. */ + checkoutLinesUpdate?: Maybe + /** Remove a gift card or a voucher from a checkout. */ + checkoutRemovePromoCode?: Maybe + /** Create a new payment for given checkout. */ + checkoutPaymentCreate?: Maybe + /** Update shipping address in the existing checkout. */ + checkoutShippingAddressUpdate?: Maybe + /** Updates the shipping address of the checkout. */ + checkoutShippingMethodUpdate?: Maybe + /** Update language code in the existing checkout. */ + checkoutLanguageCodeUpdate?: Maybe + /** Creates new channel. */ + channelCreate?: Maybe + /** Update a channel. */ + channelUpdate?: Maybe + /** Delete a channel. Orders associated with the deleted channel will be moved to the target channel. Checkouts, product availability, and pricing will be removed. */ + channelDelete?: Maybe + /** Activate a channel. */ + channelActivate?: Maybe + /** Deactivate a channel. */ + channelDeactivate?: Maybe + /** Creates an attribute. */ + attributeCreate?: Maybe + /** Deletes an attribute. */ + attributeDelete?: Maybe + /** Updates attribute. */ + attributeUpdate?: Maybe + /** Creates/Updates translations for attribute. */ + attributeTranslate?: Maybe + /** Deletes attributes. */ + attributeBulkDelete?: Maybe + /** Deletes values of attributes. */ + attributeValueBulkDelete?: Maybe + /** Creates a value for an attribute. */ + attributeValueCreate?: Maybe + /** Deletes a value of an attribute. */ + attributeValueDelete?: Maybe + /** Updates value of an attribute. */ + attributeValueUpdate?: Maybe + /** Creates/Updates translations for attribute value. */ + attributeValueTranslate?: Maybe + /** Reorder the values of an attribute. */ + attributeReorderValues?: Maybe + /** Creates a new app. */ + appCreate?: Maybe + /** Updates an existing app. */ + appUpdate?: Maybe + /** Deletes an app. */ + appDelete?: Maybe + /** Creates a new token. */ + appTokenCreate?: Maybe + /** Deletes an authentication token assigned to app. */ + appTokenDelete?: Maybe + /** Verify provided app token. */ + appTokenVerify?: Maybe + /** Install new app by using app manifest. */ + appInstall?: Maybe + /** Retry failed installation of new app. */ + appRetryInstall?: Maybe + /** Delete failed installation. */ + appDeleteFailedInstallation?: Maybe + /** Fetch and validate manifest. */ + appFetchManifest?: Maybe + /** Activate the app. */ + appActivate?: Maybe + /** Deactivate the app. */ + appDeactivate?: Maybe + /** Create JWT token. */ + tokenCreate?: Maybe + /** Refresh JWT token. Mutation tries to take refreshToken from the input.If it fails it will try to take refreshToken from the http-only cookie -refreshToken. csrfToken is required when refreshToken is provided as a cookie. */ + tokenRefresh?: Maybe + /** Verify JWT token. */ + tokenVerify?: Maybe + /** Deactivate all JWT tokens of the currently authenticated user. */ + tokensDeactivateAll?: Maybe + /** Prepare external authentication url for user by custom plugin. */ + externalAuthenticationUrl?: Maybe + /** Obtain external access tokens for user by custom plugin. */ + externalObtainAccessTokens?: Maybe + /** Refresh user's access by custom plugin. */ + externalRefresh?: Maybe + /** Logout user by custom plugin. */ + externalLogout?: Maybe + /** Verify external authentication data by plugin. */ + externalVerify?: Maybe + /** Sends an email with the account password modification link. */ + requestPasswordReset?: Maybe + /** Confirm user account with token sent by email during registration. */ + confirmAccount?: Maybe + /** Sets the user's password from the token sent by email using the RequestPasswordReset mutation. */ + setPassword?: Maybe + /** Change the password of the logged in user. */ + passwordChange?: Maybe + /** Request email change of the logged in user. */ + requestEmailChange?: Maybe + /** Confirm the email change of the logged-in user. */ + confirmEmailChange?: Maybe + /** Create a new address for the customer. */ + accountAddressCreate?: Maybe + /** Updates an address of the logged-in user. */ + accountAddressUpdate?: Maybe + /** Delete an address of the logged-in user. */ + accountAddressDelete?: Maybe + /** Sets a default address for the authenticated user. */ + accountSetDefaultAddress?: Maybe + /** Register a new user. */ + accountRegister?: Maybe + /** Updates the account of the logged-in user. */ + accountUpdate?: Maybe + /** Sends an email with the account removal link for the logged-in user. */ + accountRequestDeletion?: Maybe + /** Remove user account. */ + accountDelete?: Maybe + /** Creates user address. */ + addressCreate?: Maybe + /** Updates an address. */ + addressUpdate?: Maybe + /** Deletes an address. */ + addressDelete?: Maybe + /** Sets a default address for the given user. */ + addressSetDefault?: Maybe + /** Creates a new customer. */ + customerCreate?: Maybe + /** Updates an existing customer. */ + customerUpdate?: Maybe + /** Deletes a customer. */ + customerDelete?: Maybe + /** Deletes customers. */ + customerBulkDelete?: Maybe + /** Creates a new staff user. */ + staffCreate?: Maybe + /** Updates an existing staff user. */ + staffUpdate?: Maybe + /** Deletes a staff user. */ + staffDelete?: Maybe + /** Deletes staff users. */ + staffBulkDelete?: Maybe + /** Create a user avatar. Only for staff members. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ + userAvatarUpdate?: Maybe + /** Deletes a user avatar. Only for staff members. */ + userAvatarDelete?: Maybe + /** Activate or deactivate users. */ + userBulkSetActive?: Maybe + /** Create new permission group. */ + permissionGroupCreate?: Maybe + /** Update permission group. */ + permissionGroupUpdate?: Maybe + /** Delete permission group. */ + permissionGroupDelete?: Maybe +} + +export type MutationWebhookCreateArgs = { + input: WebhookCreateInput +} + +export type MutationWebhookDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationWebhookUpdateArgs = { + id: Scalars['ID'] + input: WebhookUpdateInput +} + +export type MutationCreateWarehouseArgs = { + input: WarehouseCreateInput +} + +export type MutationUpdateWarehouseArgs = { + id: Scalars['ID'] + input: WarehouseUpdateInput +} + +export type MutationDeleteWarehouseArgs = { + id: Scalars['ID'] +} + +export type MutationAssignWarehouseShippingZoneArgs = { + id: Scalars['ID'] + shippingZoneIds: Array +} + +export type MutationUnassignWarehouseShippingZoneArgs = { + id: Scalars['ID'] + shippingZoneIds: Array +} + +export type MutationStaffNotificationRecipientCreateArgs = { + input: StaffNotificationRecipientInput +} + +export type MutationStaffNotificationRecipientUpdateArgs = { + id: Scalars['ID'] + input: StaffNotificationRecipientInput +} + +export type MutationStaffNotificationRecipientDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationShopDomainUpdateArgs = { + input?: Maybe +} + +export type MutationShopSettingsUpdateArgs = { + input: ShopSettingsInput +} + +export type MutationShopSettingsTranslateArgs = { + input: ShopSettingsTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationShopAddressUpdateArgs = { + input?: Maybe +} + +export type MutationOrderSettingsUpdateArgs = { + input: OrderSettingsUpdateInput +} + +export type MutationShippingMethodChannelListingUpdateArgs = { + id: Scalars['ID'] + input: ShippingMethodChannelListingInput +} + +export type MutationShippingPriceCreateArgs = { + input: ShippingPriceInput +} + +export type MutationShippingPriceDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationShippingPriceBulkDeleteArgs = { + ids: Array> +} + +export type MutationShippingPriceUpdateArgs = { + id: Scalars['ID'] + input: ShippingPriceInput +} + +export type MutationShippingPriceTranslateArgs = { + id: Scalars['ID'] + input: ShippingPriceTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationShippingPriceExcludeProductsArgs = { + id: Scalars['ID'] + input: ShippingPriceExcludeProductsInput +} + +export type MutationShippingPriceRemoveProductFromExcludeArgs = { + id: Scalars['ID'] + products: Array> +} + +export type MutationShippingZoneCreateArgs = { + input: ShippingZoneCreateInput +} + +export type MutationShippingZoneDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationShippingZoneBulkDeleteArgs = { + ids: Array> +} + +export type MutationShippingZoneUpdateArgs = { + id: Scalars['ID'] + input: ShippingZoneUpdateInput +} + +export type MutationProductAttributeAssignArgs = { + operations: Array> + productTypeId: Scalars['ID'] +} + +export type MutationProductAttributeUnassignArgs = { + attributeIds: Array> + productTypeId: Scalars['ID'] +} + +export type MutationCategoryCreateArgs = { + input: CategoryInput + parent?: Maybe +} + +export type MutationCategoryDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationCategoryBulkDeleteArgs = { + ids: Array> +} + +export type MutationCategoryUpdateArgs = { + id: Scalars['ID'] + input: CategoryInput +} + +export type MutationCategoryTranslateArgs = { + id: Scalars['ID'] + input: TranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationCollectionAddProductsArgs = { + collectionId: Scalars['ID'] + products: Array> +} + +export type MutationCollectionCreateArgs = { + input: CollectionCreateInput +} + +export type MutationCollectionDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationCollectionReorderProductsArgs = { + collectionId: Scalars['ID'] + moves: Array> +} + +export type MutationCollectionBulkDeleteArgs = { + ids: Array> +} + +export type MutationCollectionRemoveProductsArgs = { + collectionId: Scalars['ID'] + products: Array> +} + +export type MutationCollectionUpdateArgs = { + id: Scalars['ID'] + input: CollectionInput +} + +export type MutationCollectionTranslateArgs = { + id: Scalars['ID'] + input: TranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationCollectionChannelListingUpdateArgs = { + id: Scalars['ID'] + input: CollectionChannelListingUpdateInput +} + +export type MutationProductCreateArgs = { + input: ProductCreateInput +} + +export type MutationProductDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationProductBulkDeleteArgs = { + ids: Array> +} + +export type MutationProductUpdateArgs = { + id: Scalars['ID'] + input: ProductInput +} + +export type MutationProductTranslateArgs = { + id: Scalars['ID'] + input: TranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationProductChannelListingUpdateArgs = { + id: Scalars['ID'] + input: ProductChannelListingUpdateInput +} + +export type MutationProductMediaCreateArgs = { + input: ProductMediaCreateInput +} + +export type MutationProductVariantReorderArgs = { + moves: Array> + productId: Scalars['ID'] +} + +export type MutationProductMediaDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationProductMediaBulkDeleteArgs = { + ids: Array> +} + +export type MutationProductMediaReorderArgs = { + mediaIds: Array> + productId: Scalars['ID'] +} + +export type MutationProductMediaUpdateArgs = { + id: Scalars['ID'] + input: ProductMediaUpdateInput +} + +export type MutationProductTypeCreateArgs = { + input: ProductTypeInput +} + +export type MutationProductTypeDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationProductTypeBulkDeleteArgs = { + ids: Array> +} + +export type MutationProductTypeUpdateArgs = { + id: Scalars['ID'] + input: ProductTypeInput +} + +export type MutationProductTypeReorderAttributesArgs = { + moves: Array> + productTypeId: Scalars['ID'] + type: ProductAttributeType +} + +export type MutationProductReorderAttributeValuesArgs = { + attributeId: Scalars['ID'] + moves: Array> + productId: Scalars['ID'] +} + +export type MutationDigitalContentCreateArgs = { + input: DigitalContentUploadInput + variantId: Scalars['ID'] +} + +export type MutationDigitalContentDeleteArgs = { + variantId: Scalars['ID'] +} + +export type MutationDigitalContentUpdateArgs = { + input: DigitalContentInput + variantId: Scalars['ID'] +} + +export type MutationDigitalContentUrlCreateArgs = { + input: DigitalContentUrlCreateInput +} + +export type MutationProductVariantCreateArgs = { + input: ProductVariantCreateInput +} + +export type MutationProductVariantDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationProductVariantBulkCreateArgs = { + product: Scalars['ID'] + variants: Array> +} + +export type MutationProductVariantBulkDeleteArgs = { + ids: Array> +} + +export type MutationProductVariantStocksCreateArgs = { + stocks: Array + variantId: Scalars['ID'] +} + +export type MutationProductVariantStocksDeleteArgs = { + variantId: Scalars['ID'] + warehouseIds?: Maybe> +} + +export type MutationProductVariantStocksUpdateArgs = { + stocks: Array + variantId: Scalars['ID'] +} + +export type MutationProductVariantUpdateArgs = { + id: Scalars['ID'] + input: ProductVariantInput +} + +export type MutationProductVariantSetDefaultArgs = { + productId: Scalars['ID'] + variantId: Scalars['ID'] +} + +export type MutationProductVariantTranslateArgs = { + id: Scalars['ID'] + input: NameTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationProductVariantChannelListingUpdateArgs = { + id: Scalars['ID'] + input: Array +} + +export type MutationProductVariantReorderAttributeValuesArgs = { + attributeId: Scalars['ID'] + moves: Array> + variantId: Scalars['ID'] +} + +export type MutationVariantMediaAssignArgs = { + mediaId: Scalars['ID'] + variantId: Scalars['ID'] +} + +export type MutationVariantMediaUnassignArgs = { + mediaId: Scalars['ID'] + variantId: Scalars['ID'] +} + +export type MutationPaymentCaptureArgs = { + amount?: Maybe + paymentId: Scalars['ID'] +} + +export type MutationPaymentRefundArgs = { + amount?: Maybe + paymentId: Scalars['ID'] +} + +export type MutationPaymentVoidArgs = { + paymentId: Scalars['ID'] +} + +export type MutationPaymentInitializeArgs = { + channel?: Maybe + gateway: Scalars['String'] + paymentData?: Maybe +} + +export type MutationPageCreateArgs = { + input: PageCreateInput +} + +export type MutationPageDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationPageBulkDeleteArgs = { + ids: Array> +} + +export type MutationPageBulkPublishArgs = { + ids: Array> + isPublished: Scalars['Boolean'] +} + +export type MutationPageUpdateArgs = { + id: Scalars['ID'] + input: PageInput +} + +export type MutationPageTranslateArgs = { + id: Scalars['ID'] + input: PageTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationPageTypeCreateArgs = { + input: PageTypeCreateInput +} + +export type MutationPageTypeUpdateArgs = { + id?: Maybe + input: PageTypeUpdateInput +} + +export type MutationPageTypeDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationPageTypeBulkDeleteArgs = { + ids: Array +} + +export type MutationPageAttributeAssignArgs = { + attributeIds: Array + pageTypeId: Scalars['ID'] +} + +export type MutationPageAttributeUnassignArgs = { + attributeIds: Array + pageTypeId: Scalars['ID'] +} + +export type MutationPageTypeReorderAttributesArgs = { + moves: Array + pageTypeId: Scalars['ID'] +} + +export type MutationPageReorderAttributeValuesArgs = { + attributeId: Scalars['ID'] + moves: Array> + pageId: Scalars['ID'] +} + +export type MutationDraftOrderCompleteArgs = { + id: Scalars['ID'] +} + +export type MutationDraftOrderCreateArgs = { + input: DraftOrderCreateInput +} + +export type MutationDraftOrderDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationDraftOrderBulkDeleteArgs = { + ids: Array> +} + +export type MutationDraftOrderLinesBulkDeleteArgs = { + ids: Array> +} + +export type MutationDraftOrderUpdateArgs = { + id: Scalars['ID'] + input: DraftOrderInput +} + +export type MutationOrderAddNoteArgs = { + order: Scalars['ID'] + input: OrderAddNoteInput +} + +export type MutationOrderCancelArgs = { + id: Scalars['ID'] +} + +export type MutationOrderCaptureArgs = { + amount: Scalars['PositiveDecimal'] + id: Scalars['ID'] +} + +export type MutationOrderConfirmArgs = { + id: Scalars['ID'] +} + +export type MutationOrderFulfillArgs = { + input: OrderFulfillInput + order?: Maybe +} + +export type MutationOrderFulfillmentCancelArgs = { + id: Scalars['ID'] + input: FulfillmentCancelInput +} + +export type MutationOrderFulfillmentUpdateTrackingArgs = { + id: Scalars['ID'] + input: FulfillmentUpdateTrackingInput +} + +export type MutationOrderFulfillmentRefundProductsArgs = { + input: OrderRefundProductsInput + order: Scalars['ID'] +} + +export type MutationOrderFulfillmentReturnProductsArgs = { + input: OrderReturnProductsInput + order: Scalars['ID'] +} + +export type MutationOrderLinesCreateArgs = { + id: Scalars['ID'] + input: Array> +} + +export type MutationOrderLineDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationOrderLineUpdateArgs = { + id: Scalars['ID'] + input: OrderLineInput +} + +export type MutationOrderDiscountAddArgs = { + input: OrderDiscountCommonInput + orderId: Scalars['ID'] +} + +export type MutationOrderDiscountUpdateArgs = { + discountId: Scalars['ID'] + input: OrderDiscountCommonInput +} + +export type MutationOrderDiscountDeleteArgs = { + discountId: Scalars['ID'] +} + +export type MutationOrderLineDiscountUpdateArgs = { + input: OrderDiscountCommonInput + orderLineId: Scalars['ID'] +} + +export type MutationOrderLineDiscountRemoveArgs = { + orderLineId: Scalars['ID'] +} + +export type MutationOrderMarkAsPaidArgs = { + id: Scalars['ID'] + transactionReference?: Maybe +} + +export type MutationOrderRefundArgs = { + amount: Scalars['PositiveDecimal'] + id: Scalars['ID'] +} + +export type MutationOrderUpdateArgs = { + id: Scalars['ID'] + input: OrderUpdateInput +} + +export type MutationOrderUpdateShippingArgs = { + order: Scalars['ID'] + input?: Maybe +} + +export type MutationOrderVoidArgs = { + id: Scalars['ID'] +} + +export type MutationOrderBulkCancelArgs = { + ids: Array> +} + +export type MutationDeleteMetadataArgs = { + id: Scalars['ID'] + keys: Array +} + +export type MutationDeletePrivateMetadataArgs = { + id: Scalars['ID'] + keys: Array +} + +export type MutationUpdateMetadataArgs = { + id: Scalars['ID'] + input: Array +} + +export type MutationUpdatePrivateMetadataArgs = { + id: Scalars['ID'] + input: Array +} + +export type MutationAssignNavigationArgs = { + menu?: Maybe + navigationType: NavigationType +} + +export type MutationMenuCreateArgs = { + input: MenuCreateInput +} + +export type MutationMenuDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationMenuBulkDeleteArgs = { + ids: Array> +} + +export type MutationMenuUpdateArgs = { + id: Scalars['ID'] + input: MenuInput +} + +export type MutationMenuItemCreateArgs = { + input: MenuItemCreateInput +} + +export type MutationMenuItemDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationMenuItemBulkDeleteArgs = { + ids: Array> +} + +export type MutationMenuItemUpdateArgs = { + id: Scalars['ID'] + input: MenuItemInput +} + +export type MutationMenuItemTranslateArgs = { + id: Scalars['ID'] + input: NameTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationMenuItemMoveArgs = { + menu: Scalars['ID'] + moves: Array> +} + +export type MutationInvoiceRequestArgs = { + number?: Maybe + orderId: Scalars['ID'] +} + +export type MutationInvoiceRequestDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationInvoiceCreateArgs = { + input: InvoiceCreateInput + orderId: Scalars['ID'] +} + +export type MutationInvoiceDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationInvoiceUpdateArgs = { + id: Scalars['ID'] + input: UpdateInvoiceInput +} + +export type MutationInvoiceSendNotificationArgs = { + id: Scalars['ID'] +} + +export type MutationGiftCardActivateArgs = { + id: Scalars['ID'] +} + +export type MutationGiftCardCreateArgs = { + input: GiftCardCreateInput +} + +export type MutationGiftCardDeactivateArgs = { + id: Scalars['ID'] +} + +export type MutationGiftCardUpdateArgs = { + id: Scalars['ID'] + input: GiftCardUpdateInput +} + +export type MutationPluginUpdateArgs = { + channel?: Maybe + id: Scalars['ID'] + input: PluginUpdateInput +} + +export type MutationSaleCreateArgs = { + input: SaleInput +} + +export type MutationSaleDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationSaleBulkDeleteArgs = { + ids: Array> +} + +export type MutationSaleUpdateArgs = { + id: Scalars['ID'] + input: SaleInput +} + +export type MutationSaleCataloguesAddArgs = { + id: Scalars['ID'] + input: CatalogueInput +} + +export type MutationSaleCataloguesRemoveArgs = { + id: Scalars['ID'] + input: CatalogueInput +} + +export type MutationSaleTranslateArgs = { + id: Scalars['ID'] + input: NameTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationSaleChannelListingUpdateArgs = { + id: Scalars['ID'] + input: SaleChannelListingInput +} + +export type MutationVoucherCreateArgs = { + input: VoucherInput +} + +export type MutationVoucherDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationVoucherBulkDeleteArgs = { + ids: Array> +} + +export type MutationVoucherUpdateArgs = { + id: Scalars['ID'] + input: VoucherInput +} + +export type MutationVoucherCataloguesAddArgs = { + id: Scalars['ID'] + input: CatalogueInput +} + +export type MutationVoucherCataloguesRemoveArgs = { + id: Scalars['ID'] + input: CatalogueInput +} + +export type MutationVoucherTranslateArgs = { + id: Scalars['ID'] + input: NameTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationVoucherChannelListingUpdateArgs = { + id: Scalars['ID'] + input: VoucherChannelListingInput +} + +export type MutationExportProductsArgs = { + input: ExportProductsInput +} + +export type MutationFileUploadArgs = { + file: Scalars['Upload'] +} + +export type MutationCheckoutAddPromoCodeArgs = { + checkoutId: Scalars['ID'] + promoCode: Scalars['String'] +} + +export type MutationCheckoutBillingAddressUpdateArgs = { + billingAddress: AddressInput + checkoutId: Scalars['ID'] +} + +export type MutationCheckoutCompleteArgs = { + checkoutId: Scalars['ID'] + paymentData?: Maybe + redirectUrl?: Maybe + storeSource?: Maybe +} + +export type MutationCheckoutCreateArgs = { + input: CheckoutCreateInput +} + +export type MutationCheckoutCustomerAttachArgs = { + checkoutId: Scalars['ID'] +} + +export type MutationCheckoutCustomerDetachArgs = { + checkoutId: Scalars['ID'] +} + +export type MutationCheckoutEmailUpdateArgs = { + checkoutId?: Maybe + email: Scalars['String'] +} + +export type MutationCheckoutLineDeleteArgs = { + checkoutId: Scalars['ID'] + lineId?: Maybe +} + +export type MutationCheckoutLinesAddArgs = { + checkoutId: Scalars['ID'] + lines: Array> +} + +export type MutationCheckoutLinesUpdateArgs = { + checkoutId: Scalars['ID'] + lines: Array> +} + +export type MutationCheckoutRemovePromoCodeArgs = { + checkoutId: Scalars['ID'] + promoCode: Scalars['String'] +} + +export type MutationCheckoutPaymentCreateArgs = { + checkoutId: Scalars['ID'] + input: PaymentInput +} + +export type MutationCheckoutShippingAddressUpdateArgs = { + checkoutId: Scalars['ID'] + shippingAddress: AddressInput +} + +export type MutationCheckoutShippingMethodUpdateArgs = { + checkoutId?: Maybe + shippingMethodId: Scalars['ID'] +} + +export type MutationCheckoutLanguageCodeUpdateArgs = { + checkoutId: Scalars['ID'] + languageCode: LanguageCodeEnum +} + +export type MutationChannelCreateArgs = { + input: ChannelCreateInput +} + +export type MutationChannelUpdateArgs = { + id: Scalars['ID'] + input: ChannelUpdateInput +} + +export type MutationChannelDeleteArgs = { + id: Scalars['ID'] + input?: Maybe +} + +export type MutationChannelActivateArgs = { + id: Scalars['ID'] +} + +export type MutationChannelDeactivateArgs = { + id: Scalars['ID'] +} + +export type MutationAttributeCreateArgs = { + input: AttributeCreateInput +} + +export type MutationAttributeDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAttributeUpdateArgs = { + id: Scalars['ID'] + input: AttributeUpdateInput +} + +export type MutationAttributeTranslateArgs = { + id: Scalars['ID'] + input: NameTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationAttributeBulkDeleteArgs = { + ids: Array> +} + +export type MutationAttributeValueBulkDeleteArgs = { + ids: Array> +} + +export type MutationAttributeValueCreateArgs = { + attribute: Scalars['ID'] + input: AttributeValueCreateInput +} + +export type MutationAttributeValueDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAttributeValueUpdateArgs = { + id: Scalars['ID'] + input: AttributeValueCreateInput +} + +export type MutationAttributeValueTranslateArgs = { + id: Scalars['ID'] + input: AttributeValueTranslationInput + languageCode: LanguageCodeEnum +} + +export type MutationAttributeReorderValuesArgs = { + attributeId: Scalars['ID'] + moves: Array> +} + +export type MutationAppCreateArgs = { + input: AppInput +} + +export type MutationAppUpdateArgs = { + id: Scalars['ID'] + input: AppInput +} + +export type MutationAppDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAppTokenCreateArgs = { + input: AppTokenInput +} + +export type MutationAppTokenDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAppTokenVerifyArgs = { + token: Scalars['String'] +} + +export type MutationAppInstallArgs = { + input: AppInstallInput +} + +export type MutationAppRetryInstallArgs = { + activateAfterInstallation?: Maybe + id: Scalars['ID'] +} + +export type MutationAppDeleteFailedInstallationArgs = { + id: Scalars['ID'] +} + +export type MutationAppFetchManifestArgs = { + manifestUrl: Scalars['String'] +} + +export type MutationAppActivateArgs = { + id: Scalars['ID'] +} + +export type MutationAppDeactivateArgs = { + id: Scalars['ID'] +} + +export type MutationTokenCreateArgs = { + email: Scalars['String'] + password: Scalars['String'] +} + +export type MutationTokenRefreshArgs = { + csrfToken?: Maybe + refreshToken?: Maybe +} + +export type MutationTokenVerifyArgs = { + token: Scalars['String'] +} + +export type MutationExternalAuthenticationUrlArgs = { + input: Scalars['JSONString'] + pluginId: Scalars['String'] +} + +export type MutationExternalObtainAccessTokensArgs = { + input: Scalars['JSONString'] + pluginId: Scalars['String'] +} + +export type MutationExternalRefreshArgs = { + input: Scalars['JSONString'] + pluginId: Scalars['String'] +} + +export type MutationExternalLogoutArgs = { + input: Scalars['JSONString'] + pluginId: Scalars['String'] +} + +export type MutationExternalVerifyArgs = { + input: Scalars['JSONString'] + pluginId: Scalars['String'] +} + +export type MutationRequestPasswordResetArgs = { + channel?: Maybe + email: Scalars['String'] + redirectUrl: Scalars['String'] +} + +export type MutationConfirmAccountArgs = { + email: Scalars['String'] + token: Scalars['String'] +} + +export type MutationSetPasswordArgs = { + email: Scalars['String'] + password: Scalars['String'] + token: Scalars['String'] +} + +export type MutationPasswordChangeArgs = { + newPassword: Scalars['String'] + oldPassword: Scalars['String'] +} + +export type MutationRequestEmailChangeArgs = { + channel?: Maybe + newEmail: Scalars['String'] + password: Scalars['String'] + redirectUrl: Scalars['String'] +} + +export type MutationConfirmEmailChangeArgs = { + channel?: Maybe + token: Scalars['String'] +} + +export type MutationAccountAddressCreateArgs = { + input: AddressInput + type?: Maybe +} + +export type MutationAccountAddressUpdateArgs = { + id: Scalars['ID'] + input: AddressInput +} + +export type MutationAccountAddressDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAccountSetDefaultAddressArgs = { + id: Scalars['ID'] + type: AddressTypeEnum +} + +export type MutationAccountRegisterArgs = { + input: AccountRegisterInput +} + +export type MutationAccountUpdateArgs = { + input: AccountInput +} + +export type MutationAccountRequestDeletionArgs = { + channel?: Maybe + redirectUrl: Scalars['String'] +} + +export type MutationAccountDeleteArgs = { + token: Scalars['String'] +} + +export type MutationAddressCreateArgs = { + input: AddressInput + userId: Scalars['ID'] +} + +export type MutationAddressUpdateArgs = { + id: Scalars['ID'] + input: AddressInput +} + +export type MutationAddressDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationAddressSetDefaultArgs = { + addressId: Scalars['ID'] + type: AddressTypeEnum + userId: Scalars['ID'] +} + +export type MutationCustomerCreateArgs = { + input: UserCreateInput +} + +export type MutationCustomerUpdateArgs = { + id: Scalars['ID'] + input: CustomerInput +} + +export type MutationCustomerDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationCustomerBulkDeleteArgs = { + ids: Array> +} + +export type MutationStaffCreateArgs = { + input: StaffCreateInput +} + +export type MutationStaffUpdateArgs = { + id: Scalars['ID'] + input: StaffUpdateInput +} + +export type MutationStaffDeleteArgs = { + id: Scalars['ID'] +} + +export type MutationStaffBulkDeleteArgs = { + ids: Array> +} + +export type MutationUserAvatarUpdateArgs = { + image: Scalars['Upload'] +} + +export type MutationUserBulkSetActiveArgs = { + ids: Array> + isActive: Scalars['Boolean'] +} + +export type MutationPermissionGroupCreateArgs = { + input: PermissionGroupCreateInput +} + +export type MutationPermissionGroupUpdateArgs = { + id: Scalars['ID'] + input: PermissionGroupUpdateInput +} + +export type MutationPermissionGroupDeleteArgs = { + id: Scalars['ID'] +} + +export type NameTranslationInput = { + name?: Maybe +} + +export enum NavigationType { + /** Main storefront navigation. */ + Main = 'MAIN', + /** Secondary storefront navigation. */ + Secondary = 'SECONDARY', +} + +/** An object with an ID */ +export type Node = { + /** The ID of the object. */ + id: Scalars['ID'] +} + +export type ObjectWithMetadata = { + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> +} + +/** Represents an order in the shop. */ +export type Order = Node & + ObjectWithMetadata & { + __typename?: 'Order' + /** The ID of the object. */ + id: Scalars['ID'] + created: Scalars['DateTime'] + status: OrderStatus + user?: Maybe + trackingClientId: Scalars['String'] + billingAddress?: Maybe
+ shippingAddress?: Maybe
+ shippingMethod?: Maybe + shippingMethodName?: Maybe + channel: Channel + /** Total price of shipping. */ + shippingPrice: TaxedMoney + shippingTaxRate: Scalars['Float'] + token: Scalars['String'] + voucher?: Maybe + /** List of user gift cards. */ + giftCards?: Maybe>> + displayGrossPrices: Scalars['Boolean'] + customerNote: Scalars['String'] + weight?: Maybe + redirectUrl?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** List of shipments for the order. */ + fulfillments: Array> + /** List of order lines. */ + lines: Array> + /** List of actions that can be performed in the current state of an order. */ + actions: Array> + /** Shipping methods that can be used with this order. */ + availableShippingMethods?: Maybe>> + /** List of order invoices. */ + invoices?: Maybe>> + /** User-friendly number of an order. */ + number?: Maybe + /** The ID of the order that was the base for this order. */ + original?: Maybe + /** The order origin. */ + origin: OrderOriginEnum + /** Informs if an order is fully paid. */ + isPaid: Scalars['Boolean'] + /** Internal payment status. */ + paymentStatus: PaymentChargeStatusEnum + /** User-friendly payment status. */ + paymentStatusDisplay: Scalars['String'] + /** List of payments for the order. */ + payments?: Maybe>> + /** Total amount of the order. */ + total: TaxedMoney + /** Undiscounted total amount of the order. */ + undiscountedTotal: TaxedMoney + /** The sum of line prices not including shipping. */ + subtotal: TaxedMoney + /** User-friendly order status. */ + statusDisplay?: Maybe + /** Informs whether a draft order can be finalized(turned into a regular order). */ + canFinalize: Scalars['Boolean'] + /** Amount authorized for the order. */ + totalAuthorized: Money + /** Amount captured by payment. */ + totalCaptured: Money + /** List of events associated with the order. */ + events?: Maybe>> + /** The difference between the paid and the order total amount. */ + totalBalance: Money + /** Email address of the customer. */ + userEmail?: Maybe + /** Returns True, if order requires shipping. */ + isShippingRequired: Scalars['Boolean'] + /** @deprecated Use the `languageCodeEnum` field to fetch the language code. This field will be removed in Saleor 4.0. */ + languageCode: Scalars['String'] + /** Order language code. */ + languageCodeEnum: LanguageCodeEnum + /** + * Returns applied discount. + * @deprecated Use discounts field. This field will be removed in Saleor 4.0. + */ + discount?: Maybe + /** + * Discount name. + * @deprecated Use discounts field. This field will be removed in Saleor 4.0. + */ + discountName?: Maybe + /** + * Translated discount name. + * @deprecated Use discounts field. This field will be removed in Saleor 4.0. + */ + translatedDiscountName?: Maybe + /** List of all discounts assigned to the order. */ + discounts?: Maybe> + } + +export enum OrderAction { + /** Represents the capture action. */ + Capture = 'CAPTURE', + /** Represents a mark-as-paid action. */ + MarkAsPaid = 'MARK_AS_PAID', + /** Represents a refund action. */ + Refund = 'REFUND', + /** Represents a void action. */ + Void = 'VOID', +} + +/** Adds note to the order. */ +export type OrderAddNote = { + __typename?: 'OrderAddNote' + /** Order with the note added. */ + order?: Maybe + /** Order note created. */ + event?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderAddNoteInput = { + /** Note message. */ + message: Scalars['String'] +} + +/** Cancels orders. */ +export type OrderBulkCancel = { + __typename?: 'OrderBulkCancel' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Cancel an order. */ +export type OrderCancel = { + __typename?: 'OrderCancel' + /** Canceled order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Capture an order. */ +export type OrderCapture = { + __typename?: 'OrderCapture' + /** Captured order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Confirms an unconfirmed order by changing status to unfulfilled. */ +export type OrderConfirm = { + __typename?: 'OrderConfirm' + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderCountableConnection = { + __typename?: 'OrderCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type OrderCountableEdge = { + __typename?: 'OrderCountableEdge' + /** The item at the end of the edge. */ + node: Order + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export enum OrderDirection { + /** Specifies an ascending sort order. */ + Asc = 'ASC', + /** Specifies a descending sort order. */ + Desc = 'DESC', +} + +/** Contains all details related to the applied discount to the order. */ +export type OrderDiscount = Node & { + __typename?: 'OrderDiscount' + /** The ID of the object. */ + id: Scalars['ID'] + type: OrderDiscountType + /** Type of the discount: fixed or percent */ + valueType: DiscountValueTypeEnum + /** Value of the discount. Can store fixed value or percent value */ + value: Scalars['PositiveDecimal'] + name?: Maybe + translatedName?: Maybe + /** Explanation for the applied discount. */ + reason?: Maybe + /** Returns amount of discount. */ + amount: Money +} + +/** Adds discount to the order. */ +export type OrderDiscountAdd = { + __typename?: 'OrderDiscountAdd' + /** Order which has been discounted. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderDiscountCommonInput = { + /** Type of the discount: fixed or percent */ + valueType: DiscountValueTypeEnum + /** Value of the discount. Can store fixed value or percent value */ + value: Scalars['PositiveDecimal'] + /** Explanation for the applied discount. */ + reason?: Maybe +} + +/** Remove discount from the order. */ +export type OrderDiscountDelete = { + __typename?: 'OrderDiscountDelete' + /** Order which has removed discount. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum OrderDiscountType { + /** Voucher */ + Voucher = 'VOUCHER', + /** Manual */ + Manual = 'MANUAL', +} + +/** Update discount for the order. */ +export type OrderDiscountUpdate = { + __typename?: 'OrderDiscountUpdate' + /** Order which has been discounted. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderDraftFilterInput = { + customer?: Maybe + created?: Maybe + search?: Maybe + metadata?: Maybe>> + channels?: Maybe>> +} + +export type OrderError = { + __typename?: 'OrderError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: OrderErrorCode + /** Warehouse ID which causes the error. */ + warehouse?: Maybe + /** Order line ID which causes the error. */ + orderLine?: Maybe + /** List of product variants that are associated with the error */ + variants?: Maybe> + /** A type of address that causes the error. */ + addressType?: Maybe +} + +/** An enumeration. */ +export enum OrderErrorCode { + BillingAddressNotSet = 'BILLING_ADDRESS_NOT_SET', + CannotCancelFulfillment = 'CANNOT_CANCEL_FULFILLMENT', + CannotCancelOrder = 'CANNOT_CANCEL_ORDER', + CannotDelete = 'CANNOT_DELETE', + CannotDiscount = 'CANNOT_DISCOUNT', + CannotRefund = 'CANNOT_REFUND', + CaptureInactivePayment = 'CAPTURE_INACTIVE_PAYMENT', + NotEditable = 'NOT_EDITABLE', + FulfillOrderLine = 'FULFILL_ORDER_LINE', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + ProductNotPublished = 'PRODUCT_NOT_PUBLISHED', + ProductUnavailableForPurchase = 'PRODUCT_UNAVAILABLE_FOR_PURCHASE', + NotFound = 'NOT_FOUND', + OrderNoShippingAddress = 'ORDER_NO_SHIPPING_ADDRESS', + PaymentError = 'PAYMENT_ERROR', + PaymentMissing = 'PAYMENT_MISSING', + Required = 'REQUIRED', + ShippingMethodNotApplicable = 'SHIPPING_METHOD_NOT_APPLICABLE', + ShippingMethodRequired = 'SHIPPING_METHOD_REQUIRED', + TaxError = 'TAX_ERROR', + Unique = 'UNIQUE', + VoidInactivePayment = 'VOID_INACTIVE_PAYMENT', + ZeroQuantity = 'ZERO_QUANTITY', + InvalidQuantity = 'INVALID_QUANTITY', + InsufficientStock = 'INSUFFICIENT_STOCK', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + NotAvailableInChannel = 'NOT_AVAILABLE_IN_CHANNEL', + ChannelInactive = 'CHANNEL_INACTIVE', +} + +/** History log of the order. */ +export type OrderEvent = Node & { + __typename?: 'OrderEvent' + /** The ID of the object. */ + id: Scalars['ID'] + /** Date when event happened at in ISO 8601 format. */ + date?: Maybe + /** Order event type. */ + type?: Maybe + /** User who performed the action. */ + user?: Maybe + /** Content of the event. */ + message?: Maybe + /** Email of the customer. */ + email?: Maybe + /** Type of an email sent to the customer. */ + emailType?: Maybe + /** Amount of money. */ + amount?: Maybe + /** The payment ID from the payment gateway. */ + paymentId?: Maybe + /** The payment gateway of the payment. */ + paymentGateway?: Maybe + /** Number of items. */ + quantity?: Maybe + /** Composed ID of the Fulfillment. */ + composedId?: Maybe + /** User-friendly number of an order. */ + orderNumber?: Maybe + /** Number of an invoice related to the order. */ + invoiceNumber?: Maybe + /** List of oversold lines names. */ + oversoldItems?: Maybe>> + /** The concerned lines. */ + lines?: Maybe>> + /** The lines fulfilled. */ + fulfilledItems?: Maybe>> + /** The warehouse were items were restocked. */ + warehouse?: Maybe + /** The transaction reference of captured payment. */ + transactionReference?: Maybe + /** Define if shipping costs were included to the refund. */ + shippingCostsIncluded?: Maybe + /** The order which is related to this order. */ + relatedOrder?: Maybe + /** The discount applied to the order. */ + discount?: Maybe +} + +export type OrderEventCountableConnection = { + __typename?: 'OrderEventCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type OrderEventCountableEdge = { + __typename?: 'OrderEventCountableEdge' + /** The item at the end of the edge. */ + node: OrderEvent + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type OrderEventDiscountObject = { + __typename?: 'OrderEventDiscountObject' + /** Type of the discount: fixed or percent. */ + valueType: DiscountValueTypeEnum + /** Value of the discount. Can store fixed value or percent value. */ + value: Scalars['PositiveDecimal'] + /** Explanation for the applied discount. */ + reason?: Maybe + /** Returns amount of discount. */ + amount?: Maybe + /** Type of the discount: fixed or percent. */ + oldValueType?: Maybe + /** Value of the discount. Can store fixed value or percent value. */ + oldValue?: Maybe + /** Returns amount of discount. */ + oldAmount?: Maybe +} + +export type OrderEventOrderLineObject = { + __typename?: 'OrderEventOrderLineObject' + /** The variant quantity. */ + quantity?: Maybe + /** The order line. */ + orderLine?: Maybe + /** The variant name. */ + itemName?: Maybe + /** The discount applied to the order line. */ + discount?: Maybe +} + +/** An enumeration. */ +export enum OrderEventsEmailsEnum { + PaymentConfirmation = 'PAYMENT_CONFIRMATION', + Confirmed = 'CONFIRMED', + ShippingConfirmation = 'SHIPPING_CONFIRMATION', + TrackingUpdated = 'TRACKING_UPDATED', + OrderConfirmation = 'ORDER_CONFIRMATION', + OrderCancel = 'ORDER_CANCEL', + OrderRefund = 'ORDER_REFUND', + FulfillmentConfirmation = 'FULFILLMENT_CONFIRMATION', + DigitalLinks = 'DIGITAL_LINKS', +} + +/** An enumeration. */ +export enum OrderEventsEnum { + DraftCreated = 'DRAFT_CREATED', + DraftCreatedFromReplace = 'DRAFT_CREATED_FROM_REPLACE', + AddedProducts = 'ADDED_PRODUCTS', + RemovedProducts = 'REMOVED_PRODUCTS', + Placed = 'PLACED', + PlacedFromDraft = 'PLACED_FROM_DRAFT', + OversoldItems = 'OVERSOLD_ITEMS', + Canceled = 'CANCELED', + OrderMarkedAsPaid = 'ORDER_MARKED_AS_PAID', + OrderFullyPaid = 'ORDER_FULLY_PAID', + OrderReplacementCreated = 'ORDER_REPLACEMENT_CREATED', + OrderDiscountAdded = 'ORDER_DISCOUNT_ADDED', + OrderDiscountAutomaticallyUpdated = 'ORDER_DISCOUNT_AUTOMATICALLY_UPDATED', + OrderDiscountUpdated = 'ORDER_DISCOUNT_UPDATED', + OrderDiscountDeleted = 'ORDER_DISCOUNT_DELETED', + OrderLineDiscountUpdated = 'ORDER_LINE_DISCOUNT_UPDATED', + OrderLineDiscountRemoved = 'ORDER_LINE_DISCOUNT_REMOVED', + UpdatedAddress = 'UPDATED_ADDRESS', + EmailSent = 'EMAIL_SENT', + Confirmed = 'CONFIRMED', + PaymentAuthorized = 'PAYMENT_AUTHORIZED', + PaymentCaptured = 'PAYMENT_CAPTURED', + ExternalServiceNotification = 'EXTERNAL_SERVICE_NOTIFICATION', + PaymentRefunded = 'PAYMENT_REFUNDED', + PaymentVoided = 'PAYMENT_VOIDED', + PaymentFailed = 'PAYMENT_FAILED', + InvoiceRequested = 'INVOICE_REQUESTED', + InvoiceGenerated = 'INVOICE_GENERATED', + InvoiceUpdated = 'INVOICE_UPDATED', + InvoiceSent = 'INVOICE_SENT', + FulfillmentCanceled = 'FULFILLMENT_CANCELED', + FulfillmentRestockedItems = 'FULFILLMENT_RESTOCKED_ITEMS', + FulfillmentFulfilledItems = 'FULFILLMENT_FULFILLED_ITEMS', + FulfillmentRefunded = 'FULFILLMENT_REFUNDED', + FulfillmentReturned = 'FULFILLMENT_RETURNED', + FulfillmentReplaced = 'FULFILLMENT_REPLACED', + TrackingUpdated = 'TRACKING_UPDATED', + NoteAdded = 'NOTE_ADDED', + Other = 'OTHER', +} + +export type OrderFilterInput = { + paymentStatus?: Maybe>> + status?: Maybe>> + customer?: Maybe + created?: Maybe + search?: Maybe + metadata?: Maybe>> + channels?: Maybe>> +} + +/** Creates new fulfillments for an order. */ +export type OrderFulfill = { + __typename?: 'OrderFulfill' + /** List of created fulfillments. */ + fulfillments?: Maybe>> + /** Fulfilled order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderFulfillInput = { + /** List of items informing how to fulfill the order. */ + lines: Array + /** If true, send an email notification to the customer. */ + notifyCustomer?: Maybe +} + +export type OrderFulfillLineInput = { + /** The ID of the order line. */ + orderLineId?: Maybe + /** List of stock items to create. */ + stocks: Array +} + +export type OrderFulfillStockInput = { + /** The number of line items to be fulfilled from given warehouse. */ + quantity: Scalars['Int'] + /** ID of the warehouse from which the item will be fulfilled. */ + warehouse: Scalars['ID'] +} + +/** Represents order line of particular order. */ +export type OrderLine = Node & { + __typename?: 'OrderLine' + /** The ID of the object. */ + id: Scalars['ID'] + productName: Scalars['String'] + variantName: Scalars['String'] + productSku: Scalars['String'] + isShippingRequired: Scalars['Boolean'] + quantity: Scalars['Int'] + quantityFulfilled: Scalars['Int'] + unitDiscountReason?: Maybe + taxRate: Scalars['Float'] + digitalContentUrl?: Maybe + /** The main thumbnail for the ordered product. */ + thumbnail?: Maybe + /** Price of the single item in the order line. */ + unitPrice: TaxedMoney + /** Price of the single item in the order line without applied an order line discount. */ + undiscountedUnitPrice: TaxedMoney + /** The discount applied to the single order line. */ + unitDiscount: Money + /** Value of the discount. Can store fixed value or percent value */ + unitDiscountValue: Scalars['PositiveDecimal'] + /** Price of the order line. */ + totalPrice: TaxedMoney + /** A purchased product variant. Note: this field may be null if the variant has been removed from stock at all. */ + variant?: Maybe + /** Product name in the customer's language */ + translatedProductName: Scalars['String'] + /** Variant name in the customer's language */ + translatedVariantName: Scalars['String'] + /** List of allocations across warehouses. */ + allocations?: Maybe> + /** Type of the discount: fixed or percent */ + unitDiscountType?: Maybe +} + +/** Represents order line of particular order. */ +export type OrderLineThumbnailArgs = { + size?: Maybe +} + +export type OrderLineCreateInput = { + /** Number of variant items ordered. */ + quantity: Scalars['Int'] + /** Product variant ID. */ + variantId: Scalars['ID'] +} + +/** Deletes an order line from an order. */ +export type OrderLineDelete = { + __typename?: 'OrderLineDelete' + /** A related order. */ + order?: Maybe + /** An order line that was deleted. */ + orderLine?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Remove discount applied to the order line. */ +export type OrderLineDiscountRemove = { + __typename?: 'OrderLineDiscountRemove' + /** Order line which has removed discount. */ + orderLine?: Maybe + /** Order which is related to line which has removed discount. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Update discount for the order line. */ +export type OrderLineDiscountUpdate = { + __typename?: 'OrderLineDiscountUpdate' + /** Order line which has been discounted. */ + orderLine?: Maybe + /** Order which is related to the discounted line. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderLineInput = { + /** Number of variant items ordered. */ + quantity: Scalars['Int'] +} + +/** Updates an order line of an order. */ +export type OrderLineUpdate = { + __typename?: 'OrderLineUpdate' + /** Related order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array + orderLine?: Maybe +} + +/** Create order lines for an order. */ +export type OrderLinesCreate = { + __typename?: 'OrderLinesCreate' + /** Related order. */ + order?: Maybe + /** List of added order lines. */ + orderLines?: Maybe> + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** Mark order as manually paid. */ +export type OrderMarkAsPaid = { + __typename?: 'OrderMarkAsPaid' + /** Order marked as paid. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum OrderOriginEnum { + Checkout = 'CHECKOUT', + Draft = 'DRAFT', + Reissue = 'REISSUE', +} + +/** Refund an order. */ +export type OrderRefund = { + __typename?: 'OrderRefund' + /** A refunded order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderRefundFulfillmentLineInput = { + /** The ID of the fulfillment line to refund. */ + fulfillmentLineId: Scalars['ID'] + /** The number of items to be refunded. */ + quantity: Scalars['Int'] +} + +export type OrderRefundLineInput = { + /** The ID of the order line to refund. */ + orderLineId: Scalars['ID'] + /** The number of items to be refunded. */ + quantity: Scalars['Int'] +} + +export type OrderRefundProductsInput = { + /** List of unfulfilled lines to refund. */ + orderLines?: Maybe> + /** List of fulfilled lines to refund. */ + fulfillmentLines?: Maybe> + /** The total amount of refund when the value is provided manually. */ + amountToRefund?: Maybe + /** If true, Saleor will refund shipping costs. If amountToRefund is providedincludeShippingCosts will be ignored. */ + includeShippingCosts?: Maybe +} + +export type OrderReturnFulfillmentLineInput = { + /** The ID of the fulfillment line to return. */ + fulfillmentLineId: Scalars['ID'] + /** The number of items to be returned. */ + quantity: Scalars['Int'] + /** Determines, if the line should be added to replace order. */ + replace?: Maybe +} + +export type OrderReturnLineInput = { + /** The ID of the order line to return. */ + orderLineId: Scalars['ID'] + /** The number of items to be returned. */ + quantity: Scalars['Int'] + /** Determines, if the line should be added to replace order. */ + replace?: Maybe +} + +export type OrderReturnProductsInput = { + /** List of unfulfilled lines to return. */ + orderLines?: Maybe> + /** List of fulfilled lines to return. */ + fulfillmentLines?: Maybe> + /** The total amount of refund when the value is provided manually. */ + amountToRefund?: Maybe + /** If true, Saleor will refund shipping costs. If amountToRefund is providedincludeShippingCosts will be ignored. */ + includeShippingCosts?: Maybe + /** If true, Saleor will call refund action for all lines. */ + refund?: Maybe +} + +/** Order related settings from site settings. */ +export type OrderSettings = { + __typename?: 'OrderSettings' + automaticallyConfirmAllNewOrders: Scalars['Boolean'] +} + +export type OrderSettingsError = { + __typename?: 'OrderSettingsError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: OrderSettingsErrorCode +} + +/** An enumeration. */ +export enum OrderSettingsErrorCode { + Invalid = 'INVALID', +} + +/** Update shop order settings. */ +export type OrderSettingsUpdate = { + __typename?: 'OrderSettingsUpdate' + /** Order settings. */ + orderSettings?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderSettingsErrors: Array + errors: Array +} + +export type OrderSettingsUpdateInput = { + /** When disabled, all new orders from checkout will be marked as unconfirmed. When enabled orders from checkout will become unfulfilled immediately. */ + automaticallyConfirmAllNewOrders: Scalars['Boolean'] +} + +export enum OrderSortField { + /** Sort orders by number. */ + Number = 'NUMBER', + /** Sort orders by creation date. */ + CreationDate = 'CREATION_DATE', + /** Sort orders by customer. */ + Customer = 'CUSTOMER', + /** Sort orders by payment. */ + Payment = 'PAYMENT', + /** Sort orders by fulfillment status. */ + FulfillmentStatus = 'FULFILLMENT_STATUS', +} + +export type OrderSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort orders by the selected field. */ + field: OrderSortField +} + +/** An enumeration. */ +export enum OrderStatus { + /** Draft */ + Draft = 'DRAFT', + /** Unconfirmed */ + Unconfirmed = 'UNCONFIRMED', + /** Unfulfilled */ + Unfulfilled = 'UNFULFILLED', + /** Partially fulfilled */ + PartiallyFulfilled = 'PARTIALLY_FULFILLED', + /** Partially returned */ + PartiallyReturned = 'PARTIALLY_RETURNED', + /** Returned */ + Returned = 'RETURNED', + /** Fulfilled */ + Fulfilled = 'FULFILLED', + /** Canceled */ + Canceled = 'CANCELED', +} + +export enum OrderStatusFilter { + ReadyToFulfill = 'READY_TO_FULFILL', + ReadyToCapture = 'READY_TO_CAPTURE', + Unfulfilled = 'UNFULFILLED', + Unconfirmed = 'UNCONFIRMED', + PartiallyFulfilled = 'PARTIALLY_FULFILLED', + Fulfilled = 'FULFILLED', + Canceled = 'CANCELED', +} + +/** Updates an order. */ +export type OrderUpdate = { + __typename?: 'OrderUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array + order?: Maybe +} + +export type OrderUpdateInput = { + /** Billing address of the customer. */ + billingAddress?: Maybe + /** Email address of the customer. */ + userEmail?: Maybe + /** Shipping address of the customer. */ + shippingAddress?: Maybe +} + +/** Updates a shipping method of the order. */ +export type OrderUpdateShipping = { + __typename?: 'OrderUpdateShipping' + /** Order with updated shipping method. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +export type OrderUpdateShippingInput = { + /** ID of the selected shipping method. */ + shippingMethod?: Maybe +} + +/** Void an order. */ +export type OrderVoid = { + __typename?: 'OrderVoid' + /** A voided order. */ + order?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + orderErrors: Array + errors: Array +} + +/** A static page that can be manually added by a shop operator through the dashboard. */ +export type Page = Node & + ObjectWithMetadata & { + __typename?: 'Page' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + title: Scalars['String'] + content?: Maybe + publicationDate?: Maybe + isPublished: Scalars['Boolean'] + slug: Scalars['String'] + pageType: PageType + created: Scalars['DateTime'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** + * Content of the page (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `content` field instead. + */ + contentJson: Scalars['JSONString'] + /** Returns translated page fields for the given language code. */ + translation?: Maybe + /** List of attributes assigned to this product. */ + attributes: Array + } + +/** A static page that can be manually added by a shop operator through the dashboard. */ +export type PageTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Assign attributes to a given page type. */ +export type PageAttributeAssign = { + __typename?: 'PageAttributeAssign' + /** The updated page type. */ + pageType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +/** Unassign attributes from a given page type. */ +export type PageAttributeUnassign = { + __typename?: 'PageAttributeUnassign' + /** The updated page type. */ + pageType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +/** Deletes pages. */ +export type PageBulkDelete = { + __typename?: 'PageBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +/** Publish pages. */ +export type PageBulkPublish = { + __typename?: 'PageBulkPublish' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +export type PageCountableConnection = { + __typename?: 'PageCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type PageCountableEdge = { + __typename?: 'PageCountableEdge' + /** The item at the end of the edge. */ + node: Page + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new page. */ +export type PageCreate = { + __typename?: 'PageCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + page?: Maybe +} + +export type PageCreateInput = { + /** Page internal name. */ + slug?: Maybe + /** Page title. */ + title?: Maybe + /** Page content in JSON format. */ + content?: Maybe + /** List of attributes. */ + attributes?: Maybe> + /** Determines if page is visible in the storefront. */ + isPublished?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** ID of the page type that page belongs to. */ + pageType: Scalars['ID'] +} + +/** Deletes a page. */ +export type PageDelete = { + __typename?: 'PageDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + page?: Maybe +} + +export type PageError = { + __typename?: 'PageError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: PageErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> +} + +/** An enumeration. */ +export enum PageErrorCode { + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + AttributeAlreadyAssigned = 'ATTRIBUTE_ALREADY_ASSIGNED', +} + +export type PageFilterInput = { + search?: Maybe + metadata?: Maybe>> + pageTypes?: Maybe>> +} + +/** The Relay compliant `PageInfo` type, containing data necessary to paginate this connection. */ +export type PageInfo = { + __typename?: 'PageInfo' + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars['Boolean'] + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars['Boolean'] + /** When paginating backwards, the cursor to continue. */ + startCursor?: Maybe + /** When paginating forwards, the cursor to continue. */ + endCursor?: Maybe +} + +export type PageInput = { + /** Page internal name. */ + slug?: Maybe + /** Page title. */ + title?: Maybe + /** Page content in JSON format. */ + content?: Maybe + /** List of attributes. */ + attributes?: Maybe> + /** Determines if page is visible in the storefront. */ + isPublished?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe +} + +/** Reorder page attribute values. */ +export type PageReorderAttributeValues = { + __typename?: 'PageReorderAttributeValues' + /** Page from which attribute values are reordered. */ + page?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +export enum PageSortField { + /** Sort pages by title. */ + Title = 'TITLE', + /** Sort pages by slug. */ + Slug = 'SLUG', + /** Sort pages by visibility. */ + Visibility = 'VISIBILITY', + /** Sort pages by creation date. */ + CreationDate = 'CREATION_DATE', + /** Sort pages by publication date. */ + PublicationDate = 'PUBLICATION_DATE', +} + +export type PageSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort pages by the selected field. */ + field: PageSortField +} + +export type PageTranslatableContent = Node & { + __typename?: 'PageTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + title: Scalars['String'] + content?: Maybe + /** + * Content of the page (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `content` field instead. + */ + contentJson?: Maybe + /** Returns translated page fields for the given language code. */ + translation?: Maybe + /** ('A static page that can be manually added by a shop operator ', 'through the dashboard.') */ + page?: Maybe +} + +export type PageTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Page. */ +export type PageTranslate = { + __typename?: 'PageTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + page?: Maybe +} + +export type PageTranslation = Node & { + __typename?: 'PageTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + title: Scalars['String'] + content?: Maybe + /** Translation language. */ + language: LanguageDisplay + /** + * Translated description of the page (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `content` field instead. + */ + contentJson?: Maybe +} + +export type PageTranslationInput = { + seoTitle?: Maybe + seoDescription?: Maybe + title?: Maybe + content?: Maybe +} + +/** Represents a type of page. It defines what attributes are available to pages of this type. */ +export type PageType = Node & + ObjectWithMetadata & { + __typename?: 'PageType' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + slug: Scalars['String'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Page attributes of that page type. */ + attributes?: Maybe>> + /** Attributes that can be assigned to the page type. */ + availableAttributes?: Maybe + /** Whether page type has pages assigned. */ + hasPages?: Maybe + } + +/** Represents a type of page. It defines what attributes are available to pages of this type. */ +export type PageTypeAvailableAttributesArgs = { + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Delete page types. */ +export type PageTypeBulkDelete = { + __typename?: 'PageTypeBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +export type PageTypeCountableConnection = { + __typename?: 'PageTypeCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type PageTypeCountableEdge = { + __typename?: 'PageTypeCountableEdge' + /** The item at the end of the edge. */ + node: PageType + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Create a new page type. */ +export type PageTypeCreate = { + __typename?: 'PageTypeCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + pageType?: Maybe +} + +export type PageTypeCreateInput = { + /** Name of the page type. */ + name?: Maybe + /** Page type slug. */ + slug?: Maybe + /** List of attribute IDs to be assigned to the page type. */ + addAttributes?: Maybe> +} + +/** Delete a page type. */ +export type PageTypeDelete = { + __typename?: 'PageTypeDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + pageType?: Maybe +} + +export type PageTypeFilterInput = { + search?: Maybe +} + +/** Reorder the attributes of a page type. */ +export type PageTypeReorderAttributes = { + __typename?: 'PageTypeReorderAttributes' + /** Page type from which attributes are reordered. */ + pageType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array +} + +export enum PageTypeSortField { + /** Sort page types by name. */ + Name = 'NAME', + /** Sort page types by slug. */ + Slug = 'SLUG', +} + +export type PageTypeSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort page types by the selected field. */ + field: PageTypeSortField +} + +/** Update page type. */ +export type PageTypeUpdate = { + __typename?: 'PageTypeUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + pageType?: Maybe +} + +export type PageTypeUpdateInput = { + /** Name of the page type. */ + name?: Maybe + /** Page type slug. */ + slug?: Maybe + /** List of attribute IDs to be assigned to the page type. */ + addAttributes?: Maybe> + /** List of attribute IDs to be assigned to the page type. */ + removeAttributes?: Maybe> +} + +/** Updates an existing page. */ +export type PageUpdate = { + __typename?: 'PageUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pageErrors: Array + errors: Array + page?: Maybe +} + +/** Change the password of the logged in user. */ +export type PasswordChange = { + __typename?: 'PasswordChange' + /** A user instance with a new password. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Represents a payment of a given type. */ +export type Payment = Node & { + __typename?: 'Payment' + /** The ID of the object. */ + id: Scalars['ID'] + gateway: Scalars['String'] + isActive: Scalars['Boolean'] + created: Scalars['DateTime'] + modified: Scalars['DateTime'] + token: Scalars['String'] + checkout?: Maybe + order?: Maybe + paymentMethodType: Scalars['String'] + customerIpAddress?: Maybe + /** Internal payment status. */ + chargeStatus: PaymentChargeStatusEnum + /** List of actions that can be performed in the current state of a payment. */ + actions: Array> + /** Total amount of the payment. */ + total?: Maybe + /** Total amount captured for this payment. */ + capturedAmount?: Maybe + /** List of all transactions within this payment. */ + transactions?: Maybe>> + /** Maximum amount of money that can be captured. */ + availableCaptureAmount?: Maybe + /** Maximum amount of money that can be refunded. */ + availableRefundAmount?: Maybe + /** The details of the card used for this payment. */ + creditCard?: Maybe +} + +/** Captures the authorized payment amount. */ +export type PaymentCapture = { + __typename?: 'PaymentCapture' + /** Updated payment. */ + payment?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + paymentErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum PaymentChargeStatusEnum { + NotCharged = 'NOT_CHARGED', + Pending = 'PENDING', + PartiallyCharged = 'PARTIALLY_CHARGED', + FullyCharged = 'FULLY_CHARGED', + PartiallyRefunded = 'PARTIALLY_REFUNDED', + FullyRefunded = 'FULLY_REFUNDED', + Refused = 'REFUSED', + Cancelled = 'CANCELLED', +} + +export type PaymentCountableConnection = { + __typename?: 'PaymentCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type PaymentCountableEdge = { + __typename?: 'PaymentCountableEdge' + /** The item at the end of the edge. */ + node: Payment + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type PaymentError = { + __typename?: 'PaymentError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: PaymentErrorCode +} + +/** An enumeration. */ +export enum PaymentErrorCode { + BillingAddressNotSet = 'BILLING_ADDRESS_NOT_SET', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + PartialPaymentNotAllowed = 'PARTIAL_PAYMENT_NOT_ALLOWED', + ShippingAddressNotSet = 'SHIPPING_ADDRESS_NOT_SET', + InvalidShippingMethod = 'INVALID_SHIPPING_METHOD', + ShippingMethodNotSet = 'SHIPPING_METHOD_NOT_SET', + PaymentError = 'PAYMENT_ERROR', + NotSupportedGateway = 'NOT_SUPPORTED_GATEWAY', + ChannelInactive = 'CHANNEL_INACTIVE', +} + +export type PaymentFilterInput = { + checkouts?: Maybe>> +} + +/** Available payment gateway backend with configuration necessary to setup client. */ +export type PaymentGateway = { + __typename?: 'PaymentGateway' + /** Payment gateway name. */ + name: Scalars['String'] + /** Payment gateway ID. */ + id: Scalars['ID'] + /** Payment gateway client configuration. */ + config: Array + /** Payment gateway supported currencies. */ + currencies: Array> +} + +/** Initializes payment process when it is required by gateway. */ +export type PaymentInitialize = { + __typename?: 'PaymentInitialize' + initializedPayment?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + paymentErrors: Array + errors: Array +} + +/** Server-side data generated by a payment gateway. Optional step when the payment provider requires an additional action to initialize payment session. */ +export type PaymentInitialized = { + __typename?: 'PaymentInitialized' + /** ID of a payment gateway. */ + gateway: Scalars['String'] + /** Payment gateway name. */ + name: Scalars['String'] + /** Initialized data by gateway. */ + data?: Maybe +} + +export type PaymentInput = { + /** A gateway to use with that payment. */ + gateway: Scalars['String'] + /** Client-side generated payment token, representing customer's billing data in a secure manner. */ + token?: Maybe + /** Total amount of the transaction, including all taxes and discounts. If no amount is provided, the checkout total will be used. */ + amount?: Maybe + /** URL of a storefront view where user should be redirected after requiring additional actions. Payment with additional actions will not be finished if this field is not provided. */ + returnUrl?: Maybe +} + +/** Refunds the captured payment amount. */ +export type PaymentRefund = { + __typename?: 'PaymentRefund' + /** Updated payment. */ + payment?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + paymentErrors: Array + errors: Array +} + +/** Represents a payment source stored for user in payment gateway, such as credit card. */ +export type PaymentSource = { + __typename?: 'PaymentSource' + /** Payment gateway name. */ + gateway: Scalars['String'] + /** Stored credit card details if available. */ + creditCardInfo?: Maybe +} + +/** Voids the authorized payment. */ +export type PaymentVoid = { + __typename?: 'PaymentVoid' + /** Updated payment. */ + payment?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + paymentErrors: Array + errors: Array +} + +/** Represents a permission object in a friendly form. */ +export type Permission = { + __typename?: 'Permission' + /** Internal code for permission. */ + code: PermissionEnum + /** Describe action(s) allowed to do by permission. */ + name: Scalars['String'] +} + +/** An enumeration. */ +export enum PermissionEnum { + ManageUsers = 'MANAGE_USERS', + ManageStaff = 'MANAGE_STAFF', + ManageApps = 'MANAGE_APPS', + ManageChannels = 'MANAGE_CHANNELS', + ManageDiscounts = 'MANAGE_DISCOUNTS', + ManagePlugins = 'MANAGE_PLUGINS', + ManageGiftCard = 'MANAGE_GIFT_CARD', + ManageMenus = 'MANAGE_MENUS', + ManageOrders = 'MANAGE_ORDERS', + ManagePages = 'MANAGE_PAGES', + ManagePageTypesAndAttributes = 'MANAGE_PAGE_TYPES_AND_ATTRIBUTES', + ManageProducts = 'MANAGE_PRODUCTS', + ManageProductTypesAndAttributes = 'MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES', + ManageShipping = 'MANAGE_SHIPPING', + ManageSettings = 'MANAGE_SETTINGS', + ManageTranslations = 'MANAGE_TRANSLATIONS', + ManageCheckouts = 'MANAGE_CHECKOUTS', +} + +/** Create new permission group. */ +export type PermissionGroupCreate = { + __typename?: 'PermissionGroupCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + permissionGroupErrors: Array + errors: Array + group?: Maybe +} + +export type PermissionGroupCreateInput = { + /** List of permission code names to assign to this group. */ + addPermissions?: Maybe> + /** List of users to assign to this group. */ + addUsers?: Maybe> + /** Group name. */ + name: Scalars['String'] +} + +/** Delete permission group. */ +export type PermissionGroupDelete = { + __typename?: 'PermissionGroupDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + permissionGroupErrors: Array + errors: Array + group?: Maybe +} + +export type PermissionGroupError = { + __typename?: 'PermissionGroupError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: PermissionGroupErrorCode + /** List of permissions which causes the error. */ + permissions?: Maybe> + /** List of user IDs which causes the error. */ + users?: Maybe> +} + +/** An enumeration. */ +export enum PermissionGroupErrorCode { + AssignNonStaffMember = 'ASSIGN_NON_STAFF_MEMBER', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + CannotRemoveFromLastGroup = 'CANNOT_REMOVE_FROM_LAST_GROUP', + LeftNotManageablePermission = 'LEFT_NOT_MANAGEABLE_PERMISSION', + OutOfScopePermission = 'OUT_OF_SCOPE_PERMISSION', + OutOfScopeUser = 'OUT_OF_SCOPE_USER', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +export type PermissionGroupFilterInput = { + search?: Maybe +} + +export enum PermissionGroupSortField { + /** Sort permission group accounts by name. */ + Name = 'NAME', +} + +export type PermissionGroupSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort permission group by the selected field. */ + field: PermissionGroupSortField +} + +/** Update permission group. */ +export type PermissionGroupUpdate = { + __typename?: 'PermissionGroupUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + permissionGroupErrors: Array + errors: Array + group?: Maybe +} + +export type PermissionGroupUpdateInput = { + /** List of permission code names to assign to this group. */ + addPermissions?: Maybe> + /** List of users to assign to this group. */ + addUsers?: Maybe> + /** Group name. */ + name?: Maybe + /** List of permission code names to unassign from this group. */ + removePermissions?: Maybe> + /** List of users to unassign from this group. */ + removeUsers?: Maybe> +} + +/** Plugin. */ +export type Plugin = { + __typename?: 'Plugin' + /** Identifier of the plugin. */ + id: Scalars['ID'] + /** Name of the plugin. */ + name: Scalars['String'] + /** Description of the plugin. */ + description: Scalars['String'] + /** Global configuration of the plugin (not channel-specific). */ + globalConfiguration?: Maybe + /** Channel-specific plugin configuration. */ + channelConfigurations: Array +} + +/** Stores information about a configuration of plugin. */ +export type PluginConfiguration = { + __typename?: 'PluginConfiguration' + /** Determines if plugin is active or not. */ + active: Scalars['Boolean'] + /** The channel to which the plugin configuration is assigned to. */ + channel?: Maybe + /** Configuration of the plugin. */ + configuration?: Maybe>> +} + +export enum PluginConfigurationType { + PerChannel = 'PER_CHANNEL', + Global = 'GLOBAL', +} + +export type PluginCountableConnection = { + __typename?: 'PluginCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type PluginCountableEdge = { + __typename?: 'PluginCountableEdge' + /** The item at the end of the edge. */ + node: Plugin + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type PluginError = { + __typename?: 'PluginError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: PluginErrorCode +} + +/** An enumeration. */ +export enum PluginErrorCode { + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + PluginMisconfigured = 'PLUGIN_MISCONFIGURED', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +export type PluginFilterInput = { + statusInChannels?: Maybe + search?: Maybe + type?: Maybe +} + +export enum PluginSortField { + Name = 'NAME', + IsActive = 'IS_ACTIVE', +} + +export type PluginSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort plugins by the selected field. */ + field: PluginSortField +} + +export type PluginStatusInChannelsInput = { + active: Scalars['Boolean'] + channels: Array +} + +/** Update plugin configuration. */ +export type PluginUpdate = { + __typename?: 'PluginUpdate' + plugin?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + pluginsErrors: Array + errors: Array +} + +export type PluginUpdateInput = { + /** Indicates whether the plugin should be enabled. */ + active?: Maybe + /** Configuration of the plugin. */ + configuration?: Maybe>> +} + +/** An enumeration. */ +export enum PostalCodeRuleInclusionTypeEnum { + Include = 'INCLUDE', + Exclude = 'EXCLUDE', +} + +export type PriceRangeInput = { + /** Price greater than or equal to. */ + gte?: Maybe + /** Price less than or equal to. */ + lte?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type Product = Node & + ObjectWithMetadata & { + __typename?: 'Product' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + productType: ProductType + slug: Scalars['String'] + category?: Maybe + updatedAt?: Maybe + chargeTaxes: Scalars['Boolean'] + weight?: Maybe + defaultVariant?: Maybe + rating?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** + * Description of the product (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** The main thumbnail for a product. */ + thumbnail?: Maybe + /** Lists the storefront product's pricing, the current price and discounts, only meant for displaying. */ + pricing?: Maybe + /** Whether the product is in stock and visible or not. */ + isAvailable?: Maybe + /** A type of tax. Assigned by enabled tax gateway */ + taxType?: Maybe + /** List of attributes assigned to this product. */ + attributes: Array + /** List of availability in channels for the product. */ + channelListings?: Maybe> + /** Get a single product media by ID. */ + mediaById: ProductMedia + /** + * Get a single product image by ID. + * @deprecated Will be removed in Saleor 4.0. Use the `mediaById` field instead. + */ + imageById?: Maybe + /** List of variants for the product. */ + variants?: Maybe>> + /** List of media for the product. */ + media?: Maybe> + /** + * List of images for the product. + * @deprecated Will be removed in Saleor 4.0. Use the `media` field instead. + */ + images?: Maybe>> + /** List of collections for the product. */ + collections?: Maybe>> + /** Returns translated product fields for the given language code. */ + translation?: Maybe + /** Date when product is available for purchase. */ + availableForPurchase?: Maybe + /** Whether the product is available for purchase. */ + isAvailableForPurchase?: Maybe + } + +/** Represents an individual item for sale in the storefront. */ +export type ProductThumbnailArgs = { + size?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type ProductPricingArgs = { + address?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type ProductIsAvailableArgs = { + address?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type ProductMediaByIdArgs = { + id?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type ProductImageByIdArgs = { + id?: Maybe +} + +/** Represents an individual item for sale in the storefront. */ +export type ProductTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Assign attributes to a given product type. */ +export type ProductAttributeAssign = { + __typename?: 'ProductAttributeAssign' + /** The updated product type. */ + productType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type ProductAttributeAssignInput = { + /** The ID of the attribute to assign. */ + id: Scalars['ID'] + /** The attribute type to be assigned as. */ + type: ProductAttributeType +} + +export enum ProductAttributeType { + Product = 'PRODUCT', + Variant = 'VARIANT', +} + +/** Un-assign attributes from a given product type. */ +export type ProductAttributeUnassign = { + __typename?: 'ProductAttributeUnassign' + /** The updated product type. */ + productType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Deletes products. */ +export type ProductBulkDelete = { + __typename?: 'ProductBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Represents product channel listing. */ +export type ProductChannelListing = Node & { + __typename?: 'ProductChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + publicationDate?: Maybe + isPublished: Scalars['Boolean'] + channel: Channel + visibleInListings: Scalars['Boolean'] + availableForPurchase?: Maybe + /** The price of the cheapest variant (including discounts). */ + discountedPrice?: Maybe + /** Purchase cost of product. */ + purchaseCost?: Maybe + /** Range of margin percentage value. */ + margin?: Maybe + /** Whether the product is available for purchase. */ + isAvailableForPurchase?: Maybe + /** Lists the storefront product's pricing, the current price and discounts, only meant for displaying. */ + pricing?: Maybe +} + +/** Represents product channel listing. */ +export type ProductChannelListingPricingArgs = { + address?: Maybe +} + +export type ProductChannelListingAddInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** Determines if object is visible to customers. */ + isPublished?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe + /** Determines if product is visible in product listings (doesn't apply to product collections). */ + visibleInListings?: Maybe + /** Determine if product should be available for purchase. */ + isAvailableForPurchase?: Maybe + /** A start date from which a product will be available for purchase. When not set and isAvailable is set to True, the current day is assumed. */ + availableForPurchaseDate?: Maybe + /** List of variants to which the channel should be assigned. */ + addVariants?: Maybe> + /** List of variants from which the channel should be unassigned. */ + removeVariants?: Maybe> +} + +export type ProductChannelListingError = { + __typename?: 'ProductChannelListingError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ProductErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> + /** List of channels IDs which causes the error. */ + channels?: Maybe> + /** List of variants IDs which causes the error. */ + variants?: Maybe> +} + +/** Manage product's availability in channels. */ +export type ProductChannelListingUpdate = { + __typename?: 'ProductChannelListingUpdate' + /** An updated product instance. */ + product?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productChannelListingErrors: Array + errors: Array +} + +export type ProductChannelListingUpdateInput = { + /** List of channels to which the product should be assigned or updated. */ + updateChannels?: Maybe> + /** List of channels from which the product should be unassigned. */ + removeChannels?: Maybe> +} + +export type ProductCountableConnection = { + __typename?: 'ProductCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type ProductCountableEdge = { + __typename?: 'ProductCountableEdge' + /** The item at the end of the edge. */ + node: Product + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new product. */ +export type ProductCreate = { + __typename?: 'ProductCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + product?: Maybe +} + +export type ProductCreateInput = { + /** List of attributes. */ + attributes?: Maybe> + /** ID of the product's category. */ + category?: Maybe + /** Determine if taxes are being charged for the product. */ + chargeTaxes?: Maybe + /** List of IDs of collections that the product belongs to. */ + collections?: Maybe> + /** Product description (JSON). */ + description?: Maybe + /** Product name. */ + name?: Maybe + /** Product slug. */ + slug?: Maybe + /** Tax rate for enabled tax gateway. */ + taxCode?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** Weight of the Product. */ + weight?: Maybe + /** Defines the product rating value. */ + rating?: Maybe + /** ID of the type that product belongs to. */ + productType: Scalars['ID'] +} + +/** Deletes a product. */ +export type ProductDelete = { + __typename?: 'ProductDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + product?: Maybe +} + +export type ProductError = { + __typename?: 'ProductError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ProductErrorCode + /** List of attributes IDs which causes the error. */ + attributes?: Maybe> + /** List of attribute values IDs which causes the error. */ + values?: Maybe> +} + +/** An enumeration. */ +export enum ProductErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + AttributeAlreadyAssigned = 'ATTRIBUTE_ALREADY_ASSIGNED', + AttributeCannotBeAssigned = 'ATTRIBUTE_CANNOT_BE_ASSIGNED', + AttributeVariantsDisabled = 'ATTRIBUTE_VARIANTS_DISABLED', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + ProductWithoutCategory = 'PRODUCT_WITHOUT_CATEGORY', + NotProductsImage = 'NOT_PRODUCTS_IMAGE', + NotProductsVariant = 'NOT_PRODUCTS_VARIANT', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + VariantNoDigitalContent = 'VARIANT_NO_DIGITAL_CONTENT', + CannotManageProductWithoutVariant = 'CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT', + ProductNotAssignedToChannel = 'PRODUCT_NOT_ASSIGNED_TO_CHANNEL', + UnsupportedMediaProvider = 'UNSUPPORTED_MEDIA_PROVIDER', +} + +export enum ProductFieldEnum { + Name = 'NAME', + Description = 'DESCRIPTION', + ProductType = 'PRODUCT_TYPE', + Category = 'CATEGORY', + ProductWeight = 'PRODUCT_WEIGHT', + Collections = 'COLLECTIONS', + ChargeTaxes = 'CHARGE_TAXES', + ProductMedia = 'PRODUCT_MEDIA', + VariantSku = 'VARIANT_SKU', + VariantWeight = 'VARIANT_WEIGHT', + VariantMedia = 'VARIANT_MEDIA', +} + +export type ProductFilterInput = { + isPublished?: Maybe + collections?: Maybe>> + categories?: Maybe>> + hasCategory?: Maybe + attributes?: Maybe>> + stockAvailability?: Maybe + stocks?: Maybe + search?: Maybe + metadata?: Maybe>> + price?: Maybe + minimalPrice?: Maybe + productTypes?: Maybe>> + ids?: Maybe>> + /** Specifies the channel by which the data should be sorted. */ + channel?: Maybe +} + +/** Represents a product image. */ +export type ProductImage = { + __typename?: 'ProductImage' + /** The ID of the image. */ + id: Scalars['ID'] + /** The alt text of the image. */ + alt?: Maybe + /** The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. */ + sortOrder?: Maybe + /** The URL of the image. */ + url: Scalars['String'] +} + +/** Represents a product image. */ +export type ProductImageUrlArgs = { + size?: Maybe +} + +export type ProductInput = { + /** List of attributes. */ + attributes?: Maybe> + /** ID of the product's category. */ + category?: Maybe + /** Determine if taxes are being charged for the product. */ + chargeTaxes?: Maybe + /** List of IDs of collections that the product belongs to. */ + collections?: Maybe> + /** Product description (JSON). */ + description?: Maybe + /** Product name. */ + name?: Maybe + /** Product slug. */ + slug?: Maybe + /** Tax rate for enabled tax gateway. */ + taxCode?: Maybe + /** Search engine optimization fields. */ + seo?: Maybe + /** Weight of the Product. */ + weight?: Maybe + /** Defines the product rating value. */ + rating?: Maybe +} + +/** Represents a product media. */ +export type ProductMedia = Node & { + __typename?: 'ProductMedia' + /** The ID of the object. */ + id: Scalars['ID'] + sortOrder?: Maybe + alt: Scalars['String'] + type: ProductMediaType + oembedData: Scalars['JSONString'] + /** The URL of the media. */ + url: Scalars['String'] +} + +/** Represents a product media. */ +export type ProductMediaUrlArgs = { + size?: Maybe +} + +/** Deletes product media. */ +export type ProductMediaBulkDelete = { + __typename?: 'ProductMediaBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Create a media object (image or video URL) associated with product. For image, this mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ +export type ProductMediaCreate = { + __typename?: 'ProductMediaCreate' + product?: Maybe + media?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type ProductMediaCreateInput = { + /** Alt text for a product media. */ + alt?: Maybe + /** Represents an image file in a multipart request. */ + image?: Maybe + /** ID of an product. */ + product: Scalars['ID'] + /** Represents an URL to an external media. */ + mediaUrl?: Maybe +} + +/** Deletes a product media. */ +export type ProductMediaDelete = { + __typename?: 'ProductMediaDelete' + product?: Maybe + media?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Changes ordering of the product media. */ +export type ProductMediaReorder = { + __typename?: 'ProductMediaReorder' + product?: Maybe + media?: Maybe> + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum ProductMediaType { + /** An uploaded image or an URL to an image */ + Image = 'IMAGE', + /** A URL to an external video */ + Video = 'VIDEO', +} + +/** Updates a product media. */ +export type ProductMediaUpdate = { + __typename?: 'ProductMediaUpdate' + product?: Maybe + media?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type ProductMediaUpdateInput = { + /** Alt text for a product media. */ + alt?: Maybe +} + +export type ProductOrder = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Specifies the channel in which to sort the data. */ + channel?: Maybe + /** + * Sort product by the selected attribute's values. + * Note: this doesn't take translations into account yet. + */ + attributeId?: Maybe + /** Sort products by the selected field. */ + field?: Maybe +} + +export enum ProductOrderField { + /** Sort products by name. */ + Name = 'NAME', + /** Sort products by rank. Note: This option is available only with the `search` filter. */ + Rank = 'RANK', + /** Sort products by price. */ + Price = 'PRICE', + /** Sort products by a minimal price of a product's variant. */ + MinimalPrice = 'MINIMAL_PRICE', + /** Sort products by update date. */ + Date = 'DATE', + /** Sort products by type. */ + Type = 'TYPE', + /** Sort products by publication status. */ + Published = 'PUBLISHED', + /** Sort products by publication date. */ + PublicationDate = 'PUBLICATION_DATE', + /** Sort products by collection. Note: This option is available only for the `Collection.products` query. */ + Collection = 'COLLECTION', + /** Sort products by rating. */ + Rating = 'RATING', +} + +/** Represents availability of a product in the storefront. */ +export type ProductPricingInfo = { + __typename?: 'ProductPricingInfo' + /** Whether it is in sale or not. */ + onSale?: Maybe + /** The discount amount if in sale (null otherwise). */ + discount?: Maybe + /** The discount amount in the local currency. */ + discountLocalCurrency?: Maybe + /** The discounted price range of the product variants. */ + priceRange?: Maybe + /** The undiscounted price range of the product variants. */ + priceRangeUndiscounted?: Maybe + /** The discounted price range of the product variants in the local currency. */ + priceRangeLocalCurrency?: Maybe +} + +/** Reorder product attribute values. */ +export type ProductReorderAttributeValues = { + __typename?: 'ProductReorderAttributeValues' + /** Product from which attribute values are reordered. */ + product?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export type ProductStockFilterInput = { + warehouseIds?: Maybe> + quantity?: Maybe +} + +export type ProductTranslatableContent = Node & { + __typename?: 'ProductTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** + * Description of the product (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe + /** Returns translated product fields for the given language code. */ + translation?: Maybe + /** Represents an individual item for sale in the storefront. */ + product?: Maybe +} + +export type ProductTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Product. */ +export type ProductTranslate = { + __typename?: 'ProductTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + product?: Maybe +} + +export type ProductTranslation = Node & { + __typename?: 'ProductTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + seoTitle?: Maybe + seoDescription?: Maybe + name: Scalars['String'] + description?: Maybe + /** Translation language. */ + language: LanguageDisplay + /** + * Translated description of the product (JSON). + * @deprecated Will be removed in Saleor 4.0. Use the `description` field instead. + */ + descriptionJson?: Maybe +} + +/** Represents a type of product. It defines what attributes are available to products of this type. */ +export type ProductType = Node & + ObjectWithMetadata & { + __typename?: 'ProductType' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + slug: Scalars['String'] + hasVariants: Scalars['Boolean'] + isShippingRequired: Scalars['Boolean'] + isDigital: Scalars['Boolean'] + weight?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** + * List of products of this type. + * @deprecated Will be removed in Saleor 4.0. Use the top-level `products` query with the `productTypes` filter. + */ + products?: Maybe + /** A type of tax. Assigned by enabled tax gateway */ + taxType?: Maybe + /** Variant attributes of that product type. */ + variantAttributes?: Maybe>> + /** Product attributes of that product type. */ + productAttributes?: Maybe>> + availableAttributes?: Maybe + } + +/** Represents a type of product. It defines what attributes are available to products of this type. */ +export type ProductTypeProductsArgs = { + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents a type of product. It defines what attributes are available to products of this type. */ +export type ProductTypeVariantAttributesArgs = { + variantSelection?: Maybe +} + +/** Represents a type of product. It defines what attributes are available to products of this type. */ +export type ProductTypeAvailableAttributesArgs = { + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Deletes product types. */ +export type ProductTypeBulkDelete = { + __typename?: 'ProductTypeBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export enum ProductTypeConfigurable { + Configurable = 'CONFIGURABLE', + Simple = 'SIMPLE', +} + +export type ProductTypeCountableConnection = { + __typename?: 'ProductTypeCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type ProductTypeCountableEdge = { + __typename?: 'ProductTypeCountableEdge' + /** The item at the end of the edge. */ + node: ProductType + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new product type. */ +export type ProductTypeCreate = { + __typename?: 'ProductTypeCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productType?: Maybe +} + +/** Deletes a product type. */ +export type ProductTypeDelete = { + __typename?: 'ProductTypeDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productType?: Maybe +} + +export enum ProductTypeEnum { + Digital = 'DIGITAL', + Shippable = 'SHIPPABLE', +} + +export type ProductTypeFilterInput = { + search?: Maybe + configurable?: Maybe + productType?: Maybe + metadata?: Maybe>> + ids?: Maybe>> +} + +export type ProductTypeInput = { + /** Name of the product type. */ + name?: Maybe + /** Product type slug. */ + slug?: Maybe + /** Determines if product of this type has multiple variants. This option mainly simplifies product management in the dashboard. There is always at least one variant created under the hood. */ + hasVariants?: Maybe + /** List of attributes shared among all product variants. */ + productAttributes?: Maybe>> + /** List of attributes used to distinguish between different variants of a product. */ + variantAttributes?: Maybe>> + /** Determines if shipping is required for products of this variant. */ + isShippingRequired?: Maybe + /** Determines if products are digital. */ + isDigital?: Maybe + /** Weight of the ProductType items. */ + weight?: Maybe + /** Tax rate for enabled tax gateway. */ + taxCode?: Maybe +} + +/** Reorder the attributes of a product type. */ +export type ProductTypeReorderAttributes = { + __typename?: 'ProductTypeReorderAttributes' + /** Product type from which attributes are reordered. */ + productType?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +export enum ProductTypeSortField { + /** Sort products by name. */ + Name = 'NAME', + /** Sort products by type. */ + Digital = 'DIGITAL', + /** Sort products by shipping. */ + ShippingRequired = 'SHIPPING_REQUIRED', +} + +export type ProductTypeSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort product types by the selected field. */ + field: ProductTypeSortField +} + +/** Updates an existing product type. */ +export type ProductTypeUpdate = { + __typename?: 'ProductTypeUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productType?: Maybe +} + +/** Updates an existing product. */ +export type ProductUpdate = { + __typename?: 'ProductUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + product?: Maybe +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariant = Node & + ObjectWithMetadata & { + __typename?: 'ProductVariant' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + sku: Scalars['String'] + product: Product + trackInventory: Scalars['Boolean'] + weight?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** List of price information in channels for the product. */ + channelListings?: Maybe> + /** Lists the storefront variant's pricing, the current price and discounts, only meant for displaying. */ + pricing?: Maybe + /** List of attributes assigned to this variant. */ + attributes: Array + /** Cost price of the variant. */ + costPrice?: Maybe + /** Gross margin percentage value. */ + margin?: Maybe + /** Total quantity ordered. */ + quantityOrdered?: Maybe + /** Total revenue generated by a variant in given period of time. Note: this field should be queried using `reportProductSales` query as it uses optimizations suitable for such calculations. */ + revenue?: Maybe + /** + * List of images for the product variant. + * @deprecated Will be removed in Saleor 4.0. Use the `media` instead. + */ + images?: Maybe>> + /** List of media for the product variant. */ + media?: Maybe> + /** Returns translated product variant fields for the given language code. */ + translation?: Maybe + /** Digital content for the product variant. */ + digitalContent?: Maybe + /** Stocks for the product variant. */ + stocks?: Maybe>> + /** Quantity of a product available for sale in one checkout. */ + quantityAvailable: Scalars['Int'] + } + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantPricingArgs = { + address?: Maybe +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantAttributesArgs = { + variantSelection?: Maybe +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantRevenueArgs = { + period?: Maybe +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantStocksArgs = { + address?: Maybe + countryCode?: Maybe +} + +/** Represents a version of a product such as different size or color. */ +export type ProductVariantQuantityAvailableArgs = { + address?: Maybe + countryCode?: Maybe +} + +/** Creates product variants for a given product. */ +export type ProductVariantBulkCreate = { + __typename?: 'ProductVariantBulkCreate' + /** Returns how many objects were created. */ + count: Scalars['Int'] + /** List of the created variants. */ + productVariants: Array + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + bulkProductErrors: Array + errors: Array +} + +export type ProductVariantBulkCreateInput = { + /** List of attributes specific to this variant. */ + attributes: Array> + /** Stock keeping unit. */ + sku: Scalars['String'] + /** Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. */ + trackInventory?: Maybe + /** Weight of the Product Variant. */ + weight?: Maybe + /** Stocks of a product available for sale. */ + stocks?: Maybe> + /** List of prices assigned to channels. */ + channelListings?: Maybe> +} + +/** Deletes product variants. */ +export type ProductVariantBulkDelete = { + __typename?: 'ProductVariantBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Represents product varaint channel listing. */ +export type ProductVariantChannelListing = Node & { + __typename?: 'ProductVariantChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + channel: Channel + price?: Maybe + /** Cost price of the variant. */ + costPrice?: Maybe + /** Gross margin percentage value. */ + margin?: Maybe +} + +export type ProductVariantChannelListingAddInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** Price of the particular variant in channel. */ + price: Scalars['PositiveDecimal'] + /** Cost price of the variant in channel. */ + costPrice?: Maybe +} + +/** Manage product variant prices in channels. */ +export type ProductVariantChannelListingUpdate = { + __typename?: 'ProductVariantChannelListingUpdate' + /** An updated product variant instance. */ + variant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productChannelListingErrors: Array + errors: Array +} + +export type ProductVariantCountableConnection = { + __typename?: 'ProductVariantCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type ProductVariantCountableEdge = { + __typename?: 'ProductVariantCountableEdge' + /** The item at the end of the edge. */ + node: ProductVariant + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new variant for a product. */ +export type ProductVariantCreate = { + __typename?: 'ProductVariantCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productVariant?: Maybe +} + +export type ProductVariantCreateInput = { + /** List of attributes specific to this variant. */ + attributes: Array> + /** Stock keeping unit. */ + sku?: Maybe + /** Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. */ + trackInventory?: Maybe + /** Weight of the Product Variant. */ + weight?: Maybe + /** Product ID of which type is the variant. */ + product: Scalars['ID'] + /** Stocks of a product available for sale. */ + stocks?: Maybe> +} + +/** Deletes a product variant. */ +export type ProductVariantDelete = { + __typename?: 'ProductVariantDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productVariant?: Maybe +} + +export type ProductVariantFilterInput = { + search?: Maybe + sku?: Maybe>> + metadata?: Maybe>> +} + +export type ProductVariantInput = { + /** List of attributes specific to this variant. */ + attributes?: Maybe>> + /** Stock keeping unit. */ + sku?: Maybe + /** Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. */ + trackInventory?: Maybe + /** Weight of the Product Variant. */ + weight?: Maybe +} + +/** Reorder the variants of a product. Mutation updates updated_at on product and triggers PRODUCT_UPDATED webhook. */ +export type ProductVariantReorder = { + __typename?: 'ProductVariantReorder' + product?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Reorder product variant attribute values. */ +export type ProductVariantReorderAttributeValues = { + __typename?: 'ProductVariantReorderAttributeValues' + /** Product variant from which attribute values are reordered. */ + productVariant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Set default variant for a product. Mutation triggers PRODUCT_UPDATED webhook. */ +export type ProductVariantSetDefault = { + __typename?: 'ProductVariantSetDefault' + product?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Creates stocks for product variant. */ +export type ProductVariantStocksCreate = { + __typename?: 'ProductVariantStocksCreate' + /** Updated product variant. */ + productVariant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + bulkStockErrors: Array + errors: Array +} + +/** Delete stocks from product variant. */ +export type ProductVariantStocksDelete = { + __typename?: 'ProductVariantStocksDelete' + /** Updated product variant. */ + productVariant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + stockErrors: Array + errors: Array +} + +/** Update stocks for product variant. */ +export type ProductVariantStocksUpdate = { + __typename?: 'ProductVariantStocksUpdate' + /** Updated product variant. */ + productVariant?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + bulkStockErrors: Array + errors: Array +} + +export type ProductVariantTranslatableContent = Node & { + __typename?: 'ProductVariantTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Returns translated product variant fields for the given language code. */ + translation?: Maybe + /** Represents a version of a product such as different size or color. */ + productVariant?: Maybe +} + +export type ProductVariantTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Product Variant. */ +export type ProductVariantTranslate = { + __typename?: 'ProductVariantTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + productVariant?: Maybe +} + +export type ProductVariantTranslation = Node & { + __typename?: 'ProductVariantTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Translation language. */ + language: LanguageDisplay +} + +/** Updates an existing variant for product. */ +export type ProductVariantUpdate = { + __typename?: 'ProductVariantUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array + productVariant?: Maybe +} + +export type PublishableChannelListingInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** Determines if object is visible to customers. */ + isPublished?: Maybe + /** Publication date. ISO 8601 standard. */ + publicationDate?: Maybe +} + +export type Query = { + __typename?: 'Query' + /** Look up a webhook by ID. */ + webhook?: Maybe + /** List of all available webhook events. */ + webhookEvents?: Maybe>> + /** Retrieve a sample payload for a given webhook event based on real data. It can be useful for some integrations where sample payload is required. */ + webhookSamplePayload?: Maybe + /** Look up a warehouse by ID. */ + warehouse?: Maybe + /** List of warehouses. */ + warehouses?: Maybe + /** Returns a list of all translatable items of a given kind. */ + translations?: Maybe + translation?: Maybe + /** Look up a stock by ID */ + stock?: Maybe + /** List of stocks. */ + stocks?: Maybe + /** Return information about the shop. */ + shop: Shop + /** Order related settings from site settings. */ + orderSettings?: Maybe + /** Look up a shipping zone by ID. */ + shippingZone?: Maybe + /** List of the shop's shipping zones. */ + shippingZones?: Maybe + /** Look up digital content by ID. */ + digitalContent?: Maybe + /** List of digital content. */ + digitalContents?: Maybe + /** List of the shop's categories. */ + categories?: Maybe + /** Look up a category by ID or slug. */ + category?: Maybe + /** Look up a collection by ID. */ + collection?: Maybe + /** List of the shop's collections. */ + collections?: Maybe + /** Look up a product by ID. */ + product?: Maybe + /** List of the shop's products. */ + products?: Maybe + /** Look up a product type by ID. */ + productType?: Maybe + /** List of the shop's product types. */ + productTypes?: Maybe + /** Look up a product variant by ID or SKU. */ + productVariant?: Maybe + /** List of product variants. */ + productVariants?: Maybe + /** List of top selling products. */ + reportProductSales?: Maybe + /** Look up a payment by ID. */ + payment?: Maybe + /** List of payments. */ + payments?: Maybe + /** Look up a page by ID or slug. */ + page?: Maybe + /** List of the shop's pages. */ + pages?: Maybe + /** Look up a page type by ID. */ + pageType?: Maybe + /** List of the page types. */ + pageTypes?: Maybe + /** List of activity events to display on homepage (at the moment it only contains order-events). */ + homepageEvents?: Maybe + /** Look up an order by ID. */ + order?: Maybe + /** List of orders. */ + orders?: Maybe + /** List of draft orders. */ + draftOrders?: Maybe + /** Return the total sales amount from a specific period. */ + ordersTotal?: Maybe + /** Look up an order by token. */ + orderByToken?: Maybe + /** Look up a navigation menu by ID or name. */ + menu?: Maybe + /** List of the storefront's menus. */ + menus?: Maybe + /** Look up a menu item by ID. */ + menuItem?: Maybe + /** List of the storefronts's menu items. */ + menuItems?: Maybe + /** Look up a gift card by ID. */ + giftCard?: Maybe + /** List of gift cards. */ + giftCards?: Maybe + /** Look up a plugin by ID. */ + plugin?: Maybe + /** List of plugins. */ + plugins?: Maybe + /** Look up a sale by ID. */ + sale?: Maybe + /** List of the shop's sales. */ + sales?: Maybe + /** Look up a voucher by ID. */ + voucher?: Maybe + /** List of the shop's vouchers. */ + vouchers?: Maybe + /** Look up a export file by ID. */ + exportFile?: Maybe + /** List of export files. */ + exportFiles?: Maybe + /** List of all tax rates available from tax gateway. */ + taxTypes?: Maybe>> + /** Look up a checkout by token and slug of channel. */ + checkout?: Maybe + /** List of checkouts. */ + checkouts?: Maybe + /** Look up a checkout line by ID. */ + checkoutLine?: Maybe + /** List of checkout lines. */ + checkoutLines?: Maybe + /** Look up a channel by ID. */ + channel?: Maybe + /** List of all channels. */ + channels?: Maybe> + /** List of the shop's attributes. */ + attributes?: Maybe + /** Look up an attribute by ID. */ + attribute?: Maybe + /** List of all apps installations */ + appsInstallations: Array + /** List of the apps. */ + apps?: Maybe + /** Look up an app by ID. If ID is not provided, return the currently authenticated app. */ + app?: Maybe + /** Returns address validation rules. */ + addressValidationRules?: Maybe + /** Look up an address by ID. */ + address?: Maybe
+ /** List of the shop's customers. */ + customers?: Maybe + /** List of permission groups. */ + permissionGroups?: Maybe + /** Look up permission group by ID. */ + permissionGroup?: Maybe + /** Return the currently authenticated user. */ + me?: Maybe + /** List of the shop's staff users. */ + staffUsers?: Maybe + /** Look up a user by ID or email address. */ + user?: Maybe + _entities?: Maybe>> + _service?: Maybe<_Service> +} + +export type QueryWebhookArgs = { + id: Scalars['ID'] +} + +export type QueryWebhookSamplePayloadArgs = { + eventType: WebhookSampleEventTypeEnum +} + +export type QueryWarehouseArgs = { + id: Scalars['ID'] +} + +export type QueryWarehousesArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryTranslationsArgs = { + kind: TranslatableKinds + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryTranslationArgs = { + id: Scalars['ID'] + kind: TranslatableKinds +} + +export type QueryStockArgs = { + id: Scalars['ID'] +} + +export type QueryStocksArgs = { + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryShippingZoneArgs = { + id: Scalars['ID'] + channel?: Maybe +} + +export type QueryShippingZonesArgs = { + filter?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryDigitalContentArgs = { + id: Scalars['ID'] +} + +export type QueryDigitalContentsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryCategoriesArgs = { + filter?: Maybe + sortBy?: Maybe + level?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryCategoryArgs = { + id?: Maybe + slug?: Maybe +} + +export type QueryCollectionArgs = { + id?: Maybe + slug?: Maybe + channel?: Maybe +} + +export type QueryCollectionsArgs = { + filter?: Maybe + sortBy?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryProductArgs = { + id?: Maybe + slug?: Maybe + channel?: Maybe +} + +export type QueryProductsArgs = { + filter?: Maybe + sortBy?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryProductTypeArgs = { + id: Scalars['ID'] +} + +export type QueryProductTypesArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryProductVariantArgs = { + id?: Maybe + sku?: Maybe + channel?: Maybe +} + +export type QueryProductVariantsArgs = { + ids?: Maybe>> + channel?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryReportProductSalesArgs = { + period: ReportingPeriod + channel: Scalars['String'] + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPaymentArgs = { + id: Scalars['ID'] +} + +export type QueryPaymentsArgs = { + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPageArgs = { + id?: Maybe + slug?: Maybe +} + +export type QueryPagesArgs = { + sortBy?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPageTypeArgs = { + id: Scalars['ID'] +} + +export type QueryPageTypesArgs = { + sortBy?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryHomepageEventsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryOrderArgs = { + id: Scalars['ID'] +} + +export type QueryOrdersArgs = { + sortBy?: Maybe + filter?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryDraftOrdersArgs = { + sortBy?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryOrdersTotalArgs = { + period?: Maybe + channel?: Maybe +} + +export type QueryOrderByTokenArgs = { + token: Scalars['UUID'] +} + +export type QueryMenuArgs = { + channel?: Maybe + id?: Maybe + name?: Maybe + slug?: Maybe +} + +export type QueryMenusArgs = { + channel?: Maybe + sortBy?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryMenuItemArgs = { + id: Scalars['ID'] + channel?: Maybe +} + +export type QueryMenuItemsArgs = { + channel?: Maybe + sortBy?: Maybe + filter?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryGiftCardArgs = { + id: Scalars['ID'] +} + +export type QueryGiftCardsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPluginArgs = { + id: Scalars['ID'] +} + +export type QueryPluginsArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QuerySaleArgs = { + id: Scalars['ID'] + channel?: Maybe +} + +export type QuerySalesArgs = { + filter?: Maybe + sortBy?: Maybe + query?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryVoucherArgs = { + id: Scalars['ID'] + channel?: Maybe +} + +export type QueryVouchersArgs = { + filter?: Maybe + sortBy?: Maybe + query?: Maybe + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryExportFileArgs = { + id: Scalars['ID'] +} + +export type QueryExportFilesArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryCheckoutArgs = { + token?: Maybe +} + +export type QueryCheckoutsArgs = { + channel?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryCheckoutLineArgs = { + id?: Maybe +} + +export type QueryCheckoutLinesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryChannelArgs = { + id?: Maybe +} + +export type QueryAttributesArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryAttributeArgs = { + id?: Maybe + slug?: Maybe +} + +export type QueryAppsArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryAppArgs = { + id?: Maybe +} + +export type QueryAddressValidationRulesArgs = { + countryCode: CountryCode + countryArea?: Maybe + city?: Maybe + cityArea?: Maybe +} + +export type QueryAddressArgs = { + id: Scalars['ID'] +} + +export type QueryCustomersArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPermissionGroupsArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryPermissionGroupArgs = { + id: Scalars['ID'] +} + +export type QueryStaffUsersArgs = { + filter?: Maybe + sortBy?: Maybe + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type QueryUserArgs = { + id?: Maybe + email?: Maybe +} + +export type Query_EntitiesArgs = { + representations?: Maybe>> +} + +/** Represents a reduced VAT rate for a particular type of goods. */ +export type ReducedRate = { + __typename?: 'ReducedRate' + /** Reduced VAT rate in percent. */ + rate: Scalars['Float'] + /** A type of goods. */ + rateType: TaxRateType +} + +/** Refresh JWT token. Mutation tries to take refreshToken from the input.If it fails it will try to take refreshToken from the http-only cookie -refreshToken. csrfToken is required when refreshToken is provided as a cookie. */ +export type RefreshToken = { + __typename?: 'RefreshToken' + /** JWT token, required to authenticate. */ + token?: Maybe + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +export type ReorderInput = { + /** The ID of the item to move. */ + id: Scalars['ID'] + /** The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. */ + sortOrder?: Maybe +} + +export enum ReportingPeriod { + Today = 'TODAY', + ThisMonth = 'THIS_MONTH', +} + +/** Request email change of the logged in user. */ +export type RequestEmailChange = { + __typename?: 'RequestEmailChange' + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Sends an email with the account password modification link. */ +export type RequestPasswordReset = { + __typename?: 'RequestPasswordReset' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ +export type Sale = Node & { + __typename?: 'Sale' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + type: SaleType + startDate: Scalars['DateTime'] + endDate?: Maybe + /** List of categories this sale applies to. */ + categories?: Maybe + /** List of collections this sale applies to. */ + collections?: Maybe + /** List of products this sale applies to. */ + products?: Maybe + /** Returns translated sale fields for the given language code. */ + translation?: Maybe + /** List of channels available for the sale. */ + channelListings?: Maybe> + /** Sale value. */ + discountValue?: Maybe + /** Currency code for sale. */ + currency?: Maybe +} + +/** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ +export type SaleCategoriesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ +export type SaleCollectionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ +export type SaleProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ +export type SaleTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Adds products, categories, collections to a voucher. */ +export type SaleAddCatalogues = { + __typename?: 'SaleAddCatalogues' + /** Sale of which catalogue IDs will be modified. */ + sale?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +/** Deletes sales. */ +export type SaleBulkDelete = { + __typename?: 'SaleBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +/** Represents sale channel listing. */ +export type SaleChannelListing = Node & { + __typename?: 'SaleChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + channel: Channel + discountValue: Scalars['Float'] + currency: Scalars['String'] +} + +export type SaleChannelListingAddInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** The value of the discount. */ + discountValue: Scalars['PositiveDecimal'] +} + +export type SaleChannelListingInput = { + /** List of channels to which the sale should be assigned. */ + addChannels?: Maybe> + /** List of channels from which the sale should be unassigned. */ + removeChannels?: Maybe> +} + +/** Manage sale's availability in channels. */ +export type SaleChannelListingUpdate = { + __typename?: 'SaleChannelListingUpdate' + /** An updated sale instance. */ + sale?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +export type SaleCountableConnection = { + __typename?: 'SaleCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type SaleCountableEdge = { + __typename?: 'SaleCountableEdge' + /** The item at the end of the edge. */ + node: Sale + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new sale. */ +export type SaleCreate = { + __typename?: 'SaleCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + sale?: Maybe +} + +/** Deletes a sale. */ +export type SaleDelete = { + __typename?: 'SaleDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + sale?: Maybe +} + +export type SaleFilterInput = { + status?: Maybe>> + saleType?: Maybe + started?: Maybe + search?: Maybe +} + +export type SaleInput = { + /** Voucher name. */ + name?: Maybe + /** Fixed or percentage. */ + type?: Maybe + /** Value of the voucher. */ + value?: Maybe + /** Products related to the discount. */ + products?: Maybe>> + /** Categories related to the discount. */ + categories?: Maybe>> + /** Collections related to the discount. */ + collections?: Maybe>> + /** Start date of the voucher in ISO 8601 format. */ + startDate?: Maybe + /** End date of the voucher in ISO 8601 format. */ + endDate?: Maybe +} + +/** Removes products, categories, collections from a sale. */ +export type SaleRemoveCatalogues = { + __typename?: 'SaleRemoveCatalogues' + /** Sale of which catalogue IDs will be modified. */ + sale?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +export enum SaleSortField { + /** Sort sales by name. */ + Name = 'NAME', + /** Sort sales by start date. */ + StartDate = 'START_DATE', + /** Sort sales by end date. */ + EndDate = 'END_DATE', + /** Sort sales by value. */ + Value = 'VALUE', + /** Sort sales by type. */ + Type = 'TYPE', +} + +export type SaleSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Specifies the channel in which to sort the data. */ + channel?: Maybe + /** Sort sales by the selected field. */ + field: SaleSortField +} + +export type SaleTranslatableContent = Node & { + __typename?: 'SaleTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + /** Returns translated sale fields for the given language code. */ + translation?: Maybe + /** Sales allow creating discounts for categories, collections or products and are visible to all the customers. */ + sale?: Maybe +} + +export type SaleTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/updates translations for a sale. */ +export type SaleTranslate = { + __typename?: 'SaleTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + sale?: Maybe +} + +export type SaleTranslation = Node & { + __typename?: 'SaleTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name?: Maybe + /** Translation language. */ + language: LanguageDisplay +} + +/** An enumeration. */ +export enum SaleType { + /** fixed */ + Fixed = 'FIXED', + /** % */ + Percentage = 'PERCENTAGE', +} + +/** Updates a sale. */ +export type SaleUpdate = { + __typename?: 'SaleUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + sale?: Maybe +} + +/** Represents a custom attribute. */ +export type SelectedAttribute = { + __typename?: 'SelectedAttribute' + /** Name of an attribute displayed in the interface. */ + attribute: Attribute + /** Values of an attribute. */ + values: Array> +} + +export type SeoInput = { + /** SEO title. */ + title?: Maybe + /** SEO description. */ + description?: Maybe +} + +/** Sets the user's password from the token sent by email using the RequestPasswordReset mutation. */ +export type SetPassword = { + __typename?: 'SetPassword' + /** JWT token, required to authenticate. */ + token?: Maybe + /** JWT refresh token, required to re-generate access token. */ + refreshToken?: Maybe + /** CSRF token required to re-generate access token. */ + csrfToken?: Maybe + /** A user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +export type ShippingError = { + __typename?: 'ShippingError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ShippingErrorCode + /** List of warehouse IDs which causes the error. */ + warehouses?: Maybe> + /** List of channels IDs which causes the error. */ + channels?: Maybe> +} + +/** An enumeration. */ +export enum ShippingErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + MaxLessThanMin = 'MAX_LESS_THAN_MIN', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', + DuplicatedInputItem = 'DUPLICATED_INPUT_ITEM', +} + +/** Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. */ +export type ShippingMethod = Node & + ObjectWithMetadata & { + __typename?: 'ShippingMethod' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + description?: Maybe + minimumOrderWeight?: Maybe + maximumOrderWeight?: Maybe + maximumDeliveryDays?: Maybe + minimumDeliveryDays?: Maybe + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Type of the shipping method. */ + type?: Maybe + /** Returns translated shipping method fields for the given language code. */ + translation?: Maybe + /** List of channels available for the method. */ + channelListings?: Maybe> + /** The price of the cheapest variant (including discounts). */ + price?: Maybe + /** The price of the cheapest variant (including discounts). */ + maximumOrderPrice?: Maybe + /** The price of the cheapest variant (including discounts). */ + minimumOrderPrice?: Maybe + /** Postal code ranges rule of exclusion or inclusion of the shipping method. */ + postalCodeRules?: Maybe>> + /** List of excluded products for the shipping method. */ + excludedProducts?: Maybe + } + +/** Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. */ +export type ShippingMethodTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. */ +export type ShippingMethodExcludedProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents shipping method channel listing. */ +export type ShippingMethodChannelListing = Node & { + __typename?: 'ShippingMethodChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + channel: Channel + minimumOrderPrice?: Maybe + maximumOrderPrice?: Maybe + price?: Maybe +} + +export type ShippingMethodChannelListingAddInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** Shipping price of the shipping method in this channel. */ + price?: Maybe + /** Minimum order price to use this shipping method. */ + minimumOrderPrice?: Maybe + /** Maximum order price to use this shipping method. */ + maximumOrderPrice?: Maybe +} + +export type ShippingMethodChannelListingInput = { + /** List of channels to which the shipping method should be assigned. */ + addChannels?: Maybe> + /** List of channels from which the shipping method should be unassigned. */ + removeChannels?: Maybe> +} + +/** Manage shipping method's availability in channels. */ +export type ShippingMethodChannelListingUpdate = { + __typename?: 'ShippingMethodChannelListingUpdate' + /** An updated shipping method instance. */ + shippingMethod?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Represents shipping method postal code rule. */ +export type ShippingMethodPostalCodeRule = Node & { + __typename?: 'ShippingMethodPostalCodeRule' + /** Start address range. */ + start?: Maybe + /** End address range. */ + end?: Maybe + /** Inclusion type of the postal code rule. */ + inclusionType?: Maybe + /** The ID of the object. */ + id: Scalars['ID'] +} + +export type ShippingMethodTranslatableContent = Node & { + __typename?: 'ShippingMethodTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + description?: Maybe + /** Returns translated shipping method fields for the given language code. */ + translation?: Maybe + /** Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. */ + shippingMethod?: Maybe +} + +export type ShippingMethodTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +export type ShippingMethodTranslation = Node & { + __typename?: 'ShippingMethodTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name?: Maybe + description?: Maybe + /** Translation language. */ + language: LanguageDisplay +} + +/** An enumeration. */ +export enum ShippingMethodTypeEnum { + Price = 'PRICE', + Weight = 'WEIGHT', +} + +export type ShippingPostalCodeRulesCreateInputRange = { + /** Start range of the postal code. */ + start: Scalars['String'] + /** End range of the postal code. */ + end?: Maybe +} + +/** Deletes shipping prices. */ +export type ShippingPriceBulkDelete = { + __typename?: 'ShippingPriceBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Creates a new shipping price. */ +export type ShippingPriceCreate = { + __typename?: 'ShippingPriceCreate' + /** A shipping zone to which the shipping method belongs. */ + shippingZone?: Maybe + shippingMethod?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Deletes a shipping price. */ +export type ShippingPriceDelete = { + __typename?: 'ShippingPriceDelete' + /** A shipping method to delete. */ + shippingMethod?: Maybe + /** A shipping zone to which the shipping method belongs. */ + shippingZone?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Exclude products from shipping price. */ +export type ShippingPriceExcludeProducts = { + __typename?: 'ShippingPriceExcludeProducts' + /** A shipping method with new list of excluded products. */ + shippingMethod?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +export type ShippingPriceExcludeProductsInput = { + /** List of products which will be excluded. */ + products: Array> +} + +export type ShippingPriceInput = { + /** Name of the shipping method. */ + name?: Maybe + /** Shipping method description (JSON). */ + description?: Maybe + /** Minimum order weight to use this shipping method. */ + minimumOrderWeight?: Maybe + /** Maximum order weight to use this shipping method. */ + maximumOrderWeight?: Maybe + /** Maximum number of days for delivery. */ + maximumDeliveryDays?: Maybe + /** Minimal number of days for delivery. */ + minimumDeliveryDays?: Maybe + /** Shipping type: price or weight based. */ + type?: Maybe + /** Shipping zone this method belongs to. */ + shippingZone?: Maybe + /** Postal code rules to add. */ + addPostalCodeRules?: Maybe> + /** Postal code rules to delete. */ + deletePostalCodeRules?: Maybe> + /** Inclusion type for currently assigned postal code rules. */ + inclusionType?: Maybe +} + +/** Remove product from excluded list for shipping price. */ +export type ShippingPriceRemoveProductFromExclude = { + __typename?: 'ShippingPriceRemoveProductFromExclude' + /** A shipping method with new list of excluded products. */ + shippingMethod?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Creates/Updates translations for shipping method. */ +export type ShippingPriceTranslate = { + __typename?: 'ShippingPriceTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + shippingMethod?: Maybe +} + +export type ShippingPriceTranslationInput = { + name?: Maybe + /** Translated shipping method description (JSON). */ + description?: Maybe +} + +/** Updates a new shipping price. */ +export type ShippingPriceUpdate = { + __typename?: 'ShippingPriceUpdate' + /** A shipping zone to which the shipping method belongs. */ + shippingZone?: Maybe + shippingMethod?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +/** Represents a shipping zone in the shop. Zones are the concept used only for grouping shipping methods in the dashboard, and are never exposed to the customers directly. */ +export type ShippingZone = Node & + ObjectWithMetadata & { + __typename?: 'ShippingZone' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + default: Scalars['Boolean'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** Lowest and highest prices for the shipping. */ + priceRange?: Maybe + /** List of countries available for the method. */ + countries?: Maybe>> + /** List of shipping methods available for orders shipped to countries within this shipping zone. */ + shippingMethods?: Maybe>> + /** List of warehouses for shipping zone. */ + warehouses: Array + /** List of channels for shipping zone. */ + channels: Array + /** Description of a shipping zone. */ + description?: Maybe + } + +/** Deletes shipping zones. */ +export type ShippingZoneBulkDelete = { + __typename?: 'ShippingZoneBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array +} + +export type ShippingZoneCountableConnection = { + __typename?: 'ShippingZoneCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type ShippingZoneCountableEdge = { + __typename?: 'ShippingZoneCountableEdge' + /** The item at the end of the edge. */ + node: ShippingZone + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new shipping zone. */ +export type ShippingZoneCreate = { + __typename?: 'ShippingZoneCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array + shippingZone?: Maybe +} + +export type ShippingZoneCreateInput = { + /** Shipping zone's name. Visible only to the staff. */ + name?: Maybe + /** Description of the shipping zone. */ + description?: Maybe + /** List of countries in this shipping zone. */ + countries?: Maybe>> + /** Default shipping zone will be used for countries not covered by other zones. */ + default?: Maybe + /** List of warehouses to assign to a shipping zone */ + addWarehouses?: Maybe>> + /** List of channels to assign to the shipping zone. */ + addChannels?: Maybe> +} + +/** Deletes a shipping zone. */ +export type ShippingZoneDelete = { + __typename?: 'ShippingZoneDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array + shippingZone?: Maybe +} + +export type ShippingZoneFilterInput = { + search?: Maybe + channels?: Maybe>> +} + +/** Updates a new shipping zone. */ +export type ShippingZoneUpdate = { + __typename?: 'ShippingZoneUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shippingErrors: Array + errors: Array + shippingZone?: Maybe +} + +export type ShippingZoneUpdateInput = { + /** Shipping zone's name. Visible only to the staff. */ + name?: Maybe + /** Description of the shipping zone. */ + description?: Maybe + /** List of countries in this shipping zone. */ + countries?: Maybe>> + /** Default shipping zone will be used for countries not covered by other zones. */ + default?: Maybe + /** List of warehouses to assign to a shipping zone */ + addWarehouses?: Maybe>> + /** List of channels to assign to the shipping zone. */ + addChannels?: Maybe> + /** List of warehouses to unassign from a shipping zone */ + removeWarehouses?: Maybe>> + /** List of channels to unassign from the shipping zone. */ + removeChannels?: Maybe> +} + +/** Represents a shop resource containing general shop data and configuration. */ +export type Shop = { + __typename?: 'Shop' + /** List of available payment gateways. */ + availablePaymentGateways: Array + /** List of available external authentications. */ + availableExternalAuthentications: Array + /** Shipping methods that are available for the shop. */ + availableShippingMethods?: Maybe>> + /** List of countries available in the shop. */ + countries: Array + /** Shop's default country. */ + defaultCountry?: Maybe + /** Default shop's email sender's name. */ + defaultMailSenderName?: Maybe + /** Default shop's email sender's address. */ + defaultMailSenderAddress?: Maybe + /** Shop's description. */ + description?: Maybe + /** Shop's domain data. */ + domain: Domain + /** List of the shops's supported languages. */ + languages: Array> + /** Shop's name. */ + name: Scalars['String'] + /** List of available permissions. */ + permissions: Array> + /** List of possible phone prefixes. */ + phonePrefixes: Array> + /** Header text. */ + headerText?: Maybe + /** Include taxes in prices. */ + includeTaxesInPrices: Scalars['Boolean'] + /** Display prices with tax in store. */ + displayGrossPrices: Scalars['Boolean'] + /** Charge taxes on shipping. */ + chargeTaxesOnShipping: Scalars['Boolean'] + /** Enable inventory tracking. */ + trackInventoryByDefault?: Maybe + /** Default weight unit. */ + defaultWeightUnit?: Maybe + /** Returns translated shop fields for the given language code. */ + translation?: Maybe + /** Enable automatic fulfillment for all digital products. */ + automaticFulfillmentDigitalProducts?: Maybe + /** Default number of max downloads per digital content URL. */ + defaultDigitalMaxDownloads?: Maybe + /** Default number of days which digital content URL will be valid. */ + defaultDigitalUrlValidDays?: Maybe + /** Company address. */ + companyAddress?: Maybe
+ /** URL of a view where customers can set their password. */ + customerSetPasswordUrl?: Maybe + /** List of staff notification recipients. */ + staffNotificationRecipients?: Maybe>> + /** Resource limitations and current usage if any set for a shop */ + limits: LimitInfo + /** Saleor API version. */ + version: Scalars['String'] +} + +/** Represents a shop resource containing general shop data and configuration. */ +export type ShopAvailablePaymentGatewaysArgs = { + currency?: Maybe + channel?: Maybe +} + +/** Represents a shop resource containing general shop data and configuration. */ +export type ShopAvailableShippingMethodsArgs = { + channel: Scalars['String'] + address?: Maybe +} + +/** Represents a shop resource containing general shop data and configuration. */ +export type ShopCountriesArgs = { + languageCode?: Maybe +} + +/** Represents a shop resource containing general shop data and configuration. */ +export type ShopTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Update the shop's address. If the `null` value is passed, the currently selected address will be deleted. */ +export type ShopAddressUpdate = { + __typename?: 'ShopAddressUpdate' + /** Updated shop. */ + shop?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array +} + +/** Updates site domain of the shop. */ +export type ShopDomainUpdate = { + __typename?: 'ShopDomainUpdate' + /** Updated shop. */ + shop?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array +} + +export type ShopError = { + __typename?: 'ShopError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: ShopErrorCode +} + +/** An enumeration. */ +export enum ShopErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + CannotFetchTaxRates = 'CANNOT_FETCH_TAX_RATES', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +/** Fetch tax rates. */ +export type ShopFetchTaxRates = { + __typename?: 'ShopFetchTaxRates' + /** Updated shop. */ + shop?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array +} + +export type ShopSettingsInput = { + /** Header text. */ + headerText?: Maybe + /** SEO description. */ + description?: Maybe + /** Include taxes in prices. */ + includeTaxesInPrices?: Maybe + /** Display prices with tax in store. */ + displayGrossPrices?: Maybe + /** Charge taxes on shipping. */ + chargeTaxesOnShipping?: Maybe + /** Enable inventory tracking. */ + trackInventoryByDefault?: Maybe + /** Default weight unit. */ + defaultWeightUnit?: Maybe + /** Enable automatic fulfillment for all digital products. */ + automaticFulfillmentDigitalProducts?: Maybe + /** Default number of max downloads per digital content URL. */ + defaultDigitalMaxDownloads?: Maybe + /** Default number of days which digital content URL will be valid. */ + defaultDigitalUrlValidDays?: Maybe + /** Default email sender's name. */ + defaultMailSenderName?: Maybe + /** Default email sender's address. */ + defaultMailSenderAddress?: Maybe + /** URL of a view where customers can set their password. */ + customerSetPasswordUrl?: Maybe +} + +/** Creates/Updates translations for Shop Settings. */ +export type ShopSettingsTranslate = { + __typename?: 'ShopSettingsTranslate' + /** Updated shop. */ + shop?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array +} + +export type ShopSettingsTranslationInput = { + headerText?: Maybe + description?: Maybe +} + +/** Updates shop settings. */ +export type ShopSettingsUpdate = { + __typename?: 'ShopSettingsUpdate' + /** Updated shop. */ + shop?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array +} + +export type ShopTranslation = Node & { + __typename?: 'ShopTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + headerText: Scalars['String'] + description: Scalars['String'] + /** Translation language. */ + language: LanguageDisplay +} + +export type SiteDomainInput = { + /** Domain name for shop. */ + domain?: Maybe + /** Shop site name. */ + name?: Maybe +} + +/** Deletes staff users. */ +export type StaffBulkDelete = { + __typename?: 'StaffBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + staffErrors: Array + errors: Array +} + +/** Creates a new staff user. */ +export type StaffCreate = { + __typename?: 'StaffCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + staffErrors: Array + errors: Array + user?: Maybe +} + +export type StaffCreateInput = { + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** The unique email address of the user. */ + email?: Maybe + /** User account is active. */ + isActive?: Maybe + /** A note about the user. */ + note?: Maybe + /** List of permission group IDs to which user should be assigned. */ + addGroups?: Maybe> + /** URL of a view where users should be redirected to set the password. URL in RFC 1808 format. */ + redirectUrl?: Maybe +} + +/** Deletes a staff user. */ +export type StaffDelete = { + __typename?: 'StaffDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + staffErrors: Array + errors: Array + user?: Maybe +} + +export type StaffError = { + __typename?: 'StaffError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: AccountErrorCode + /** A type of address that causes the error. */ + addressType?: Maybe + /** List of permissions which causes the error. */ + permissions?: Maybe> + /** List of permission group IDs which cause the error. */ + groups?: Maybe> + /** List of user IDs which causes the error. */ + users?: Maybe> +} + +export enum StaffMemberStatus { + /** User account has been activated. */ + Active = 'ACTIVE', + /** User account has not been activated yet. */ + Deactivated = 'DEACTIVATED', +} + +/** Represents a recipient of email notifications send by Saleor, such as notifications about new orders. Notifications can be assigned to staff users or arbitrary email addresses. */ +export type StaffNotificationRecipient = Node & { + __typename?: 'StaffNotificationRecipient' + /** Returns a user subscribed to email notifications. */ + user?: Maybe + /** Determines if a notification active. */ + active?: Maybe + /** The ID of the object. */ + id: Scalars['ID'] + /** Returns email address of a user subscribed to email notifications. */ + email?: Maybe +} + +/** Creates a new staff notification recipient. */ +export type StaffNotificationRecipientCreate = { + __typename?: 'StaffNotificationRecipientCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array + staffNotificationRecipient?: Maybe +} + +/** Delete staff notification recipient. */ +export type StaffNotificationRecipientDelete = { + __typename?: 'StaffNotificationRecipientDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array + staffNotificationRecipient?: Maybe +} + +export type StaffNotificationRecipientInput = { + /** The ID of the user subscribed to email notifications.. */ + user?: Maybe + /** Email address of a user subscribed to email notifications. */ + email?: Maybe + /** Determines if a notification active. */ + active?: Maybe +} + +/** Updates a staff notification recipient. */ +export type StaffNotificationRecipientUpdate = { + __typename?: 'StaffNotificationRecipientUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + shopErrors: Array + errors: Array + staffNotificationRecipient?: Maybe +} + +/** Updates an existing staff user. */ +export type StaffUpdate = { + __typename?: 'StaffUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + staffErrors: Array + errors: Array + user?: Maybe +} + +export type StaffUpdateInput = { + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** The unique email address of the user. */ + email?: Maybe + /** User account is active. */ + isActive?: Maybe + /** A note about the user. */ + note?: Maybe + /** List of permission group IDs to which user should be assigned. */ + addGroups?: Maybe> + /** List of permission group IDs from which user should be unassigned. */ + removeGroups?: Maybe> +} + +export type StaffUserInput = { + status?: Maybe + search?: Maybe +} + +/** Represents stock. */ +export type Stock = Node & { + __typename?: 'Stock' + warehouse: Warehouse + productVariant: ProductVariant + /** Quantity of a product in the warehouse's possession, including the allocated stock that is waiting for shipment. */ + quantity: Scalars['Int'] + /** The ID of the object. */ + id: Scalars['ID'] + /** Quantity allocated for orders */ + quantityAllocated: Scalars['Int'] +} + +export enum StockAvailability { + InStock = 'IN_STOCK', + OutOfStock = 'OUT_OF_STOCK', +} + +export type StockCountableConnection = { + __typename?: 'StockCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type StockCountableEdge = { + __typename?: 'StockCountableEdge' + /** The item at the end of the edge. */ + node: Stock + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type StockError = { + __typename?: 'StockError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: StockErrorCode +} + +/** An enumeration. */ +export enum StockErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +export type StockFilterInput = { + quantity?: Maybe + search?: Maybe +} + +export type StockInput = { + /** Warehouse in which stock is located. */ + warehouse: Scalars['ID'] + /** Quantity of items available for sell. */ + quantity: Scalars['Int'] +} + +/** An enumeration. */ +export enum TaxRateType { + Accommodation = 'ACCOMMODATION', + AdmissionToCulturalEvents = 'ADMISSION_TO_CULTURAL_EVENTS', + AdmissionToEntertainmentEvents = 'ADMISSION_TO_ENTERTAINMENT_EVENTS', + AdmissionToSportingEvents = 'ADMISSION_TO_SPORTING_EVENTS', + Advertising = 'ADVERTISING', + AgriculturalSupplies = 'AGRICULTURAL_SUPPLIES', + BabyFoodstuffs = 'BABY_FOODSTUFFS', + Bikes = 'BIKES', + Books = 'BOOKS', + ChildrensClothing = 'CHILDRENS_CLOTHING', + DomesticFuel = 'DOMESTIC_FUEL', + DomesticServices = 'DOMESTIC_SERVICES', + EBooks = 'E_BOOKS', + Foodstuffs = 'FOODSTUFFS', + Hotels = 'HOTELS', + Medical = 'MEDICAL', + Newspapers = 'NEWSPAPERS', + PassengerTransport = 'PASSENGER_TRANSPORT', + Pharmaceuticals = 'PHARMACEUTICALS', + PropertyRenovations = 'PROPERTY_RENOVATIONS', + Restaurants = 'RESTAURANTS', + SocialHousing = 'SOCIAL_HOUSING', + Standard = 'STANDARD', + Water = 'WATER', + Wine = 'WINE', +} + +/** Representation of tax types fetched from tax gateway. */ +export type TaxType = { + __typename?: 'TaxType' + /** Description of the tax type. */ + description?: Maybe + /** External tax code used to identify given tax group. */ + taxCode?: Maybe +} + +/** Represents a monetary value with taxes. In cases where taxes were not applied, net and gross values will be equal. */ +export type TaxedMoney = { + __typename?: 'TaxedMoney' + /** Currency code. */ + currency: Scalars['String'] + /** Amount of money including taxes. */ + gross: Money + /** Amount of money without taxes. */ + net: Money + /** Amount of taxes. */ + tax: Money +} + +/** Represents a range of monetary values. */ +export type TaxedMoneyRange = { + __typename?: 'TaxedMoneyRange' + /** Lower bound of a price range. */ + start?: Maybe + /** Upper bound of a price range. */ + stop?: Maybe +} + +/** An object representing a single payment. */ +export type Transaction = Node & { + __typename?: 'Transaction' + /** The ID of the object. */ + id: Scalars['ID'] + created: Scalars['DateTime'] + payment: Payment + token: Scalars['String'] + kind: TransactionKind + isSuccess: Scalars['Boolean'] + error?: Maybe + gatewayResponse: Scalars['JSONString'] + /** Total amount of the transaction. */ + amount?: Maybe +} + +/** An enumeration. */ +export enum TransactionKind { + /** External reference */ + External = 'EXTERNAL', + /** Authorization */ + Auth = 'AUTH', + /** Pending */ + Pending = 'PENDING', + /** Action to confirm */ + ActionToConfirm = 'ACTION_TO_CONFIRM', + /** Refund */ + Refund = 'REFUND', + /** Refund in progress */ + RefundOngoing = 'REFUND_ONGOING', + /** Capture */ + Capture = 'CAPTURE', + /** Void */ + Void = 'VOID', + /** Confirm */ + Confirm = 'CONFIRM', + /** Cancel */ + Cancel = 'CANCEL', +} + +export type TranslatableItem = + | ProductTranslatableContent + | CollectionTranslatableContent + | CategoryTranslatableContent + | AttributeTranslatableContent + | AttributeValueTranslatableContent + | ProductVariantTranslatableContent + | PageTranslatableContent + | ShippingMethodTranslatableContent + | SaleTranslatableContent + | VoucherTranslatableContent + | MenuItemTranslatableContent + +export type TranslatableItemConnection = { + __typename?: 'TranslatableItemConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type TranslatableItemEdge = { + __typename?: 'TranslatableItemEdge' + /** The item at the end of the edge. */ + node: TranslatableItem + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export enum TranslatableKinds { + Attribute = 'ATTRIBUTE', + AttributeValue = 'ATTRIBUTE_VALUE', + Category = 'CATEGORY', + Collection = 'COLLECTION', + MenuItem = 'MENU_ITEM', + Page = 'PAGE', + Product = 'PRODUCT', + Sale = 'SALE', + ShippingMethod = 'SHIPPING_METHOD', + Variant = 'VARIANT', + Voucher = 'VOUCHER', +} + +export type TranslationError = { + __typename?: 'TranslationError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: TranslationErrorCode +} + +/** An enumeration. */ +export enum TranslationErrorCode { + GraphqlError = 'GRAPHQL_ERROR', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', +} + +export type TranslationInput = { + seoTitle?: Maybe + seoDescription?: Maybe + name?: Maybe + description?: Maybe +} + +export type UpdateInvoiceInput = { + /** Invoice number */ + number?: Maybe + /** URL of an invoice to download. */ + url?: Maybe +} + +/** Updates metadata of an object. */ +export type UpdateMetadata = { + __typename?: 'UpdateMetadata' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + metadataErrors: Array + errors: Array + item?: Maybe +} + +/** Updates private metadata of an object. */ +export type UpdatePrivateMetadata = { + __typename?: 'UpdatePrivateMetadata' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + metadataErrors: Array + errors: Array + item?: Maybe +} + +export type UploadError = { + __typename?: 'UploadError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: UploadErrorCode +} + +/** An enumeration. */ +export enum UploadErrorCode { + GraphqlError = 'GRAPHQL_ERROR', +} + +/** Represents user data. */ +export type User = Node & + ObjectWithMetadata & { + __typename?: 'User' + /** The ID of the object. */ + id: Scalars['ID'] + lastLogin?: Maybe + email: Scalars['String'] + firstName: Scalars['String'] + lastName: Scalars['String'] + isStaff: Scalars['Boolean'] + isActive: Scalars['Boolean'] + /** A note about the customer. */ + note?: Maybe + dateJoined: Scalars['DateTime'] + defaultShippingAddress?: Maybe
+ defaultBillingAddress?: Maybe
+ /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + /** List of all user's addresses. */ + addresses?: Maybe>> + /** + * Returns the last open checkout of this user. + * @deprecated Will be removed in Saleor 4.0. Use the `checkout_tokens` field to fetch the user checkouts. + */ + checkout?: Maybe + /** Returns the checkout UUID's assigned to this user. */ + checkoutTokens?: Maybe> + /** List of the user gift cards. */ + giftCards?: Maybe + /** List of user's orders. */ + orders?: Maybe + /** List of user's permissions. */ + userPermissions?: Maybe>> + /** List of user's permission groups. */ + permissionGroups?: Maybe>> + /** List of user's permission groups which user can manage. */ + editableGroups?: Maybe>> + avatar?: Maybe + /** List of events associated with the user. */ + events?: Maybe>> + /** List of stored payment sources. */ + storedPaymentSources?: Maybe>> + /** User language code. */ + languageCode: LanguageCodeEnum + } + +/** Represents user data. */ +export type UserCheckoutTokensArgs = { + channel?: Maybe +} + +/** Represents user data. */ +export type UserGiftCardsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents user data. */ +export type UserOrdersArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Represents user data. */ +export type UserAvatarArgs = { + size?: Maybe +} + +/** Represents user data. */ +export type UserStoredPaymentSourcesArgs = { + channel?: Maybe +} + +/** Deletes a user avatar. Only for staff members. */ +export type UserAvatarDelete = { + __typename?: 'UserAvatarDelete' + /** An updated user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Create a user avatar. Only for staff members. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec */ +export type UserAvatarUpdate = { + __typename?: 'UserAvatarUpdate' + /** An updated user instance. */ + user?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** Activate or deactivate users. */ +export type UserBulkSetActive = { + __typename?: 'UserBulkSetActive' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +export type UserCountableConnection = { + __typename?: 'UserCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type UserCountableEdge = { + __typename?: 'UserCountableEdge' + /** The item at the end of the edge. */ + node: User + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +export type UserCreateInput = { + /** Billing address of the customer. */ + defaultBillingAddress?: Maybe + /** Shipping address of the customer. */ + defaultShippingAddress?: Maybe + /** Given name. */ + firstName?: Maybe + /** Family name. */ + lastName?: Maybe + /** The unique email address of the user. */ + email?: Maybe + /** User account is active. */ + isActive?: Maybe + /** A note about the user. */ + note?: Maybe + /** User language code. */ + languageCode?: Maybe + /** URL of a view where users should be redirected to set the password. URL in RFC 1808 format. */ + redirectUrl?: Maybe + /** Slug of a channel which will be used for notify user. Optional when only one channel exists. */ + channel?: Maybe +} + +export type UserPermission = { + __typename?: 'UserPermission' + /** Internal code for permission. */ + code: PermissionEnum + /** Describe action(s) allowed to do by permission. */ + name: Scalars['String'] + /** List of user permission groups which contains this permission. */ + sourcePermissionGroups?: Maybe> +} + +export type UserPermissionSourcePermissionGroupsArgs = { + userId: Scalars['ID'] +} + +export enum UserSortField { + /** Sort users by first name. */ + FirstName = 'FIRST_NAME', + /** Sort users by last name. */ + LastName = 'LAST_NAME', + /** Sort users by email. */ + Email = 'EMAIL', + /** Sort users by order count. */ + OrderCount = 'ORDER_COUNT', +} + +export type UserSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort users by the selected field. */ + field: UserSortField +} + +/** Represents a VAT rate for a country. */ +export type Vat = { + __typename?: 'VAT' + /** Country code. */ + countryCode: Scalars['String'] + /** Standard VAT rate in percent. */ + standardRate?: Maybe + /** Country's VAT rate exceptions for specific types of goods. */ + reducedRates: Array> +} + +export enum VariantAttributeScope { + All = 'ALL', + VariantSelection = 'VARIANT_SELECTION', + NotVariantSelection = 'NOT_VARIANT_SELECTION', +} + +/** Assign an media to a product variant. */ +export type VariantMediaAssign = { + __typename?: 'VariantMediaAssign' + productVariant?: Maybe + media?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Unassign an media from a product variant. */ +export type VariantMediaUnassign = { + __typename?: 'VariantMediaUnassign' + productVariant?: Maybe + media?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + productErrors: Array + errors: Array +} + +/** Represents availability of a variant in the storefront. */ +export type VariantPricingInfo = { + __typename?: 'VariantPricingInfo' + /** Whether it is in sale or not. */ + onSale?: Maybe + /** The discount amount if in sale (null otherwise). */ + discount?: Maybe + /** The discount amount in the local currency. */ + discountLocalCurrency?: Maybe + /** The price, with any discount subtracted. */ + price?: Maybe + /** The price without any discount. */ + priceUndiscounted?: Maybe + /** The discounted price in the local currency. */ + priceLocalCurrency?: Maybe +} + +/** Verify JWT token. */ +export type VerifyToken = { + __typename?: 'VerifyToken' + /** User assigned to token. */ + user?: Maybe + /** Determine if token is valid or not. */ + isValid: Scalars['Boolean'] + /** JWT payload. */ + payload?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + accountErrors: Array + errors: Array +} + +/** An enumeration. */ +export enum VolumeUnitsEnum { + CubicMillimeter = 'CUBIC_MILLIMETER', + CubicCentimeter = 'CUBIC_CENTIMETER', + CubicDecimeter = 'CUBIC_DECIMETER', + CubicMeter = 'CUBIC_METER', + Liter = 'LITER', + CubicFoot = 'CUBIC_FOOT', + CubicInch = 'CUBIC_INCH', + CubicYard = 'CUBIC_YARD', + Qt = 'QT', + Pint = 'PINT', + FlOz = 'FL_OZ', + AcreIn = 'ACRE_IN', + AcreFt = 'ACRE_FT', +} + +/** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ +export type Voucher = Node & { + __typename?: 'Voucher' + /** The ID of the object. */ + id: Scalars['ID'] + name?: Maybe + /** Determines a type of voucher. */ + type: VoucherTypeEnum + code: Scalars['String'] + usageLimit?: Maybe + used: Scalars['Int'] + startDate: Scalars['DateTime'] + endDate?: Maybe + applyOncePerOrder: Scalars['Boolean'] + applyOncePerCustomer: Scalars['Boolean'] + /** Determines a type of discount for voucher - value or percentage */ + discountValueType: DiscountValueTypeEnum + minCheckoutItemsQuantity?: Maybe + /** List of categories this voucher applies to. */ + categories?: Maybe + /** List of collections this voucher applies to. */ + collections?: Maybe + /** List of products this voucher applies to. */ + products?: Maybe + /** List of countries available for the shipping voucher. */ + countries?: Maybe>> + /** Returns translated voucher fields for the given language code. */ + translation?: Maybe + /** Voucher value. */ + discountValue?: Maybe + /** Currency code for voucher. */ + currency?: Maybe + /** Minimum order value to apply voucher. */ + minSpent?: Maybe + /** List of availability in channels for the voucher. */ + channelListings?: Maybe> +} + +/** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ +export type VoucherCategoriesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ +export type VoucherCollectionsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ +export type VoucherProductsArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +/** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ +export type VoucherTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Adds products, categories, collections to a voucher. */ +export type VoucherAddCatalogues = { + __typename?: 'VoucherAddCatalogues' + /** Voucher of which catalogue IDs will be modified. */ + voucher?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +/** Deletes vouchers. */ +export type VoucherBulkDelete = { + __typename?: 'VoucherBulkDelete' + /** Returns how many objects were affected. */ + count: Scalars['Int'] + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +/** Represents voucher channel listing. */ +export type VoucherChannelListing = Node & { + __typename?: 'VoucherChannelListing' + /** The ID of the object. */ + id: Scalars['ID'] + channel: Channel + discountValue: Scalars['Float'] + currency: Scalars['String'] + minSpent?: Maybe +} + +export type VoucherChannelListingAddInput = { + /** ID of a channel. */ + channelId: Scalars['ID'] + /** Value of the voucher. */ + discountValue?: Maybe + /** Min purchase amount required to apply the voucher. */ + minAmountSpent?: Maybe +} + +export type VoucherChannelListingInput = { + /** List of channels to which the voucher should be assigned. */ + addChannels?: Maybe> + /** List of channels from which the voucher should be unassigned. */ + removeChannels?: Maybe> +} + +/** Manage voucher's availability in channels. */ +export type VoucherChannelListingUpdate = { + __typename?: 'VoucherChannelListingUpdate' + /** An updated voucher instance. */ + voucher?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +export type VoucherCountableConnection = { + __typename?: 'VoucherCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type VoucherCountableEdge = { + __typename?: 'VoucherCountableEdge' + /** The item at the end of the edge. */ + node: Voucher + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates a new voucher. */ +export type VoucherCreate = { + __typename?: 'VoucherCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + voucher?: Maybe +} + +/** Deletes a voucher. */ +export type VoucherDelete = { + __typename?: 'VoucherDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + voucher?: Maybe +} + +export enum VoucherDiscountType { + Fixed = 'FIXED', + Percentage = 'PERCENTAGE', + Shipping = 'SHIPPING', +} + +export type VoucherFilterInput = { + status?: Maybe>> + timesUsed?: Maybe + discountType?: Maybe>> + started?: Maybe + search?: Maybe +} + +export type VoucherInput = { + /** Voucher type: PRODUCT, CATEGORY SHIPPING or ENTIRE_ORDER. */ + type?: Maybe + /** Voucher name. */ + name?: Maybe + /** Code to use the voucher. */ + code?: Maybe + /** Start date of the voucher in ISO 8601 format. */ + startDate?: Maybe + /** End date of the voucher in ISO 8601 format. */ + endDate?: Maybe + /** Choices: fixed or percentage. */ + discountValueType?: Maybe + /** Products discounted by the voucher. */ + products?: Maybe>> + /** Collections discounted by the voucher. */ + collections?: Maybe>> + /** Categories discounted by the voucher. */ + categories?: Maybe>> + /** Minimal quantity of checkout items required to apply the voucher. */ + minCheckoutItemsQuantity?: Maybe + /** Country codes that can be used with the shipping voucher. */ + countries?: Maybe>> + /** Voucher should be applied to the cheapest item or entire order. */ + applyOncePerOrder?: Maybe + /** Voucher should be applied once per customer. */ + applyOncePerCustomer?: Maybe + /** Limit number of times this voucher can be used in total. */ + usageLimit?: Maybe +} + +/** Removes products, categories, collections from a voucher. */ +export type VoucherRemoveCatalogues = { + __typename?: 'VoucherRemoveCatalogues' + /** Voucher of which catalogue IDs will be modified. */ + voucher?: Maybe + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array +} + +export enum VoucherSortField { + /** Sort vouchers by code. */ + Code = 'CODE', + /** Sort vouchers by start date. */ + StartDate = 'START_DATE', + /** Sort vouchers by end date. */ + EndDate = 'END_DATE', + /** Sort vouchers by value. */ + Value = 'VALUE', + /** Sort vouchers by type. */ + Type = 'TYPE', + /** Sort vouchers by usage limit. */ + UsageLimit = 'USAGE_LIMIT', + /** Sort vouchers by minimum spent amount. */ + MinimumSpentAmount = 'MINIMUM_SPENT_AMOUNT', +} + +export type VoucherSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Specifies the channel in which to sort the data. */ + channel?: Maybe + /** Sort vouchers by the selected field. */ + field: VoucherSortField +} + +export type VoucherTranslatableContent = Node & { + __typename?: 'VoucherTranslatableContent' + /** The ID of the object. */ + id: Scalars['ID'] + name?: Maybe + /** Returns translated voucher fields for the given language code. */ + translation?: Maybe + /** Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. */ + voucher?: Maybe +} + +export type VoucherTranslatableContentTranslationArgs = { + languageCode: LanguageCodeEnum +} + +/** Creates/Updates translations for Voucher. */ +export type VoucherTranslate = { + __typename?: 'VoucherTranslate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + translationErrors: Array + errors: Array + voucher?: Maybe +} + +export type VoucherTranslation = Node & { + __typename?: 'VoucherTranslation' + /** The ID of the object. */ + id: Scalars['ID'] + name?: Maybe + /** Translation language. */ + language: LanguageDisplay +} + +export enum VoucherTypeEnum { + Shipping = 'SHIPPING', + EntireOrder = 'ENTIRE_ORDER', + SpecificProduct = 'SPECIFIC_PRODUCT', +} + +/** Updates a voucher. */ +export type VoucherUpdate = { + __typename?: 'VoucherUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + discountErrors: Array + errors: Array + voucher?: Maybe +} + +/** Represents warehouse. */ +export type Warehouse = Node & + ObjectWithMetadata & { + __typename?: 'Warehouse' + /** The ID of the object. */ + id: Scalars['ID'] + name: Scalars['String'] + slug: Scalars['String'] + companyName: Scalars['String'] + shippingZones: ShippingZoneCountableConnection + address: Address + email: Scalars['String'] + /** List of private metadata items.Requires proper staff permissions to access. */ + privateMetadata: Array> + /** List of public metadata items. Can be accessed without permissions. */ + metadata: Array> + } + +/** Represents warehouse. */ +export type WarehouseShippingZonesArgs = { + before?: Maybe + after?: Maybe + first?: Maybe + last?: Maybe +} + +export type WarehouseAddressInput = { + /** Address. */ + streetAddress1: Scalars['String'] + /** Address. */ + streetAddress2?: Maybe + /** City. */ + city: Scalars['String'] + /** District. */ + cityArea?: Maybe + /** Postal code. */ + postalCode?: Maybe + /** Country. */ + country: CountryCode + /** State or province. */ + countryArea?: Maybe + /** Phone number. */ + phone?: Maybe +} + +export type WarehouseCountableConnection = { + __typename?: 'WarehouseCountableConnection' + /** Pagination data for this connection. */ + pageInfo: PageInfo + edges: Array + /** A total count of items in the collection. */ + totalCount?: Maybe +} + +export type WarehouseCountableEdge = { + __typename?: 'WarehouseCountableEdge' + /** The item at the end of the edge. */ + node: Warehouse + /** A cursor for use in pagination. */ + cursor: Scalars['String'] +} + +/** Creates new warehouse. */ +export type WarehouseCreate = { + __typename?: 'WarehouseCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + warehouseErrors: Array + errors: Array + warehouse?: Maybe +} + +export type WarehouseCreateInput = { + /** Warehouse slug. */ + slug?: Maybe + /** Company name. */ + companyName?: Maybe + /** The email address of the warehouse. */ + email?: Maybe + /** Warehouse name. */ + name: Scalars['String'] + /** Address of the warehouse. */ + address: WarehouseAddressInput + /** Shipping zones supported by the warehouse. */ + shippingZones?: Maybe>> +} + +/** Deletes selected warehouse. */ +export type WarehouseDelete = { + __typename?: 'WarehouseDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + warehouseErrors: Array + errors: Array + warehouse?: Maybe +} + +export type WarehouseError = { + __typename?: 'WarehouseError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: WarehouseErrorCode +} + +/** An enumeration. */ +export enum WarehouseErrorCode { + AlreadyExists = 'ALREADY_EXISTS', + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +export type WarehouseFilterInput = { + search?: Maybe + ids?: Maybe>> +} + +/** Add shipping zone to given warehouse. */ +export type WarehouseShippingZoneAssign = { + __typename?: 'WarehouseShippingZoneAssign' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + warehouseErrors: Array + errors: Array + warehouse?: Maybe +} + +/** Remove shipping zone from given warehouse. */ +export type WarehouseShippingZoneUnassign = { + __typename?: 'WarehouseShippingZoneUnassign' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + warehouseErrors: Array + errors: Array + warehouse?: Maybe +} + +export enum WarehouseSortField { + /** Sort warehouses by name. */ + Name = 'NAME', +} + +export type WarehouseSortingInput = { + /** Specifies the direction in which to sort products. */ + direction: OrderDirection + /** Sort warehouses by the selected field. */ + field: WarehouseSortField +} + +/** Updates given warehouse. */ +export type WarehouseUpdate = { + __typename?: 'WarehouseUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + warehouseErrors: Array + errors: Array + warehouse?: Maybe +} + +export type WarehouseUpdateInput = { + /** Warehouse slug. */ + slug?: Maybe + /** Company name. */ + companyName?: Maybe + /** The email address of the warehouse. */ + email?: Maybe + /** Warehouse name. */ + name?: Maybe + /** Address of the warehouse. */ + address?: Maybe +} + +/** Webhook. */ +export type Webhook = Node & { + __typename?: 'Webhook' + name: Scalars['String'] + targetUrl: Scalars['String'] + isActive: Scalars['Boolean'] + secretKey?: Maybe + /** The ID of the object. */ + id: Scalars['ID'] + /** List of webhook events. */ + events: Array + app: App +} + +/** Creates a new webhook subscription. */ +export type WebhookCreate = { + __typename?: 'WebhookCreate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + webhookErrors: Array + errors: Array + webhook?: Maybe +} + +export type WebhookCreateInput = { + /** The name of the webhook. */ + name?: Maybe + /** The url to receive the payload. */ + targetUrl?: Maybe + /** The events that webhook wants to subscribe. */ + events?: Maybe>> + /** ID of the app to which webhook belongs. */ + app?: Maybe + /** Determine if webhook will be set active or not. */ + isActive?: Maybe + /** The secret key used to create a hash signature with each payload. */ + secretKey?: Maybe +} + +/** Deletes a webhook subscription. */ +export type WebhookDelete = { + __typename?: 'WebhookDelete' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + webhookErrors: Array + errors: Array + webhook?: Maybe +} + +export type WebhookError = { + __typename?: 'WebhookError' + /** Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. */ + field?: Maybe + /** The error message. */ + message?: Maybe + /** The error code. */ + code: WebhookErrorCode +} + +/** An enumeration. */ +export enum WebhookErrorCode { + GraphqlError = 'GRAPHQL_ERROR', + Invalid = 'INVALID', + NotFound = 'NOT_FOUND', + Required = 'REQUIRED', + Unique = 'UNIQUE', +} + +/** Webhook event. */ +export type WebhookEvent = { + __typename?: 'WebhookEvent' + /** Internal name of the event type. */ + eventType: WebhookEventTypeEnum + /** Display name of the event. */ + name: Scalars['String'] +} + +/** Enum determining type of webhook. */ +export enum WebhookEventTypeEnum { + /** All the events. */ + AnyEvents = 'ANY_EVENTS', + /** A new order is placed. */ + OrderCreated = 'ORDER_CREATED', + /** An order is confirmed (status change unconfirmed -> unfulfilled) by a staff user using the OrderConfirm mutation. It also triggers when the user completes the checkout and the shop setting `automatically_confirm_all_new_orders` is enabled. */ + OrderConfirmed = 'ORDER_CONFIRMED', + /** Payment is made and an order is fully paid. */ + OrderFullyPaid = 'ORDER_FULLY_PAID', + /** An order is updated; triggered for all changes related to an order; covers all other order webhooks, except for ORDER_CREATED. */ + OrderUpdated = 'ORDER_UPDATED', + /** An order is cancelled. */ + OrderCancelled = 'ORDER_CANCELLED', + /** An order is fulfilled. */ + OrderFulfilled = 'ORDER_FULFILLED', + /** An invoice for order requested. */ + InvoiceRequested = 'INVOICE_REQUESTED', + /** An invoice is deleted. */ + InvoiceDeleted = 'INVOICE_DELETED', + /** Invoice has been sent. */ + InvoiceSent = 'INVOICE_SENT', + /** A new customer account is created. */ + CustomerCreated = 'CUSTOMER_CREATED', + /** A customer account is updated. */ + CustomerUpdated = 'CUSTOMER_UPDATED', + /** A new product is created. */ + ProductCreated = 'PRODUCT_CREATED', + /** A product is updated. */ + ProductUpdated = 'PRODUCT_UPDATED', + /** A product is deleted. */ + ProductDeleted = 'PRODUCT_DELETED', + /** A new product variant is created. */ + ProductVariantCreated = 'PRODUCT_VARIANT_CREATED', + /** A product variant is updated. */ + ProductVariantUpdated = 'PRODUCT_VARIANT_UPDATED', + /** A product variant is deleted. */ + ProductVariantDeleted = 'PRODUCT_VARIANT_DELETED', + /** A new checkout is created. */ + CheckoutCreated = 'CHECKOUT_CREATED', + /** A checkout is updated. It also triggers all updates related to the checkout. */ + CheckoutUpdated = 'CHECKOUT_UPDATED', + /** A new fulfillment is created. */ + FulfillmentCreated = 'FULFILLMENT_CREATED', + /** User notification triggered. */ + NotifyUser = 'NOTIFY_USER', + /** A new page is created. */ + PageCreated = 'PAGE_CREATED', + /** A page is updated. */ + PageUpdated = 'PAGE_UPDATED', + /** A page is deleted. */ + PageDeleted = 'PAGE_DELETED', +} + +/** An enumeration. */ +export enum WebhookSampleEventTypeEnum { + OrderCreated = 'ORDER_CREATED', + OrderConfirmed = 'ORDER_CONFIRMED', + OrderFullyPaid = 'ORDER_FULLY_PAID', + OrderUpdated = 'ORDER_UPDATED', + OrderCancelled = 'ORDER_CANCELLED', + OrderFulfilled = 'ORDER_FULFILLED', + InvoiceRequested = 'INVOICE_REQUESTED', + InvoiceDeleted = 'INVOICE_DELETED', + InvoiceSent = 'INVOICE_SENT', + CustomerCreated = 'CUSTOMER_CREATED', + CustomerUpdated = 'CUSTOMER_UPDATED', + ProductCreated = 'PRODUCT_CREATED', + ProductUpdated = 'PRODUCT_UPDATED', + ProductDeleted = 'PRODUCT_DELETED', + ProductVariantCreated = 'PRODUCT_VARIANT_CREATED', + ProductVariantUpdated = 'PRODUCT_VARIANT_UPDATED', + ProductVariantDeleted = 'PRODUCT_VARIANT_DELETED', + CheckoutCreated = 'CHECKOUT_CREATED', + CheckoutUpdated = 'CHECKOUT_UPDATED', + FulfillmentCreated = 'FULFILLMENT_CREATED', + NotifyUser = 'NOTIFY_USER', + PageCreated = 'PAGE_CREATED', + PageUpdated = 'PAGE_UPDATED', + PageDeleted = 'PAGE_DELETED', +} + +/** Updates a webhook subscription. */ +export type WebhookUpdate = { + __typename?: 'WebhookUpdate' + /** @deprecated Use errors field instead. This field will be removed in Saleor 4.0. */ + webhookErrors: Array + errors: Array + webhook?: Maybe +} + +export type WebhookUpdateInput = { + /** The new name of the webhook. */ + name?: Maybe + /** The url to receive the payload. */ + targetUrl?: Maybe + /** The events that webhook wants to subscribe. */ + events?: Maybe>> + /** ID of the app to which webhook belongs. */ + app?: Maybe + /** Determine if webhook will be set active or not. */ + isActive?: Maybe + /** Use to create a hash signature with each payload. */ + secretKey?: Maybe +} + +/** Represents weight value in a specific weight unit. */ +export type Weight = { + __typename?: 'Weight' + /** Weight unit. */ + unit: WeightUnitsEnum + /** Weight value. */ + value: Scalars['Float'] +} + +/** An enumeration. */ +export enum WeightUnitsEnum { + G = 'G', + Lb = 'LB', + Oz = 'OZ', + Kg = 'KG', + Tonne = 'TONNE', +} + +export type _Entity = + | Address + | User + | Group + | App + | ProductVariant + | Product + | ProductType + | Collection + | Category + | ProductMedia + | ProductImage + | PageType + +export type _Service = { + __typename?: '_Service' + sdl?: Maybe +} + +export type GetAllProductPathsQueryVariables = Exact<{ + first?: Maybe + cursor?: Maybe + channel?: Maybe +}> + +export type GetAllProductPathsQuery = { __typename?: 'Query' } & { + products?: Maybe< + { __typename?: 'ProductCountableConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick + edges: Array< + { __typename?: 'ProductCountableEdge' } & Pick & { + node: { __typename?: 'Product' } & Pick + } + > + } + > +} + +export type ProductConnectionFragment = { + __typename?: 'ProductCountableConnection' +} & { + pageInfo: { __typename?: 'PageInfo' } & Pick + edges: Array< + { __typename?: 'ProductCountableEdge' } & { + node: { __typename?: 'Product' } & Pick & { + pricing?: Maybe< + { __typename?: 'ProductPricingInfo' } & { + priceRange?: Maybe< + { __typename?: 'TaxedMoneyRange' } & { + start?: Maybe< + { __typename?: 'TaxedMoney' } & { + net: { __typename?: 'Money' } & Pick + } + > + } + > + } + > + media?: Maybe>> + } + } + > +} + +export type GetAllProductsQueryVariables = Exact<{ + first?: Maybe + filter?: Maybe + sortBy?: Maybe + channel?: Maybe +}> + +export type GetAllProductsQuery = { __typename?: 'Query' } & { + products?: Maybe<{ __typename?: 'ProductCountableConnection' } & ProductConnectionFragment> +} diff --git a/packages/saleor/schema.graphql b/packages/saleor/schema.graphql new file mode 100644 index 0000000..de28586 --- /dev/null +++ b/packages/saleor/schema.graphql @@ -0,0 +1,18973 @@ +""" +Create a new address for the customer. +""" +type AccountAddressCreate { + """ + A user instance for which the address was created. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +""" +Delete an address of the logged-in user. +""" +type AccountAddressDelete { + """ + A user instance for which the address was deleted. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +""" +Updates an address of the logged-in user. +""" +type AccountAddressUpdate { + """ + A user object for which the address was edited. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +""" +Remove user account. +""" +type AccountDelete { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +type AccountError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: AccountErrorCode! + + """ + A type of address that causes the error. + """ + addressType: AddressTypeEnum +} + +""" +An enumeration. +""" +enum AccountErrorCode { + ACTIVATE_OWN_ACCOUNT + ACTIVATE_SUPERUSER_ACCOUNT + DUPLICATED_INPUT_ITEM + DEACTIVATE_OWN_ACCOUNT + DEACTIVATE_SUPERUSER_ACCOUNT + DELETE_NON_STAFF_USER + DELETE_OWN_ACCOUNT + DELETE_STAFF_ACCOUNT + DELETE_SUPERUSER_ACCOUNT + GRAPHQL_ERROR + INACTIVE + INVALID + INVALID_PASSWORD + LEFT_NOT_MANAGEABLE_PERMISSION + INVALID_CREDENTIALS + NOT_FOUND + OUT_OF_SCOPE_USER + OUT_OF_SCOPE_GROUP + OUT_OF_SCOPE_PERMISSION + PASSWORD_ENTIRELY_NUMERIC + PASSWORD_TOO_COMMON + PASSWORD_TOO_SHORT + PASSWORD_TOO_SIMILAR + REQUIRED + UNIQUE + JWT_SIGNATURE_EXPIRED + JWT_INVALID_TOKEN + JWT_DECODE_ERROR + JWT_MISSING_TOKEN + JWT_INVALID_CSRF_TOKEN + CHANNEL_INACTIVE + MISSING_CHANNEL_SLUG +} + +input AccountInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + Billing address of the customer. + """ + defaultBillingAddress: AddressInput + + """ + Shipping address of the customer. + """ + defaultShippingAddress: AddressInput + + """ + User language code. + """ + languageCode: LanguageCodeEnum +} + +""" +Register a new user. +""" +type AccountRegister { + """ + Informs whether users need to confirm their email address. + """ + requiresConfirmation: Boolean + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +input AccountRegisterInput { + """ + The email address of the user. + """ + email: String! + + """ + Password. + """ + password: String! + + """ + Base of frontend URL that will be needed to create confirmation URL. + """ + redirectUrl: String + + """ + User language code. + """ + languageCode: LanguageCodeEnum + + """ + User public metadata. + """ + metadata: [MetadataInput!] + + """ + Slug of a channel which will be used to notify users. Optional when only one channel exists. + """ + channel: String +} + +""" +Sends an email with the account removal link for the logged-in user. +""" +type AccountRequestDeletion { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Sets a default address for the authenticated user. +""" +type AccountSetDefaultAddress { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Updates the account of the logged-in user. +""" +type AccountUpdate { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +""" +Represents user address data. +""" +type Address implements Node { + """ + The ID of the object. + """ + id: ID! + firstName: String! + lastName: String! + companyName: String! + streetAddress1: String! + streetAddress2: String! + city: String! + cityArea: String! + postalCode: String! + + """ + Shop's default country. + """ + country: CountryDisplay! + countryArea: String! + phone: String + + """ + Address is user's default shipping address. + """ + isDefaultShippingAddress: Boolean + + """ + Address is user's default billing address. + """ + isDefaultBillingAddress: Boolean +} + +""" +Creates user address. +""" +type AddressCreate { + """ + A user instance for which the address was created. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +""" +Deletes an address. +""" +type AddressDelete { + """ + A user instance for which the address was deleted. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +input AddressInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + Company or organization. + """ + companyName: String + + """ + Address. + """ + streetAddress1: String + + """ + Address. + """ + streetAddress2: String + + """ + City. + """ + city: String + + """ + District. + """ + cityArea: String + + """ + Postal code. + """ + postalCode: String + + """ + Country. + """ + country: CountryCode + + """ + State or province. + """ + countryArea: String + + """ + Phone number. + """ + phone: String +} + +""" +Sets a default address for the given user. +""" +type AddressSetDefault { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +An enumeration. +""" +enum AddressTypeEnum { + BILLING + SHIPPING +} + +""" +Updates an address. +""" +type AddressUpdate { + """ + A user object for which the address was edited. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + address: Address +} + +type AddressValidationData { + countryCode: String + countryName: String + addressFormat: String + addressLatinFormat: String + allowedFields: [String] + requiredFields: [String] + upperFields: [String] + countryAreaType: String + countryAreaChoices: [ChoiceValue] + cityType: String + cityChoices: [ChoiceValue] + cityAreaType: String + cityAreaChoices: [ChoiceValue] + postalCodeType: String + postalCodeMatchers: [String] + postalCodeExamples: [String] + postalCodePrefix: String +} + +""" +Represents allocation. +""" +type Allocation implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Quantity allocated for orders. + """ + quantity: Int! + + """ + The warehouse were items were allocated. + """ + warehouse: Warehouse! +} + +""" +Represents app data. +""" +type App implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + + """ + Name of the app. + """ + name: String + + """ + The date and time when the app was created. + """ + created: DateTime + + """ + Determine if app will be set active or not. + """ + isActive: Boolean + + """ + List of the app's permissions. + """ + permissions: [Permission] + + """ + Last 4 characters of the tokens. + """ + tokens: [AppToken] + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Type of the app. + """ + type: AppTypeEnum + + """ + List of webhooks assigned to this app. + """ + webhooks: [Webhook] + + """ + Description of this app. + """ + aboutApp: String + + """ + Description of the data privacy defined for this app. + """ + dataPrivacy: String + + """ + Url to details about the privacy policy on the app owner page. + """ + dataPrivacyUrl: String + + """ + Homepage of the app. + """ + homepageUrl: String + + """ + Support page for the app. + """ + supportUrl: String + + """ + Url to iframe with the configuration for the app. + """ + configurationUrl: String + + """ + Url to iframe with the app. + """ + appUrl: String + + """ + Version number of the app. + """ + version: String + + """ + JWT token used to authenticate by thridparty app. + """ + accessToken: String +} + +""" +Activate the app. +""" +type AppActivate { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + app: App +} + +type AppCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [AppCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type AppCountableEdge { + """ + The item at the end of the edge. + """ + node: App! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new app. +""" +type AppCreate { + """ + The newly created authentication token. + """ + authToken: String + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + app: App +} + +""" +Deactivate the app. +""" +type AppDeactivate { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + app: App +} + +""" +Deletes an app. +""" +type AppDelete { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + app: App +} + +""" +Delete failed installation. +""" +type AppDeleteFailedInstallation { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + appInstallation: AppInstallation +} + +type AppError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: AppErrorCode! + + """ + List of permissions which causes the error. + """ + permissions: [PermissionEnum!] +} + +""" +An enumeration. +""" +enum AppErrorCode { + FORBIDDEN + GRAPHQL_ERROR + INVALID + INVALID_STATUS + INVALID_PERMISSION + INVALID_URL_FORMAT + INVALID_MANIFEST_FORMAT + MANIFEST_URL_CANT_CONNECT + NOT_FOUND + REQUIRED + UNIQUE + OUT_OF_SCOPE_APP + OUT_OF_SCOPE_PERMISSION +} + +""" +Fetch and validate manifest. +""" +type AppFetchManifest { + manifest: Manifest + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! +} + +input AppFilterInput { + search: String + isActive: Boolean + type: AppTypeEnum +} + +input AppInput { + """ + Name of the app. + """ + name: String + + """ + List of permission code names to assign to this app. + """ + permissions: [PermissionEnum] +} + +""" +Install new app by using app manifest. +""" +type AppInstall { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + appInstallation: AppInstallation +} + +input AppInstallInput { + """ + Name of the app to install. + """ + appName: String + + """ + Url to app's manifest in JSON format. + """ + manifestUrl: String + + """ + Determine if app will be set active or not. + """ + activateAfterInstallation: Boolean = true + + """ + List of permission code names to assign to this app. + """ + permissions: [PermissionEnum] +} + +""" +Represents ongoing installation of app. +""" +type AppInstallation implements Node & Job { + appName: String! + manifestUrl: String! + + """ + The ID of the object. + """ + id: ID! + + """ + Job status. + """ + status: JobStatusEnum! + + """ + Created date time of job in ISO 8601 format. + """ + createdAt: DateTime! + + """ + Date time of job last update in ISO 8601 format. + """ + updatedAt: DateTime! + + """ + Job message. + """ + message: String +} + +""" +Retry failed installation of new app. +""" +type AppRetryInstall { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + appInstallation: AppInstallation +} + +enum AppSortField { + """ + Sort apps by name. + """ + NAME + + """ + Sort apps by creation date. + """ + CREATION_DATE +} + +input AppSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort apps by the selected field. + """ + field: AppSortField! +} + +""" +Represents token data. +""" +type AppToken implements Node { + """ + Name of the authenticated token. + """ + name: String + + """ + Last 4 characters of the token. + """ + authToken: String + + """ + The ID of the object. + """ + id: ID! +} + +""" +Creates a new token. +""" +type AppTokenCreate { + """ + The newly created authentication token. + """ + authToken: String + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + appToken: AppToken +} + +""" +Deletes an authentication token assigned to app. +""" +type AppTokenDelete { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + appToken: AppToken +} + +input AppTokenInput { + """ + Name of the token. + """ + name: String + + """ + ID of app. + """ + app: ID! +} + +""" +Verify provided app token. +""" +type AppTokenVerify { + """ + Determine if token is valid or not. + """ + valid: Boolean! + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! +} + +""" +Enum determining type of your App. +""" +enum AppTypeEnum { + """ + Local Saleor App. The app is fully manageable from dashboard. You can change assigned permissions, add webhooks, or authentication token + """ + LOCAL + + """ + Third party external App. Installation is fully automated. Saleor uses a defined App manifest to gather all required information. + """ + THIRDPARTY +} + +""" +Updates an existing app. +""" +type AppUpdate { + appErrors: [AppError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AppError!]! + app: App +} + +""" +An enumeration. +""" +enum AreaUnitsEnum { + SQ_CM + SQ_M + SQ_KM + SQ_FT + SQ_YD + SQ_INCH +} + +""" +Assigns storefront's navigation menus. +""" +type AssignNavigation { + """ + Assigned navigation menu. + """ + menu: Menu + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! +} + +""" +Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. +""" +type Attribute implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + productTypes(before: String, after: String, first: Int, last: Int): ProductTypeCountableConnection! + productVariantTypes(before: String, after: String, first: Int, last: Int): ProductTypeCountableConnection! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + The input type to use for entering attribute values in the dashboard. + """ + inputType: AttributeInputTypeEnum + + """ + The entity type which can be used as a reference. + """ + entityType: AttributeEntityTypeEnum + + """ + Name of an attribute displayed in the interface. + """ + name: String + + """ + Internal representation of an attribute name. + """ + slug: String + + """ + The attribute type. + """ + type: AttributeTypeEnum + + """ + The unit of attribute values. + """ + unit: MeasurementUnitsEnum + + """ + List of attribute's values. + """ + values: [AttributeValue] + + """ + Whether the attribute requires values to be passed or not. + """ + valueRequired: Boolean! + + """ + Whether the attribute should be visible or not in storefront. + """ + visibleInStorefront: Boolean! + + """ + Whether the attribute can be filtered in storefront. + """ + filterableInStorefront: Boolean! + + """ + Whether the attribute can be filtered in dashboard. + """ + filterableInDashboard: Boolean! + + """ + Whether the attribute can be displayed in the admin product list. + """ + availableInGrid: Boolean! + + """ + Returns translated attribute fields for the given language code. + """ + translation( + """ + A language code to return the translation for attribute. + """ + languageCode: LanguageCodeEnum! + ): AttributeTranslation + + """ + The position of the attribute in the storefront navigation (0 by default). + """ + storefrontSearchPosition: Int! +} + +""" +Deletes attributes. +""" +type AttributeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! +} + +type AttributeCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [AttributeCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type AttributeCountableEdge { + """ + The item at the end of the edge. + """ + node: Attribute! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates an attribute. +""" +type AttributeCreate { + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! +} + +input AttributeCreateInput { + """ + The input type to use for entering attribute values in the dashboard. + """ + inputType: AttributeInputTypeEnum + + """ + The entity type which can be used as a reference. + """ + entityType: AttributeEntityTypeEnum + + """ + Name of an attribute displayed in the interface. + """ + name: String! + + """ + Internal representation of an attribute name. + """ + slug: String + + """ + The attribute type. + """ + type: AttributeTypeEnum! + + """ + The unit of attribute values. + """ + unit: MeasurementUnitsEnum + + """ + List of attribute's values. + """ + values: [AttributeValueCreateInput] + + """ + Whether the attribute requires values to be passed or not. + """ + valueRequired: Boolean + + """ + Whether the attribute is for variants only. + """ + isVariantOnly: Boolean + + """ + Whether the attribute should be visible or not in storefront. + """ + visibleInStorefront: Boolean + + """ + Whether the attribute can be filtered in storefront. + """ + filterableInStorefront: Boolean + + """ + Whether the attribute can be filtered in dashboard. + """ + filterableInDashboard: Boolean + + """ + The position of the attribute in the storefront navigation (0 by default). + """ + storefrontSearchPosition: Int + + """ + Whether the attribute can be displayed in the admin product list. + """ + availableInGrid: Boolean +} + +""" +Deletes an attribute. +""" +type AttributeDelete { + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! + attribute: Attribute +} + +""" +An enumeration. +""" +enum AttributeEntityTypeEnum { + PAGE + PRODUCT +} + +type AttributeError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: AttributeErrorCode! +} + +""" +An enumeration. +""" +enum AttributeErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +input AttributeFilterInput { + valueRequired: Boolean + isVariantOnly: Boolean + visibleInStorefront: Boolean + filterableInStorefront: Boolean + filterableInDashboard: Boolean + availableInGrid: Boolean + metadata: [MetadataInput] + search: String + ids: [ID] + type: AttributeTypeEnum + inCollection: ID + inCategory: ID + + """ + Specifies the channel by which the data should be sorted. + """ + channel: String +} + +input AttributeInput { + """ + Internal representation of an attribute name. + """ + slug: String! + + """ + Internal representation of a value (unique per attribute). + """ + values: [String] + + """ + The range that the returned values should be in. + """ + valuesRange: IntRangeInput +} + +""" +An enumeration. +""" +enum AttributeInputTypeEnum { + DROPDOWN + MULTISELECT + FILE + REFERENCE + NUMERIC + RICH_TEXT +} + +""" +Reorder the values of an attribute. +""" +type AttributeReorderValues { + """ + Attribute from which values are reordered. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! +} + +enum AttributeSortField { + """ + Sort attributes by name + """ + NAME + + """ + Sort attributes by slug + """ + SLUG + + """ + Sort attributes by the value required flag + """ + VALUE_REQUIRED + + """ + Sort attributes by the variant only flag + """ + IS_VARIANT_ONLY + + """ + Sort attributes by visibility in the storefront + """ + VISIBLE_IN_STOREFRONT + + """ + Sort attributes by the filterable in storefront flag + """ + FILTERABLE_IN_STOREFRONT + + """ + Sort attributes by the filterable in dashboard flag + """ + FILTERABLE_IN_DASHBOARD + + """ + Sort attributes by their position in storefront + """ + STOREFRONT_SEARCH_POSITION + + """ + Sort attributes based on whether they can be displayed or not in a product grid. + """ + AVAILABLE_IN_GRID +} + +input AttributeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort attributes by the selected field. + """ + field: AttributeSortField! +} + +type AttributeTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Returns translated attribute fields for the given language code. + """ + translation( + """ + A language code to return the translation for attribute. + """ + languageCode: LanguageCodeEnum! + ): AttributeTranslation + + """ + Custom attribute of a product. + """ + attribute: Attribute +} + +""" +Creates/Updates translations for attribute. +""" +type AttributeTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + attribute: Attribute +} + +type AttributeTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Translation language. + """ + language: LanguageDisplay! +} + +""" +An enumeration. +""" +enum AttributeTypeEnum { + PRODUCT_TYPE + PAGE_TYPE +} + +""" +Updates attribute. +""" +type AttributeUpdate { + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! +} + +input AttributeUpdateInput { + """ + Name of an attribute displayed in the interface. + """ + name: String + + """ + Internal representation of an attribute name. + """ + slug: String + + """ + The unit of attribute values. + """ + unit: MeasurementUnitsEnum + + """ + IDs of values to be removed from this attribute. + """ + removeValues: [ID] + + """ + New values to be created for this attribute. + """ + addValues: [AttributeValueCreateInput] + + """ + Whether the attribute requires values to be passed or not. + """ + valueRequired: Boolean + + """ + Whether the attribute is for variants only. + """ + isVariantOnly: Boolean + + """ + Whether the attribute should be visible or not in storefront. + """ + visibleInStorefront: Boolean + + """ + Whether the attribute can be filtered in storefront. + """ + filterableInStorefront: Boolean + + """ + Whether the attribute can be filtered in dashboard. + """ + filterableInDashboard: Boolean + + """ + The position of the attribute in the storefront navigation (0 by default). + """ + storefrontSearchPosition: Int + + """ + Whether the attribute can be displayed in the admin product list. + """ + availableInGrid: Boolean +} + +""" +Represents a value of an attribute. +""" +type AttributeValue implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Name of a value displayed in the interface. + """ + name: String + + """ + Internal representation of a value (unique per attribute). + """ + slug: String + + """ + Represents the value of the attribute value. + """ + value: String + + """ + Returns translated attribute value fields for the given language code. + """ + translation( + """ + A language code to return the translation for attribute value. + """ + languageCode: LanguageCodeEnum! + ): AttributeValueTranslation + + """ + The input type to use for entering attribute values in the dashboard. + """ + inputType: AttributeInputTypeEnum + + """ + The ID of the attribute reference. + """ + reference: ID + + """ + Represents file URL and content type (if attribute value is a file). + """ + file: File + + """ + Represents the text (JSON) of the attribute value. + """ + richText: JSONString +} + +""" +Deletes values of attributes. +""" +type AttributeValueBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! +} + +""" +Creates a value for an attribute. +""" +type AttributeValueCreate { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +input AttributeValueCreateInput { + """ + Name of a value displayed in the interface. + """ + name: String! + + """ + Represents the value of the attribute value. + """ + value: String + + """ + Represents the text (JSON) of the attribute value. + """ + richText: JSONString +} + +""" +Deletes a value of an attribute. +""" +type AttributeValueDelete { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +input AttributeValueInput { + """ + ID of the selected attribute. + """ + id: ID + + """ + The value or slug of an attribute to resolve. If the passed value is non-existent, it will be created. + """ + values: [String] + + """ + URL of the file attribute. Every time, a new value is created. + """ + file: String + + """ + File content type. + """ + contentType: String + + """ + List of entity IDs that will be used as references. + """ + references: [ID!] + + """ + Text content in JSON format. + """ + richText: JSONString +} + +type AttributeValueTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Returns translated attribute value fields for the given language code. + """ + translation( + """ + A language code to return the translation for attribute value. + """ + languageCode: LanguageCodeEnum! + ): AttributeValueTranslation + + """ + Represents a value of an attribute. + """ + attributeValue: AttributeValue +} + +""" +Creates/Updates translations for attribute value. +""" +type AttributeValueTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + attributeValue: AttributeValue +} + +type AttributeValueTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + richText: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! +} + +input AttributeValueTranslationInput { + name: String + richText: JSONString +} + +""" +Updates value of an attribute. +""" +type AttributeValueUpdate { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +input BulkAttributeValueInput { + """ + ID of the selected attribute. + """ + id: ID + + """ + The value or slug of an attribute to resolve. If the passed value is non-existent, it will be created. + """ + values: [String]! +} + +type BulkProductError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ProductErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] + + """ + Index of an input list item that caused the error. + """ + index: Int + + """ + List of warehouse IDs which causes the error. + """ + warehouses: [ID!] + + """ + List of channel IDs which causes the error. + """ + channels: [ID!] +} + +type BulkStockError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ProductErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] + + """ + Index of an input list item that caused the error. + """ + index: Int +} + +input CatalogueInput { + """ + Products related to the discount. + """ + products: [ID] + + """ + Categories related to the discount. + """ + categories: [ID] + + """ + Collections related to the discount. + """ + collections: [ID] +} + +""" +Represents a single category of products. Categories allow to organize products in a tree-hierarchies which can be used for navigation in the storefront. +""" +type Category implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + slug: String! + parent: Category + level: Int! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Description of the category (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + List of ancestors of the category. + """ + ancestors( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CategoryCountableConnection + + """ + List of products in the category. + """ + products( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + + """ + List of children of the category. + """ + children( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CategoryCountableConnection + backgroundImage( + """ + Size of the image. + """ + size: Int + ): Image + + """ + Returns translated category fields for the given language code. + """ + translation( + """ + A language code to return the translation for category. + """ + languageCode: LanguageCodeEnum! + ): CategoryTranslation +} + +""" +Deletes categories. +""" +type CategoryBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +type CategoryCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [CategoryCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type CategoryCountableEdge { + """ + The item at the end of the edge. + """ + node: Category! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new category. +""" +type CategoryCreate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + category: Category +} + +""" +Deletes a category. +""" +type CategoryDelete { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + category: Category +} + +input CategoryFilterInput { + search: String + metadata: [MetadataInput] + ids: [ID] +} + +input CategoryInput { + """ + Category description (JSON). + """ + description: JSONString + + """ + Category name. + """ + name: String + + """ + Category slug. + """ + slug: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + Background image file. + """ + backgroundImage: Upload + + """ + Alt text for a product media. + """ + backgroundImageAlt: String +} + +enum CategorySortField { + """ + Sort categories by name. + """ + NAME + + """ + Sort categories by product count. + """ + PRODUCT_COUNT + + """ + Sort categories by subcategory count. + """ + SUBCATEGORY_COUNT +} + +input CategorySortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + """ + channel: String + + """ + Sort categories by the selected field. + """ + field: CategorySortField! +} + +type CategoryTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Description of the category (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + Returns translated category fields for the given language code. + """ + translation( + """ + A language code to return the translation for category. + """ + languageCode: LanguageCodeEnum! + ): CategoryTranslation + + """ + Represents a single category of products. + """ + category: Category +} + +""" +Creates/Updates translations for Category. +""" +type CategoryTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + category: Category +} + +type CategoryTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! + + """ + Translated description of the product (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") +} + +""" +Updates a category. +""" +type CategoryUpdate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + category: Category +} + +""" +Represents channel. +""" +type Channel implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + isActive: Boolean! + slug: String! + currencyCode: String! + + """ + Whether a channel has associated orders. + """ + hasOrders: Boolean! +} + +""" +Activate a channel. +""" +type ChannelActivate { + """ + Activated channel. + """ + channel: Channel + channelErrors: [ChannelError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ChannelError!]! +} + +""" +Creates new channel. +""" +type ChannelCreate { + channelErrors: [ChannelError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ChannelError!]! + channel: Channel +} + +input ChannelCreateInput { + """ + isActive flag. + """ + isActive: Boolean + + """ + Name of the channel. + """ + name: String! + + """ + Slug of the channel. + """ + slug: String! + + """ + Currency of the channel. + """ + currencyCode: String! + + """ + List of shipping zones to assign to the channel. + """ + addShippingZones: [ID!] +} + +""" +Deactivate a channel. +""" +type ChannelDeactivate { + """ + Deactivated channel. + """ + channel: Channel + channelErrors: [ChannelError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ChannelError!]! +} + +""" +Delete a channel. Orders associated with the deleted channel will be moved to the target channel. Checkouts, product availability, and pricing will be removed. +""" +type ChannelDelete { + channelErrors: [ChannelError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ChannelError!]! + channel: Channel +} + +input ChannelDeleteInput { + """ + ID of channel to migrate orders from origin channel. + """ + targetChannel: ID! +} + +type ChannelError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ChannelErrorCode! + + """ + List of shipping zone IDs which causes the error. + """ + shippingZones: [ID!] +} + +""" +An enumeration. +""" +enum ChannelErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + CHANNEL_TARGET_ID_MUST_BE_DIFFERENT + CHANNELS_CURRENCY_MUST_BE_THE_SAME + CHANNEL_WITH_ORDERS + DUPLICATED_INPUT_ITEM +} + +""" +Update a channel. +""" +type ChannelUpdate { + channelErrors: [ChannelError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ChannelError!]! + channel: Channel +} + +input ChannelUpdateInput { + """ + isActive flag. + """ + isActive: Boolean + + """ + Name of the channel. + """ + name: String + + """ + Slug of the channel. + """ + slug: String + + """ + List of shipping zones to assign to the channel. + """ + addShippingZones: [ID!] + + """ + List of shipping zones to unassign from the channel. + """ + removeShippingZones: [ID!] +} + +""" +Checkout object. +""" +type Checkout implements Node & ObjectWithMetadata { + created: DateTime! + lastChange: DateTime! + user: User + channel: Channel! + billingAddress: Address + shippingAddress: Address + note: String! + discount: Money + discountName: String + translatedDiscountName: String + voucherCode: String + + """ + List of gift cards associated with this checkout. + """ + giftCards: [GiftCard] + + """ + The ID of the object. + """ + id: ID! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Shipping methods that can be used with this order. + """ + availableShippingMethods: [ShippingMethod]! + + """ + List of available payment gateways. + """ + availablePaymentGateways: [PaymentGateway!]! + + """ + Email of a customer. + """ + email: String! + + """ + Returns True, if checkout requires shipping. + """ + isShippingRequired: Boolean! + + """ + The number of items purchased. + """ + quantity: Int! + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLine] + + """ + The price of the shipping, with all the taxes included. + """ + shippingPrice: TaxedMoney + + """ + The shipping method related with checkout. + """ + shippingMethod: ShippingMethod + + """ + The price of the checkout before shipping, with taxes included. + """ + subtotalPrice: TaxedMoney + + """ + The checkout's token. + """ + token: UUID! + + """ + The sum of the the checkout line prices, with all the taxes,shipping costs, and discounts included. + """ + totalPrice: TaxedMoney + + """ + Checkout language code. + """ + languageCode: LanguageCodeEnum! +} + +""" +Adds a gift card or a voucher to a checkout. +""" +type CheckoutAddPromoCode { + """ + The checkout with the added gift card or voucher. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Update billing address in the existing checkout. +""" +type CheckoutBillingAddressUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Completes the checkout. As a result a new order is created and a payment charge is made. This action requires a successful payment before it can be performed. In case additional confirmation step as 3D secure is required confirmationNeeded flag will be set to True and no order created until payment is confirmed with second call of this mutation. +""" +type CheckoutComplete { + """ + Placed order. + """ + order: Order + + """ + Set to true if payment needs to be confirmed before checkout is complete. + """ + confirmationNeeded: Boolean! + + """ + Confirmation data used to process additional authorization steps. + """ + confirmationData: JSONString + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +type CheckoutCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [CheckoutCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type CheckoutCountableEdge { + """ + The item at the end of the edge. + """ + node: Checkout! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Create a new checkout. +""" +type CheckoutCreate { + """ + Whether the checkout was created or the current active one was returned. Refer to checkoutLinesAdd and checkoutLinesUpdate to merge a cart with an active checkout.DEPRECATED: Will be removed in Saleor 4.0. Always returns True. + """ + created: Boolean + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! + checkout: Checkout +} + +input CheckoutCreateInput { + """ + Slug of a channel in which to create a checkout. + """ + channel: String + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLineInput]! + + """ + The customer's email address. + """ + email: String + + """ + The mailing address to where the checkout will be shipped. Note: the address will be ignored if the checkout doesn't contain shippable items. + """ + shippingAddress: AddressInput + + """ + Billing address of the customer. + """ + billingAddress: AddressInput + + """ + Checkout language code. + """ + languageCode: LanguageCodeEnum +} + +""" +Sets the customer as the owner of the checkout. +""" +type CheckoutCustomerAttach { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Removes the user assigned as the owner of the checkout. +""" +type CheckoutCustomerDetach { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Updates email address in the existing checkout object. +""" +type CheckoutEmailUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +type CheckoutError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: CheckoutErrorCode! + + """ + List of varint IDs which causes the error. + """ + variants: [ID!] + + """ + A type of address that causes the error. + """ + addressType: AddressTypeEnum +} + +""" +An enumeration. +""" +enum CheckoutErrorCode { + BILLING_ADDRESS_NOT_SET + CHECKOUT_NOT_FULLY_PAID + GRAPHQL_ERROR + PRODUCT_NOT_PUBLISHED + PRODUCT_UNAVAILABLE_FOR_PURCHASE + INSUFFICIENT_STOCK + INVALID + INVALID_SHIPPING_METHOD + NOT_FOUND + PAYMENT_ERROR + QUANTITY_GREATER_THAN_LIMIT + REQUIRED + SHIPPING_ADDRESS_NOT_SET + SHIPPING_METHOD_NOT_APPLICABLE + SHIPPING_METHOD_NOT_SET + SHIPPING_NOT_REQUIRED + TAX_ERROR + UNIQUE + VOUCHER_NOT_APPLICABLE + ZERO_QUANTITY + MISSING_CHANNEL_SLUG + CHANNEL_INACTIVE + UNAVAILABLE_VARIANT_IN_CHANNEL +} + +""" +Update language code in the existing checkout. +""" +type CheckoutLanguageCodeUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Represents an item in the checkout. +""" +type CheckoutLine implements Node { + """ + The ID of the object. + """ + id: ID! + variant: ProductVariant! + quantity: Int! + + """ + The sum of the checkout line price, taxes and discounts. + """ + totalPrice: TaxedMoney + + """ + Indicates whether the item need to be delivered. + """ + requiresShipping: Boolean +} + +type CheckoutLineCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [CheckoutLineCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type CheckoutLineCountableEdge { + """ + The item at the end of the edge. + """ + node: CheckoutLine! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Deletes a CheckoutLine. +""" +type CheckoutLineDelete { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +input CheckoutLineInput { + """ + The number of items purchased. + """ + quantity: Int! + + """ + ID of the product variant. + """ + variantId: ID! +} + +""" +Adds a checkout line to the existing checkout. +""" +type CheckoutLinesAdd { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Updates checkout line in the existing checkout. +""" +type CheckoutLinesUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Create a new payment for given checkout. +""" +type CheckoutPaymentCreate { + """ + Related checkout object. + """ + checkout: Checkout + + """ + A newly created payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PaymentError!]! +} + +""" +Remove a gift card or a voucher from a checkout. +""" +type CheckoutRemovePromoCode { + """ + The checkout with the removed gift card or voucher. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Update shipping address in the existing checkout. +""" +type CheckoutShippingAddressUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +""" +Updates the shipping address of the checkout. +""" +type CheckoutShippingMethodUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CheckoutError!]! +} + +type ChoiceValue { + raw: String + verbose: String +} + +""" +Represents a collection of products. +""" +type Collection implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + slug: String! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Description of the collection (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + List of products in this collection. + """ + products( + """ + Filtering options for products. + """ + filter: ProductFilterInput + + """ + Sort products. + """ + sortBy: ProductOrder + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + backgroundImage( + """ + Size of the image. + """ + size: Int + ): Image + + """ + Returns translated collection fields for the given language code. + """ + translation( + """ + A language code to return the translation for collection. + """ + languageCode: LanguageCodeEnum! + ): CollectionTranslation + + """ + List of channels in which the collection is available. + """ + channelListings: [CollectionChannelListing!] +} + +""" +Adds products to a collection. +""" +type CollectionAddProducts { + """ + Collection to which products will be added. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! +} + +""" +Deletes collections. +""" +type CollectionBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! +} + +""" +Represents collection channel listing. +""" +type CollectionChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + publicationDate: Date + isPublished: Boolean! + channel: Channel! +} + +type CollectionChannelListingError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ProductErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] + + """ + List of channels IDs which causes the error. + """ + channels: [ID!] +} + +""" +Manage collection's availability in channels. +""" +type CollectionChannelListingUpdate { + """ + An updated collection instance. + """ + collection: Collection + collectionChannelListingErrors: [CollectionChannelListingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionChannelListingError!]! +} + +input CollectionChannelListingUpdateInput { + """ + List of channels to which the collection should be assigned. + """ + addChannels: [PublishableChannelListingInput!] + + """ + List of channels from which the collection should be unassigned. + """ + removeChannels: [ID!] +} + +type CollectionCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [CollectionCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type CollectionCountableEdge { + """ + The item at the end of the edge. + """ + node: Collection! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new collection. +""" +type CollectionCreate { + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! + collection: Collection +} + +input CollectionCreateInput { + """ + Informs whether a collection is published. + """ + isPublished: Boolean + + """ + Name of the collection. + """ + name: String + + """ + Slug of the collection. + """ + slug: String + + """ + Description of the collection (JSON). + """ + description: JSONString + + """ + Background image file. + """ + backgroundImage: Upload + + """ + Alt text for an image. + """ + backgroundImageAlt: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: Date + + """ + List of products to be added to the collection. + """ + products: [ID] +} + +""" +Deletes a collection. +""" +type CollectionDelete { + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! + collection: Collection +} + +type CollectionError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + List of products IDs which causes the error. + """ + products: [ID!] + + """ + The error code. + """ + code: CollectionErrorCode! +} + +""" +An enumeration. +""" +enum CollectionErrorCode { + DUPLICATED_INPUT_ITEM + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT +} + +input CollectionFilterInput { + published: CollectionPublished + search: String + metadata: [MetadataInput] + ids: [ID] + + """ + Specifies the channel by which the data should be sorted. + """ + channel: String +} + +input CollectionInput { + """ + Informs whether a collection is published. + """ + isPublished: Boolean + + """ + Name of the collection. + """ + name: String + + """ + Slug of the collection. + """ + slug: String + + """ + Description of the collection (JSON). + """ + description: JSONString + + """ + Background image file. + """ + backgroundImage: Upload + + """ + Alt text for an image. + """ + backgroundImageAlt: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: Date +} + +enum CollectionPublished { + PUBLISHED + HIDDEN +} + +""" +Remove products from a collection. +""" +type CollectionRemoveProducts { + """ + Collection from which products will be removed. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! +} + +""" +Reorder the products of a collection. +""" +type CollectionReorderProducts { + """ + Collection from which products are reordered. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! +} + +enum CollectionSortField { + """ + Sort collections by name. + """ + NAME + + """ + Sort collections by availability. + """ + AVAILABILITY + + """ + Sort collections by product count. + """ + PRODUCT_COUNT + + """ + Sort collections by publication date. + """ + PUBLICATION_DATE +} + +input CollectionSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + """ + channel: String + + """ + Sort collections by the selected field. + """ + field: CollectionSortField! +} + +type CollectionTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Description of the collection (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + Returns translated collection fields for the given language code. + """ + translation( + """ + A language code to return the translation for collection. + """ + languageCode: LanguageCodeEnum! + ): CollectionTranslation + + """ + Represents a collection of products. + """ + collection: Collection +} + +""" +Creates/Updates translations for collection. +""" +type CollectionTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + collection: Collection +} + +type CollectionTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! + + """ + Translated description of the product (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") +} + +""" +Updates a collection. +""" +type CollectionUpdate { + collectionErrors: [CollectionError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [CollectionError!]! + collection: Collection +} + +""" +Stores information about a single configuration field. +""" +type ConfigurationItem { + """ + Name of the field. + """ + name: String! + + """ + Current value of the field. + """ + value: String + + """ + Type of the field. + """ + type: ConfigurationTypeFieldEnum + + """ + Help text for the field. + """ + helpText: String + + """ + Label for the field. + """ + label: String +} + +input ConfigurationItemInput { + """ + Name of the field to update. + """ + name: String! + + """ + Value of the given field to update. + """ + value: String +} + +""" +An enumeration. +""" +enum ConfigurationTypeFieldEnum { + STRING + MULTILINE + BOOLEAN + SECRET + PASSWORD + SECRETMULTILINE + OUTPUT +} + +""" +Confirm user account with token sent by email during registration. +""" +type ConfirmAccount { + """ + An activated user account. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Confirm the email change of the logged-in user. +""" +type ConfirmEmailChange { + """ + A user instance with a new email. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +An enumeration. +""" +enum CountryCode { + AF + AX + AL + DZ + AS + AD + AO + AI + AQ + AG + AR + AM + AW + AU + AT + AZ + BS + BH + BD + BB + BY + BE + BZ + BJ + BM + BT + BO + BQ + BA + BW + BV + BR + IO + BN + BG + BF + BI + CV + KH + CM + CA + KY + CF + TD + CL + CN + CX + CC + CO + KM + CG + CD + CK + CR + CI + HR + CU + CW + CY + CZ + DK + DJ + DM + DO + EC + EG + SV + GQ + ER + EE + SZ + ET + EU + FK + FO + FJ + FI + FR + GF + PF + TF + GA + GM + GE + DE + GH + GI + GR + GL + GD + GP + GU + GT + GG + GN + GW + GY + HT + HM + VA + HN + HK + HU + IS + IN + ID + IR + IQ + IE + IM + IL + IT + JM + JP + JE + JO + KZ + KE + KI + KW + KG + LA + LV + LB + LS + LR + LY + LI + LT + LU + MO + MG + MW + MY + MV + ML + MT + MH + MQ + MR + MU + YT + MX + FM + MD + MC + MN + ME + MS + MA + MZ + MM + NA + NR + NP + NL + NC + NZ + NI + NE + NG + NU + NF + KP + MK + MP + NO + OM + PK + PW + PS + PA + PG + PY + PE + PH + PN + PL + PT + PR + QA + RE + RO + RU + RW + BL + SH + KN + LC + MF + PM + VC + WS + SM + ST + SA + SN + RS + SC + SL + SG + SX + SK + SI + SB + SO + ZA + GS + KR + SS + ES + LK + SD + SR + SJ + SE + CH + SY + TW + TJ + TZ + TH + TL + TG + TK + TO + TT + TN + TR + TM + TC + TV + UG + UA + AE + GB + UM + US + UY + UZ + VU + VE + VN + VG + VI + WF + EH + YE + ZM + ZW +} + +type CountryDisplay { + """ + Country code. + """ + code: String! + + """ + Country name. + """ + country: String! + + """ + Country tax. + """ + vat: VAT +} + +""" +Create JWT token. +""" +type CreateToken { + """ + JWT token, required to authenticate. + """ + token: String + + """ + JWT refresh token, required to re-generate access token. + """ + refreshToken: String + + """ + CSRF token required to re-generate access token. + """ + csrfToken: String + + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +type CreditCard { + """ + Card brand. + """ + brand: String! + + """ + First 4 digits of the card number. + """ + firstDigits: String + + """ + Last 4 digits of the card number. + """ + lastDigits: String! + + """ + Two-digit number representing the card’s expiration month. + """ + expMonth: Int + + """ + Four-digit number representing the card’s expiration year. + """ + expYear: Int +} + +""" +Deletes customers. +""" +type CustomerBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Creates a new customer. +""" +type CustomerCreate { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +""" +Deletes a customer. +""" +type CustomerDelete { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +""" +History log of the customer. +""" +type CustomerEvent implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Date when event happened at in ISO 8601 format. + """ + date: DateTime + + """ + Customer event type. + """ + type: CustomerEventsEnum + + """ + User who performed the action. + """ + user: User + + """ + Content of the event. + """ + message: String + + """ + Number of objects concerned by the event. + """ + count: Int + + """ + The concerned order. + """ + order: Order + + """ + The concerned order line. + """ + orderLine: OrderLine +} + +""" +An enumeration. +""" +enum CustomerEventsEnum { + ACCOUNT_CREATED + PASSWORD_RESET_LINK_SENT + PASSWORD_RESET + EMAIL_CHANGED_REQUEST + PASSWORD_CHANGED + EMAIL_CHANGED + PLACED_ORDER + NOTE_ADDED_TO_ORDER + DIGITAL_LINK_DOWNLOADED + CUSTOMER_DELETED + NAME_ASSIGNED + EMAIL_ASSIGNED + NOTE_ADDED +} + +input CustomerFilterInput { + dateJoined: DateRangeInput + numberOfOrders: IntRangeInput + placedOrders: DateRangeInput + search: String +} + +input CustomerInput { + """ + Billing address of the customer. + """ + defaultBillingAddress: AddressInput + + """ + Shipping address of the customer. + """ + defaultShippingAddress: AddressInput + + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + The unique email address of the user. + """ + email: String + + """ + User account is active. + """ + isActive: Boolean + + """ + A note about the user. + """ + note: String + + """ + User language code. + """ + languageCode: LanguageCodeEnum +} + +""" +Updates an existing customer. +""" +type CustomerUpdate { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! + user: User +} + +""" +The `Date` scalar type represents a Date +value as specified by +[iso8601](https://en.wikipedia.org/wiki/ISO_8601). +""" +scalar Date + +input DateRangeInput { + """ + Start date. + """ + gte: Date + + """ + End date. + """ + lte: Date +} + +""" +The `DateTime` scalar type represents a DateTime +value as specified by +[iso8601](https://en.wikipedia.org/wiki/ISO_8601). +""" +scalar DateTime + +input DateTimeRangeInput { + """ + Start date. + """ + gte: DateTime + + """ + End date. + """ + lte: DateTime +} + +""" +Deactivate all JWT tokens of the currently authenticated user. +""" +type DeactivateAllUserTokens { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Delete metadata of an object. +""" +type DeleteMetadata { + metadataErrors: [MetadataError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Delete object's private metadata. +""" +type DeletePrivateMetadata { + metadataErrors: [MetadataError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +type DigitalContent implements Node & ObjectWithMetadata { + useDefaultSettings: Boolean! + automaticFulfillment: Boolean! + contentFile: String! + maxDownloads: Int + urlValidDays: Int + + """ + List of URLs for the digital variant. + """ + urls: [DigitalContentUrl] + + """ + The ID of the object. + """ + id: ID! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Product variant assigned to digital content. + """ + productVariant: ProductVariant! +} + +type DigitalContentCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [DigitalContentCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type DigitalContentCountableEdge { + """ + The item at the end of the edge. + """ + node: DigitalContent! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Create new digital content. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec +""" +type DigitalContentCreate { + variant: ProductVariant + content: DigitalContent + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Remove digital content assigned to given variant. +""" +type DigitalContentDelete { + variant: ProductVariant + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input DigitalContentInput { + """ + Use default digital content settings for this product. + """ + useDefaultSettings: Boolean! + + """ + Determines how many times a download link can be accessed by a customer. + """ + maxDownloads: Int + + """ + Determines for how many days a download link is active since it was generated. + """ + urlValidDays: Int + + """ + Overwrite default automatic_fulfillment setting for variant. + """ + automaticFulfillment: Boolean +} + +""" +Update digital content. +""" +type DigitalContentUpdate { + variant: ProductVariant + content: DigitalContent + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input DigitalContentUploadInput { + """ + Use default digital content settings for this product. + """ + useDefaultSettings: Boolean! + + """ + Determines how many times a download link can be accessed by a customer. + """ + maxDownloads: Int + + """ + Determines for how many days a download link is active since it was generated. + """ + urlValidDays: Int + + """ + Overwrite default automatic_fulfillment setting for variant. + """ + automaticFulfillment: Boolean + + """ + Represents an file in a multipart request. + """ + contentFile: Upload! +} + +type DigitalContentUrl implements Node { + content: DigitalContent! + created: DateTime! + downloadNum: Int! + + """ + The ID of the object. + """ + id: ID! + + """ + URL for digital content. + """ + url: String + + """ + UUID of digital content. + """ + token: UUID! +} + +""" +Generate new URL to digital content. +""" +type DigitalContentUrlCreate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + digitalContentUrl: DigitalContentUrl +} + +input DigitalContentUrlCreateInput { + """ + Digital content ID which URL will belong to. + """ + content: ID! +} + +type DiscountError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + List of products IDs which causes the error. + """ + products: [ID!] + + """ + The error code. + """ + code: DiscountErrorCode! + + """ + List of channels IDs which causes the error. + """ + channels: [ID!] +} + +""" +An enumeration. +""" +enum DiscountErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT + DUPLICATED_INPUT_ITEM +} + +enum DiscountStatusEnum { + ACTIVE + EXPIRED + SCHEDULED +} + +enum DiscountValueTypeEnum { + FIXED + PERCENTAGE +} + +""" +An enumeration. +""" +enum DistanceUnitsEnum { + CM + M + KM + FT + YD + INCH +} + +""" +Represents shop's domain. +""" +type Domain { + """ + The host name of the domain. + """ + host: String! + + """ + Inform if SSL is enabled. + """ + sslEnabled: Boolean! + + """ + Shop's absolute URL. + """ + url: String! +} + +""" +Deletes draft orders. +""" +type DraftOrderBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Completes creating an order. +""" +type DraftOrderComplete { + """ + Completed order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Creates a new draft order. +""" +type DraftOrderCreate { + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! + order: Order +} + +input DraftOrderCreateInput { + """ + Billing address of the customer. + """ + billingAddress: AddressInput + user: ID + + """ + Email address of the customer. + """ + userEmail: String + + """ + Discount amount for the order. + """ + discount: PositiveDecimal + + """ + Shipping address of the customer. + """ + shippingAddress: AddressInput + + """ + ID of a selected shipping method. + """ + shippingMethod: ID + + """ + ID of the voucher associated with the order. + """ + voucher: ID + + """ + A note from a customer. Visible by customers in the order summary. + """ + customerNote: String + + """ + ID of the channel associated with the order. + """ + channel: ID + + """ + URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. + """ + redirectUrl: String + + """ + Variant line input consisting of variant ID and quantity of products. + """ + lines: [OrderLineCreateInput] +} + +""" +Deletes a draft order. +""" +type DraftOrderDelete { + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! + order: Order +} + +input DraftOrderInput { + """ + Billing address of the customer. + """ + billingAddress: AddressInput + user: ID + + """ + Email address of the customer. + """ + userEmail: String + + """ + Discount amount for the order. + """ + discount: PositiveDecimal + + """ + Shipping address of the customer. + """ + shippingAddress: AddressInput + + """ + ID of a selected shipping method. + """ + shippingMethod: ID + + """ + ID of the voucher associated with the order. + """ + voucher: ID + + """ + A note from a customer. Visible by customers in the order summary. + """ + customerNote: String + + """ + ID of the channel associated with the order. + """ + channel: ID + + """ + URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. + """ + redirectUrl: String +} + +""" +Deletes order lines. +""" +type DraftOrderLinesBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Updates a draft order. +""" +type DraftOrderUpdate { + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! + order: Order +} + +type ExportError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ExportErrorCode! +} + +""" +An enumeration. +""" +enum ExportErrorCode { + INVALID + NOT_FOUND + REQUIRED +} + +""" +History log of export file. +""" +type ExportEvent implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Date when event happened at in ISO 8601 format. + """ + date: DateTime! + + """ + Export event type. + """ + type: ExportEventsEnum! + + """ + User who performed the action. + """ + user: User + + """ + App which performed the action. + """ + app: App + + """ + Content of the event. + """ + message: String! +} + +""" +An enumeration. +""" +enum ExportEventsEnum { + EXPORT_PENDING + EXPORT_SUCCESS + EXPORT_FAILED + EXPORT_DELETED + EXPORTED_FILE_SENT + EXPORT_FAILED_INFO_SENT +} + +""" +Represents a job data of exported file. +""" +type ExportFile implements Node & Job { + """ + The ID of the object. + """ + id: ID! + user: User + app: App + + """ + Job status. + """ + status: JobStatusEnum! + + """ + Created date time of job in ISO 8601 format. + """ + createdAt: DateTime! + + """ + Date time of job last update in ISO 8601 format. + """ + updatedAt: DateTime! + + """ + Job message. + """ + message: String + + """ + The URL of field to download. + """ + url: String + + """ + List of events associated with the export. + """ + events: [ExportEvent!] +} + +type ExportFileCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [ExportFileCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type ExportFileCountableEdge { + """ + The item at the end of the edge. + """ + node: ExportFile! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +input ExportFileFilterInput { + createdAt: DateTimeRangeInput + updatedAt: DateTimeRangeInput + status: JobStatusEnum + user: String + app: String +} + +enum ExportFileSortField { + """ + Sort export file by status. + """ + STATUS + + """ + Sort export file by created at. + """ + CREATED_AT + + """ + Sort export file by updated at. + """ + UPDATED_AT +} + +input ExportFileSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort export file by the selected field. + """ + field: ExportFileSortField! +} + +input ExportInfoInput { + """ + List of attribute ids witch should be exported. + """ + attributes: [ID!] + + """ + List of warehouse ids witch should be exported. + """ + warehouses: [ID!] + + """ + List of channels ids which should be exported. + """ + channels: [ID!] + + """ + List of product fields witch should be exported. + """ + fields: [ProductFieldEnum!] +} + +""" +Export products to csv file. +""" +type ExportProducts { + """ + The newly created export file job which is responsible for export data. + """ + exportFile: ExportFile + exportErrors: [ExportError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ExportError!]! +} + +input ExportProductsInput { + """ + Determine which products should be exported. + """ + scope: ExportScope! + + """ + Filtering options for products. + """ + filter: ProductFilterInput + + """ + List of products IDS to export. + """ + ids: [ID!] + + """ + Input with info about fields which should be exported. + """ + exportInfo: ExportInfoInput + + """ + Type of exported file. + """ + fileType: FileTypesEnum! +} + +enum ExportScope { + """ + Export all products. + """ + ALL + + """ + Export products with given ids. + """ + IDS + + """ + Export the filtered products. + """ + FILTER +} + +type ExternalAuthentication { + """ + ID of external authentication plugin. + """ + id: String! + + """ + Name of external authentication plugin. + """ + name: String +} + +""" +Prepare external authentication url for user by custom plugin. +""" +type ExternalAuthenticationUrl { + """ + The data returned by authentication plugin. + """ + authenticationData: JSONString + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Logout user by custom plugin. +""" +type ExternalLogout { + """ + The data returned by authentication plugin. + """ + logoutData: JSONString + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Obtain external access tokens for user by custom plugin. +""" +type ExternalObtainAccessTokens { + """ + The token, required to authenticate. + """ + token: String + + """ + The refresh token, required to re-generate external access token. + """ + refreshToken: String + + """ + CSRF token required to re-generate external access token. + """ + csrfToken: String + + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Refresh user's access by custom plugin. +""" +type ExternalRefresh { + """ + The token, required to authenticate. + """ + token: String + + """ + The refresh token, required to re-generate external access token. + """ + refreshToken: String + + """ + CSRF token required to re-generate external access token. + """ + csrfToken: String + + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Verify external authentication data by plugin. +""" +type ExternalVerify { + """ + User assigned to data. + """ + user: User + + """ + Determine if authentication data is valid or not. + """ + isValid: Boolean! + + """ + External data. + """ + verifyData: JSONString + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +type File { + """ + The URL of the file. + """ + url: String! + + """ + Content type of the file. + """ + contentType: String +} + +""" +An enumeration. +""" +enum FileTypesEnum { + CSV + XLSX +} + +""" +Upload a file. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec +""" +type FileUpload { + uploadedFile: File + uploadErrors: [UploadError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [UploadError!]! +} + +""" +Represents order fulfillment. +""" +type Fulfillment implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + fulfillmentOrder: Int! + status: FulfillmentStatus! + trackingNumber: String! + created: DateTime! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + List of lines for the fulfillment. + """ + lines: [FulfillmentLine] + + """ + User-friendly fulfillment status. + """ + statusDisplay: String + + """ + Warehouse from fulfillment was fulfilled. + """ + warehouse: Warehouse +} + +""" +Cancels existing fulfillment and optionally restocks items. +""" +type FulfillmentCancel { + """ + A canceled fulfillment. + """ + fulfillment: Fulfillment + + """ + Order which fulfillment was cancelled. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input FulfillmentCancelInput { + """ + ID of warehouse where items will be restock. + """ + warehouseId: ID! +} + +""" +Represents line of the fulfillment. +""" +type FulfillmentLine implements Node { + """ + The ID of the object. + """ + id: ID! + quantity: Int! + orderLine: OrderLine +} + +""" +Refund products. +""" +type FulfillmentRefundProducts { + """ + A refunded fulfillment. + """ + fulfillment: Fulfillment + + """ + Order which fulfillment was refunded. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Return products. +""" +type FulfillmentReturnProducts { + """ + A return fulfillment. + """ + returnFulfillment: Fulfillment + + """ + A replace fulfillment. + """ + replaceFulfillment: Fulfillment + + """ + Order which fulfillment was returned. + """ + order: Order + + """ + A draft order which was created for products with replace flag. + """ + replaceOrder: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +An enumeration. +""" +enum FulfillmentStatus { + """ + Fulfilled + """ + FULFILLED + + """ + Refunded + """ + REFUNDED + + """ + Returned + """ + RETURNED + + """ + Replaced + """ + REPLACED + + """ + Refunded and returned + """ + REFUNDED_AND_RETURNED + + """ + Canceled + """ + CANCELED +} + +""" +Updates a fulfillment for an order. +""" +type FulfillmentUpdateTracking { + """ + A fulfillment with updated tracking. + """ + fulfillment: Fulfillment + + """ + Order for which fulfillment was updated. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input FulfillmentUpdateTrackingInput { + """ + Fulfillment tracking number. + """ + trackingNumber: String + + """ + If true, send an email notification to the customer. + """ + notifyCustomer: Boolean = false +} + +""" +Payment gateway client configuration key and value pair. +""" +type GatewayConfigLine { + """ + Gateway config key. + """ + field: String! + + """ + Gateway config value for key. + """ + value: String +} + +""" +The `GenericScalar` scalar type represents a generic +GraphQL scalar value that could be: +String, Boolean, Int, Float, List or Object. +""" +scalar GenericScalar + +""" +A gift card is a prepaid electronic payment card accepted in stores. They can be used during checkout by providing a valid gift card codes. +""" +type GiftCard implements Node { + """ + Gift card code. + """ + code: String + + """ + The customer who bought a gift card. + """ + user: User + created: DateTime! + startDate: Date! + endDate: Date + lastUsedOn: DateTime + isActive: Boolean! + initialBalance: Money + currentBalance: Money + + """ + The ID of the object. + """ + id: ID! + + """ + Code in format which allows displaying in a user interface. + """ + displayCode: String +} + +""" +Activate a gift card. +""" +type GiftCardActivate { + """ + A gift card to activate. + """ + giftCard: GiftCard + giftCardErrors: [GiftCardError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [GiftCardError!]! +} + +type GiftCardCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [GiftCardCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type GiftCardCountableEdge { + """ + The item at the end of the edge. + """ + node: GiftCard! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new gift card. +""" +type GiftCardCreate { + giftCardErrors: [GiftCardError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [GiftCardError!]! + giftCard: GiftCard +} + +input GiftCardCreateInput { + """ + Start date of the gift card in ISO 8601 format. + """ + startDate: Date + + """ + End date of the gift card in ISO 8601 format. + """ + endDate: Date + + """ + Value of the gift card. + """ + balance: PositiveDecimal + + """ + The customer's email of the gift card buyer. + """ + userEmail: String + + """ + Code to use the gift card. + """ + code: String +} + +""" +Deactivate a gift card. +""" +type GiftCardDeactivate { + """ + A gift card to deactivate. + """ + giftCard: GiftCard + giftCardErrors: [GiftCardError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [GiftCardError!]! +} + +type GiftCardError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: GiftCardErrorCode! +} + +""" +An enumeration. +""" +enum GiftCardErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +""" +Update a gift card. +""" +type GiftCardUpdate { + giftCardErrors: [GiftCardError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [GiftCardError!]! + giftCard: GiftCard +} + +input GiftCardUpdateInput { + """ + Start date of the gift card in ISO 8601 format. + """ + startDate: Date + + """ + End date of the gift card in ISO 8601 format. + """ + endDate: Date + + """ + Value of the gift card. + """ + balance: PositiveDecimal + + """ + The customer's email of the gift card buyer. + """ + userEmail: String +} + +""" +Represents permission group data. +""" +type Group implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + List of group permissions + """ + permissions: [Permission] + + """ + List of group users + """ + users: [User] + + """ + True, if the currently authenticated user has rights to manage a group. + """ + userCanManage: Boolean! +} + +type GroupCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [GroupCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type GroupCountableEdge { + """ + The item at the end of the edge. + """ + node: Group! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Represents an image. +""" +type Image { + """ + The URL of the image. + """ + url: String! + + """ + Alt text for an image. + """ + alt: String +} + +input IntRangeInput { + """ + Value greater than or equal to. + """ + gte: Int + + """ + Value less than or equal to. + """ + lte: Int +} + +""" +Represents an Invoice. +""" +type Invoice implements ObjectWithMetadata & Job & Node { + """ + The ID of the object. + """ + id: ID! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Job status. + """ + status: JobStatusEnum! + number: String + externalUrl: String + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + Created date time of job in ISO 8601 format. + """ + createdAt: DateTime! + + """ + Date time of job last update in ISO 8601 format. + """ + updatedAt: DateTime! + + """ + Job message. + """ + message: String + + """ + URL to download an invoice. + """ + url: String +} + +""" +Creates a ready to send invoice. +""" +type InvoiceCreate { + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +input InvoiceCreateInput { + """ + Invoice number. + """ + number: String! + + """ + URL of an invoice to download. + """ + url: String! +} + +""" +Deletes an invoice. +""" +type InvoiceDelete { + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +type InvoiceError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: InvoiceErrorCode! +} + +""" +An enumeration. +""" +enum InvoiceErrorCode { + REQUIRED + NOT_READY + URL_NOT_SET + EMAIL_NOT_SET + NUMBER_NOT_SET + NOT_FOUND + INVALID_STATUS +} + +""" +Request an invoice for the order using plugin. +""" +type InvoiceRequest { + """ + Order related to an invoice. + """ + order: Order + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Requests deletion of an invoice. +""" +type InvoiceRequestDelete { + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Send an invoice notification to the customer. +""" +type InvoiceSendNotification { + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Updates an invoice. +""" +type InvoiceUpdate { + invoiceErrors: [InvoiceError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Allows use of a JSON String for input / output from the GraphQL schema. + +Use of this type is *not recommended* as you lose the benefits of having a defined, static +schema (one of the key benefits of GraphQL). +""" +scalar JSONString + +interface Job { + """ + Job status. + """ + status: JobStatusEnum! + + """ + Created date time of job in ISO 8601 format. + """ + createdAt: DateTime! + + """ + Date time of job last update in ISO 8601 format. + """ + updatedAt: DateTime! + + """ + Job message. + """ + message: String +} + +""" +An enumeration. +""" +enum JobStatusEnum { + PENDING + SUCCESS + FAILED + DELETED +} + +""" +An enumeration. +""" +enum LanguageCodeEnum { + AR + AZ + BG + BN + CA + CS + DA + DE + EL + EN + ES + ES_CO + ET + FA + FI + FR + HI + HU + HY + ID + IS + IT + JA + KA + KM + KO + LT + MN + MY + NB + NL + PL + PT + PT_BR + RO + RU + SK + SL + SQ + SR + SV + SW + TA + TH + TR + UK + VI + ZH_HANS + ZH_HANT +} + +type LanguageDisplay { + """ + ISO 639 representation of the language name. + """ + code: LanguageCodeEnum! + + """ + Full name of the language. + """ + language: String! +} + +type LimitInfo { + """ + Defines the current resource usage. + """ + currentUsage: Limits! + + """ + Defines the allowed maximum resource usage, null means unlimited. + """ + allowedUsage: Limits! +} + +type Limits { + channels: Int + orders: Int + productVariants: Int + staffUsers: Int + warehouses: Int +} + +""" +The manifest definition. +""" +type Manifest { + identifier: String! + version: String! + name: String! + about: String + permissions: [Permission] + appUrl: String + configurationUrl: String + tokenTargetUrl: String + dataPrivacy: String + dataPrivacyUrl: String + homepageUrl: String + supportUrl: String +} + +type Margin { + start: Int + stop: Int +} + +""" +An enumeration. +""" +enum MeasurementUnitsEnum { + CM + M + KM + FT + YD + INCH + SQ_CM + SQ_M + SQ_KM + SQ_FT + SQ_YD + SQ_INCH + CUBIC_MILLIMETER + CUBIC_CENTIMETER + CUBIC_DECIMETER + CUBIC_METER + LITER + CUBIC_FOOT + CUBIC_INCH + CUBIC_YARD + QT + PINT + FL_OZ + ACRE_IN + ACRE_FT + G + LB + OZ + KG + TONNE +} + +""" +Represents a single menu - an object that is used to help navigate through the store. +""" +type Menu implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + slug: String! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + items: [MenuItem] +} + +""" +Deletes menus. +""" +type MenuBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! +} + +type MenuCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [MenuCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type MenuCountableEdge { + """ + The item at the end of the edge. + """ + node: Menu! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new Menu. +""" +type MenuCreate { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menu: Menu +} + +input MenuCreateInput { + """ + Name of the menu. + """ + name: String! + + """ + Slug of the menu. Will be generated if not provided. + """ + slug: String + + """ + List of menu items. + """ + items: [MenuItemInput] +} + +""" +Deletes a menu. +""" +type MenuDelete { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menu: Menu +} + +type MenuError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: MenuErrorCode! +} + +""" +An enumeration. +""" +enum MenuErrorCode { + CANNOT_ASSIGN_NODE + GRAPHQL_ERROR + INVALID + INVALID_MENU_ITEM + NO_MENU_ITEM_PROVIDED + NOT_FOUND + REQUIRED + TOO_MANY_MENU_ITEMS + UNIQUE +} + +input MenuFilterInput { + search: String + slug: [String] + metadata: [MetadataInput] +} + +input MenuInput { + """ + Name of the menu. + """ + name: String + + """ + Slug of the menu. + """ + slug: String +} + +""" +Represents a single item of the related menu. Can store categories, collection or pages. +""" +type MenuItem implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + menu: Menu! + parent: MenuItem + category: Category + collection: Collection + page: Page + level: Int! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + children: [MenuItem] + + """ + URL to the menu item. + """ + url: String + + """ + Returns translated menu item fields for the given language code. + """ + translation( + """ + A language code to return the translation for menu item. + """ + languageCode: LanguageCodeEnum! + ): MenuItemTranslation +} + +""" +Deletes menu items. +""" +type MenuItemBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! +} + +type MenuItemCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [MenuItemCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type MenuItemCountableEdge { + """ + The item at the end of the edge. + """ + node: MenuItem! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new menu item. +""" +type MenuItemCreate { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menuItem: MenuItem +} + +input MenuItemCreateInput { + """ + Name of the menu item. + """ + name: String! + + """ + URL of the pointed item. + """ + url: String + + """ + Category to which item points. + """ + category: ID + + """ + Collection to which item points. + """ + collection: ID + + """ + Page to which item points. + """ + page: ID + + """ + Menu to which item belongs. + """ + menu: ID! + + """ + ID of the parent menu. If empty, menu will be top level menu. + """ + parent: ID +} + +""" +Deletes a menu item. +""" +type MenuItemDelete { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menuItem: MenuItem +} + +input MenuItemFilterInput { + search: String + metadata: [MetadataInput] +} + +input MenuItemInput { + """ + Name of the menu item. + """ + name: String + + """ + URL of the pointed item. + """ + url: String + + """ + Category to which item points. + """ + category: ID + + """ + Collection to which item points. + """ + collection: ID + + """ + Page to which item points. + """ + page: ID +} + +""" +Moves items of menus. +""" +type MenuItemMove { + """ + Assigned menu to move within. + """ + menu: Menu + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! +} + +input MenuItemMoveInput { + """ + The menu item ID to move. + """ + itemId: ID! + + """ + ID of the parent menu. If empty, menu will be top level menu. + """ + parentId: ID + + """ + The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. + """ + sortOrder: Int +} + +input MenuItemSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort menu items by the selected field. + """ + field: MenuItemsSortField! +} + +type MenuItemTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Returns translated menu item fields for the given language code. + """ + translation( + """ + A language code to return the translation for menu item. + """ + languageCode: LanguageCodeEnum! + ): MenuItemTranslation + + """ + Represents a single item of the related menu. Can store categories, collection or pages. + """ + menuItem: MenuItem +} + +""" +Creates/Updates translations for Menu Item. +""" +type MenuItemTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + menuItem: MenuItem +} + +type MenuItemTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Translation language. + """ + language: LanguageDisplay! +} + +""" +Updates a menu item. +""" +type MenuItemUpdate { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menuItem: MenuItem +} + +enum MenuItemsSortField { + """ + Sort menu items by name. + """ + NAME +} + +enum MenuSortField { + """ + Sort menus by name. + """ + NAME + + """ + Sort menus by items count. + """ + ITEMS_COUNT +} + +input MenuSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort menus by the selected field. + """ + field: MenuSortField! +} + +""" +Updates a menu. +""" +type MenuUpdate { + menuErrors: [MenuError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MenuError!]! + menu: Menu +} + +type MetadataError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: MetadataErrorCode! +} + +""" +An enumeration. +""" +enum MetadataErrorCode { + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED +} + +input MetadataInput { + """ + Key of a metadata item. + """ + key: String! + + """ + Value of a metadata item. + """ + value: String! +} + +type MetadataItem { + """ + Key of a metadata item. + """ + key: String! + + """ + Value of a metadata item. + """ + value: String! +} + +""" +Represents amount of money in specific currency. +""" +type Money { + """ + Currency code. + """ + currency: String! + + """ + Amount of money. + """ + amount: Float! +} + +""" +Represents a range of amounts of money. +""" +type MoneyRange { + """ + Lower bound of a price range. + """ + start: Money + + """ + Upper bound of a price range. + """ + stop: Money +} + +input MoveProductInput { + """ + The ID of the product to move. + """ + productId: ID! + + """ + The relative sorting position of the product (from -inf to +inf) starting from the first given product's actual position.1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. + """ + sortOrder: Int +} + +type Mutation { + """ + Creates a new webhook subscription. + """ + webhookCreate( + """ + Fields required to create a webhook. + """ + input: WebhookCreateInput! + ): WebhookCreate + + """ + Deletes a webhook subscription. + """ + webhookDelete( + """ + ID of a webhook to delete. + """ + id: ID! + ): WebhookDelete + + """ + Updates a webhook subscription. + """ + webhookUpdate( + """ + ID of a webhook to update. + """ + id: ID! + + """ + Fields required to update a webhook. + """ + input: WebhookUpdateInput! + ): WebhookUpdate + + """ + Creates new warehouse. + """ + createWarehouse( + """ + Fields required to create warehouse. + """ + input: WarehouseCreateInput! + ): WarehouseCreate + + """ + Updates given warehouse. + """ + updateWarehouse( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + Fields required to update warehouse. + """ + input: WarehouseUpdateInput! + ): WarehouseUpdate + + """ + Deletes selected warehouse. + """ + deleteWarehouse( + """ + ID of a warehouse to delete. + """ + id: ID! + ): WarehouseDelete + + """ + Add shipping zone to given warehouse. + """ + assignWarehouseShippingZone( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + List of shipping zone IDs. + """ + shippingZoneIds: [ID!]! + ): WarehouseShippingZoneAssign + + """ + Remove shipping zone from given warehouse. + """ + unassignWarehouseShippingZone( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + List of shipping zone IDs. + """ + shippingZoneIds: [ID!]! + ): WarehouseShippingZoneUnassign + + """ + Creates a new staff notification recipient. + """ + staffNotificationRecipientCreate( + """ + Fields required to create a staff notification recipient. + """ + input: StaffNotificationRecipientInput! + ): StaffNotificationRecipientCreate + + """ + Updates a staff notification recipient. + """ + staffNotificationRecipientUpdate( + """ + ID of a staff notification recipient to update. + """ + id: ID! + + """ + Fields required to update a staff notification recipient. + """ + input: StaffNotificationRecipientInput! + ): StaffNotificationRecipientUpdate + + """ + Delete staff notification recipient. + """ + staffNotificationRecipientDelete( + """ + ID of a staff notification recipient to delete. + """ + id: ID! + ): StaffNotificationRecipientDelete + + """ + Updates site domain of the shop. + """ + shopDomainUpdate( + """ + Fields required to update site. + """ + input: SiteDomainInput + ): ShopDomainUpdate + + """ + Updates shop settings. + """ + shopSettingsUpdate( + """ + Fields required to update shop settings. + """ + input: ShopSettingsInput! + ): ShopSettingsUpdate + + """ + Fetch tax rates. + """ + shopFetchTaxRates: ShopFetchTaxRates + + """ + Creates/Updates translations for Shop Settings. + """ + shopSettingsTranslate( + """ + Fields required to update shop settings translations. + """ + input: ShopSettingsTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ShopSettingsTranslate + + """ + Update the shop's address. If the `null` value is passed, the currently selected address will be deleted. + """ + shopAddressUpdate( + """ + Fields required to update shop address. + """ + input: AddressInput + ): ShopAddressUpdate + + """ + Update shop order settings. + """ + orderSettingsUpdate( + """ + Fields required to update shop order settings. + """ + input: OrderSettingsUpdateInput! + ): OrderSettingsUpdate + + """ + Manage shipping method's availability in channels. + """ + shippingMethodChannelListingUpdate( + """ + ID of a shipping method to update. + """ + id: ID! + + """ + Fields required to update shipping method channel listings. + """ + input: ShippingMethodChannelListingInput! + ): ShippingMethodChannelListingUpdate + + """ + Creates a new shipping price. + """ + shippingPriceCreate( + """ + Fields required to create a shipping price. + """ + input: ShippingPriceInput! + ): ShippingPriceCreate + + """ + Deletes a shipping price. + """ + shippingPriceDelete( + """ + ID of a shipping price to delete. + """ + id: ID! + ): ShippingPriceDelete + + """ + Deletes shipping prices. + """ + shippingPriceBulkDelete( + """ + List of shipping price IDs to delete. + """ + ids: [ID]! + ): ShippingPriceBulkDelete + + """ + Updates a new shipping price. + """ + shippingPriceUpdate( + """ + ID of a shipping price to update. + """ + id: ID! + + """ + Fields required to update a shipping price. + """ + input: ShippingPriceInput! + ): ShippingPriceUpdate + + """ + Creates/Updates translations for shipping method. + """ + shippingPriceTranslate( + """ + Shipping method ID. + """ + id: ID! + input: ShippingPriceTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ShippingPriceTranslate + + """ + Exclude products from shipping price. + """ + shippingPriceExcludeProducts( + """ + ID of a shipping price. + """ + id: ID! + + """ + Exclude products input. + """ + input: ShippingPriceExcludeProductsInput! + ): ShippingPriceExcludeProducts + + """ + Remove product from excluded list for shipping price. + """ + shippingPriceRemoveProductFromExclude( + """ + ID of a shipping price. + """ + id: ID! + + """ + List of products which will be removed from excluded list. + """ + products: [ID]! + ): ShippingPriceRemoveProductFromExclude + + """ + Creates a new shipping zone. + """ + shippingZoneCreate( + """ + Fields required to create a shipping zone. + """ + input: ShippingZoneCreateInput! + ): ShippingZoneCreate + + """ + Deletes a shipping zone. + """ + shippingZoneDelete( + """ + ID of a shipping zone to delete. + """ + id: ID! + ): ShippingZoneDelete + + """ + Deletes shipping zones. + """ + shippingZoneBulkDelete( + """ + List of shipping zone IDs to delete. + """ + ids: [ID]! + ): ShippingZoneBulkDelete + + """ + Updates a new shipping zone. + """ + shippingZoneUpdate( + """ + ID of a shipping zone to update. + """ + id: ID! + + """ + Fields required to update a shipping zone. + """ + input: ShippingZoneUpdateInput! + ): ShippingZoneUpdate + + """ + Assign attributes to a given product type. + """ + productAttributeAssign( + """ + The operations to perform. + """ + operations: [ProductAttributeAssignInput]! + + """ + ID of the product type to assign the attributes into. + """ + productTypeId: ID! + ): ProductAttributeAssign + + """ + Un-assign attributes from a given product type. + """ + productAttributeUnassign( + """ + The IDs of the attributes to unassign. + """ + attributeIds: [ID]! + + """ + ID of the product type from which the attributes should be unassigned. + """ + productTypeId: ID! + ): ProductAttributeUnassign + + """ + Creates a new category. + """ + categoryCreate( + """ + Fields required to create a category. + """ + input: CategoryInput! + + """ + ID of the parent category. If empty, category will be top level category. + """ + parent: ID + ): CategoryCreate + + """ + Deletes a category. + """ + categoryDelete( + """ + ID of a category to delete. + """ + id: ID! + ): CategoryDelete + + """ + Deletes categories. + """ + categoryBulkDelete( + """ + List of category IDs to delete. + """ + ids: [ID]! + ): CategoryBulkDelete + + """ + Updates a category. + """ + categoryUpdate( + """ + ID of a category to update. + """ + id: ID! + + """ + Fields required to update a category. + """ + input: CategoryInput! + ): CategoryUpdate + + """ + Creates/Updates translations for Category. + """ + categoryTranslate( + """ + Category ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): CategoryTranslate + + """ + Adds products to a collection. + """ + collectionAddProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + List of product IDs. + """ + products: [ID]! + ): CollectionAddProducts + + """ + Creates a new collection. + """ + collectionCreate( + """ + Fields required to create a collection. + """ + input: CollectionCreateInput! + ): CollectionCreate + + """ + Deletes a collection. + """ + collectionDelete( + """ + ID of a collection to delete. + """ + id: ID! + ): CollectionDelete + + """ + Reorder the products of a collection. + """ + collectionReorderProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + The collection products position operations. + """ + moves: [MoveProductInput]! + ): CollectionReorderProducts + + """ + Deletes collections. + """ + collectionBulkDelete( + """ + List of collection IDs to delete. + """ + ids: [ID]! + ): CollectionBulkDelete + + """ + Remove products from a collection. + """ + collectionRemoveProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + List of product IDs. + """ + products: [ID]! + ): CollectionRemoveProducts + + """ + Updates a collection. + """ + collectionUpdate( + """ + ID of a collection to update. + """ + id: ID! + + """ + Fields required to update a collection. + """ + input: CollectionInput! + ): CollectionUpdate + + """ + Creates/Updates translations for collection. + """ + collectionTranslate( + """ + Collection ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): CollectionTranslate + + """ + Manage collection's availability in channels. + """ + collectionChannelListingUpdate( + """ + ID of a collection to update. + """ + id: ID! + + """ + Fields required to create or update collection channel listings. + """ + input: CollectionChannelListingUpdateInput! + ): CollectionChannelListingUpdate + + """ + Creates a new product. + """ + productCreate( + """ + Fields required to create a product. + """ + input: ProductCreateInput! + ): ProductCreate + + """ + Deletes a product. + """ + productDelete( + """ + ID of a product to delete. + """ + id: ID! + ): ProductDelete + + """ + Deletes products. + """ + productBulkDelete( + """ + List of product IDs to delete. + """ + ids: [ID]! + ): ProductBulkDelete + + """ + Updates an existing product. + """ + productUpdate( + """ + ID of a product to update. + """ + id: ID! + + """ + Fields required to update a product. + """ + input: ProductInput! + ): ProductUpdate + + """ + Creates/Updates translations for Product. + """ + productTranslate( + """ + Product ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ProductTranslate + + """ + Manage product's availability in channels. + """ + productChannelListingUpdate( + """ + ID of a product to update. + """ + id: ID! + + """ + Fields required to create or update product channel listings. + """ + input: ProductChannelListingUpdateInput! + ): ProductChannelListingUpdate + + """ + Create a media object (image or video URL) associated with product. For image, this mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec + """ + productMediaCreate( + """ + Fields required to create a product media. + """ + input: ProductMediaCreateInput! + ): ProductMediaCreate + + """ + Reorder the variants of a product. Mutation updates updated_at on product and triggers PRODUCT_UPDATED webhook. + """ + productVariantReorder( + """ + The list of variant reordering operations. + """ + moves: [ReorderInput]! + + """ + Id of product that variants order will be altered. + """ + productId: ID! + ): ProductVariantReorder + + """ + Deletes a product media. + """ + productMediaDelete( + """ + ID of a product media to delete. + """ + id: ID! + ): ProductMediaDelete + + """ + Deletes product media. + """ + productMediaBulkDelete( + """ + List of product media IDs to delete. + """ + ids: [ID]! + ): ProductMediaBulkDelete + + """ + Changes ordering of the product media. + """ + productMediaReorder( + """ + IDs of a product media in the desired order. + """ + mediaIds: [ID]! + + """ + ID of product that media order will be altered. + """ + productId: ID! + ): ProductMediaReorder + + """ + Updates a product media. + """ + productMediaUpdate( + """ + ID of a product media to update. + """ + id: ID! + + """ + Fields required to update a product media. + """ + input: ProductMediaUpdateInput! + ): ProductMediaUpdate + + """ + Creates a new product type. + """ + productTypeCreate( + """ + Fields required to create a product type. + """ + input: ProductTypeInput! + ): ProductTypeCreate + + """ + Deletes a product type. + """ + productTypeDelete( + """ + ID of a product type to delete. + """ + id: ID! + ): ProductTypeDelete + + """ + Deletes product types. + """ + productTypeBulkDelete( + """ + List of product type IDs to delete. + """ + ids: [ID]! + ): ProductTypeBulkDelete + + """ + Updates an existing product type. + """ + productTypeUpdate( + """ + ID of a product type to update. + """ + id: ID! + + """ + Fields required to update a product type. + """ + input: ProductTypeInput! + ): ProductTypeUpdate + + """ + Reorder the attributes of a product type. + """ + productTypeReorderAttributes( + """ + The list of attribute reordering operations. + """ + moves: [ReorderInput]! + + """ + ID of a product type. + """ + productTypeId: ID! + + """ + The attribute type to reorder. + """ + type: ProductAttributeType! + ): ProductTypeReorderAttributes + + """ + Reorder product attribute values. + """ + productReorderAttributeValues( + """ + ID of an attribute. + """ + attributeId: ID! + + """ + The list of reordering operations for given attribute values. + """ + moves: [ReorderInput]! + + """ + ID of a product. + """ + productId: ID! + ): ProductReorderAttributeValues + + """ + Create new digital content. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec + """ + digitalContentCreate( + """ + Fields required to create a digital content. + """ + input: DigitalContentUploadInput! + + """ + ID of a product variant to upload digital content. + """ + variantId: ID! + ): DigitalContentCreate + + """ + Remove digital content assigned to given variant. + """ + digitalContentDelete( + """ + ID of a product variant with digital content to remove. + """ + variantId: ID! + ): DigitalContentDelete + + """ + Update digital content. + """ + digitalContentUpdate( + """ + Fields required to update a digital content. + """ + input: DigitalContentInput! + + """ + ID of a product variant with digital content to update. + """ + variantId: ID! + ): DigitalContentUpdate + + """ + Generate new URL to digital content. + """ + digitalContentUrlCreate( + """ + Fields required to create a new url. + """ + input: DigitalContentUrlCreateInput! + ): DigitalContentUrlCreate + + """ + Creates a new variant for a product. + """ + productVariantCreate( + """ + Fields required to create a product variant. + """ + input: ProductVariantCreateInput! + ): ProductVariantCreate + + """ + Deletes a product variant. + """ + productVariantDelete( + """ + ID of a product variant to delete. + """ + id: ID! + ): ProductVariantDelete + + """ + Creates product variants for a given product. + """ + productVariantBulkCreate( + """ + ID of the product to create the variants for. + """ + product: ID! + + """ + Input list of product variants to create. + """ + variants: [ProductVariantBulkCreateInput]! + ): ProductVariantBulkCreate + + """ + Deletes product variants. + """ + productVariantBulkDelete( + """ + List of product variant IDs to delete. + """ + ids: [ID]! + ): ProductVariantBulkDelete + + """ + Creates stocks for product variant. + """ + productVariantStocksCreate( + """ + Input list of stocks to create. + """ + stocks: [StockInput!]! + + """ + ID of a product variant for which stocks will be created. + """ + variantId: ID! + ): ProductVariantStocksCreate + + """ + Delete stocks from product variant. + """ + productVariantStocksDelete( + """ + ID of product variant for which stocks will be deleted. + """ + variantId: ID! + warehouseIds: [ID!] + ): ProductVariantStocksDelete + + """ + Update stocks for product variant. + """ + productVariantStocksUpdate( + """ + Input list of stocks to create. + """ + stocks: [StockInput!]! + + """ + ID of a product variant for which stocks will be created. + """ + variantId: ID! + ): ProductVariantStocksUpdate + + """ + Updates an existing variant for product. + """ + productVariantUpdate( + """ + ID of a product variant to update. + """ + id: ID! + + """ + Fields required to update a product variant. + """ + input: ProductVariantInput! + ): ProductVariantUpdate + + """ + Set default variant for a product. Mutation triggers PRODUCT_UPDATED webhook. + """ + productVariantSetDefault( + """ + Id of a product that will have the default variant set. + """ + productId: ID! + + """ + Id of a variant that will be set as default. + """ + variantId: ID! + ): ProductVariantSetDefault + + """ + Creates/Updates translations for Product Variant. + """ + productVariantTranslate( + """ + Product Variant ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ProductVariantTranslate + + """ + Manage product variant prices in channels. + """ + productVariantChannelListingUpdate( + """ + ID of a product variant to update. + """ + id: ID! + + """ + ('List of fields required to create or upgrade product variant ', 'channel listings.') + """ + input: [ProductVariantChannelListingAddInput!]! + ): ProductVariantChannelListingUpdate + + """ + Reorder product variant attribute values. + """ + productVariantReorderAttributeValues( + """ + ID of an attribute. + """ + attributeId: ID! + + """ + The list of reordering operations for given attribute values. + """ + moves: [ReorderInput]! + + """ + ID of a product variant. + """ + variantId: ID! + ): ProductVariantReorderAttributeValues + + """ + Assign an media to a product variant. + """ + variantMediaAssign( + """ + ID of a product media to assign to a variant. + """ + mediaId: ID! + + """ + ID of a product variant. + """ + variantId: ID! + ): VariantMediaAssign + + """ + Unassign an media from a product variant. + """ + variantMediaUnassign( + """ + ID of a product media to unassign from a variant. + """ + mediaId: ID! + + """ + ID of a product variant. + """ + variantId: ID! + ): VariantMediaUnassign + + """ + Captures the authorized payment amount. + """ + paymentCapture( + """ + Transaction amount. + """ + amount: PositiveDecimal + + """ + Payment ID. + """ + paymentId: ID! + ): PaymentCapture + + """ + Refunds the captured payment amount. + """ + paymentRefund( + """ + Transaction amount. + """ + amount: PositiveDecimal + + """ + Payment ID. + """ + paymentId: ID! + ): PaymentRefund + + """ + Voids the authorized payment. + """ + paymentVoid( + """ + Payment ID. + """ + paymentId: ID! + ): PaymentVoid + + """ + Initializes payment process when it is required by gateway. + """ + paymentInitialize( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + A gateway name used to initialize the payment. + """ + gateway: String! + + """ + Client-side generated data required to initialize the payment. + """ + paymentData: JSONString + ): PaymentInitialize + + """ + Creates a new page. + """ + pageCreate( + """ + Fields required to create a page. + """ + input: PageCreateInput! + ): PageCreate + + """ + Deletes a page. + """ + pageDelete( + """ + ID of a page to delete. + """ + id: ID! + ): PageDelete + + """ + Deletes pages. + """ + pageBulkDelete( + """ + List of page IDs to delete. + """ + ids: [ID]! + ): PageBulkDelete + + """ + Publish pages. + """ + pageBulkPublish( + """ + List of page IDs to (un)publish. + """ + ids: [ID]! + + """ + Determine if pages will be published or not. + """ + isPublished: Boolean! + ): PageBulkPublish + + """ + Updates an existing page. + """ + pageUpdate( + """ + ID of a page to update. + """ + id: ID! + + """ + Fields required to update a page. + """ + input: PageInput! + ): PageUpdate + + """ + Creates/Updates translations for Page. + """ + pageTranslate( + """ + Page ID. + """ + id: ID! + input: PageTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): PageTranslate + + """ + Create a new page type. + """ + pageTypeCreate( + """ + Fields required to create page type. + """ + input: PageTypeCreateInput! + ): PageTypeCreate + + """ + Update page type. + """ + pageTypeUpdate( + """ + ID of the page type to update. + """ + id: ID + + """ + Fields required to update page type. + """ + input: PageTypeUpdateInput! + ): PageTypeUpdate + + """ + Delete a page type. + """ + pageTypeDelete( + """ + ID of the page type to delete. + """ + id: ID! + ): PageTypeDelete + + """ + Delete page types. + """ + pageTypeBulkDelete( + """ + List of page type IDs to delete + """ + ids: [ID!]! + ): PageTypeBulkDelete + + """ + Assign attributes to a given page type. + """ + pageAttributeAssign( + """ + The IDs of the attributes to assign. + """ + attributeIds: [ID!]! + + """ + ID of the page type to assign the attributes into. + """ + pageTypeId: ID! + ): PageAttributeAssign + + """ + Unassign attributes from a given page type. + """ + pageAttributeUnassign( + """ + The IDs of the attributes to unassign. + """ + attributeIds: [ID!]! + + """ + ID of the page type from which the attributes should be unassign. + """ + pageTypeId: ID! + ): PageAttributeUnassign + + """ + Reorder the attributes of a page type. + """ + pageTypeReorderAttributes( + """ + The list of attribute reordering operations. + """ + moves: [ReorderInput!]! + + """ + ID of a page type. + """ + pageTypeId: ID! + ): PageTypeReorderAttributes + + """ + Reorder page attribute values. + """ + pageReorderAttributeValues( + """ + ID of an attribute. + """ + attributeId: ID! + + """ + The list of reordering operations for given attribute values. + """ + moves: [ReorderInput]! + + """ + ID of a page. + """ + pageId: ID! + ): PageReorderAttributeValues + + """ + Completes creating an order. + """ + draftOrderComplete( + """ + ID of the order that will be completed. + """ + id: ID! + ): DraftOrderComplete + + """ + Creates a new draft order. + """ + draftOrderCreate( + """ + Fields required to create an order. + """ + input: DraftOrderCreateInput! + ): DraftOrderCreate + + """ + Deletes a draft order. + """ + draftOrderDelete( + """ + ID of a draft order to delete. + """ + id: ID! + ): DraftOrderDelete + + """ + Deletes draft orders. + """ + draftOrderBulkDelete( + """ + List of draft order IDs to delete. + """ + ids: [ID]! + ): DraftOrderBulkDelete + + """ + Deletes order lines. + """ + draftOrderLinesBulkDelete( + """ + List of order lines IDs to delete. + """ + ids: [ID]! + ): DraftOrderLinesBulkDelete + + """ + Updates a draft order. + """ + draftOrderUpdate( + """ + ID of a draft order to update. + """ + id: ID! + + """ + Fields required to update an order. + """ + input: DraftOrderInput! + ): DraftOrderUpdate + + """ + Adds note to the order. + """ + orderAddNote( + """ + ID of the order to add a note for. + """ + order: ID! + + """ + Fields required to create a note for the order. + """ + input: OrderAddNoteInput! + ): OrderAddNote + + """ + Cancel an order. + """ + orderCancel( + """ + ID of the order to cancel. + """ + id: ID! + ): OrderCancel + + """ + Capture an order. + """ + orderCapture( + """ + Amount of money to capture. + """ + amount: PositiveDecimal! + + """ + ID of the order to capture. + """ + id: ID! + ): OrderCapture + + """ + Confirms an unconfirmed order by changing status to unfulfilled. + """ + orderConfirm( + """ + ID of an order to confirm. + """ + id: ID! + ): OrderConfirm + + """ + Creates new fulfillments for an order. + """ + orderFulfill( + """ + Fields required to create an fulfillment. + """ + input: OrderFulfillInput! + + """ + ID of the order to be fulfilled. + """ + order: ID + ): OrderFulfill + + """ + Cancels existing fulfillment and optionally restocks items. + """ + orderFulfillmentCancel( + """ + ID of an fulfillment to cancel. + """ + id: ID! + + """ + Fields required to cancel an fulfillment. + """ + input: FulfillmentCancelInput! + ): FulfillmentCancel + + """ + Updates a fulfillment for an order. + """ + orderFulfillmentUpdateTracking( + """ + ID of an fulfillment to update. + """ + id: ID! + + """ + Fields required to update an fulfillment. + """ + input: FulfillmentUpdateTrackingInput! + ): FulfillmentUpdateTracking + + """ + Refund products. + """ + orderFulfillmentRefundProducts( + """ + Fields required to create an refund fulfillment. + """ + input: OrderRefundProductsInput! + + """ + ID of the order to be refunded. + """ + order: ID! + ): FulfillmentRefundProducts + + """ + Return products. + """ + orderFulfillmentReturnProducts( + """ + Fields required to return products. + """ + input: OrderReturnProductsInput! + + """ + ID of the order to be returned. + """ + order: ID! + ): FulfillmentReturnProducts + + """ + Create order lines for an order. + """ + orderLinesCreate( + """ + ID of the order to add the lines to. + """ + id: ID! + + """ + Fields required to add order lines. + """ + input: [OrderLineCreateInput]! + ): OrderLinesCreate + + """ + Deletes an order line from an order. + """ + orderLineDelete( + """ + ID of the order line to delete. + """ + id: ID! + ): OrderLineDelete + + """ + Updates an order line of an order. + """ + orderLineUpdate( + """ + ID of the order line to update. + """ + id: ID! + + """ + Fields required to update an order line. + """ + input: OrderLineInput! + ): OrderLineUpdate + + """ + Adds discount to the order. + """ + orderDiscountAdd( + """ + Fields required to create a discount for the order. + """ + input: OrderDiscountCommonInput! + + """ + ID of an order to discount. + """ + orderId: ID! + ): OrderDiscountAdd + + """ + Update discount for the order. + """ + orderDiscountUpdate( + """ + ID of a discount to update. + """ + discountId: ID! + + """ + Fields required to update a discount for the order. + """ + input: OrderDiscountCommonInput! + ): OrderDiscountUpdate + + """ + Remove discount from the order. + """ + orderDiscountDelete( + """ + ID of a discount to remove. + """ + discountId: ID! + ): OrderDiscountDelete + + """ + Update discount for the order line. + """ + orderLineDiscountUpdate( + """ + Fields required to update price for the order line. + """ + input: OrderDiscountCommonInput! + + """ + ID of a order line to update price + """ + orderLineId: ID! + ): OrderLineDiscountUpdate + + """ + Remove discount applied to the order line. + """ + orderLineDiscountRemove( + """ + ID of a order line to remove its discount + """ + orderLineId: ID! + ): OrderLineDiscountRemove + + """ + Mark order as manually paid. + """ + orderMarkAsPaid( + """ + ID of the order to mark paid. + """ + id: ID! + + """ + The external transaction reference. + """ + transactionReference: String + ): OrderMarkAsPaid + + """ + Refund an order. + """ + orderRefund( + """ + Amount of money to refund. + """ + amount: PositiveDecimal! + + """ + ID of the order to refund. + """ + id: ID! + ): OrderRefund + + """ + Updates an order. + """ + orderUpdate( + """ + ID of an order to update. + """ + id: ID! + + """ + Fields required to update an order. + """ + input: OrderUpdateInput! + ): OrderUpdate + + """ + Updates a shipping method of the order. + """ + orderUpdateShipping( + """ + ID of the order to update a shipping method. + """ + order: ID! + + """ + Fields required to change shipping method of the order. + """ + input: OrderUpdateShippingInput + ): OrderUpdateShipping + + """ + Void an order. + """ + orderVoid( + """ + ID of the order to void. + """ + id: ID! + ): OrderVoid + + """ + Cancels orders. + """ + orderBulkCancel( + """ + List of orders IDs to cancel. + """ + ids: [ID]! + ): OrderBulkCancel + + """ + Delete metadata of an object. + """ + deleteMetadata( + """ + ID of an object to update. + """ + id: ID! + + """ + Metadata keys to delete. + """ + keys: [String!]! + ): DeleteMetadata + + """ + Delete object's private metadata. + """ + deletePrivateMetadata( + """ + ID of an object to update. + """ + id: ID! + + """ + Metadata keys to delete. + """ + keys: [String!]! + ): DeletePrivateMetadata + + """ + Updates metadata of an object. + """ + updateMetadata( + """ + ID of an object to update. + """ + id: ID! + + """ + Fields required to update the object's metadata. + """ + input: [MetadataInput!]! + ): UpdateMetadata + + """ + Updates private metadata of an object. + """ + updatePrivateMetadata( + """ + ID of an object to update. + """ + id: ID! + + """ + Fields required to update the object's metadata. + """ + input: [MetadataInput!]! + ): UpdatePrivateMetadata + + """ + Assigns storefront's navigation menus. + """ + assignNavigation( + """ + ID of the menu. + """ + menu: ID + + """ + Type of the navigation bar to assign the menu to. + """ + navigationType: NavigationType! + ): AssignNavigation + + """ + Creates a new Menu. + """ + menuCreate( + """ + Fields required to create a menu. + """ + input: MenuCreateInput! + ): MenuCreate + + """ + Deletes a menu. + """ + menuDelete( + """ + ID of a menu to delete. + """ + id: ID! + ): MenuDelete + + """ + Deletes menus. + """ + menuBulkDelete( + """ + List of menu IDs to delete. + """ + ids: [ID]! + ): MenuBulkDelete + + """ + Updates a menu. + """ + menuUpdate( + """ + ID of a menu to update. + """ + id: ID! + + """ + Fields required to update a menu. + """ + input: MenuInput! + ): MenuUpdate + + """ + Creates a new menu item. + """ + menuItemCreate( + """ + Fields required to update a menu item. Only one of `url`, `category`, `page`, `collection` is allowed per item. + """ + input: MenuItemCreateInput! + ): MenuItemCreate + + """ + Deletes a menu item. + """ + menuItemDelete( + """ + ID of a menu item to delete. + """ + id: ID! + ): MenuItemDelete + + """ + Deletes menu items. + """ + menuItemBulkDelete( + """ + List of menu item IDs to delete. + """ + ids: [ID]! + ): MenuItemBulkDelete + + """ + Updates a menu item. + """ + menuItemUpdate( + """ + ID of a menu item to update. + """ + id: ID! + + """ + Fields required to update a menu item. Only one of `url`, `category`, `page`, `collection` is allowed per item. + """ + input: MenuItemInput! + ): MenuItemUpdate + + """ + Creates/Updates translations for Menu Item. + """ + menuItemTranslate( + """ + Menu Item ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): MenuItemTranslate + + """ + Moves items of menus. + """ + menuItemMove( + """ + ID of the menu. + """ + menu: ID! + + """ + The menu position data. + """ + moves: [MenuItemMoveInput]! + ): MenuItemMove + + """ + Request an invoice for the order using plugin. + """ + invoiceRequest( + """ + Invoice number, if not provided it will be generated. + """ + number: String + + """ + ID of the order related to invoice. + """ + orderId: ID! + ): InvoiceRequest + + """ + Requests deletion of an invoice. + """ + invoiceRequestDelete( + """ + ID of an invoice to request the deletion. + """ + id: ID! + ): InvoiceRequestDelete + + """ + Creates a ready to send invoice. + """ + invoiceCreate( + """ + Fields required when creating an invoice. + """ + input: InvoiceCreateInput! + + """ + ID of the order related to invoice. + """ + orderId: ID! + ): InvoiceCreate + + """ + Deletes an invoice. + """ + invoiceDelete( + """ + ID of an invoice to delete. + """ + id: ID! + ): InvoiceDelete + + """ + Updates an invoice. + """ + invoiceUpdate( + """ + ID of an invoice to update. + """ + id: ID! + + """ + Fields to use when updating an invoice. + """ + input: UpdateInvoiceInput! + ): InvoiceUpdate + + """ + Send an invoice notification to the customer. + """ + invoiceSendNotification( + """ + ID of an invoice to be sent. + """ + id: ID! + ): InvoiceSendNotification + + """ + Activate a gift card. + """ + giftCardActivate( + """ + ID of a gift card to activate. + """ + id: ID! + ): GiftCardActivate + + """ + Creates a new gift card. + """ + giftCardCreate( + """ + Fields required to create a gift card. + """ + input: GiftCardCreateInput! + ): GiftCardCreate + + """ + Deactivate a gift card. + """ + giftCardDeactivate( + """ + ID of a gift card to deactivate. + """ + id: ID! + ): GiftCardDeactivate + + """ + Update a gift card. + """ + giftCardUpdate( + """ + ID of a gift card to update. + """ + id: ID! + + """ + Fields required to update a gift card. + """ + input: GiftCardUpdateInput! + ): GiftCardUpdate + + """ + Update plugin configuration. + """ + pluginUpdate( + """ + ID of a channel for which the data should be modified. + """ + channel: ID + + """ + ID of plugin to update. + """ + id: ID! + + """ + Fields required to update a plugin configuration. + """ + input: PluginUpdateInput! + ): PluginUpdate + + """ + Creates a new sale. + """ + saleCreate( + """ + Fields required to create a sale. + """ + input: SaleInput! + ): SaleCreate + + """ + Deletes a sale. + """ + saleDelete( + """ + ID of a sale to delete. + """ + id: ID! + ): SaleDelete + + """ + Deletes sales. + """ + saleBulkDelete( + """ + List of sale IDs to delete. + """ + ids: [ID]! + ): SaleBulkDelete + + """ + Updates a sale. + """ + saleUpdate( + """ + ID of a sale to update. + """ + id: ID! + + """ + Fields required to update a sale. + """ + input: SaleInput! + ): SaleUpdate + + """ + Adds products, categories, collections to a voucher. + """ + saleCataloguesAdd( + """ + ID of a sale. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of sale. + """ + input: CatalogueInput! + ): SaleAddCatalogues + + """ + Removes products, categories, collections from a sale. + """ + saleCataloguesRemove( + """ + ID of a sale. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of sale. + """ + input: CatalogueInput! + ): SaleRemoveCatalogues + + """ + Creates/updates translations for a sale. + """ + saleTranslate( + """ + Voucher ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): SaleTranslate + + """ + Manage sale's availability in channels. + """ + saleChannelListingUpdate( + """ + ID of a sale to update. + """ + id: ID! + + """ + Fields required to update sale channel listings. + """ + input: SaleChannelListingInput! + ): SaleChannelListingUpdate + + """ + Creates a new voucher. + """ + voucherCreate( + """ + Fields required to create a voucher. + """ + input: VoucherInput! + ): VoucherCreate + + """ + Deletes a voucher. + """ + voucherDelete( + """ + ID of a voucher to delete. + """ + id: ID! + ): VoucherDelete + + """ + Deletes vouchers. + """ + voucherBulkDelete( + """ + List of voucher IDs to delete. + """ + ids: [ID]! + ): VoucherBulkDelete + + """ + Updates a voucher. + """ + voucherUpdate( + """ + ID of a voucher to update. + """ + id: ID! + + """ + Fields required to update a voucher. + """ + input: VoucherInput! + ): VoucherUpdate + + """ + Adds products, categories, collections to a voucher. + """ + voucherCataloguesAdd( + """ + ID of a voucher. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of voucher. + """ + input: CatalogueInput! + ): VoucherAddCatalogues + + """ + Removes products, categories, collections from a voucher. + """ + voucherCataloguesRemove( + """ + ID of a voucher. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of voucher. + """ + input: CatalogueInput! + ): VoucherRemoveCatalogues + + """ + Creates/Updates translations for Voucher. + """ + voucherTranslate( + """ + Voucher ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): VoucherTranslate + + """ + Manage voucher's availability in channels. + """ + voucherChannelListingUpdate( + """ + ID of a voucher to update. + """ + id: ID! + + """ + Fields required to update voucher channel listings. + """ + input: VoucherChannelListingInput! + ): VoucherChannelListingUpdate + + """ + Export products to csv file. + """ + exportProducts( + """ + Fields required to export product data + """ + input: ExportProductsInput! + ): ExportProducts + + """ + Upload a file. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec + """ + fileUpload( + """ + Represents a file in a multipart request. + """ + file: Upload! + ): FileUpload + + """ + Adds a gift card or a voucher to a checkout. + """ + checkoutAddPromoCode( + """ + Checkout ID. + """ + checkoutId: ID! + + """ + Gift card code or voucher code. + """ + promoCode: String! + ): CheckoutAddPromoCode + + """ + Update billing address in the existing checkout. + """ + checkoutBillingAddressUpdate( + """ + The billing address of the checkout. + """ + billingAddress: AddressInput! + + """ + ID of the checkout. + """ + checkoutId: ID! + ): CheckoutBillingAddressUpdate + + """ + Completes the checkout. As a result a new order is created and a payment charge is made. This action requires a successful payment before it can be performed. In case additional confirmation step as 3D secure is required confirmationNeeded flag will be set to True and no order created until payment is confirmed with second call of this mutation. + """ + checkoutComplete( + """ + Checkout ID. + """ + checkoutId: ID! + + """ + Client-side generated data required to finalize the payment. + """ + paymentData: JSONString + + """ + URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. + """ + redirectUrl: String + + """ + Determines whether to store the payment source for future usage. + """ + storeSource: Boolean = false + ): CheckoutComplete + + """ + Create a new checkout. + """ + checkoutCreate( + """ + Fields required to create checkout. + """ + input: CheckoutCreateInput! + ): CheckoutCreate + + """ + Sets the customer as the owner of the checkout. + """ + checkoutCustomerAttach( + """ + ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCustomerAttach + + """ + Removes the user assigned as the owner of the checkout. + """ + checkoutCustomerDetach( + """ + Checkout ID. + """ + checkoutId: ID! + ): CheckoutCustomerDetach + + """ + Updates email address in the existing checkout object. + """ + checkoutEmailUpdate( + """ + Checkout ID. + """ + checkoutId: ID + + """ + email. + """ + email: String! + ): CheckoutEmailUpdate + + """ + Deletes a CheckoutLine. + """ + checkoutLineDelete( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + ID of the checkout line to delete. + """ + lineId: ID + ): CheckoutLineDelete + + """ + Adds a checkout line to the existing checkout. + """ + checkoutLinesAdd( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLineInput]! + ): CheckoutLinesAdd + + """ + Updates checkout line in the existing checkout. + """ + checkoutLinesUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLineInput]! + ): CheckoutLinesUpdate + + """ + Remove a gift card or a voucher from a checkout. + """ + checkoutRemovePromoCode( + """ + Checkout ID. + """ + checkoutId: ID! + + """ + Gift card code or voucher code. + """ + promoCode: String! + ): CheckoutRemovePromoCode + + """ + Create a new payment for given checkout. + """ + checkoutPaymentCreate( + """ + Checkout ID. + """ + checkoutId: ID! + + """ + Data required to create a new payment. + """ + input: PaymentInput! + ): CheckoutPaymentCreate + + """ + Update shipping address in the existing checkout. + """ + checkoutShippingAddressUpdate( + """ + ID of the checkout. + """ + checkoutId: ID! + + """ + The mailing address to where the checkout will be shipped. + """ + shippingAddress: AddressInput! + ): CheckoutShippingAddressUpdate + + """ + Updates the shipping address of the checkout. + """ + checkoutShippingMethodUpdate( + """ + Checkout ID. + """ + checkoutId: ID + + """ + Shipping method. + """ + shippingMethodId: ID! + ): CheckoutShippingMethodUpdate + + """ + Update language code in the existing checkout. + """ + checkoutLanguageCodeUpdate( + """ + ID of the checkout. + """ + checkoutId: ID! + + """ + New language code. + """ + languageCode: LanguageCodeEnum! + ): CheckoutLanguageCodeUpdate + + """ + Creates new channel. + """ + channelCreate( + """ + Fields required to create channel. + """ + input: ChannelCreateInput! + ): ChannelCreate + + """ + Update a channel. + """ + channelUpdate( + """ + ID of a channel to update. + """ + id: ID! + + """ + Fields required to update a channel. + """ + input: ChannelUpdateInput! + ): ChannelUpdate + + """ + Delete a channel. Orders associated with the deleted channel will be moved to the target channel. Checkouts, product availability, and pricing will be removed. + """ + channelDelete( + """ + ID of a channel to delete. + """ + id: ID! + + """ + Fields required to delete a channel. + """ + input: ChannelDeleteInput + ): ChannelDelete + + """ + Activate a channel. + """ + channelActivate( + """ + ID of the channel to activate. + """ + id: ID! + ): ChannelActivate + + """ + Deactivate a channel. + """ + channelDeactivate( + """ + ID of the channel to deactivate. + """ + id: ID! + ): ChannelDeactivate + + """ + Creates an attribute. + """ + attributeCreate( + """ + Fields required to create an attribute. + """ + input: AttributeCreateInput! + ): AttributeCreate + + """ + Deletes an attribute. + """ + attributeDelete( + """ + ID of an attribute to delete. + """ + id: ID! + ): AttributeDelete + + """ + Updates attribute. + """ + attributeUpdate( + """ + ID of an attribute to update. + """ + id: ID! + + """ + Fields required to update an attribute. + """ + input: AttributeUpdateInput! + ): AttributeUpdate + + """ + Creates/Updates translations for attribute. + """ + attributeTranslate( + """ + Attribute ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): AttributeTranslate + + """ + Deletes attributes. + """ + attributeBulkDelete( + """ + List of attribute IDs to delete. + """ + ids: [ID]! + ): AttributeBulkDelete + + """ + Deletes values of attributes. + """ + attributeValueBulkDelete( + """ + List of attribute value IDs to delete. + """ + ids: [ID]! + ): AttributeValueBulkDelete + + """ + Creates a value for an attribute. + """ + attributeValueCreate( + """ + Attribute to which value will be assigned. + """ + attribute: ID! + + """ + Fields required to create an AttributeValue. + """ + input: AttributeValueCreateInput! + ): AttributeValueCreate + + """ + Deletes a value of an attribute. + """ + attributeValueDelete( + """ + ID of a value to delete. + """ + id: ID! + ): AttributeValueDelete + + """ + Updates value of an attribute. + """ + attributeValueUpdate( + """ + ID of an AttributeValue to update. + """ + id: ID! + + """ + Fields required to update an AttributeValue. + """ + input: AttributeValueCreateInput! + ): AttributeValueUpdate + + """ + Creates/Updates translations for attribute value. + """ + attributeValueTranslate( + """ + Attribute Value ID. + """ + id: ID! + input: AttributeValueTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): AttributeValueTranslate + + """ + Reorder the values of an attribute. + """ + attributeReorderValues( + """ + ID of an attribute. + """ + attributeId: ID! + + """ + The list of reordering operations for given attribute values. + """ + moves: [ReorderInput]! + ): AttributeReorderValues + + """ + Creates a new app. + """ + appCreate( + """ + Fields required to create a new app. + """ + input: AppInput! + ): AppCreate + + """ + Updates an existing app. + """ + appUpdate( + """ + ID of an app to update. + """ + id: ID! + + """ + Fields required to update an existing app. + """ + input: AppInput! + ): AppUpdate + + """ + Deletes an app. + """ + appDelete( + """ + ID of an app to delete. + """ + id: ID! + ): AppDelete + + """ + Creates a new token. + """ + appTokenCreate( + """ + Fields required to create a new auth token. + """ + input: AppTokenInput! + ): AppTokenCreate + + """ + Deletes an authentication token assigned to app. + """ + appTokenDelete( + """ + ID of an auth token to delete. + """ + id: ID! + ): AppTokenDelete + + """ + Verify provided app token. + """ + appTokenVerify( + """ + App token to verify. + """ + token: String! + ): AppTokenVerify + + """ + Install new app by using app manifest. + """ + appInstall( + """ + Fields required to install a new app. + """ + input: AppInstallInput! + ): AppInstall + + """ + Retry failed installation of new app. + """ + appRetryInstall( + """ + Determine if app will be set active or not. + """ + activateAfterInstallation: Boolean = true + + """ + ID of failed installation. + """ + id: ID! + ): AppRetryInstall + + """ + Delete failed installation. + """ + appDeleteFailedInstallation( + """ + ID of failed installation to delete. + """ + id: ID! + ): AppDeleteFailedInstallation + + """ + Fetch and validate manifest. + """ + appFetchManifest(manifestUrl: String!): AppFetchManifest + + """ + Activate the app. + """ + appActivate( + """ + ID of app to activate. + """ + id: ID! + ): AppActivate + + """ + Deactivate the app. + """ + appDeactivate( + """ + ID of app to deactivate. + """ + id: ID! + ): AppDeactivate + + """ + Create JWT token. + """ + tokenCreate( + """ + Email of a user. + """ + email: String! + + """ + Password of a user. + """ + password: String! + ): CreateToken + + """ + Refresh JWT token. Mutation tries to take refreshToken from the input.If it fails it will try to take refreshToken from the http-only cookie -refreshToken. csrfToken is required when refreshToken is provided as a cookie. + """ + tokenRefresh( + """ + CSRF token required to refresh token. This argument is required when refreshToken is provided as a cookie. + """ + csrfToken: String + + """ + Refresh token. + """ + refreshToken: String + ): RefreshToken + + """ + Verify JWT token. + """ + tokenVerify( + """ + JWT token to validate. + """ + token: String! + ): VerifyToken + + """ + Deactivate all JWT tokens of the currently authenticated user. + """ + tokensDeactivateAll: DeactivateAllUserTokens + + """ + Prepare external authentication url for user by custom plugin. + """ + externalAuthenticationUrl( + """ + The data required by plugin to create external authentication url. + """ + input: JSONString! + + """ + The ID of the authentication plugin. + """ + pluginId: String! + ): ExternalAuthenticationUrl + + """ + Obtain external access tokens for user by custom plugin. + """ + externalObtainAccessTokens( + """ + The data required by plugin to create authentication data. + """ + input: JSONString! + + """ + The ID of the authentication plugin. + """ + pluginId: String! + ): ExternalObtainAccessTokens + + """ + Refresh user's access by custom plugin. + """ + externalRefresh( + """ + The data required by plugin to proceed the refresh process. + """ + input: JSONString! + + """ + The ID of the authentication plugin. + """ + pluginId: String! + ): ExternalRefresh + + """ + Logout user by custom plugin. + """ + externalLogout( + """ + The data required by plugin to proceed the logout process. + """ + input: JSONString! + + """ + The ID of the authentication plugin. + """ + pluginId: String! + ): ExternalLogout + + """ + Verify external authentication data by plugin. + """ + externalVerify( + """ + The data required by plugin to proceed the verification. + """ + input: JSONString! + + """ + The ID of the authentication plugin. + """ + pluginId: String! + ): ExternalVerify + + """ + Sends an email with the account password modification link. + """ + requestPasswordReset( + """ + Slug of a channel which will be used for notify user. Optional when only one channel exists. + """ + channel: String + + """ + Email of the user that will be used for password recovery. + """ + email: String! + + """ + URL of a view where users should be redirected to reset the password. URL in RFC 1808 format. + """ + redirectUrl: String! + ): RequestPasswordReset + + """ + Confirm user account with token sent by email during registration. + """ + confirmAccount( + """ + E-mail of the user performing account confirmation. + """ + email: String! + + """ + A one-time token required to confirm the account. + """ + token: String! + ): ConfirmAccount + + """ + Sets the user's password from the token sent by email using the RequestPasswordReset mutation. + """ + setPassword( + """ + Email of a user. + """ + email: String! + + """ + Password of a user. + """ + password: String! + + """ + A one-time token required to set the password. + """ + token: String! + ): SetPassword + + """ + Change the password of the logged in user. + """ + passwordChange( + """ + New user password. + """ + newPassword: String! + + """ + Current user password. + """ + oldPassword: String! + ): PasswordChange + + """ + Request email change of the logged in user. + """ + requestEmailChange( + """ + Slug of a channel which will be used to notify users. Optional when only one channel exists. + """ + channel: String + + """ + New user email. + """ + newEmail: String! + + """ + User password. + """ + password: String! + + """ + URL of a view where users should be redirected to update the email address. URL in RFC 1808 format. + """ + redirectUrl: String! + ): RequestEmailChange + + """ + Confirm the email change of the logged-in user. + """ + confirmEmailChange( + """ + Slug of a channel which will be used to notify users. Optional when only one channel exists. + """ + channel: String + + """ + A one-time token required to change the email. + """ + token: String! + ): ConfirmEmailChange + + """ + Create a new address for the customer. + """ + accountAddressCreate( + """ + Fields required to create address. + """ + input: AddressInput! + + """ + A type of address. If provided, the new address will be automatically assigned as the customer's default address of that type. + """ + type: AddressTypeEnum + ): AccountAddressCreate + + """ + Updates an address of the logged-in user. + """ + accountAddressUpdate( + """ + ID of the address to update. + """ + id: ID! + + """ + Fields required to update the address. + """ + input: AddressInput! + ): AccountAddressUpdate + + """ + Delete an address of the logged-in user. + """ + accountAddressDelete( + """ + ID of the address to delete. + """ + id: ID! + ): AccountAddressDelete + + """ + Sets a default address for the authenticated user. + """ + accountSetDefaultAddress( + """ + ID of the address to set as default. + """ + id: ID! + + """ + The type of address. + """ + type: AddressTypeEnum! + ): AccountSetDefaultAddress + + """ + Register a new user. + """ + accountRegister( + """ + Fields required to create a user. + """ + input: AccountRegisterInput! + ): AccountRegister + + """ + Updates the account of the logged-in user. + """ + accountUpdate( + """ + Fields required to update the account of the logged-in user. + """ + input: AccountInput! + ): AccountUpdate + + """ + Sends an email with the account removal link for the logged-in user. + """ + accountRequestDeletion( + """ + Slug of a channel which will be used to notify users. Optional when only one channel exists. + """ + channel: String + + """ + URL of a view where users should be redirected to delete their account. URL in RFC 1808 format. + """ + redirectUrl: String! + ): AccountRequestDeletion + + """ + Remove user account. + """ + accountDelete( + """ + A one-time token required to remove account. Sent by email using AccountRequestDeletion mutation. + """ + token: String! + ): AccountDelete + + """ + Creates user address. + """ + addressCreate( + """ + Fields required to create address. + """ + input: AddressInput! + + """ + ID of a user to create address for. + """ + userId: ID! + ): AddressCreate + + """ + Updates an address. + """ + addressUpdate( + """ + ID of the address to update. + """ + id: ID! + + """ + Fields required to update the address. + """ + input: AddressInput! + ): AddressUpdate + + """ + Deletes an address. + """ + addressDelete( + """ + ID of the address to delete. + """ + id: ID! + ): AddressDelete + + """ + Sets a default address for the given user. + """ + addressSetDefault( + """ + ID of the address. + """ + addressId: ID! + + """ + The type of address. + """ + type: AddressTypeEnum! + + """ + ID of the user to change the address for. + """ + userId: ID! + ): AddressSetDefault + + """ + Creates a new customer. + """ + customerCreate( + """ + Fields required to create a customer. + """ + input: UserCreateInput! + ): CustomerCreate + + """ + Updates an existing customer. + """ + customerUpdate( + """ + ID of a customer to update. + """ + id: ID! + + """ + Fields required to update a customer. + """ + input: CustomerInput! + ): CustomerUpdate + + """ + Deletes a customer. + """ + customerDelete( + """ + ID of a customer to delete. + """ + id: ID! + ): CustomerDelete + + """ + Deletes customers. + """ + customerBulkDelete( + """ + List of user IDs to delete. + """ + ids: [ID]! + ): CustomerBulkDelete + + """ + Creates a new staff user. + """ + staffCreate( + """ + Fields required to create a staff user. + """ + input: StaffCreateInput! + ): StaffCreate + + """ + Updates an existing staff user. + """ + staffUpdate( + """ + ID of a staff user to update. + """ + id: ID! + + """ + Fields required to update a staff user. + """ + input: StaffUpdateInput! + ): StaffUpdate + + """ + Deletes a staff user. + """ + staffDelete( + """ + ID of a staff user to delete. + """ + id: ID! + ): StaffDelete + + """ + Deletes staff users. + """ + staffBulkDelete( + """ + List of user IDs to delete. + """ + ids: [ID]! + ): StaffBulkDelete + + """ + Create a user avatar. Only for staff members. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec + """ + userAvatarUpdate( + """ + Represents an image file in a multipart request. + """ + image: Upload! + ): UserAvatarUpdate + + """ + Deletes a user avatar. Only for staff members. + """ + userAvatarDelete: UserAvatarDelete + + """ + Activate or deactivate users. + """ + userBulkSetActive( + """ + List of user IDs to (de)activate). + """ + ids: [ID]! + + """ + Determine if users will be set active or not. + """ + isActive: Boolean! + ): UserBulkSetActive + + """ + Create new permission group. + """ + permissionGroupCreate( + """ + Input fields to create permission group. + """ + input: PermissionGroupCreateInput! + ): PermissionGroupCreate + + """ + Update permission group. + """ + permissionGroupUpdate( + """ + ID of the group to update. + """ + id: ID! + + """ + Input fields to create permission group. + """ + input: PermissionGroupUpdateInput! + ): PermissionGroupUpdate + + """ + Delete permission group. + """ + permissionGroupDelete( + """ + ID of the group to delete. + """ + id: ID! + ): PermissionGroupDelete +} + +input NameTranslationInput { + name: String +} + +enum NavigationType { + """ + Main storefront navigation. + """ + MAIN + + """ + Secondary storefront navigation. + """ + SECONDARY +} + +""" +An object with an ID +""" +interface Node { + """ + The ID of the object. + """ + id: ID! +} + +interface ObjectWithMetadata { + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! +} + +""" +Represents an order in the shop. +""" +type Order implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + created: DateTime! + status: OrderStatus! + user: User + trackingClientId: String! + billingAddress: Address + shippingAddress: Address + shippingMethod: ShippingMethod + shippingMethodName: String + channel: Channel! + + """ + Total price of shipping. + """ + shippingPrice: TaxedMoney! + shippingTaxRate: Float! + token: String! + voucher: Voucher + + """ + List of user gift cards. + """ + giftCards: [GiftCard] + displayGrossPrices: Boolean! + customerNote: String! + weight: Weight + redirectUrl: String + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + List of shipments for the order. + """ + fulfillments: [Fulfillment]! + + """ + List of order lines. + """ + lines: [OrderLine]! + + """ + List of actions that can be performed in the current state of an order. + """ + actions: [OrderAction]! + + """ + Shipping methods that can be used with this order. + """ + availableShippingMethods: [ShippingMethod] + + """ + List of order invoices. + """ + invoices: [Invoice] + + """ + User-friendly number of an order. + """ + number: String + + """ + The ID of the order that was the base for this order. + """ + original: ID + + """ + The order origin. + """ + origin: OrderOriginEnum! + + """ + Informs if an order is fully paid. + """ + isPaid: Boolean! + + """ + Internal payment status. + """ + paymentStatus: PaymentChargeStatusEnum! + + """ + User-friendly payment status. + """ + paymentStatusDisplay: String! + + """ + List of payments for the order. + """ + payments: [Payment] + + """ + Total amount of the order. + """ + total: TaxedMoney! + + """ + Undiscounted total amount of the order. + """ + undiscountedTotal: TaxedMoney! + + """ + The sum of line prices not including shipping. + """ + subtotal: TaxedMoney! + + """ + User-friendly order status. + """ + statusDisplay: String + + """ + Informs whether a draft order can be finalized(turned into a regular order). + """ + canFinalize: Boolean! + + """ + Amount authorized for the order. + """ + totalAuthorized: Money! + + """ + Amount captured by payment. + """ + totalCaptured: Money! + + """ + List of events associated with the order. + """ + events: [OrderEvent] + + """ + The difference between the paid and the order total amount. + """ + totalBalance: Money! + + """ + Email address of the customer. + """ + userEmail: String + + """ + Returns True, if order requires shipping. + """ + isShippingRequired: Boolean! + languageCode: String! + @deprecated( + reason: "Use the `languageCodeEnum` field to fetch the language code. This field will be removed in Saleor 4.0." + ) + + """ + Order language code. + """ + languageCodeEnum: LanguageCodeEnum! + + """ + Returns applied discount. + """ + discount: Money @deprecated(reason: "Use discounts field. This field will be removed in Saleor 4.0.") + + """ + Discount name. + """ + discountName: String @deprecated(reason: "Use discounts field. This field will be removed in Saleor 4.0.") + + """ + Translated discount name. + """ + translatedDiscountName: String @deprecated(reason: "Use discounts field. This field will be removed in Saleor 4.0.") + + """ + List of all discounts assigned to the order. + """ + discounts: [OrderDiscount!] +} + +enum OrderAction { + """ + Represents the capture action. + """ + CAPTURE + + """ + Represents a mark-as-paid action. + """ + MARK_AS_PAID + + """ + Represents a refund action. + """ + REFUND + + """ + Represents a void action. + """ + VOID +} + +""" +Adds note to the order. +""" +type OrderAddNote { + """ + Order with the note added. + """ + order: Order + + """ + Order note created. + """ + event: OrderEvent + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderAddNoteInput { + """ + Note message. + """ + message: String! +} + +""" +Cancels orders. +""" +type OrderBulkCancel { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Cancel an order. +""" +type OrderCancel { + """ + Canceled order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Capture an order. +""" +type OrderCapture { + """ + Captured order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Confirms an unconfirmed order by changing status to unfulfilled. +""" +type OrderConfirm { + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +type OrderCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [OrderCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type OrderCountableEdge { + """ + The item at the end of the edge. + """ + node: Order! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +enum OrderDirection { + """ + Specifies an ascending sort order. + """ + ASC + + """ + Specifies a descending sort order. + """ + DESC +} + +""" +Contains all details related to the applied discount to the order. +""" +type OrderDiscount implements Node { + """ + The ID of the object. + """ + id: ID! + type: OrderDiscountType! + + """ + Type of the discount: fixed or percent + """ + valueType: DiscountValueTypeEnum! + + """ + Value of the discount. Can store fixed value or percent value + """ + value: PositiveDecimal! + name: String + translatedName: String + + """ + Explanation for the applied discount. + """ + reason: String + + """ + Returns amount of discount. + """ + amount: Money! +} + +""" +Adds discount to the order. +""" +type OrderDiscountAdd { + """ + Order which has been discounted. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderDiscountCommonInput { + """ + Type of the discount: fixed or percent + """ + valueType: DiscountValueTypeEnum! + + """ + Value of the discount. Can store fixed value or percent value + """ + value: PositiveDecimal! + + """ + Explanation for the applied discount. + """ + reason: String +} + +""" +Remove discount from the order. +""" +type OrderDiscountDelete { + """ + Order which has removed discount. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +An enumeration. +""" +enum OrderDiscountType { + """ + Voucher + """ + VOUCHER + + """ + Manual + """ + MANUAL +} + +""" +Update discount for the order. +""" +type OrderDiscountUpdate { + """ + Order which has been discounted. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderDraftFilterInput { + customer: String + created: DateRangeInput + search: String + metadata: [MetadataInput] + channels: [ID] +} + +type OrderError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: OrderErrorCode! + + """ + Warehouse ID which causes the error. + """ + warehouse: ID + + """ + Order line ID which causes the error. + """ + orderLine: ID + + """ + List of product variants that are associated with the error + """ + variants: [ID!] + + """ + A type of address that causes the error. + """ + addressType: AddressTypeEnum +} + +""" +An enumeration. +""" +enum OrderErrorCode { + BILLING_ADDRESS_NOT_SET + CANNOT_CANCEL_FULFILLMENT + CANNOT_CANCEL_ORDER + CANNOT_DELETE + CANNOT_DISCOUNT + CANNOT_REFUND + CAPTURE_INACTIVE_PAYMENT + NOT_EDITABLE + FULFILL_ORDER_LINE + GRAPHQL_ERROR + INVALID + PRODUCT_NOT_PUBLISHED + PRODUCT_UNAVAILABLE_FOR_PURCHASE + NOT_FOUND + ORDER_NO_SHIPPING_ADDRESS + PAYMENT_ERROR + PAYMENT_MISSING + REQUIRED + SHIPPING_METHOD_NOT_APPLICABLE + SHIPPING_METHOD_REQUIRED + TAX_ERROR + UNIQUE + VOID_INACTIVE_PAYMENT + ZERO_QUANTITY + INVALID_QUANTITY + INSUFFICIENT_STOCK + DUPLICATED_INPUT_ITEM + NOT_AVAILABLE_IN_CHANNEL + CHANNEL_INACTIVE +} + +""" +History log of the order. +""" +type OrderEvent implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Date when event happened at in ISO 8601 format. + """ + date: DateTime + + """ + Order event type. + """ + type: OrderEventsEnum + + """ + User who performed the action. + """ + user: User + + """ + Content of the event. + """ + message: String + + """ + Email of the customer. + """ + email: String + + """ + Type of an email sent to the customer. + """ + emailType: OrderEventsEmailsEnum + + """ + Amount of money. + """ + amount: Float + + """ + The payment ID from the payment gateway. + """ + paymentId: String + + """ + The payment gateway of the payment. + """ + paymentGateway: String + + """ + Number of items. + """ + quantity: Int + + """ + Composed ID of the Fulfillment. + """ + composedId: String + + """ + User-friendly number of an order. + """ + orderNumber: String + + """ + Number of an invoice related to the order. + """ + invoiceNumber: String + + """ + List of oversold lines names. + """ + oversoldItems: [String] + + """ + The concerned lines. + """ + lines: [OrderEventOrderLineObject] + + """ + The lines fulfilled. + """ + fulfilledItems: [FulfillmentLine] + + """ + The warehouse were items were restocked. + """ + warehouse: Warehouse + + """ + The transaction reference of captured payment. + """ + transactionReference: String + + """ + Define if shipping costs were included to the refund. + """ + shippingCostsIncluded: Boolean + + """ + The order which is related to this order. + """ + relatedOrder: Order + + """ + The discount applied to the order. + """ + discount: OrderEventDiscountObject +} + +type OrderEventCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [OrderEventCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type OrderEventCountableEdge { + """ + The item at the end of the edge. + """ + node: OrderEvent! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +type OrderEventDiscountObject { + """ + Type of the discount: fixed or percent. + """ + valueType: DiscountValueTypeEnum! + + """ + Value of the discount. Can store fixed value or percent value. + """ + value: PositiveDecimal! + + """ + Explanation for the applied discount. + """ + reason: String + + """ + Returns amount of discount. + """ + amount: Money + + """ + Type of the discount: fixed or percent. + """ + oldValueType: DiscountValueTypeEnum + + """ + Value of the discount. Can store fixed value or percent value. + """ + oldValue: PositiveDecimal + + """ + Returns amount of discount. + """ + oldAmount: Money +} + +type OrderEventOrderLineObject { + """ + The variant quantity. + """ + quantity: Int + + """ + The order line. + """ + orderLine: OrderLine + + """ + The variant name. + """ + itemName: String + + """ + The discount applied to the order line. + """ + discount: OrderEventDiscountObject +} + +""" +An enumeration. +""" +enum OrderEventsEmailsEnum { + PAYMENT_CONFIRMATION + CONFIRMED + SHIPPING_CONFIRMATION + TRACKING_UPDATED + ORDER_CONFIRMATION + ORDER_CANCEL + ORDER_REFUND + FULFILLMENT_CONFIRMATION + DIGITAL_LINKS +} + +""" +An enumeration. +""" +enum OrderEventsEnum { + DRAFT_CREATED + DRAFT_CREATED_FROM_REPLACE + ADDED_PRODUCTS + REMOVED_PRODUCTS + PLACED + PLACED_FROM_DRAFT + OVERSOLD_ITEMS + CANCELED + ORDER_MARKED_AS_PAID + ORDER_FULLY_PAID + ORDER_REPLACEMENT_CREATED + ORDER_DISCOUNT_ADDED + ORDER_DISCOUNT_AUTOMATICALLY_UPDATED + ORDER_DISCOUNT_UPDATED + ORDER_DISCOUNT_DELETED + ORDER_LINE_DISCOUNT_UPDATED + ORDER_LINE_DISCOUNT_REMOVED + UPDATED_ADDRESS + EMAIL_SENT + CONFIRMED + PAYMENT_AUTHORIZED + PAYMENT_CAPTURED + EXTERNAL_SERVICE_NOTIFICATION + PAYMENT_REFUNDED + PAYMENT_VOIDED + PAYMENT_FAILED + INVOICE_REQUESTED + INVOICE_GENERATED + INVOICE_UPDATED + INVOICE_SENT + FULFILLMENT_CANCELED + FULFILLMENT_RESTOCKED_ITEMS + FULFILLMENT_FULFILLED_ITEMS + FULFILLMENT_REFUNDED + FULFILLMENT_RETURNED + FULFILLMENT_REPLACED + TRACKING_UPDATED + NOTE_ADDED + OTHER +} + +input OrderFilterInput { + paymentStatus: [PaymentChargeStatusEnum] + status: [OrderStatusFilter] + customer: String + created: DateRangeInput + search: String + metadata: [MetadataInput] + channels: [ID] +} + +""" +Creates new fulfillments for an order. +""" +type OrderFulfill { + """ + List of created fulfillments. + """ + fulfillments: [Fulfillment] + + """ + Fulfilled order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderFulfillInput { + """ + List of items informing how to fulfill the order. + """ + lines: [OrderFulfillLineInput!]! + + """ + If true, send an email notification to the customer. + """ + notifyCustomer: Boolean +} + +input OrderFulfillLineInput { + """ + The ID of the order line. + """ + orderLineId: ID + + """ + List of stock items to create. + """ + stocks: [OrderFulfillStockInput!]! +} + +input OrderFulfillStockInput { + """ + The number of line items to be fulfilled from given warehouse. + """ + quantity: Int! + + """ + ID of the warehouse from which the item will be fulfilled. + """ + warehouse: ID! +} + +""" +Represents order line of particular order. +""" +type OrderLine implements Node { + """ + The ID of the object. + """ + id: ID! + productName: String! + variantName: String! + productSku: String! + isShippingRequired: Boolean! + quantity: Int! + quantityFulfilled: Int! + unitDiscountReason: String + taxRate: Float! + digitalContentUrl: DigitalContentUrl + + """ + The main thumbnail for the ordered product. + """ + thumbnail( + """ + Size of thumbnail. + """ + size: Int + ): Image + + """ + Price of the single item in the order line. + """ + unitPrice: TaxedMoney! + + """ + Price of the single item in the order line without applied an order line discount. + """ + undiscountedUnitPrice: TaxedMoney! + + """ + The discount applied to the single order line. + """ + unitDiscount: Money! + + """ + Value of the discount. Can store fixed value or percent value + """ + unitDiscountValue: PositiveDecimal! + + """ + Price of the order line. + """ + totalPrice: TaxedMoney! + + """ + A purchased product variant. Note: this field may be null if the variant has been removed from stock at all. + """ + variant: ProductVariant + + """ + Product name in the customer's language + """ + translatedProductName: String! + + """ + Variant name in the customer's language + """ + translatedVariantName: String! + + """ + List of allocations across warehouses. + """ + allocations: [Allocation!] + + """ + Type of the discount: fixed or percent + """ + unitDiscountType: DiscountValueTypeEnum +} + +input OrderLineCreateInput { + """ + Number of variant items ordered. + """ + quantity: Int! + + """ + Product variant ID. + """ + variantId: ID! +} + +""" +Deletes an order line from an order. +""" +type OrderLineDelete { + """ + A related order. + """ + order: Order + + """ + An order line that was deleted. + """ + orderLine: OrderLine + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Remove discount applied to the order line. +""" +type OrderLineDiscountRemove { + """ + Order line which has removed discount. + """ + orderLine: OrderLine + + """ + Order which is related to line which has removed discount. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Update discount for the order line. +""" +type OrderLineDiscountUpdate { + """ + Order line which has been discounted. + """ + orderLine: OrderLine + + """ + Order which is related to the discounted line. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderLineInput { + """ + Number of variant items ordered. + """ + quantity: Int! +} + +""" +Updates an order line of an order. +""" +type OrderLineUpdate { + """ + Related order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! + orderLine: OrderLine +} + +""" +Create order lines for an order. +""" +type OrderLinesCreate { + """ + Related order. + """ + order: Order + + """ + List of added order lines. + """ + orderLines: [OrderLine!] + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +Mark order as manually paid. +""" +type OrderMarkAsPaid { + """ + Order marked as paid. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +An enumeration. +""" +enum OrderOriginEnum { + CHECKOUT + DRAFT + REISSUE +} + +""" +Refund an order. +""" +type OrderRefund { + """ + A refunded order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderRefundFulfillmentLineInput { + """ + The ID of the fulfillment line to refund. + """ + fulfillmentLineId: ID! + + """ + The number of items to be refunded. + """ + quantity: Int! +} + +input OrderRefundLineInput { + """ + The ID of the order line to refund. + """ + orderLineId: ID! + + """ + The number of items to be refunded. + """ + quantity: Int! +} + +input OrderRefundProductsInput { + """ + List of unfulfilled lines to refund. + """ + orderLines: [OrderRefundLineInput!] + + """ + List of fulfilled lines to refund. + """ + fulfillmentLines: [OrderRefundFulfillmentLineInput!] + + """ + The total amount of refund when the value is provided manually. + """ + amountToRefund: PositiveDecimal + + """ + If true, Saleor will refund shipping costs. If amountToRefund is providedincludeShippingCosts will be ignored. + """ + includeShippingCosts: Boolean = false +} + +input OrderReturnFulfillmentLineInput { + """ + The ID of the fulfillment line to return. + """ + fulfillmentLineId: ID! + + """ + The number of items to be returned. + """ + quantity: Int! + + """ + Determines, if the line should be added to replace order. + """ + replace: Boolean = false +} + +input OrderReturnLineInput { + """ + The ID of the order line to return. + """ + orderLineId: ID! + + """ + The number of items to be returned. + """ + quantity: Int! + + """ + Determines, if the line should be added to replace order. + """ + replace: Boolean = false +} + +input OrderReturnProductsInput { + """ + List of unfulfilled lines to return. + """ + orderLines: [OrderReturnLineInput!] + + """ + List of fulfilled lines to return. + """ + fulfillmentLines: [OrderReturnFulfillmentLineInput!] + + """ + The total amount of refund when the value is provided manually. + """ + amountToRefund: PositiveDecimal + + """ + If true, Saleor will refund shipping costs. If amountToRefund is providedincludeShippingCosts will be ignored. + """ + includeShippingCosts: Boolean = false + + """ + If true, Saleor will call refund action for all lines. + """ + refund: Boolean = false +} + +""" +Order related settings from site settings. +""" +type OrderSettings { + automaticallyConfirmAllNewOrders: Boolean! +} + +type OrderSettingsError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: OrderSettingsErrorCode! +} + +""" +An enumeration. +""" +enum OrderSettingsErrorCode { + INVALID +} + +""" +Update shop order settings. +""" +type OrderSettingsUpdate { + """ + Order settings. + """ + orderSettings: OrderSettings + orderSettingsErrors: [OrderSettingsError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderSettingsError!]! +} + +input OrderSettingsUpdateInput { + """ + When disabled, all new orders from checkout will be marked as unconfirmed. When enabled orders from checkout will become unfulfilled immediately. + """ + automaticallyConfirmAllNewOrders: Boolean! +} + +enum OrderSortField { + """ + Sort orders by number. + """ + NUMBER + + """ + Sort orders by creation date. + """ + CREATION_DATE + + """ + Sort orders by customer. + """ + CUSTOMER + + """ + Sort orders by payment. + """ + PAYMENT + + """ + Sort orders by fulfillment status. + """ + FULFILLMENT_STATUS +} + +input OrderSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort orders by the selected field. + """ + field: OrderSortField! +} + +""" +An enumeration. +""" +enum OrderStatus { + """ + Draft + """ + DRAFT + + """ + Unconfirmed + """ + UNCONFIRMED + + """ + Unfulfilled + """ + UNFULFILLED + + """ + Partially fulfilled + """ + PARTIALLY_FULFILLED + + """ + Partially returned + """ + PARTIALLY_RETURNED + + """ + Returned + """ + RETURNED + + """ + Fulfilled + """ + FULFILLED + + """ + Canceled + """ + CANCELED +} + +enum OrderStatusFilter { + READY_TO_FULFILL + READY_TO_CAPTURE + UNFULFILLED + UNCONFIRMED + PARTIALLY_FULFILLED + FULFILLED + CANCELED +} + +""" +Updates an order. +""" +type OrderUpdate { + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! + order: Order +} + +input OrderUpdateInput { + """ + Billing address of the customer. + """ + billingAddress: AddressInput + + """ + Email address of the customer. + """ + userEmail: String + + """ + Shipping address of the customer. + """ + shippingAddress: AddressInput +} + +""" +Updates a shipping method of the order. +""" +type OrderUpdateShipping { + """ + Order with updated shipping method. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +input OrderUpdateShippingInput { + """ + ID of the selected shipping method. + """ + shippingMethod: ID +} + +""" +Void an order. +""" +type OrderVoid { + """ + A voided order. + """ + order: Order + orderErrors: [OrderError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [OrderError!]! +} + +""" +A static page that can be manually added by a shop operator through the dashboard. +""" +type Page implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + title: String! + content: JSONString + publicationDate: Date + isPublished: Boolean! + slug: String! + pageType: PageType! + created: DateTime! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Content of the page (JSON). + """ + contentJson: JSONString! @deprecated(reason: "Will be removed in Saleor 4.0. Use the `content` field instead.") + + """ + Returns translated page fields for the given language code. + """ + translation( + """ + A language code to return the translation for page. + """ + languageCode: LanguageCodeEnum! + ): PageTranslation + + """ + List of attributes assigned to this product. + """ + attributes: [SelectedAttribute!]! +} + +""" +Assign attributes to a given page type. +""" +type PageAttributeAssign { + """ + The updated page type. + """ + pageType: PageType + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +""" +Unassign attributes from a given page type. +""" +type PageAttributeUnassign { + """ + The updated page type. + """ + pageType: PageType + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +""" +Deletes pages. +""" +type PageBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +""" +Publish pages. +""" +type PageBulkPublish { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +type PageCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [PageCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type PageCountableEdge { + """ + The item at the end of the edge. + """ + node: Page! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new page. +""" +type PageCreate { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + page: Page +} + +input PageCreateInput { + """ + Page internal name. + """ + slug: String + + """ + Page title. + """ + title: String + + """ + Page content in JSON format. + """ + content: JSONString + + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + Determines if page is visible in the storefront. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + ID of the page type that page belongs to. + """ + pageType: ID! +} + +""" +Deletes a page. +""" +type PageDelete { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + page: Page +} + +type PageError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: PageErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] +} + +""" +An enumeration. +""" +enum PageErrorCode { + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + DUPLICATED_INPUT_ITEM + ATTRIBUTE_ALREADY_ASSIGNED +} + +input PageFilterInput { + search: String + metadata: [MetadataInput] + pageTypes: [ID] +} + +""" +The Relay compliant `PageInfo` type, containing data necessary to paginate this connection. +""" +type PageInfo { + """ + When paginating forwards, are there more items? + """ + hasNextPage: Boolean! + + """ + When paginating backwards, are there more items? + """ + hasPreviousPage: Boolean! + + """ + When paginating backwards, the cursor to continue. + """ + startCursor: String + + """ + When paginating forwards, the cursor to continue. + """ + endCursor: String +} + +input PageInput { + """ + Page internal name. + """ + slug: String + + """ + Page title. + """ + title: String + + """ + Page content in JSON format. + """ + content: JSONString + + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + Determines if page is visible in the storefront. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: String + + """ + Search engine optimization fields. + """ + seo: SeoInput +} + +""" +Reorder page attribute values. +""" +type PageReorderAttributeValues { + """ + Page from which attribute values are reordered. + """ + page: Page + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +enum PageSortField { + """ + Sort pages by title. + """ + TITLE + + """ + Sort pages by slug. + """ + SLUG + + """ + Sort pages by visibility. + """ + VISIBILITY + + """ + Sort pages by creation date. + """ + CREATION_DATE + + """ + Sort pages by publication date. + """ + PUBLICATION_DATE +} + +input PageSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort pages by the selected field. + """ + field: PageSortField! +} + +type PageTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + title: String! + content: JSONString + + """ + Content of the page (JSON). + """ + contentJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `content` field instead.") + + """ + Returns translated page fields for the given language code. + """ + translation( + """ + A language code to return the translation for page. + """ + languageCode: LanguageCodeEnum! + ): PageTranslation + + """ + ('A static page that can be manually added by a shop operator ', 'through the dashboard.') + """ + page: Page +} + +""" +Creates/Updates translations for Page. +""" +type PageTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + page: PageTranslatableContent +} + +type PageTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + title: String! + content: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! + + """ + Translated description of the page (JSON). + """ + contentJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `content` field instead.") +} + +input PageTranslationInput { + seoTitle: String + seoDescription: String + title: String + content: JSONString +} + +""" +Represents a type of page. It defines what attributes are available to pages of this type. +""" +type PageType implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + slug: String! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Page attributes of that page type. + """ + attributes: [Attribute] + + """ + Attributes that can be assigned to the page type. + """ + availableAttributes( + filter: AttributeFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): AttributeCountableConnection + + """ + Whether page type has pages assigned. + """ + hasPages: Boolean +} + +""" +Delete page types. +""" +type PageTypeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +type PageTypeCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [PageTypeCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type PageTypeCountableEdge { + """ + The item at the end of the edge. + """ + node: PageType! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Create a new page type. +""" +type PageTypeCreate { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + pageType: PageType +} + +input PageTypeCreateInput { + """ + Name of the page type. + """ + name: String + + """ + Page type slug. + """ + slug: String + + """ + List of attribute IDs to be assigned to the page type. + """ + addAttributes: [ID!] +} + +""" +Delete a page type. +""" +type PageTypeDelete { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + pageType: PageType +} + +input PageTypeFilterInput { + search: String +} + +""" +Reorder the attributes of a page type. +""" +type PageTypeReorderAttributes { + """ + Page type from which attributes are reordered. + """ + pageType: PageType + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! +} + +enum PageTypeSortField { + """ + Sort page types by name. + """ + NAME + + """ + Sort page types by slug. + """ + SLUG +} + +input PageTypeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort page types by the selected field. + """ + field: PageTypeSortField! +} + +""" +Update page type. +""" +type PageTypeUpdate { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + pageType: PageType +} + +input PageTypeUpdateInput { + """ + Name of the page type. + """ + name: String + + """ + Page type slug. + """ + slug: String + + """ + List of attribute IDs to be assigned to the page type. + """ + addAttributes: [ID!] + + """ + List of attribute IDs to be assigned to the page type. + """ + removeAttributes: [ID!] +} + +""" +Updates an existing page. +""" +type PageUpdate { + pageErrors: [PageError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PageError!]! + page: Page +} + +""" +Change the password of the logged in user. +""" +type PasswordChange { + """ + A user instance with a new password. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Represents a payment of a given type. +""" +type Payment implements Node { + """ + The ID of the object. + """ + id: ID! + gateway: String! + isActive: Boolean! + created: DateTime! + modified: DateTime! + token: String! + checkout: Checkout + order: Order + paymentMethodType: String! + customerIpAddress: String + + """ + Internal payment status. + """ + chargeStatus: PaymentChargeStatusEnum! + + """ + List of actions that can be performed in the current state of a payment. + """ + actions: [OrderAction]! + + """ + Total amount of the payment. + """ + total: Money + + """ + Total amount captured for this payment. + """ + capturedAmount: Money + + """ + List of all transactions within this payment. + """ + transactions: [Transaction] + + """ + Maximum amount of money that can be captured. + """ + availableCaptureAmount: Money + + """ + Maximum amount of money that can be refunded. + """ + availableRefundAmount: Money + + """ + The details of the card used for this payment. + """ + creditCard: CreditCard +} + +""" +Captures the authorized payment amount. +""" +type PaymentCapture { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PaymentError!]! +} + +""" +An enumeration. +""" +enum PaymentChargeStatusEnum { + NOT_CHARGED + PENDING + PARTIALLY_CHARGED + FULLY_CHARGED + PARTIALLY_REFUNDED + FULLY_REFUNDED + REFUSED + CANCELLED +} + +type PaymentCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [PaymentCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type PaymentCountableEdge { + """ + The item at the end of the edge. + """ + node: Payment! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +type PaymentError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: PaymentErrorCode! +} + +""" +An enumeration. +""" +enum PaymentErrorCode { + BILLING_ADDRESS_NOT_SET + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + PARTIAL_PAYMENT_NOT_ALLOWED + SHIPPING_ADDRESS_NOT_SET + INVALID_SHIPPING_METHOD + SHIPPING_METHOD_NOT_SET + PAYMENT_ERROR + NOT_SUPPORTED_GATEWAY + CHANNEL_INACTIVE +} + +input PaymentFilterInput { + checkouts: [ID] +} + +""" +Available payment gateway backend with configuration necessary to setup client. +""" +type PaymentGateway { + """ + Payment gateway name. + """ + name: String! + + """ + Payment gateway ID. + """ + id: ID! + + """ + Payment gateway client configuration. + """ + config: [GatewayConfigLine!]! + + """ + Payment gateway supported currencies. + """ + currencies: [String]! +} + +""" +Initializes payment process when it is required by gateway. +""" +type PaymentInitialize { + initializedPayment: PaymentInitialized + paymentErrors: [PaymentError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PaymentError!]! +} + +""" +Server-side data generated by a payment gateway. Optional step when the payment provider requires an additional action to initialize payment session. +""" +type PaymentInitialized { + """ + ID of a payment gateway. + """ + gateway: String! + + """ + Payment gateway name. + """ + name: String! + + """ + Initialized data by gateway. + """ + data: JSONString +} + +input PaymentInput { + """ + A gateway to use with that payment. + """ + gateway: String! + + """ + Client-side generated payment token, representing customer's billing data in a secure manner. + """ + token: String + + """ + Total amount of the transaction, including all taxes and discounts. If no amount is provided, the checkout total will be used. + """ + amount: PositiveDecimal + + """ + URL of a storefront view where user should be redirected after requiring additional actions. Payment with additional actions will not be finished if this field is not provided. + """ + returnUrl: String +} + +""" +Refunds the captured payment amount. +""" +type PaymentRefund { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PaymentError!]! +} + +""" +Represents a payment source stored for user in payment gateway, such as credit card. +""" +type PaymentSource { + """ + Payment gateway name. + """ + gateway: String! + + """ + Stored credit card details if available. + """ + creditCardInfo: CreditCard +} + +""" +Voids the authorized payment. +""" +type PaymentVoid { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PaymentError!]! +} + +""" +Represents a permission object in a friendly form. +""" +type Permission { + """ + Internal code for permission. + """ + code: PermissionEnum! + + """ + Describe action(s) allowed to do by permission. + """ + name: String! +} + +""" +An enumeration. +""" +enum PermissionEnum { + MANAGE_USERS + MANAGE_STAFF + MANAGE_APPS + MANAGE_CHANNELS + MANAGE_DISCOUNTS + MANAGE_PLUGINS + MANAGE_GIFT_CARD + MANAGE_MENUS + MANAGE_ORDERS + MANAGE_PAGES + MANAGE_PAGE_TYPES_AND_ATTRIBUTES + MANAGE_PRODUCTS + MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES + MANAGE_SHIPPING + MANAGE_SETTINGS + MANAGE_TRANSLATIONS + MANAGE_CHECKOUTS +} + +""" +Create new permission group. +""" +type PermissionGroupCreate { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PermissionGroupError!]! + group: Group +} + +input PermissionGroupCreateInput { + """ + List of permission code names to assign to this group. + """ + addPermissions: [PermissionEnum!] + + """ + List of users to assign to this group. + """ + addUsers: [ID!] + + """ + Group name. + """ + name: String! +} + +""" +Delete permission group. +""" +type PermissionGroupDelete { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PermissionGroupError!]! + group: Group +} + +type PermissionGroupError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: PermissionGroupErrorCode! + + """ + List of permissions which causes the error. + """ + permissions: [PermissionEnum!] + + """ + List of user IDs which causes the error. + """ + users: [ID!] +} + +""" +An enumeration. +""" +enum PermissionGroupErrorCode { + ASSIGN_NON_STAFF_MEMBER + DUPLICATED_INPUT_ITEM + CANNOT_REMOVE_FROM_LAST_GROUP + LEFT_NOT_MANAGEABLE_PERMISSION + OUT_OF_SCOPE_PERMISSION + OUT_OF_SCOPE_USER + REQUIRED + UNIQUE +} + +input PermissionGroupFilterInput { + search: String +} + +enum PermissionGroupSortField { + """ + Sort permission group accounts by name. + """ + NAME +} + +input PermissionGroupSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort permission group by the selected field. + """ + field: PermissionGroupSortField! +} + +""" +Update permission group. +""" +type PermissionGroupUpdate { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PermissionGroupError!]! + group: Group +} + +input PermissionGroupUpdateInput { + """ + List of permission code names to assign to this group. + """ + addPermissions: [PermissionEnum!] + + """ + List of users to assign to this group. + """ + addUsers: [ID!] + + """ + Group name. + """ + name: String + + """ + List of permission code names to unassign from this group. + """ + removePermissions: [PermissionEnum!] + + """ + List of users to unassign from this group. + """ + removeUsers: [ID!] +} + +""" +Plugin. +""" +type Plugin { + """ + Identifier of the plugin. + """ + id: ID! + + """ + Name of the plugin. + """ + name: String! + + """ + Description of the plugin. + """ + description: String! + + """ + Global configuration of the plugin (not channel-specific). + """ + globalConfiguration: PluginConfiguration + + """ + Channel-specific plugin configuration. + """ + channelConfigurations: [PluginConfiguration!]! +} + +""" +Stores information about a configuration of plugin. +""" +type PluginConfiguration { + """ + Determines if plugin is active or not. + """ + active: Boolean! + + """ + The channel to which the plugin configuration is assigned to. + """ + channel: Channel + + """ + Configuration of the plugin. + """ + configuration: [ConfigurationItem] +} + +enum PluginConfigurationType { + PER_CHANNEL + GLOBAL +} + +type PluginCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [PluginCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type PluginCountableEdge { + """ + The item at the end of the edge. + """ + node: Plugin! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +type PluginError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: PluginErrorCode! +} + +""" +An enumeration. +""" +enum PluginErrorCode { + GRAPHQL_ERROR + INVALID + PLUGIN_MISCONFIGURED + NOT_FOUND + REQUIRED + UNIQUE +} + +input PluginFilterInput { + statusInChannels: PluginStatusInChannelsInput + search: String + type: PluginConfigurationType +} + +enum PluginSortField { + NAME + IS_ACTIVE +} + +input PluginSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort plugins by the selected field. + """ + field: PluginSortField! +} + +input PluginStatusInChannelsInput { + active: Boolean! + channels: [ID!]! +} + +""" +Update plugin configuration. +""" +type PluginUpdate { + plugin: Plugin + pluginsErrors: [PluginError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [PluginError!]! +} + +input PluginUpdateInput { + """ + Indicates whether the plugin should be enabled. + """ + active: Boolean + + """ + Configuration of the plugin. + """ + configuration: [ConfigurationItemInput] +} + +""" +Positive Decimal scalar implementation. + +Should be used in places where value must be positive. +""" +scalar PositiveDecimal + +""" +An enumeration. +""" +enum PostalCodeRuleInclusionTypeEnum { + INCLUDE + EXCLUDE +} + +input PriceRangeInput { + """ + Price greater than or equal to. + """ + gte: Float + + """ + Price less than or equal to. + """ + lte: Float +} + +""" +Represents an individual item for sale in the storefront. +""" +type Product implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + productType: ProductType! + slug: String! + category: Category + updatedAt: DateTime + chargeTaxes: Boolean! + weight: Weight + defaultVariant: ProductVariant + rating: Float + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Description of the product (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + The main thumbnail for a product. + """ + thumbnail( + """ + Size of thumbnail. + """ + size: Int + ): Image + + """ + Lists the storefront product's pricing, the current price and discounts, only meant for displaying. + """ + pricing( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + ): ProductPricingInfo + + """ + Whether the product is in stock and visible or not. + """ + isAvailable( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + ): Boolean + + """ + A type of tax. Assigned by enabled tax gateway + """ + taxType: TaxType + + """ + List of attributes assigned to this product. + """ + attributes: [SelectedAttribute!]! + + """ + List of availability in channels for the product. + """ + channelListings: [ProductChannelListing!] + + """ + Get a single product media by ID. + """ + mediaById( + """ + ID of a product media. + """ + id: ID + ): ProductMedia! + + """ + Get a single product image by ID. + """ + imageById( + """ + ID of a product image. + """ + id: ID + ): ProductImage @deprecated(reason: "Will be removed in Saleor 4.0. Use the `mediaById` field instead.") + + """ + List of variants for the product. + """ + variants: [ProductVariant] + + """ + List of media for the product. + """ + media: [ProductMedia!] + + """ + List of images for the product. + """ + images: [ProductImage] @deprecated(reason: "Will be removed in Saleor 4.0. Use the `media` field instead.") + + """ + List of collections for the product. + """ + collections: [Collection] + + """ + Returns translated product fields for the given language code. + """ + translation( + """ + A language code to return the translation for product. + """ + languageCode: LanguageCodeEnum! + ): ProductTranslation + + """ + Date when product is available for purchase. + """ + availableForPurchase: Date + + """ + Whether the product is available for purchase. + """ + isAvailableForPurchase: Boolean +} + +""" +Assign attributes to a given product type. +""" +type ProductAttributeAssign { + """ + The updated product type. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input ProductAttributeAssignInput { + """ + The ID of the attribute to assign. + """ + id: ID! + + """ + The attribute type to be assigned as. + """ + type: ProductAttributeType! +} + +enum ProductAttributeType { + PRODUCT + VARIANT +} + +""" +Un-assign attributes from a given product type. +""" +type ProductAttributeUnassign { + """ + The updated product type. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Deletes products. +""" +type ProductBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Represents product channel listing. +""" +type ProductChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + publicationDate: Date + isPublished: Boolean! + channel: Channel! + visibleInListings: Boolean! + availableForPurchase: Date + + """ + The price of the cheapest variant (including discounts). + """ + discountedPrice: Money + + """ + Purchase cost of product. + """ + purchaseCost: MoneyRange + + """ + Range of margin percentage value. + """ + margin: Margin + + """ + Whether the product is available for purchase. + """ + isAvailableForPurchase: Boolean + + """ + Lists the storefront product's pricing, the current price and discounts, only meant for displaying. + """ + pricing( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + ): ProductPricingInfo +} + +input ProductChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Determines if object is visible to customers. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: Date + + """ + Determines if product is visible in product listings (doesn't apply to product collections). + """ + visibleInListings: Boolean + + """ + Determine if product should be available for purchase. + """ + isAvailableForPurchase: Boolean + + """ + A start date from which a product will be available for purchase. When not set and isAvailable is set to True, the current day is assumed. + """ + availableForPurchaseDate: Date + + """ + List of variants to which the channel should be assigned. + """ + addVariants: [ID!] + + """ + List of variants from which the channel should be unassigned. + """ + removeVariants: [ID!] +} + +type ProductChannelListingError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ProductErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] + + """ + List of channels IDs which causes the error. + """ + channels: [ID!] + + """ + List of variants IDs which causes the error. + """ + variants: [ID!] +} + +""" +Manage product's availability in channels. +""" +type ProductChannelListingUpdate { + """ + An updated product instance. + """ + product: Product + productChannelListingErrors: [ProductChannelListingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductChannelListingError!]! +} + +input ProductChannelListingUpdateInput { + """ + List of channels to which the product should be assigned or updated. + """ + updateChannels: [ProductChannelListingAddInput!] + + """ + List of channels from which the product should be unassigned. + """ + removeChannels: [ID!] +} + +type ProductCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [ProductCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type ProductCountableEdge { + """ + The item at the end of the edge. + """ + node: Product! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new product. +""" +type ProductCreate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + product: Product +} + +input ProductCreateInput { + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + ID of the product's category. + """ + category: ID + + """ + Determine if taxes are being charged for the product. + """ + chargeTaxes: Boolean + + """ + List of IDs of collections that the product belongs to. + """ + collections: [ID!] + + """ + Product description (JSON). + """ + description: JSONString + + """ + Product name. + """ + name: String + + """ + Product slug. + """ + slug: String + + """ + Tax rate for enabled tax gateway. + """ + taxCode: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + Weight of the Product. + """ + weight: WeightScalar + + """ + Defines the product rating value. + """ + rating: Float + + """ + ID of the type that product belongs to. + """ + productType: ID! +} + +""" +Deletes a product. +""" +type ProductDelete { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + product: Product +} + +type ProductError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ProductErrorCode! + + """ + List of attributes IDs which causes the error. + """ + attributes: [ID!] + + """ + List of attribute values IDs which causes the error. + """ + values: [ID!] +} + +""" +An enumeration. +""" +enum ProductErrorCode { + ALREADY_EXISTS + ATTRIBUTE_ALREADY_ASSIGNED + ATTRIBUTE_CANNOT_BE_ASSIGNED + ATTRIBUTE_VARIANTS_DISABLED + DUPLICATED_INPUT_ITEM + GRAPHQL_ERROR + INVALID + PRODUCT_WITHOUT_CATEGORY + NOT_PRODUCTS_IMAGE + NOT_PRODUCTS_VARIANT + NOT_FOUND + REQUIRED + UNIQUE + VARIANT_NO_DIGITAL_CONTENT + CANNOT_MANAGE_PRODUCT_WITHOUT_VARIANT + PRODUCT_NOT_ASSIGNED_TO_CHANNEL + UNSUPPORTED_MEDIA_PROVIDER +} + +enum ProductFieldEnum { + NAME + DESCRIPTION + PRODUCT_TYPE + CATEGORY + PRODUCT_WEIGHT + COLLECTIONS + CHARGE_TAXES + PRODUCT_MEDIA + VARIANT_SKU + VARIANT_WEIGHT + VARIANT_MEDIA +} + +input ProductFilterInput { + isPublished: Boolean + collections: [ID] + categories: [ID] + hasCategory: Boolean + attributes: [AttributeInput] + stockAvailability: StockAvailability + stocks: ProductStockFilterInput + search: String + metadata: [MetadataInput] + price: PriceRangeInput + minimalPrice: PriceRangeInput + productTypes: [ID] + ids: [ID] + + """ + Specifies the channel by which the data should be sorted. + """ + channel: String +} + +""" +Represents a product image. +""" +type ProductImage { + """ + The ID of the image. + """ + id: ID! + + """ + The alt text of the image. + """ + alt: String + + """ + The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. + """ + sortOrder: Int + + """ + The URL of the image. + """ + url( + """ + Size of the image. + """ + size: Int + ): String! +} + +input ProductInput { + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + ID of the product's category. + """ + category: ID + + """ + Determine if taxes are being charged for the product. + """ + chargeTaxes: Boolean + + """ + List of IDs of collections that the product belongs to. + """ + collections: [ID!] + + """ + Product description (JSON). + """ + description: JSONString + + """ + Product name. + """ + name: String + + """ + Product slug. + """ + slug: String + + """ + Tax rate for enabled tax gateway. + """ + taxCode: String + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + Weight of the Product. + """ + weight: WeightScalar + + """ + Defines the product rating value. + """ + rating: Float +} + +""" +Represents a product media. +""" +type ProductMedia implements Node { + """ + The ID of the object. + """ + id: ID! + sortOrder: Int + alt: String! + type: ProductMediaType! + oembedData: JSONString! + + """ + The URL of the media. + """ + url( + """ + Size of the image. + """ + size: Int + ): String! +} + +""" +Deletes product media. +""" +type ProductMediaBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Create a media object (image or video URL) associated with product. For image, this mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec +""" +type ProductMediaCreate { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input ProductMediaCreateInput { + """ + Alt text for a product media. + """ + alt: String + + """ + Represents an image file in a multipart request. + """ + image: Upload + + """ + ID of an product. + """ + product: ID! + + """ + Represents an URL to an external media. + """ + mediaUrl: String +} + +""" +Deletes a product media. +""" +type ProductMediaDelete { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Changes ordering of the product media. +""" +type ProductMediaReorder { + product: Product + media: [ProductMedia!] + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +An enumeration. +""" +enum ProductMediaType { + """ + An uploaded image or an URL to an image + """ + IMAGE + + """ + A URL to an external video + """ + VIDEO +} + +""" +Updates a product media. +""" +type ProductMediaUpdate { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input ProductMediaUpdateInput { + """ + Alt text for a product media. + """ + alt: String +} + +input ProductOrder { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + """ + channel: String + + """ + Sort product by the selected attribute's values. + Note: this doesn't take translations into account yet. + """ + attributeId: ID + + """ + Sort products by the selected field. + """ + field: ProductOrderField +} + +enum ProductOrderField { + """ + Sort products by name. + """ + NAME + + """ + Sort products by rank. Note: This option is available only with the `search` filter. + """ + RANK + + """ + Sort products by price. + """ + PRICE + + """ + Sort products by a minimal price of a product's variant. + """ + MINIMAL_PRICE + + """ + Sort products by update date. + """ + DATE + + """ + Sort products by type. + """ + TYPE + + """ + Sort products by publication status. + """ + PUBLISHED + + """ + Sort products by publication date. + """ + PUBLICATION_DATE + + """ + Sort products by collection. Note: This option is available only for the `Collection.products` query. + """ + COLLECTION + + """ + Sort products by rating. + """ + RATING +} + +""" +Represents availability of a product in the storefront. +""" +type ProductPricingInfo { + """ + Whether it is in sale or not. + """ + onSale: Boolean + + """ + The discount amount if in sale (null otherwise). + """ + discount: TaxedMoney + + """ + The discount amount in the local currency. + """ + discountLocalCurrency: TaxedMoney + + """ + The discounted price range of the product variants. + """ + priceRange: TaxedMoneyRange + + """ + The undiscounted price range of the product variants. + """ + priceRangeUndiscounted: TaxedMoneyRange + + """ + The discounted price range of the product variants in the local currency. + """ + priceRangeLocalCurrency: TaxedMoneyRange +} + +""" +Reorder product attribute values. +""" +type ProductReorderAttributeValues { + """ + Product from which attribute values are reordered. + """ + product: Product + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +input ProductStockFilterInput { + warehouseIds: [ID!] + quantity: IntRangeInput +} + +type ProductTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Description of the product (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") + + """ + Returns translated product fields for the given language code. + """ + translation( + """ + A language code to return the translation for product. + """ + languageCode: LanguageCodeEnum! + ): ProductTranslation + + """ + Represents an individual item for sale in the storefront. + """ + product: Product +} + +""" +Creates/Updates translations for Product. +""" +type ProductTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + product: Product +} + +type ProductTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + seoTitle: String + seoDescription: String + name: String! + description: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! + + """ + Translated description of the product (JSON). + """ + descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.") +} + +""" +Represents a type of product. It defines what attributes are available to products of this type. +""" +type ProductType implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + slug: String! + hasVariants: Boolean! + isShippingRequired: Boolean! + isDigital: Boolean! + weight: Weight + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + List of products of this type. + """ + products( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + @deprecated( + reason: "Will be removed in Saleor 4.0. Use the top-level `products` query with the `productTypes` filter." + ) + + """ + A type of tax. Assigned by enabled tax gateway + """ + taxType: TaxType + + """ + Variant attributes of that product type. + """ + variantAttributes( + """ + Define scope of returned attributes. + """ + variantSelection: VariantAttributeScope + ): [Attribute] + + """ + Product attributes of that product type. + """ + productAttributes: [Attribute] + availableAttributes( + filter: AttributeFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): AttributeCountableConnection +} + +""" +Deletes product types. +""" +type ProductTypeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +enum ProductTypeConfigurable { + CONFIGURABLE + SIMPLE +} + +type ProductTypeCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [ProductTypeCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type ProductTypeCountableEdge { + """ + The item at the end of the edge. + """ + node: ProductType! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new product type. +""" +type ProductTypeCreate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productType: ProductType +} + +""" +Deletes a product type. +""" +type ProductTypeDelete { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productType: ProductType +} + +enum ProductTypeEnum { + DIGITAL + SHIPPABLE +} + +input ProductTypeFilterInput { + search: String + configurable: ProductTypeConfigurable + productType: ProductTypeEnum + metadata: [MetadataInput] + ids: [ID] +} + +input ProductTypeInput { + """ + Name of the product type. + """ + name: String + + """ + Product type slug. + """ + slug: String + + """ + Determines if product of this type has multiple variants. This option mainly simplifies product management in the dashboard. There is always at least one variant created under the hood. + """ + hasVariants: Boolean + + """ + List of attributes shared among all product variants. + """ + productAttributes: [ID] + + """ + List of attributes used to distinguish between different variants of a product. + """ + variantAttributes: [ID] + + """ + Determines if shipping is required for products of this variant. + """ + isShippingRequired: Boolean + + """ + Determines if products are digital. + """ + isDigital: Boolean + + """ + Weight of the ProductType items. + """ + weight: WeightScalar + + """ + Tax rate for enabled tax gateway. + """ + taxCode: String +} + +""" +Reorder the attributes of a product type. +""" +type ProductTypeReorderAttributes { + """ + Product type from which attributes are reordered. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +enum ProductTypeSortField { + """ + Sort products by name. + """ + NAME + + """ + Sort products by type. + """ + DIGITAL + + """ + Sort products by shipping. + """ + SHIPPING_REQUIRED +} + +input ProductTypeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort product types by the selected field. + """ + field: ProductTypeSortField! +} + +""" +Updates an existing product type. +""" +type ProductTypeUpdate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productType: ProductType +} + +""" +Updates an existing product. +""" +type ProductUpdate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + product: Product +} + +""" +Represents a version of a product such as different size or color. +""" +type ProductVariant implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + sku: String! + product: Product! + trackInventory: Boolean! + weight: Weight + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + List of price information in channels for the product. + """ + channelListings: [ProductVariantChannelListing!] + + """ + Lists the storefront variant's pricing, the current price and discounts, only meant for displaying. + """ + pricing( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + ): VariantPricingInfo + + """ + List of attributes assigned to this variant. + """ + attributes( + """ + Define scope of returned attributes. + """ + variantSelection: VariantAttributeScope + ): [SelectedAttribute!]! + + """ + Cost price of the variant. + """ + costPrice: Money + + """ + Gross margin percentage value. + """ + margin: Int + + """ + Total quantity ordered. + """ + quantityOrdered: Int + + """ + Total revenue generated by a variant in given period of time. Note: this field should be queried using `reportProductSales` query as it uses optimizations suitable for such calculations. + """ + revenue(period: ReportingPeriod): TaxedMoney + + """ + List of images for the product variant. + """ + images: [ProductImage] @deprecated(reason: "Will be removed in Saleor 4.0. Use the `media` instead.") + + """ + List of media for the product variant. + """ + media: [ProductMedia!] + + """ + Returns translated product variant fields for the given language code. + """ + translation( + """ + A language code to return the translation for product variant. + """ + languageCode: LanguageCodeEnum! + ): ProductVariantTranslation + + """ + Digital content for the product variant. + """ + digitalContent: DigitalContent + + """ + Stocks for the product variant. + """ + stocks( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + + """ + DEPRECATED: use `address` argument instead. This argument will be removed in Saleor 4.0. Two-letter ISO 3166-1 country code. + """ + countryCode: CountryCode + ): [Stock] + + """ + Quantity of a product available for sale in one checkout. + """ + quantityAvailable( + """ + Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. + """ + address: AddressInput + + """ + DEPRECATED: use `address` argument instead. This argument will be removed in Saleor 4.0.Two-letter ISO 3166-1 country code. When provided, the exact quantity from a warehouse operating in shipping zones that contain this country will be returned. Otherwise, it will return the maximum quantity from all shipping zones. + """ + countryCode: CountryCode + ): Int! +} + +""" +Creates product variants for a given product. +""" +type ProductVariantBulkCreate { + """ + Returns how many objects were created. + """ + count: Int! + + """ + List of the created variants. + """ + productVariants: [ProductVariant!]! + bulkProductErrors: [BulkProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [BulkProductError!]! +} + +input ProductVariantBulkCreateInput { + """ + List of attributes specific to this variant. + """ + attributes: [BulkAttributeValueInput]! + + """ + Stock keeping unit. + """ + sku: String! + + """ + Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. + """ + trackInventory: Boolean + + """ + Weight of the Product Variant. + """ + weight: WeightScalar + + """ + Stocks of a product available for sale. + """ + stocks: [StockInput!] + + """ + List of prices assigned to channels. + """ + channelListings: [ProductVariantChannelListingAddInput!] +} + +""" +Deletes product variants. +""" +type ProductVariantBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Represents product varaint channel listing. +""" +type ProductVariantChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + channel: Channel! + price: Money + + """ + Cost price of the variant. + """ + costPrice: Money + + """ + Gross margin percentage value. + """ + margin: Int +} + +input ProductVariantChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Price of the particular variant in channel. + """ + price: PositiveDecimal! + + """ + Cost price of the variant in channel. + """ + costPrice: PositiveDecimal +} + +""" +Manage product variant prices in channels. +""" +type ProductVariantChannelListingUpdate { + """ + An updated product variant instance. + """ + variant: ProductVariant + productChannelListingErrors: [ProductChannelListingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductChannelListingError!]! +} + +type ProductVariantCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [ProductVariantCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type ProductVariantCountableEdge { + """ + The item at the end of the edge. + """ + node: ProductVariant! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new variant for a product. +""" +type ProductVariantCreate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productVariant: ProductVariant +} + +input ProductVariantCreateInput { + """ + List of attributes specific to this variant. + """ + attributes: [AttributeValueInput]! + + """ + Stock keeping unit. + """ + sku: String + + """ + Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. + """ + trackInventory: Boolean + + """ + Weight of the Product Variant. + """ + weight: WeightScalar + + """ + Product ID of which type is the variant. + """ + product: ID! + + """ + Stocks of a product available for sale. + """ + stocks: [StockInput!] +} + +""" +Deletes a product variant. +""" +type ProductVariantDelete { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productVariant: ProductVariant +} + +input ProductVariantFilterInput { + search: String + sku: [String] + metadata: [MetadataInput] +} + +input ProductVariantInput { + """ + List of attributes specific to this variant. + """ + attributes: [AttributeValueInput] + + """ + Stock keeping unit. + """ + sku: String + + """ + Determines if the inventory of this variant should be tracked. If false, the quantity won't change when customers buy this item. + """ + trackInventory: Boolean + + """ + Weight of the Product Variant. + """ + weight: WeightScalar +} + +""" +Reorder the variants of a product. Mutation updates updated_at on product and triggers PRODUCT_UPDATED webhook. +""" +type ProductVariantReorder { + product: Product + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Reorder product variant attribute values. +""" +type ProductVariantReorderAttributeValues { + """ + Product variant from which attribute values are reordered. + """ + productVariant: ProductVariant + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Set default variant for a product. Mutation triggers PRODUCT_UPDATED webhook. +""" +type ProductVariantSetDefault { + product: Product + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Creates stocks for product variant. +""" +type ProductVariantStocksCreate { + """ + Updated product variant. + """ + productVariant: ProductVariant + bulkStockErrors: [BulkStockError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [BulkStockError!]! +} + +""" +Delete stocks from product variant. +""" +type ProductVariantStocksDelete { + """ + Updated product variant. + """ + productVariant: ProductVariant + stockErrors: [StockError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [StockError!]! +} + +""" +Update stocks for product variant. +""" +type ProductVariantStocksUpdate { + """ + Updated product variant. + """ + productVariant: ProductVariant + bulkStockErrors: [BulkStockError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [BulkStockError!]! +} + +type ProductVariantTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Returns translated product variant fields for the given language code. + """ + translation( + """ + A language code to return the translation for product variant. + """ + languageCode: LanguageCodeEnum! + ): ProductVariantTranslation + + """ + Represents a version of a product such as different size or color. + """ + productVariant: ProductVariant +} + +""" +Creates/Updates translations for Product Variant. +""" +type ProductVariantTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + productVariant: ProductVariant +} + +type ProductVariantTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Translation language. + """ + language: LanguageDisplay! +} + +""" +Updates an existing variant for product. +""" +type ProductVariantUpdate { + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! + productVariant: ProductVariant +} + +input PublishableChannelListingInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Determines if object is visible to customers. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + """ + publicationDate: Date +} + +type Query { + """ + Look up a webhook by ID. + """ + webhook( + """ + ID of the webhook. + """ + id: ID! + ): Webhook + + """ + List of all available webhook events. + """ + webhookEvents: [WebhookEvent] + + """ + Retrieve a sample payload for a given webhook event based on real data. It can be useful for some integrations where sample payload is required. + """ + webhookSamplePayload( + """ + Name of the requested event type. + """ + eventType: WebhookSampleEventTypeEnum! + ): JSONString + + """ + Look up a warehouse by ID. + """ + warehouse( + """ + ID of an warehouse + """ + id: ID! + ): Warehouse + + """ + List of warehouses. + """ + warehouses( + filter: WarehouseFilterInput + sortBy: WarehouseSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): WarehouseCountableConnection + + """ + Returns a list of all translatable items of a given kind. + """ + translations( + """ + Kind of objects to retrieve. + """ + kind: TranslatableKinds! + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): TranslatableItemConnection + translation( + """ + ID of the object to retrieve. + """ + id: ID! + + """ + Kind of the object to retrieve. + """ + kind: TranslatableKinds! + ): TranslatableItem + + """ + Look up a stock by ID + """ + stock( + """ + ID of an warehouse + """ + id: ID! + ): Stock + + """ + List of stocks. + """ + stocks( + filter: StockFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): StockCountableConnection + + """ + Return information about the shop. + """ + shop: Shop! + + """ + Order related settings from site settings. + """ + orderSettings: OrderSettings + + """ + Look up a shipping zone by ID. + """ + shippingZone( + """ + ID of the shipping zone. + """ + id: ID! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone + + """ + List of the shop's shipping zones. + """ + shippingZones( + """ + Filtering options for shipping zones. + """ + filter: ShippingZoneFilterInput + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ShippingZoneCountableConnection + + """ + Look up digital content by ID. + """ + digitalContent( + """ + ID of the digital content. + """ + id: ID! + ): DigitalContent + + """ + List of digital content. + """ + digitalContents( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): DigitalContentCountableConnection + + """ + List of the shop's categories. + """ + categories( + """ + Filtering options for categories. + """ + filter: CategoryFilterInput + + """ + Sort categories. + """ + sortBy: CategorySortingInput + + """ + Filter categories by the nesting level in the category tree. + """ + level: Int + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CategoryCountableConnection + + """ + Look up a category by ID or slug. + """ + category( + """ + ID of the category. + """ + id: ID + + """ + Slug of the category + """ + slug: String + ): Category + + """ + Look up a collection by ID. + """ + collection( + """ + ID of the collection. + """ + id: ID + + """ + Slug of the category + """ + slug: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Collection + + """ + List of the shop's collections. + """ + collections( + """ + Filtering options for collections. + """ + filter: CollectionFilterInput + + """ + Sort collections. + """ + sortBy: CollectionSortingInput + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CollectionCountableConnection + + """ + Look up a product by ID. + """ + product( + """ + ID of the product. + """ + id: ID + + """ + Slug of the product. + """ + slug: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Product + + """ + List of the shop's products. + """ + products( + """ + Filtering options for products. + """ + filter: ProductFilterInput + + """ + Sort products. + """ + sortBy: ProductOrder + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + + """ + Look up a product type by ID. + """ + productType( + """ + ID of the product type. + """ + id: ID! + ): ProductType + + """ + List of the shop's product types. + """ + productTypes( + """ + Filtering options for product types. + """ + filter: ProductTypeFilterInput + + """ + Sort product types. + """ + sortBy: ProductTypeSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductTypeCountableConnection + + """ + Look up a product variant by ID or SKU. + """ + productVariant( + """ + ID of the product variant. + """ + id: ID + + """ + Sku of the product variant. + """ + sku: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant + + """ + List of product variants. + """ + productVariants( + """ + Filter product variants by given IDs. + """ + ids: [ID] + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Filtering options for product variant. + """ + filter: ProductVariantFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductVariantCountableConnection + + """ + List of top selling products. + """ + reportProductSales( + """ + Span of time. + """ + period: ReportingPeriod! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String! + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductVariantCountableConnection + + """ + Look up a payment by ID. + """ + payment( + """ + ID of the payment. + """ + id: ID! + ): Payment + + """ + List of payments. + """ + payments( + """ + Filtering options for payments. + """ + filter: PaymentFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): PaymentCountableConnection + + """ + Look up a page by ID or slug. + """ + page( + """ + ID of the page. + """ + id: ID + + """ + The slug of the page. + """ + slug: String + ): Page + + """ + List of the shop's pages. + """ + pages( + """ + Sort pages. + """ + sortBy: PageSortingInput + + """ + Filtering options for pages. + """ + filter: PageFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): PageCountableConnection + + """ + Look up a page type by ID. + """ + pageType( + """ + ID of the page type. + """ + id: ID! + ): PageType + + """ + List of the page types. + """ + pageTypes( + """ + Sort page types. + """ + sortBy: PageTypeSortingInput + + """ + Filtering options for page types. + """ + filter: PageTypeFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): PageTypeCountableConnection + + """ + List of activity events to display on homepage (at the moment it only contains order-events). + """ + homepageEvents( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): OrderEventCountableConnection + + """ + Look up an order by ID. + """ + order( + """ + ID of an order. + """ + id: ID! + ): Order + + """ + List of orders. + """ + orders( + """ + Sort orders. + """ + sortBy: OrderSortingInput + + """ + Filtering options for orders. + """ + filter: OrderFilterInput + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): OrderCountableConnection + + """ + List of draft orders. + """ + draftOrders( + """ + Sort draft orders. + """ + sortBy: OrderSortingInput + + """ + Filtering options for draft orders. + """ + filter: OrderDraftFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): OrderCountableConnection + + """ + Return the total sales amount from a specific period. + """ + ordersTotal( + """ + A period of time. + """ + period: ReportingPeriod + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): TaxedMoney + + """ + Look up an order by token. + """ + orderByToken( + """ + The order's token. + """ + token: UUID! + ): Order + + """ + Look up a navigation menu by ID or name. + """ + menu( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + ID of the menu. + """ + id: ID + + """ + The menu's name. + """ + name: String + + """ + The menu's slug. + """ + slug: String + ): Menu + + """ + List of the storefront's menus. + """ + menus( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Sort menus. + """ + sortBy: MenuSortingInput + + """ + Filtering options for menus. + """ + filter: MenuFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): MenuCountableConnection + + """ + Look up a menu item by ID. + """ + menuItem( + """ + ID of the menu item. + """ + id: ID! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): MenuItem + + """ + List of the storefronts's menu items. + """ + menuItems( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Sort menus items. + """ + sortBy: MenuItemSortingInput + + """ + Filtering options for menu items. + """ + filter: MenuItemFilterInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): MenuItemCountableConnection + + """ + Look up a gift card by ID. + """ + giftCard( + """ + ID of the gift card. + """ + id: ID! + ): GiftCard + + """ + List of gift cards. + """ + giftCards( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): GiftCardCountableConnection + + """ + Look up a plugin by ID. + """ + plugin( + """ + ID of the plugin. + """ + id: ID! + ): Plugin + + """ + List of plugins. + """ + plugins( + """ + Filtering options for plugins. + """ + filter: PluginFilterInput + + """ + Sort plugins. + """ + sortBy: PluginSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): PluginCountableConnection + + """ + Look up a sale by ID. + """ + sale( + """ + ID of the sale. + """ + id: ID! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Sale + + """ + List of the shop's sales. + """ + sales( + """ + Filtering options for sales. + """ + filter: SaleFilterInput + + """ + Sort sales. + """ + sortBy: SaleSortingInput + + """ + Search sales by name, value or type. + """ + query: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): SaleCountableConnection + + """ + Look up a voucher by ID. + """ + voucher( + """ + ID of the voucher. + """ + id: ID! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Voucher + + """ + List of the shop's vouchers. + """ + vouchers( + """ + Filtering options for vouchers. + """ + filter: VoucherFilterInput + + """ + Sort voucher. + """ + sortBy: VoucherSortingInput + + """ + Search vouchers by name or code. + """ + query: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): VoucherCountableConnection + + """ + Look up a export file by ID. + """ + exportFile( + """ + ID of the export file job. + """ + id: ID! + ): ExportFile + + """ + List of export files. + """ + exportFiles( + """ + Filtering options for export files. + """ + filter: ExportFileFilterInput + + """ + Sort export files. + """ + sortBy: ExportFileSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ExportFileCountableConnection + + """ + List of all tax rates available from tax gateway. + """ + taxTypes: [TaxType] + + """ + Look up a checkout by token and slug of channel. + """ + checkout( + """ + The checkout's token. + """ + token: UUID + ): Checkout + + """ + List of checkouts. + """ + checkouts( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CheckoutCountableConnection + + """ + Look up a checkout line by ID. + """ + checkoutLine( + """ + ID of the checkout line. + """ + id: ID + ): CheckoutLine + + """ + List of checkout lines. + """ + checkoutLines( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CheckoutLineCountableConnection + + """ + Look up a channel by ID. + """ + channel( + """ + ID of the channel. + """ + id: ID + ): Channel + + """ + List of all channels. + """ + channels: [Channel!] + + """ + List of the shop's attributes. + """ + attributes( + """ + Filtering options for attributes. + """ + filter: AttributeFilterInput + + """ + Sorting options for attributes. + """ + sortBy: AttributeSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): AttributeCountableConnection + + """ + Look up an attribute by ID. + """ + attribute( + """ + ID of the attribute. + """ + id: ID + + """ + Slug of the attribute. + """ + slug: String + ): Attribute + + """ + List of all apps installations + """ + appsInstallations: [AppInstallation!]! + + """ + List of the apps. + """ + apps( + """ + Filtering options for apps. + """ + filter: AppFilterInput + + """ + Sort apps. + """ + sortBy: AppSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): AppCountableConnection + + """ + Look up an app by ID. If ID is not provided, return the currently authenticated app. + """ + app( + """ + ID of the app. + """ + id: ID + ): App + + """ + Returns address validation rules. + """ + addressValidationRules( + """ + Two-letter ISO 3166-1 country code. + """ + countryCode: CountryCode! + + """ + Designation of a region, province or state. + """ + countryArea: String + + """ + City or a town name. + """ + city: String + + """ + Sublocality like a district. + """ + cityArea: String + ): AddressValidationData + + """ + Look up an address by ID. + """ + address( + """ + ID of an address. + """ + id: ID! + ): Address + + """ + List of the shop's customers. + """ + customers( + """ + Filtering options for customers. + """ + filter: CustomerFilterInput + + """ + Sort customers. + """ + sortBy: UserSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): UserCountableConnection + + """ + List of permission groups. + """ + permissionGroups( + """ + Filtering options for permission groups. + """ + filter: PermissionGroupFilterInput + + """ + Sort permission groups. + """ + sortBy: PermissionGroupSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): GroupCountableConnection + + """ + Look up permission group by ID. + """ + permissionGroup( + """ + ID of the group. + """ + id: ID! + ): Group + + """ + Return the currently authenticated user. + """ + me: User + + """ + List of the shop's staff users. + """ + staffUsers( + """ + Filtering options for staff users. + """ + filter: StaffUserInput + + """ + Sort staff users. + """ + sortBy: UserSortingInput + + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): UserCountableConnection + + """ + Look up a user by ID or email address. + """ + user( + """ + ID of the user. + """ + id: ID + + """ + Email address of the user. + """ + email: String + ): User + _entities(representations: [_Any]): [_Entity] + _service: _Service +} + +""" +Represents a reduced VAT rate for a particular type of goods. +""" +type ReducedRate { + """ + Reduced VAT rate in percent. + """ + rate: Float! + + """ + A type of goods. + """ + rateType: TaxRateType! +} + +""" +Refresh JWT token. Mutation tries to take refreshToken from the input.If it fails it will try to take refreshToken from the http-only cookie -refreshToken. csrfToken is required when refreshToken is provided as a cookie. +""" +type RefreshToken { + """ + JWT token, required to authenticate. + """ + token: String + + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +input ReorderInput { + """ + The ID of the item to move. + """ + id: ID! + + """ + The new relative sorting position of the item (from -inf to +inf). 1 moves the item one position forward, -1 moves the item one position backward, 0 leaves the item unchanged. + """ + sortOrder: Int +} + +enum ReportingPeriod { + TODAY + THIS_MONTH +} + +""" +Request email change of the logged in user. +""" +type RequestEmailChange { + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Sends an email with the account password modification link. +""" +type RequestPasswordReset { + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Sales allow creating discounts for categories, collections or products and are visible to all the customers. +""" +type Sale implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + type: SaleType! + startDate: DateTime! + endDate: DateTime + + """ + List of categories this sale applies to. + """ + categories( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CategoryCountableConnection + + """ + List of collections this sale applies to. + """ + collections( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CollectionCountableConnection + + """ + List of products this sale applies to. + """ + products( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + + """ + Returns translated sale fields for the given language code. + """ + translation( + """ + A language code to return the translation for sale. + """ + languageCode: LanguageCodeEnum! + ): SaleTranslation + + """ + List of channels available for the sale. + """ + channelListings: [SaleChannelListing!] + + """ + Sale value. + """ + discountValue: Float + + """ + Currency code for sale. + """ + currency: String +} + +""" +Adds products, categories, collections to a voucher. +""" +type SaleAddCatalogues { + """ + Sale of which catalogue IDs will be modified. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +""" +Deletes sales. +""" +type SaleBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +""" +Represents sale channel listing. +""" +type SaleChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + channel: Channel! + discountValue: Float! + currency: String! +} + +input SaleChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + The value of the discount. + """ + discountValue: PositiveDecimal! +} + +input SaleChannelListingInput { + """ + List of channels to which the sale should be assigned. + """ + addChannels: [SaleChannelListingAddInput!] + + """ + List of channels from which the sale should be unassigned. + """ + removeChannels: [ID!] +} + +""" +Manage sale's availability in channels. +""" +type SaleChannelListingUpdate { + """ + An updated sale instance. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +type SaleCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [SaleCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type SaleCountableEdge { + """ + The item at the end of the edge. + """ + node: Sale! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new sale. +""" +type SaleCreate { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + sale: Sale +} + +""" +Deletes a sale. +""" +type SaleDelete { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + sale: Sale +} + +input SaleFilterInput { + status: [DiscountStatusEnum] + saleType: DiscountValueTypeEnum + started: DateTimeRangeInput + search: String +} + +input SaleInput { + """ + Voucher name. + """ + name: String + + """ + Fixed or percentage. + """ + type: DiscountValueTypeEnum + + """ + Value of the voucher. + """ + value: PositiveDecimal + + """ + Products related to the discount. + """ + products: [ID] + + """ + Categories related to the discount. + """ + categories: [ID] + + """ + Collections related to the discount. + """ + collections: [ID] + + """ + Start date of the voucher in ISO 8601 format. + """ + startDate: DateTime + + """ + End date of the voucher in ISO 8601 format. + """ + endDate: DateTime +} + +""" +Removes products, categories, collections from a sale. +""" +type SaleRemoveCatalogues { + """ + Sale of which catalogue IDs will be modified. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +enum SaleSortField { + """ + Sort sales by name. + """ + NAME + + """ + Sort sales by start date. + """ + START_DATE + + """ + Sort sales by end date. + """ + END_DATE + + """ + Sort sales by value. + """ + VALUE + + """ + Sort sales by type. + """ + TYPE +} + +input SaleSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + """ + channel: String + + """ + Sort sales by the selected field. + """ + field: SaleSortField! +} + +type SaleTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + + """ + Returns translated sale fields for the given language code. + """ + translation( + """ + A language code to return the translation for sale. + """ + languageCode: LanguageCodeEnum! + ): SaleTranslation + + """ + Sales allow creating discounts for categories, collections or products and are visible to all the customers. + """ + sale: Sale +} + +""" +Creates/updates translations for a sale. +""" +type SaleTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + sale: Sale +} + +type SaleTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String + + """ + Translation language. + """ + language: LanguageDisplay! +} + +""" +An enumeration. +""" +enum SaleType { + """ + fixed + """ + FIXED + + """ + % + """ + PERCENTAGE +} + +""" +Updates a sale. +""" +type SaleUpdate { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + sale: Sale +} + +""" +Represents a custom attribute. +""" +type SelectedAttribute { + """ + Name of an attribute displayed in the interface. + """ + attribute: Attribute! + + """ + Values of an attribute. + """ + values: [AttributeValue]! +} + +input SeoInput { + """ + SEO title. + """ + title: String + + """ + SEO description. + """ + description: String +} + +""" +Sets the user's password from the token sent by email using the RequestPasswordReset mutation. +""" +type SetPassword { + """ + JWT token, required to authenticate. + """ + token: String + + """ + JWT refresh token, required to re-generate access token. + """ + refreshToken: String + + """ + CSRF token required to re-generate access token. + """ + csrfToken: String + + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +type ShippingError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ShippingErrorCode! + + """ + List of warehouse IDs which causes the error. + """ + warehouses: [ID!] + + """ + List of channels IDs which causes the error. + """ + channels: [ID!] +} + +""" +An enumeration. +""" +enum ShippingErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + MAX_LESS_THAN_MIN + NOT_FOUND + REQUIRED + UNIQUE + DUPLICATED_INPUT_ITEM +} + +""" +Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. +""" +type ShippingMethod implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + description: JSONString + minimumOrderWeight: Weight + maximumOrderWeight: Weight + maximumDeliveryDays: Int + minimumDeliveryDays: Int + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Type of the shipping method. + """ + type: ShippingMethodTypeEnum + + """ + Returns translated shipping method fields for the given language code. + """ + translation( + """ + A language code to return the translation for shipping method. + """ + languageCode: LanguageCodeEnum! + ): ShippingMethodTranslation + + """ + List of channels available for the method. + """ + channelListings: [ShippingMethodChannelListing!] + + """ + The price of the cheapest variant (including discounts). + """ + price: Money + + """ + The price of the cheapest variant (including discounts). + """ + maximumOrderPrice: Money + + """ + The price of the cheapest variant (including discounts). + """ + minimumOrderPrice: Money + + """ + Postal code ranges rule of exclusion or inclusion of the shipping method. + """ + postalCodeRules: [ShippingMethodPostalCodeRule] + + """ + List of excluded products for the shipping method. + """ + excludedProducts( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection +} + +""" +Represents shipping method channel listing. +""" +type ShippingMethodChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + channel: Channel! + minimumOrderPrice: Money + maximumOrderPrice: Money + price: Money +} + +input ShippingMethodChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Shipping price of the shipping method in this channel. + """ + price: PositiveDecimal + + """ + Minimum order price to use this shipping method. + """ + minimumOrderPrice: PositiveDecimal + + """ + Maximum order price to use this shipping method. + """ + maximumOrderPrice: PositiveDecimal +} + +input ShippingMethodChannelListingInput { + """ + List of channels to which the shipping method should be assigned. + """ + addChannels: [ShippingMethodChannelListingAddInput!] + + """ + List of channels from which the shipping method should be unassigned. + """ + removeChannels: [ID!] +} + +""" +Manage shipping method's availability in channels. +""" +type ShippingMethodChannelListingUpdate { + """ + An updated shipping method instance. + """ + shippingMethod: ShippingMethod + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Represents shipping method postal code rule. +""" +type ShippingMethodPostalCodeRule implements Node { + """ + Start address range. + """ + start: String + + """ + End address range. + """ + end: String + + """ + Inclusion type of the postal code rule. + """ + inclusionType: PostalCodeRuleInclusionTypeEnum + + """ + The ID of the object. + """ + id: ID! +} + +type ShippingMethodTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String! + description: JSONString + + """ + Returns translated shipping method fields for the given language code. + """ + translation( + """ + A language code to return the translation for shipping method. + """ + languageCode: LanguageCodeEnum! + ): ShippingMethodTranslation + + """ + Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. + """ + shippingMethod: ShippingMethod +} + +type ShippingMethodTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String + description: JSONString + + """ + Translation language. + """ + language: LanguageDisplay! +} + +""" +An enumeration. +""" +enum ShippingMethodTypeEnum { + PRICE + WEIGHT +} + +input ShippingPostalCodeRulesCreateInputRange { + """ + Start range of the postal code. + """ + start: String! + + """ + End range of the postal code. + """ + end: String +} + +""" +Deletes shipping prices. +""" +type ShippingPriceBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Creates a new shipping price. +""" +type ShippingPriceCreate { + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingMethod: ShippingMethod + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Deletes a shipping price. +""" +type ShippingPriceDelete { + """ + A shipping method to delete. + """ + shippingMethod: ShippingMethod + + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Exclude products from shipping price. +""" +type ShippingPriceExcludeProducts { + """ + A shipping method with new list of excluded products. + """ + shippingMethod: ShippingMethod + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +input ShippingPriceExcludeProductsInput { + """ + List of products which will be excluded. + """ + products: [ID]! +} + +input ShippingPriceInput { + """ + Name of the shipping method. + """ + name: String + + """ + Shipping method description (JSON). + """ + description: JSONString + + """ + Minimum order weight to use this shipping method. + """ + minimumOrderWeight: WeightScalar + + """ + Maximum order weight to use this shipping method. + """ + maximumOrderWeight: WeightScalar + + """ + Maximum number of days for delivery. + """ + maximumDeliveryDays: Int + + """ + Minimal number of days for delivery. + """ + minimumDeliveryDays: Int + + """ + Shipping type: price or weight based. + """ + type: ShippingMethodTypeEnum + + """ + Shipping zone this method belongs to. + """ + shippingZone: ID + + """ + Postal code rules to add. + """ + addPostalCodeRules: [ShippingPostalCodeRulesCreateInputRange!] + + """ + Postal code rules to delete. + """ + deletePostalCodeRules: [ID!] + + """ + Inclusion type for currently assigned postal code rules. + """ + inclusionType: PostalCodeRuleInclusionTypeEnum +} + +""" +Remove product from excluded list for shipping price. +""" +type ShippingPriceRemoveProductFromExclude { + """ + A shipping method with new list of excluded products. + """ + shippingMethod: ShippingMethod + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Creates/Updates translations for shipping method. +""" +type ShippingPriceTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + shippingMethod: ShippingMethod +} + +input ShippingPriceTranslationInput { + name: String + + """ + Translated shipping method description (JSON). + """ + description: JSONString +} + +""" +Updates a new shipping price. +""" +type ShippingPriceUpdate { + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingMethod: ShippingMethod + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +""" +Represents a shipping zone in the shop. Zones are the concept used only for grouping shipping methods in the dashboard, and are never exposed to the customers directly. +""" +type ShippingZone implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + default: Boolean! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + Lowest and highest prices for the shipping. + """ + priceRange: MoneyRange + + """ + List of countries available for the method. + """ + countries: [CountryDisplay] + + """ + List of shipping methods available for orders shipped to countries within this shipping zone. + """ + shippingMethods: [ShippingMethod] + + """ + List of warehouses for shipping zone. + """ + warehouses: [Warehouse!]! + + """ + List of channels for shipping zone. + """ + channels: [Channel!]! + + """ + Description of a shipping zone. + """ + description: String +} + +""" +Deletes shipping zones. +""" +type ShippingZoneBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! +} + +type ShippingZoneCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [ShippingZoneCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type ShippingZoneCountableEdge { + """ + The item at the end of the edge. + """ + node: ShippingZone! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new shipping zone. +""" +type ShippingZoneCreate { + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! + shippingZone: ShippingZone +} + +input ShippingZoneCreateInput { + """ + Shipping zone's name. Visible only to the staff. + """ + name: String + + """ + Description of the shipping zone. + """ + description: String + + """ + List of countries in this shipping zone. + """ + countries: [String] + + """ + Default shipping zone will be used for countries not covered by other zones. + """ + default: Boolean + + """ + List of warehouses to assign to a shipping zone + """ + addWarehouses: [ID] + + """ + List of channels to assign to the shipping zone. + """ + addChannels: [ID!] +} + +""" +Deletes a shipping zone. +""" +type ShippingZoneDelete { + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! + shippingZone: ShippingZone +} + +input ShippingZoneFilterInput { + search: String + channels: [ID] +} + +""" +Updates a new shipping zone. +""" +type ShippingZoneUpdate { + shippingErrors: [ShippingError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShippingError!]! + shippingZone: ShippingZone +} + +input ShippingZoneUpdateInput { + """ + Shipping zone's name. Visible only to the staff. + """ + name: String + + """ + Description of the shipping zone. + """ + description: String + + """ + List of countries in this shipping zone. + """ + countries: [String] + + """ + Default shipping zone will be used for countries not covered by other zones. + """ + default: Boolean + + """ + List of warehouses to assign to a shipping zone + """ + addWarehouses: [ID] + + """ + List of channels to assign to the shipping zone. + """ + addChannels: [ID!] + + """ + List of warehouses to unassign from a shipping zone + """ + removeWarehouses: [ID] + + """ + List of channels to unassign from the shipping zone. + """ + removeChannels: [ID!] +} + +""" +Represents a shop resource containing general shop data and configuration. +""" +type Shop { + """ + List of available payment gateways. + """ + availablePaymentGateways( + """ + DEPRECATED: use `channel` argument instead. This argument will be removed in Saleor 4.0.A currency for which gateways will be returned. + """ + currency: String + + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): [PaymentGateway!]! + + """ + List of available external authentications. + """ + availableExternalAuthentications: [ExternalAuthentication!]! + + """ + Shipping methods that are available for the shop. + """ + availableShippingMethods( + """ + Slug of a channel for which the data should be returned. + """ + channel: String! + + """ + Address for which available shipping methods should be returned. + """ + address: AddressInput + ): [ShippingMethod] + + """ + List of countries available in the shop. + """ + countries( + """ + A language code to return the translation for. + """ + languageCode: LanguageCodeEnum + ): [CountryDisplay!]! + + """ + Shop's default country. + """ + defaultCountry: CountryDisplay + + """ + Default shop's email sender's name. + """ + defaultMailSenderName: String + + """ + Default shop's email sender's address. + """ + defaultMailSenderAddress: String + + """ + Shop's description. + """ + description: String + + """ + Shop's domain data. + """ + domain: Domain! + + """ + List of the shops's supported languages. + """ + languages: [LanguageDisplay]! + + """ + Shop's name. + """ + name: String! + + """ + List of available permissions. + """ + permissions: [Permission]! + + """ + List of possible phone prefixes. + """ + phonePrefixes: [String]! + + """ + Header text. + """ + headerText: String + + """ + Include taxes in prices. + """ + includeTaxesInPrices: Boolean! + + """ + Display prices with tax in store. + """ + displayGrossPrices: Boolean! + + """ + Charge taxes on shipping. + """ + chargeTaxesOnShipping: Boolean! + + """ + Enable inventory tracking. + """ + trackInventoryByDefault: Boolean + + """ + Default weight unit. + """ + defaultWeightUnit: WeightUnitsEnum + + """ + Returns translated shop fields for the given language code. + """ + translation( + """ + A language code to return the translation for shop. + """ + languageCode: LanguageCodeEnum! + ): ShopTranslation + + """ + Enable automatic fulfillment for all digital products. + """ + automaticFulfillmentDigitalProducts: Boolean + + """ + Default number of max downloads per digital content URL. + """ + defaultDigitalMaxDownloads: Int + + """ + Default number of days which digital content URL will be valid. + """ + defaultDigitalUrlValidDays: Int + + """ + Company address. + """ + companyAddress: Address + + """ + URL of a view where customers can set their password. + """ + customerSetPasswordUrl: String + + """ + List of staff notification recipients. + """ + staffNotificationRecipients: [StaffNotificationRecipient] + + """ + Resource limitations and current usage if any set for a shop + """ + limits: LimitInfo! + + """ + Saleor API version. + """ + version: String! +} + +""" +Update the shop's address. If the `null` value is passed, the currently selected address will be deleted. +""" +type ShopAddressUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! +} + +""" +Updates site domain of the shop. +""" +type ShopDomainUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! +} + +type ShopError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: ShopErrorCode! +} + +""" +An enumeration. +""" +enum ShopErrorCode { + ALREADY_EXISTS + CANNOT_FETCH_TAX_RATES + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +""" +Fetch tax rates. +""" +type ShopFetchTaxRates { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! +} + +input ShopSettingsInput { + """ + Header text. + """ + headerText: String + + """ + SEO description. + """ + description: String + + """ + Include taxes in prices. + """ + includeTaxesInPrices: Boolean + + """ + Display prices with tax in store. + """ + displayGrossPrices: Boolean + + """ + Charge taxes on shipping. + """ + chargeTaxesOnShipping: Boolean + + """ + Enable inventory tracking. + """ + trackInventoryByDefault: Boolean + + """ + Default weight unit. + """ + defaultWeightUnit: WeightUnitsEnum + + """ + Enable automatic fulfillment for all digital products. + """ + automaticFulfillmentDigitalProducts: Boolean + + """ + Default number of max downloads per digital content URL. + """ + defaultDigitalMaxDownloads: Int + + """ + Default number of days which digital content URL will be valid. + """ + defaultDigitalUrlValidDays: Int + + """ + Default email sender's name. + """ + defaultMailSenderName: String + + """ + Default email sender's address. + """ + defaultMailSenderAddress: String + + """ + URL of a view where customers can set their password. + """ + customerSetPasswordUrl: String +} + +""" +Creates/Updates translations for Shop Settings. +""" +type ShopSettingsTranslate { + """ + Updated shop. + """ + shop: Shop + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! +} + +input ShopSettingsTranslationInput { + headerText: String + description: String +} + +""" +Updates shop settings. +""" +type ShopSettingsUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! +} + +type ShopTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + headerText: String! + description: String! + + """ + Translation language. + """ + language: LanguageDisplay! +} + +input SiteDomainInput { + """ + Domain name for shop. + """ + domain: String + + """ + Shop site name. + """ + name: String +} + +""" +Deletes staff users. +""" +type StaffBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + staffErrors: [StaffError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [StaffError!]! +} + +""" +Creates a new staff user. +""" +type StaffCreate { + staffErrors: [StaffError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [StaffError!]! + user: User +} + +input StaffCreateInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + The unique email address of the user. + """ + email: String + + """ + User account is active. + """ + isActive: Boolean + + """ + A note about the user. + """ + note: String + + """ + List of permission group IDs to which user should be assigned. + """ + addGroups: [ID!] + + """ + URL of a view where users should be redirected to set the password. URL in RFC 1808 format. + """ + redirectUrl: String +} + +""" +Deletes a staff user. +""" +type StaffDelete { + staffErrors: [StaffError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [StaffError!]! + user: User +} + +type StaffError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: AccountErrorCode! + + """ + A type of address that causes the error. + """ + addressType: AddressTypeEnum + + """ + List of permissions which causes the error. + """ + permissions: [PermissionEnum!] + + """ + List of permission group IDs which cause the error. + """ + groups: [ID!] + + """ + List of user IDs which causes the error. + """ + users: [ID!] +} + +enum StaffMemberStatus { + """ + User account has been activated. + """ + ACTIVE + + """ + User account has not been activated yet. + """ + DEACTIVATED +} + +""" +Represents a recipient of email notifications send by Saleor, such as notifications about new orders. Notifications can be assigned to staff users or arbitrary email addresses. +""" +type StaffNotificationRecipient implements Node { + """ + Returns a user subscribed to email notifications. + """ + user: User + + """ + Determines if a notification active. + """ + active: Boolean + + """ + The ID of the object. + """ + id: ID! + + """ + Returns email address of a user subscribed to email notifications. + """ + email: String +} + +""" +Creates a new staff notification recipient. +""" +type StaffNotificationRecipientCreate { + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +""" +Delete staff notification recipient. +""" +type StaffNotificationRecipientDelete { + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +input StaffNotificationRecipientInput { + """ + The ID of the user subscribed to email notifications.. + """ + user: ID + + """ + Email address of a user subscribed to email notifications. + """ + email: String + + """ + Determines if a notification active. + """ + active: Boolean +} + +""" +Updates a staff notification recipient. +""" +type StaffNotificationRecipientUpdate { + shopErrors: [ShopError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +""" +Updates an existing staff user. +""" +type StaffUpdate { + staffErrors: [StaffError!]! @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [StaffError!]! + user: User +} + +input StaffUpdateInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + The unique email address of the user. + """ + email: String + + """ + User account is active. + """ + isActive: Boolean + + """ + A note about the user. + """ + note: String + + """ + List of permission group IDs to which user should be assigned. + """ + addGroups: [ID!] + + """ + List of permission group IDs from which user should be unassigned. + """ + removeGroups: [ID!] +} + +input StaffUserInput { + status: StaffMemberStatus + search: String +} + +""" +Represents stock. +""" +type Stock implements Node { + warehouse: Warehouse! + productVariant: ProductVariant! + + """ + Quantity of a product in the warehouse's possession, including the allocated stock that is waiting for shipment. + """ + quantity: Int! + + """ + The ID of the object. + """ + id: ID! + + """ + Quantity allocated for orders + """ + quantityAllocated: Int! +} + +enum StockAvailability { + IN_STOCK + OUT_OF_STOCK +} + +type StockCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [StockCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type StockCountableEdge { + """ + The item at the end of the edge. + """ + node: Stock! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +type StockError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: StockErrorCode! +} + +""" +An enumeration. +""" +enum StockErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +input StockFilterInput { + quantity: Float + search: String +} + +input StockInput { + """ + Warehouse in which stock is located. + """ + warehouse: ID! + + """ + Quantity of items available for sell. + """ + quantity: Int! +} + +""" +An enumeration. +""" +enum TaxRateType { + ACCOMMODATION + ADMISSION_TO_CULTURAL_EVENTS + ADMISSION_TO_ENTERTAINMENT_EVENTS + ADMISSION_TO_SPORTING_EVENTS + ADVERTISING + AGRICULTURAL_SUPPLIES + BABY_FOODSTUFFS + BIKES + BOOKS + CHILDRENS_CLOTHING + DOMESTIC_FUEL + DOMESTIC_SERVICES + E_BOOKS + FOODSTUFFS + HOTELS + MEDICAL + NEWSPAPERS + PASSENGER_TRANSPORT + PHARMACEUTICALS + PROPERTY_RENOVATIONS + RESTAURANTS + SOCIAL_HOUSING + STANDARD + WATER + WINE +} + +""" +Representation of tax types fetched from tax gateway. +""" +type TaxType { + """ + Description of the tax type. + """ + description: String + + """ + External tax code used to identify given tax group. + """ + taxCode: String +} + +""" +Represents a monetary value with taxes. In cases where taxes were not applied, net and gross values will be equal. +""" +type TaxedMoney { + """ + Currency code. + """ + currency: String! + + """ + Amount of money including taxes. + """ + gross: Money! + + """ + Amount of money without taxes. + """ + net: Money! + + """ + Amount of taxes. + """ + tax: Money! +} + +""" +Represents a range of monetary values. +""" +type TaxedMoneyRange { + """ + Lower bound of a price range. + """ + start: TaxedMoney + + """ + Upper bound of a price range. + """ + stop: TaxedMoney +} + +""" +An object representing a single payment. +""" +type Transaction implements Node { + """ + The ID of the object. + """ + id: ID! + created: DateTime! + payment: Payment! + token: String! + kind: TransactionKind! + isSuccess: Boolean! + error: String + gatewayResponse: JSONString! + + """ + Total amount of the transaction. + """ + amount: Money +} + +""" +An enumeration. +""" +enum TransactionKind { + """ + External reference + """ + EXTERNAL + + """ + Authorization + """ + AUTH + + """ + Pending + """ + PENDING + + """ + Action to confirm + """ + ACTION_TO_CONFIRM + + """ + Refund + """ + REFUND + + """ + Refund in progress + """ + REFUND_ONGOING + + """ + Capture + """ + CAPTURE + + """ + Void + """ + VOID + + """ + Confirm + """ + CONFIRM + + """ + Cancel + """ + CANCEL +} + +union TranslatableItem = + ProductTranslatableContent + | CollectionTranslatableContent + | CategoryTranslatableContent + | AttributeTranslatableContent + | AttributeValueTranslatableContent + | ProductVariantTranslatableContent + | PageTranslatableContent + | ShippingMethodTranslatableContent + | SaleTranslatableContent + | VoucherTranslatableContent + | MenuItemTranslatableContent + +type TranslatableItemConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [TranslatableItemEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type TranslatableItemEdge { + """ + The item at the end of the edge. + """ + node: TranslatableItem! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +enum TranslatableKinds { + ATTRIBUTE + ATTRIBUTE_VALUE + CATEGORY + COLLECTION + MENU_ITEM + PAGE + PRODUCT + SALE + SHIPPING_METHOD + VARIANT + VOUCHER +} + +type TranslationError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: TranslationErrorCode! +} + +""" +An enumeration. +""" +enum TranslationErrorCode { + GRAPHQL_ERROR + NOT_FOUND + REQUIRED +} + +input TranslationInput { + seoTitle: String + seoDescription: String + name: String + description: JSONString +} + +scalar UUID + +input UpdateInvoiceInput { + """ + Invoice number + """ + number: String + + """ + URL of an invoice to download. + """ + url: String +} + +""" +Updates metadata of an object. +""" +type UpdateMetadata { + metadataErrors: [MetadataError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Updates private metadata of an object. +""" +type UpdatePrivateMetadata { + metadataErrors: [MetadataError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Variables of this type must be set to null in mutations. They will be replaced with a filename from a following multipart part containing a binary file. See: https://github.com/jaydenseric/graphql-multipart-request-spec. +""" +scalar Upload + +type UploadError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: UploadErrorCode! +} + +""" +An enumeration. +""" +enum UploadErrorCode { + GRAPHQL_ERROR +} + +""" +Represents user data. +""" +type User implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + lastLogin: DateTime + email: String! + firstName: String! + lastName: String! + isStaff: Boolean! + isActive: Boolean! + + """ + A note about the customer. + """ + note: String + dateJoined: DateTime! + defaultShippingAddress: Address + defaultBillingAddress: Address + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! + + """ + List of all user's addresses. + """ + addresses: [Address] + + """ + Returns the last open checkout of this user. + """ + checkout: Checkout + @deprecated(reason: "Will be removed in Saleor 4.0. Use the `checkout_tokens` field to fetch the user checkouts.") + + """ + Returns the checkout UUID's assigned to this user. + """ + checkoutTokens( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): [UUID!] + + """ + List of the user gift cards. + """ + giftCards( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): GiftCardCountableConnection + + """ + List of user's orders. + """ + orders( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): OrderCountableConnection + + """ + List of user's permissions. + """ + userPermissions: [UserPermission] + + """ + List of user's permission groups. + """ + permissionGroups: [Group] + + """ + List of user's permission groups which user can manage. + """ + editableGroups: [Group] + avatar( + """ + Size of the avatar. + """ + size: Int + ): Image + + """ + List of events associated with the user. + """ + events: [CustomerEvent] + + """ + List of stored payment sources. + """ + storedPaymentSources( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): [PaymentSource] + + """ + User language code. + """ + languageCode: LanguageCodeEnum! +} + +""" +Deletes a user avatar. Only for staff members. +""" +type UserAvatarDelete { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Create a user avatar. Only for staff members. This mutation must be sent as a `multipart` request. More detailed specs of the upload format can be found here: https://github.com/jaydenseric/graphql-multipart-request-spec +""" +type UserAvatarUpdate { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +Activate or deactivate users. +""" +type UserBulkSetActive { + """ + Returns how many objects were affected. + """ + count: Int! + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +type UserCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [UserCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type UserCountableEdge { + """ + The item at the end of the edge. + """ + node: User! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +input UserCreateInput { + """ + Billing address of the customer. + """ + defaultBillingAddress: AddressInput + + """ + Shipping address of the customer. + """ + defaultShippingAddress: AddressInput + + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + The unique email address of the user. + """ + email: String + + """ + User account is active. + """ + isActive: Boolean + + """ + A note about the user. + """ + note: String + + """ + User language code. + """ + languageCode: LanguageCodeEnum + + """ + URL of a view where users should be redirected to set the password. URL in RFC 1808 format. + """ + redirectUrl: String + + """ + Slug of a channel which will be used for notify user. Optional when only one channel exists. + """ + channel: String +} + +type UserPermission { + """ + Internal code for permission. + """ + code: PermissionEnum! + + """ + Describe action(s) allowed to do by permission. + """ + name: String! + + """ + List of user permission groups which contains this permission. + """ + sourcePermissionGroups( + """ + ID of user whose groups should be returned. + """ + userId: ID! + ): [Group!] +} + +enum UserSortField { + """ + Sort users by first name. + """ + FIRST_NAME + + """ + Sort users by last name. + """ + LAST_NAME + + """ + Sort users by email. + """ + EMAIL + + """ + Sort users by order count. + """ + ORDER_COUNT +} + +input UserSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort users by the selected field. + """ + field: UserSortField! +} + +""" +Represents a VAT rate for a country. +""" +type VAT { + """ + Country code. + """ + countryCode: String! + + """ + Standard VAT rate in percent. + """ + standardRate: Float + + """ + Country's VAT rate exceptions for specific types of goods. + """ + reducedRates: [ReducedRate]! +} + +enum VariantAttributeScope { + ALL + VARIANT_SELECTION + NOT_VARIANT_SELECTION +} + +""" +Assign an media to a product variant. +""" +type VariantMediaAssign { + productVariant: ProductVariant + media: ProductMedia + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Unassign an media from a product variant. +""" +type VariantMediaUnassign { + productVariant: ProductVariant + media: ProductMedia + productErrors: [ProductError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [ProductError!]! +} + +""" +Represents availability of a variant in the storefront. +""" +type VariantPricingInfo { + """ + Whether it is in sale or not. + """ + onSale: Boolean + + """ + The discount amount if in sale (null otherwise). + """ + discount: TaxedMoney + + """ + The discount amount in the local currency. + """ + discountLocalCurrency: TaxedMoney + + """ + The price, with any discount subtracted. + """ + price: TaxedMoney + + """ + The price without any discount. + """ + priceUndiscounted: TaxedMoney + + """ + The discounted price in the local currency. + """ + priceLocalCurrency: TaxedMoney +} + +""" +Verify JWT token. +""" +type VerifyToken { + """ + User assigned to token. + """ + user: User + + """ + Determine if token is valid or not. + """ + isValid: Boolean! + + """ + JWT payload. + """ + payload: GenericScalar + accountErrors: [AccountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [AccountError!]! +} + +""" +An enumeration. +""" +enum VolumeUnitsEnum { + CUBIC_MILLIMETER + CUBIC_CENTIMETER + CUBIC_DECIMETER + CUBIC_METER + LITER + CUBIC_FOOT + CUBIC_INCH + CUBIC_YARD + QT + PINT + FL_OZ + ACRE_IN + ACRE_FT +} + +""" +Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. +""" +type Voucher implements Node { + """ + The ID of the object. + """ + id: ID! + name: String + + """ + Determines a type of voucher. + """ + type: VoucherTypeEnum! + code: String! + usageLimit: Int + used: Int! + startDate: DateTime! + endDate: DateTime + applyOncePerOrder: Boolean! + applyOncePerCustomer: Boolean! + + """ + Determines a type of discount for voucher - value or percentage + """ + discountValueType: DiscountValueTypeEnum! + minCheckoutItemsQuantity: Int + + """ + List of categories this voucher applies to. + """ + categories( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CategoryCountableConnection + + """ + List of collections this voucher applies to. + """ + collections( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): CollectionCountableConnection + + """ + List of products this voucher applies to. + """ + products( + """ + Return the elements in the list that come before the specified cursor. + """ + before: String + + """ + Return the elements in the list that come after the specified cursor. + """ + after: String + + """ + Return the first n elements from the list. + """ + first: Int + + """ + Return the last n elements from the list. + """ + last: Int + ): ProductCountableConnection + + """ + List of countries available for the shipping voucher. + """ + countries: [CountryDisplay] + + """ + Returns translated voucher fields for the given language code. + """ + translation( + """ + A language code to return the translation for voucher. + """ + languageCode: LanguageCodeEnum! + ): VoucherTranslation + + """ + Voucher value. + """ + discountValue: Float + + """ + Currency code for voucher. + """ + currency: String + + """ + Minimum order value to apply voucher. + """ + minSpent: Money + + """ + List of availability in channels for the voucher. + """ + channelListings: [VoucherChannelListing!] +} + +""" +Adds products, categories, collections to a voucher. +""" +type VoucherAddCatalogues { + """ + Voucher of which catalogue IDs will be modified. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +""" +Deletes vouchers. +""" +type VoucherBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +""" +Represents voucher channel listing. +""" +type VoucherChannelListing implements Node { + """ + The ID of the object. + """ + id: ID! + channel: Channel! + discountValue: Float! + currency: String! + minSpent: Money +} + +input VoucherChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Value of the voucher. + """ + discountValue: PositiveDecimal + + """ + Min purchase amount required to apply the voucher. + """ + minAmountSpent: PositiveDecimal +} + +input VoucherChannelListingInput { + """ + List of channels to which the voucher should be assigned. + """ + addChannels: [VoucherChannelListingAddInput!] + + """ + List of channels from which the voucher should be unassigned. + """ + removeChannels: [ID!] +} + +""" +Manage voucher's availability in channels. +""" +type VoucherChannelListingUpdate { + """ + An updated voucher instance. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +type VoucherCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [VoucherCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type VoucherCountableEdge { + """ + The item at the end of the edge. + """ + node: Voucher! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates a new voucher. +""" +type VoucherCreate { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + voucher: Voucher +} + +""" +Deletes a voucher. +""" +type VoucherDelete { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + voucher: Voucher +} + +enum VoucherDiscountType { + FIXED + PERCENTAGE + SHIPPING +} + +input VoucherFilterInput { + status: [DiscountStatusEnum] + timesUsed: IntRangeInput + discountType: [VoucherDiscountType] + started: DateTimeRangeInput + search: String +} + +input VoucherInput { + """ + Voucher type: PRODUCT, CATEGORY SHIPPING or ENTIRE_ORDER. + """ + type: VoucherTypeEnum + + """ + Voucher name. + """ + name: String + + """ + Code to use the voucher. + """ + code: String + + """ + Start date of the voucher in ISO 8601 format. + """ + startDate: DateTime + + """ + End date of the voucher in ISO 8601 format. + """ + endDate: DateTime + + """ + Choices: fixed or percentage. + """ + discountValueType: DiscountValueTypeEnum + + """ + Products discounted by the voucher. + """ + products: [ID] + + """ + Collections discounted by the voucher. + """ + collections: [ID] + + """ + Categories discounted by the voucher. + """ + categories: [ID] + + """ + Minimal quantity of checkout items required to apply the voucher. + """ + minCheckoutItemsQuantity: Int + + """ + Country codes that can be used with the shipping voucher. + """ + countries: [String] + + """ + Voucher should be applied to the cheapest item or entire order. + """ + applyOncePerOrder: Boolean + + """ + Voucher should be applied once per customer. + """ + applyOncePerCustomer: Boolean + + """ + Limit number of times this voucher can be used in total. + """ + usageLimit: Int +} + +""" +Removes products, categories, collections from a voucher. +""" +type VoucherRemoveCatalogues { + """ + Voucher of which catalogue IDs will be modified. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! +} + +enum VoucherSortField { + """ + Sort vouchers by code. + """ + CODE + + """ + Sort vouchers by start date. + """ + START_DATE + + """ + Sort vouchers by end date. + """ + END_DATE + + """ + Sort vouchers by value. + """ + VALUE + + """ + Sort vouchers by type. + """ + TYPE + + """ + Sort vouchers by usage limit. + """ + USAGE_LIMIT + + """ + Sort vouchers by minimum spent amount. + """ + MINIMUM_SPENT_AMOUNT +} + +input VoucherSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + """ + channel: String + + """ + Sort vouchers by the selected field. + """ + field: VoucherSortField! +} + +type VoucherTranslatableContent implements Node { + """ + The ID of the object. + """ + id: ID! + name: String + + """ + Returns translated voucher fields for the given language code. + """ + translation( + """ + A language code to return the translation for voucher. + """ + languageCode: LanguageCodeEnum! + ): VoucherTranslation + + """ + Vouchers allow giving discounts to particular customers on categories, collections or specific products. They can be used during checkout by providing valid voucher codes. + """ + voucher: Voucher +} + +""" +Creates/Updates translations for Voucher. +""" +type VoucherTranslate { + translationErrors: [TranslationError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [TranslationError!]! + voucher: Voucher +} + +type VoucherTranslation implements Node { + """ + The ID of the object. + """ + id: ID! + name: String + + """ + Translation language. + """ + language: LanguageDisplay! +} + +enum VoucherTypeEnum { + SHIPPING + ENTIRE_ORDER + SPECIFIC_PRODUCT +} + +""" +Updates a voucher. +""" +type VoucherUpdate { + discountErrors: [DiscountError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [DiscountError!]! + voucher: Voucher +} + +""" +Represents warehouse. +""" +type Warehouse implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + name: String! + slug: String! + companyName: String! + shippingZones(before: String, after: String, first: Int, last: Int): ShippingZoneCountableConnection! + address: Address! + email: String! + + """ + List of private metadata items.Requires proper staff permissions to access. + """ + privateMetadata: [MetadataItem]! + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem]! +} + +input WarehouseAddressInput { + """ + Address. + """ + streetAddress1: String! + + """ + Address. + """ + streetAddress2: String + + """ + City. + """ + city: String! + + """ + District. + """ + cityArea: String + + """ + Postal code. + """ + postalCode: String + + """ + Country. + """ + country: CountryCode! + + """ + State or province. + """ + countryArea: String + + """ + Phone number. + """ + phone: String +} + +type WarehouseCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [WarehouseCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type WarehouseCountableEdge { + """ + The item at the end of the edge. + """ + node: Warehouse! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Creates new warehouse. +""" +type WarehouseCreate { + warehouseErrors: [WarehouseError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WarehouseError!]! + warehouse: Warehouse +} + +input WarehouseCreateInput { + """ + Warehouse slug. + """ + slug: String + + """ + Company name. + """ + companyName: String + + """ + The email address of the warehouse. + """ + email: String + + """ + Warehouse name. + """ + name: String! + + """ + Address of the warehouse. + """ + address: WarehouseAddressInput! + + """ + Shipping zones supported by the warehouse. + """ + shippingZones: [ID] +} + +""" +Deletes selected warehouse. +""" +type WarehouseDelete { + warehouseErrors: [WarehouseError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WarehouseError!]! + warehouse: Warehouse +} + +type WarehouseError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: WarehouseErrorCode! +} + +""" +An enumeration. +""" +enum WarehouseErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +input WarehouseFilterInput { + search: String + ids: [ID] +} + +""" +Add shipping zone to given warehouse. +""" +type WarehouseShippingZoneAssign { + warehouseErrors: [WarehouseError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WarehouseError!]! + warehouse: Warehouse +} + +""" +Remove shipping zone from given warehouse. +""" +type WarehouseShippingZoneUnassign { + warehouseErrors: [WarehouseError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WarehouseError!]! + warehouse: Warehouse +} + +enum WarehouseSortField { + """ + Sort warehouses by name. + """ + NAME +} + +input WarehouseSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort warehouses by the selected field. + """ + field: WarehouseSortField! +} + +""" +Updates given warehouse. +""" +type WarehouseUpdate { + warehouseErrors: [WarehouseError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WarehouseError!]! + warehouse: Warehouse +} + +input WarehouseUpdateInput { + """ + Warehouse slug. + """ + slug: String + + """ + Company name. + """ + companyName: String + + """ + The email address of the warehouse. + """ + email: String + + """ + Warehouse name. + """ + name: String + + """ + Address of the warehouse. + """ + address: WarehouseAddressInput +} + +""" +Webhook. +""" +type Webhook implements Node { + name: String! + targetUrl: String! + isActive: Boolean! + secretKey: String + + """ + The ID of the object. + """ + id: ID! + + """ + List of webhook events. + """ + events: [WebhookEvent!]! + app: App! +} + +""" +Creates a new webhook subscription. +""" +type WebhookCreate { + webhookErrors: [WebhookError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WebhookError!]! + webhook: Webhook +} + +input WebhookCreateInput { + """ + The name of the webhook. + """ + name: String + + """ + The url to receive the payload. + """ + targetUrl: String + + """ + The events that webhook wants to subscribe. + """ + events: [WebhookEventTypeEnum] + + """ + ID of the app to which webhook belongs. + """ + app: ID + + """ + Determine if webhook will be set active or not. + """ + isActive: Boolean + + """ + The secret key used to create a hash signature with each payload. + """ + secretKey: String +} + +""" +Deletes a webhook subscription. +""" +type WebhookDelete { + webhookErrors: [WebhookError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WebhookError!]! + webhook: Webhook +} + +type WebhookError { + """ + Name of a field that caused the error. A value of `null` indicates that the error isn't associated with a particular field. + """ + field: String + + """ + The error message. + """ + message: String + + """ + The error code. + """ + code: WebhookErrorCode! +} + +""" +An enumeration. +""" +enum WebhookErrorCode { + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE +} + +""" +Webhook event. +""" +type WebhookEvent { + """ + Internal name of the event type. + """ + eventType: WebhookEventTypeEnum! + + """ + Display name of the event. + """ + name: String! +} + +""" +Enum determining type of webhook. +""" +enum WebhookEventTypeEnum { + """ + All the events. + """ + ANY_EVENTS + + """ + A new order is placed. + """ + ORDER_CREATED + + """ + An order is confirmed (status change unconfirmed -> unfulfilled) by a staff user using the OrderConfirm mutation. It also triggers when the user completes the checkout and the shop setting `automatically_confirm_all_new_orders` is enabled. + """ + ORDER_CONFIRMED + + """ + Payment is made and an order is fully paid. + """ + ORDER_FULLY_PAID + + """ + An order is updated; triggered for all changes related to an order; covers all other order webhooks, except for ORDER_CREATED. + """ + ORDER_UPDATED + + """ + An order is cancelled. + """ + ORDER_CANCELLED + + """ + An order is fulfilled. + """ + ORDER_FULFILLED + + """ + An invoice for order requested. + """ + INVOICE_REQUESTED + + """ + An invoice is deleted. + """ + INVOICE_DELETED + + """ + Invoice has been sent. + """ + INVOICE_SENT + + """ + A new customer account is created. + """ + CUSTOMER_CREATED + + """ + A customer account is updated. + """ + CUSTOMER_UPDATED + + """ + A new product is created. + """ + PRODUCT_CREATED + + """ + A product is updated. + """ + PRODUCT_UPDATED + + """ + A product is deleted. + """ + PRODUCT_DELETED + + """ + A new product variant is created. + """ + PRODUCT_VARIANT_CREATED + + """ + A product variant is updated. + """ + PRODUCT_VARIANT_UPDATED + + """ + A product variant is deleted. + """ + PRODUCT_VARIANT_DELETED + + """ + A new checkout is created. + """ + CHECKOUT_CREATED + + """ + A checkout is updated. It also triggers all updates related to the checkout. + """ + CHECKOUT_UPDATED + + """ + A new fulfillment is created. + """ + FULFILLMENT_CREATED + + """ + User notification triggered. + """ + NOTIFY_USER + + """ + A new page is created. + """ + PAGE_CREATED + + """ + A page is updated. + """ + PAGE_UPDATED + + """ + A page is deleted. + """ + PAGE_DELETED +} + +""" +An enumeration. +""" +enum WebhookSampleEventTypeEnum { + ORDER_CREATED + ORDER_CONFIRMED + ORDER_FULLY_PAID + ORDER_UPDATED + ORDER_CANCELLED + ORDER_FULFILLED + INVOICE_REQUESTED + INVOICE_DELETED + INVOICE_SENT + CUSTOMER_CREATED + CUSTOMER_UPDATED + PRODUCT_CREATED + PRODUCT_UPDATED + PRODUCT_DELETED + PRODUCT_VARIANT_CREATED + PRODUCT_VARIANT_UPDATED + PRODUCT_VARIANT_DELETED + CHECKOUT_CREATED + CHECKOUT_UPDATED + FULFILLMENT_CREATED + NOTIFY_USER + PAGE_CREATED + PAGE_UPDATED + PAGE_DELETED +} + +""" +Updates a webhook subscription. +""" +type WebhookUpdate { + webhookErrors: [WebhookError!]! + @deprecated(reason: "Use errors field instead. This field will be removed in Saleor 4.0.") + errors: [WebhookError!]! + webhook: Webhook +} + +input WebhookUpdateInput { + """ + The new name of the webhook. + """ + name: String + + """ + The url to receive the payload. + """ + targetUrl: String + + """ + The events that webhook wants to subscribe. + """ + events: [WebhookEventTypeEnum] + + """ + ID of the app to which webhook belongs. + """ + app: ID + + """ + Determine if webhook will be set active or not. + """ + isActive: Boolean + + """ + Use to create a hash signature with each payload. + """ + secretKey: String +} + +""" +Represents weight value in a specific weight unit. +""" +type Weight { + """ + Weight unit. + """ + unit: WeightUnitsEnum! + + """ + Weight value. + """ + value: Float! +} + +scalar WeightScalar + +""" +An enumeration. +""" +enum WeightUnitsEnum { + G + LB + OZ + KG + TONNE +} + +""" +Anything +""" +scalar _Any + +union _Entity = + Address + | User + | Group + | App + | ProductVariant + | Product + | ProductType + | Collection + | Category + | ProductMedia + | ProductImage + | PageType + +type _Service { + sdl: String +} diff --git a/packages/saleor/src/api/cart.ts b/packages/saleor/src/api/cart.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/cart.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/catalog/products.ts b/packages/saleor/src/api/catalog/products.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/catalog/products.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/checkout.ts b/packages/saleor/src/api/checkout.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/checkout.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/customers/index.ts b/packages/saleor/src/api/customers/index.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/customers/index.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/customers/login.ts b/packages/saleor/src/api/customers/login.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/customers/login.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/customers/logout.ts b/packages/saleor/src/api/customers/logout.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/customers/logout.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/customers/signup.ts b/packages/saleor/src/api/customers/signup.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/customers/signup.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/api/endpoints/cart.ts b/packages/saleor/src/api/endpoints/cart.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/cart.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/catalog/products.ts b/packages/saleor/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/checkout/index.ts b/packages/saleor/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..2468c8d --- /dev/null +++ b/packages/saleor/src/api/endpoints/checkout/index.ts @@ -0,0 +1,53 @@ +import { CommerceAPI, GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' +import { CheckoutSchema } from '@vercel/commerce/types/checkout' + +export type CheckoutAPI = GetAPISchema + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ req, res, config }) => { + try { + const html = ` + + + + + + Checkout + + +
+ + + +

Checkout not yet implemented :(

+

+ See #64 +

+
+ + + ` + + res.status(200) + res.setHeader('Content-Type', 'text/html') + res.write(html) + res.end() + } catch (error) { + console.error(error) + + const message = 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/saleor/src/api/endpoints/customer/address.ts b/packages/saleor/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/saleor/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/customer/card.ts b/packages/saleor/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/saleor/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/customer/index.ts b/packages/saleor/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/saleor/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/saleor/src/api/endpoints/login.ts b/packages/saleor/src/api/endpoints/login.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/login.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/logout.ts b/packages/saleor/src/api/endpoints/logout.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/logout.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/signup.ts b/packages/saleor/src/api/endpoints/signup.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/signup.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/endpoints/wishlist.ts b/packages/saleor/src/api/endpoints/wishlist.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/saleor/src/api/endpoints/wishlist.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/saleor/src/api/index.ts b/packages/saleor/src/api/index.ts new file mode 100644 index 0000000..7ee17f6 --- /dev/null +++ b/packages/saleor/src/api/index.ts @@ -0,0 +1,38 @@ +import { CommerceAPI, CommerceAPIConfig, getCommerceApi as commerceApi } from '@vercel/commerce/api' +import * as operations from './operations' +import * as Const from '../const' + +if (!Const.API_URL) { + throw new Error(`The environment variable NEXT_SALEOR_API_URL is missing and it's required to access your store`) +} + +if (!Const.API_CHANNEL) { + throw new Error(`The environment variable NEXT_SALEOR_CHANNEL is missing and it's required to access your store`) +} + +import fetchGraphqlApi from './utils/fetch-graphql-api' + +export interface SaleorConfig extends CommerceAPIConfig { + storeChannel: string +} + +const config: SaleorConfig = { + locale: 'en-US', + commerceUrl: Const.API_URL, + apiToken: Const.SALEOR_TOKEN, + cartCookie: Const.CHECKOUT_ID_COOKIE, + cartCookieMaxAge: 60 * 60 * 24 * 30, + fetch: fetchGraphqlApi, + customerCookie: '', + storeChannel: Const.API_CHANNEL, +} + +export const provider = { config, operations } + +export type Provider = typeof provider + +export type SaleorAPI

= CommerceAPI

+ +export function getCommerceApi

(customProvider: P = provider as any): SaleorAPI

{ + return commerceApi(customProvider) +} diff --git a/packages/saleor/src/api/operations/get-all-pages.ts b/packages/saleor/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..37f2e3a --- /dev/null +++ b/packages/saleor/src/api/operations/get-all-pages.ts @@ -0,0 +1,47 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' + +import { QueryPagesArgs, PageCountableEdge } from '../../../schema' +import type { SaleorConfig, Provider } from '..' +import * as Query from '../../utils/queries' + +export type Page = any + +export type GetAllPagesResult = T + +export default function getAllPagesOperation({ commerce }: OperationContext) { + async function getAllPages({ + query = Query.PageMany, + config, + variables, + }: { + url?: string + config?: Partial + variables?: QueryPagesArgs + preview?: boolean + query?: string + } = {}): Promise { + const { fetch, locale, locales = ['en-US'] } = commerce.getConfig(config) + + const { data } = await fetch( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + const pages = data.pages?.edges?.map(({ node: { title: name, slug, ...node } }: PageCountableEdge) => ({ + ...node, + url: `/${locale}/${slug}`, + name, + })) + + return { pages } + } + + return getAllPages +} diff --git a/packages/saleor/src/api/operations/get-all-product-paths.ts b/packages/saleor/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..66e8f95 --- /dev/null +++ b/packages/saleor/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,38 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import { ProductCountableEdge } from '../../../schema' +import type { Provider, SaleorConfig } from '..' + +import { getAllProductsPathsQuery } from '../../utils/queries' +import fetchAllProducts from '../utils/fetch-all-products' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation({ commerce }: OperationContext) { + async function getAllProductPaths({ + query, + config, + variables, + }: { + query?: string + config?: SaleorConfig + variables?: any + } = {}): Promise { + config = commerce.getConfig(config) + + const products = await fetchAllProducts({ + config, + query: getAllProductsPathsQuery, + variables, + }) + + return { + products: products?.map(({ node: { slug } }: ProductCountableEdge) => ({ + path: `/${slug}`, + })), + } + } + + return getAllProductPaths +} diff --git a/packages/saleor/src/api/operations/get-all-products.ts b/packages/saleor/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..f7982ad --- /dev/null +++ b/packages/saleor/src/api/operations/get-all-products.ts @@ -0,0 +1,64 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import { Product } from '@vercel/commerce/types/product' + +import { ProductCountableEdge } from '../../../schema' +import type { Provider, SaleorConfig } from '..' +import { normalizeProduct } from '../../utils' + +import * as Query from '../../utils/queries' +import { GraphQLFetcherResult } from '@vercel/commerce/api' + +type ReturnType = { + products: Product[] +} + +export default function getAllProductsOperation({ commerce }: OperationContext) { + async function getAllProducts({ + query = Query.ProductMany, + variables, + config, + featured, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + featured?: boolean + } = {}): Promise { + const { fetch, locale } = commerce.getConfig(config) + + if (featured) { + variables = { ...variables, categoryId: 'Q29sbGVjdGlvbjo0' } + query = Query.CollectionOne + } + + const { data }: GraphQLFetcherResult = await fetch( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + if (featured) { + const products = + data.collection.products?.edges?.map(({ node: p }: ProductCountableEdge) => normalizeProduct(p)) ?? [] + + return { + products, + } + } else { + const products = data.products?.edges?.map(({ node: p }: ProductCountableEdge) => normalizeProduct(p)) ?? [] + + return { + products, + } + } + } + + return getAllProducts +} diff --git a/packages/saleor/src/api/operations/get-page.ts b/packages/saleor/src/api/operations/get-page.ts new file mode 100644 index 0000000..bab9d92 --- /dev/null +++ b/packages/saleor/src/api/operations/get-page.ts @@ -0,0 +1,50 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Provider, SaleorConfig } from '..' +import { QueryPageArgs } from '../../../schema' + +import * as Query from '../../utils/queries' + +export type Page = any + +export type GetPageResult = T + +export default function getPageOperation({ commerce }: OperationContext) { + async function getPage({ + query = Query.PageOne, + variables, + config, + }: { + query?: string + variables: QueryPageArgs + config?: Partial + preview?: boolean + }): Promise { + const { fetch, locale = 'en-US' } = commerce.getConfig(config) + + const { + data: { page }, + } = await fetch( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return { + page: page + ? { + ...page, + name: page.title, + url: `/${locale}/${page.slug}`, + } + : null, + } + } + + return getPage +} diff --git a/packages/saleor/src/api/operations/get-product.ts b/packages/saleor/src/api/operations/get-product.ts new file mode 100644 index 0000000..5a33dec --- /dev/null +++ b/packages/saleor/src/api/operations/get-product.ts @@ -0,0 +1,46 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import { normalizeProduct } from '../../utils' +import type { Provider, SaleorConfig } from '..' + +import * as Query from '../../utils/queries' + +type Variables = { + slug: string +} + +type ReturnType = { + product: any +} + +export default function getProductOperation({ commerce }: OperationContext) { + async function getProduct({ + query = Query.ProductOneBySlug, + variables, + config: cfg, + }: { + query?: string + variables: Variables + config?: Partial + preview?: boolean + }): Promise { + const { fetch, locale } = commerce.getConfig(cfg) + + const { data } = await fetch( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return { + product: data?.product ? normalizeProduct(data.product) : null, + } + } + + return getProduct +} diff --git a/packages/saleor/src/api/operations/get-site-info.ts b/packages/saleor/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..6ce7408 --- /dev/null +++ b/packages/saleor/src/api/operations/get-site-info.ts @@ -0,0 +1,35 @@ +import type { OperationContext } from '@vercel/commerce/api/operations' +import { Category } from '@vercel/commerce/types/site' +import type { SaleorConfig, Provider } from '..' + +import { getCategories, getVendors } from '../../utils' + +interface GetSiteInfoResult { + categories: Category[] + brands: any[] +} + +export default function getSiteInfoOperation({ commerce }: OperationContext) { + async function getSiteInfo({ + query, + config, + variables, + }: { + query?: string + config?: Partial + preview?: boolean + variables?: any + } = {}): Promise { + const cfg = commerce.getConfig(config) + + const categories = await getCategories(cfg) + const brands = await getVendors(cfg) + + return { + categories, + brands, + } + } + + return getSiteInfo +} diff --git a/packages/saleor/src/api/operations/index.ts b/packages/saleor/src/api/operations/index.ts new file mode 100644 index 0000000..7872a20 --- /dev/null +++ b/packages/saleor/src/api/operations/index.ts @@ -0,0 +1,7 @@ +export { default as getAllPages } from './get-all-pages' +export { default as getPage } from './get-page' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' +export { default as getProduct } from './get-product' +export { default as getSiteInfo } from './get-site-info' +export { default as login } from './login' diff --git a/packages/saleor/src/api/operations/login.ts b/packages/saleor/src/api/operations/login.ts new file mode 100644 index 0000000..76d1e78 --- /dev/null +++ b/packages/saleor/src/api/operations/login.ts @@ -0,0 +1,40 @@ +import type { ServerResponse } from 'http' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Provider, SaleorConfig } from '..' +import { throwUserErrors } from '../../utils' + +import * as Mutation from '../../utils/mutations' + +export default function loginOperation({ commerce }: OperationContext) { + async function login({ + query = Mutation.SessionCreate, + variables, + config, + }: { + query?: string + variables: any + res: ServerResponse + config?: SaleorConfig + }): Promise { + config = commerce.getConfig(config) + + const { + data: { customerAccessTokenCreate }, + } = await config.fetch(query, { variables }) + + throwUserErrors(customerAccessTokenCreate?.customerUserErrors) + + const customerAccessToken = customerAccessTokenCreate?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + // if (accessToken) { + // setCustomerToken(accessToken) + // } + + return { + result: customerAccessToken?.accessToken, + } + } + + return login +} diff --git a/packages/saleor/src/api/utils/fetch-all-products.ts b/packages/saleor/src/api/utils/fetch-all-products.ts new file mode 100644 index 0000000..761e127 --- /dev/null +++ b/packages/saleor/src/api/utils/fetch-all-products.ts @@ -0,0 +1,41 @@ +import { ProductCountableEdge } from '../../../schema' +import { SaleorConfig } from '..' + +const fetchAllProducts = async ({ + config, + query, + variables, + acc = [], + cursor, +}: { + config: SaleorConfig + query: string + acc?: ProductCountableEdge[] + variables?: any + cursor?: string +}): Promise => { + const { data } = await config.fetch(query, { + variables: { ...variables, cursor }, + }) + + const edges: ProductCountableEdge[] = data.products?.edges ?? [] + const hasNextPage = data.products?.pageInfo?.hasNextPage + acc = acc.concat(edges) + + if (hasNextPage) { + const cursor = edges.pop()?.cursor + if (cursor) { + return fetchAllProducts({ + config, + query, + variables, + acc, + cursor, + }) + } + } + + return acc +} + +export default fetchAllProducts diff --git a/packages/saleor/src/api/utils/fetch-graphql-api.ts b/packages/saleor/src/api/utils/fetch-graphql-api.ts new file mode 100644 index 0000000..de4d45a --- /dev/null +++ b/packages/saleor/src/api/utils/fetch-graphql-api.ts @@ -0,0 +1,37 @@ +import type { GraphQLFetcher } from '@vercel/commerce/api' +import fetch from './fetch' + +import { API_URL } from '../../const' +import { getError } from '../../utils/handle-fetch-response' +import { getCommerceApi } from '..' +import { getToken } from '../../utils/index' + +const fetchGraphqlApi: GraphQLFetcher = async (query: string, { variables } = {}, fetchOptions) => { + const config = getCommerceApi().getConfig() + const token = getToken() + + const res = await fetch(API_URL!, { + ...fetchOptions, + method: 'POST', + headers: { + ...(token && { + Authorization: `Bearer ${token}`, + }), + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const { data, errors, status } = await res.json() + + if (errors) { + throw getError(errors, status) + } + + return { data, res } +} +export default fetchGraphqlApi diff --git a/packages/saleor/src/api/utils/fetch.ts b/packages/saleor/src/api/utils/fetch.ts new file mode 100644 index 0000000..0b83671 --- /dev/null +++ b/packages/saleor/src/api/utils/fetch.ts @@ -0,0 +1,2 @@ +import zeitFetch from '@vercel/fetch' +export default zeitFetch() diff --git a/packages/saleor/src/api/utils/is-allowed-method.ts b/packages/saleor/src/api/utils/is-allowed-method.ts new file mode 100644 index 0000000..cbaab22 --- /dev/null +++ b/packages/saleor/src/api/utils/is-allowed-method.ts @@ -0,0 +1,22 @@ +import type { NextApiRequest, NextApiResponse } from 'next' + +export default function isAllowedMethod(req: NextApiRequest, res: NextApiResponse, allowedMethods: string[]) { + const methods = allowedMethods.includes('OPTIONS') ? allowedMethods : [...allowedMethods, 'OPTIONS'] + + if (!req.method || !methods.includes(req.method)) { + res.status(405) + res.setHeader('Allow', methods.join(', ')) + res.end() + return false + } + + if (req.method === 'OPTIONS') { + res.status(200) + res.setHeader('Allow', methods.join(', ')) + res.setHeader('Content-Length', '0') + res.end() + return false + } + + return true +} diff --git a/packages/saleor/src/api/wishlist.ts b/packages/saleor/src/api/wishlist.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/saleor/src/api/wishlist.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/saleor/src/auth/use-login.tsx b/packages/saleor/src/auth/use-login.tsx new file mode 100644 index 0000000..33f95da --- /dev/null +++ b/packages/saleor/src/auth/use-login.tsx @@ -0,0 +1,63 @@ +import { useCallback } from 'react' + +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useCustomer from '../customer/use-customer' +import * as mutation from '../utils/mutations' +import { Mutation, MutationTokenCreateArgs } from '../../schema' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import { setCSRFToken, setToken, throwUserErrors, checkoutAttach, getCheckoutId } from '../utils' +import { LoginHook } from '@vercel/commerce/types/login' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: mutation.SessionCreate, + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'A first name, last name, email and password are required to login', + }) + } + + const { tokenCreate } = await fetch({ + ...options, + variables: { email, password }, + }) + + throwUserErrors(tokenCreate?.errors) + + const { token, csrfToken } = tokenCreate! + + if (token && csrfToken) { + setToken(token) + setCSRFToken(csrfToken) + + const { checkoutId } = getCheckoutId() + checkoutAttach(fetch, { + variables: { checkoutId }, + headers: { + Authorization: `JWT ${token}`, + }, + }) + } + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/auth/use-logout.tsx b/packages/saleor/src/auth/use-logout.tsx new file mode 100644 index 0000000..396cb47 --- /dev/null +++ b/packages/saleor/src/auth/use-logout.tsx @@ -0,0 +1,41 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import useCustomer from '../customer/use-customer' +import * as mutation from '../utils/mutations' +import { setCSRFToken, setToken, setCheckoutToken } from '../utils/customer-token' +import { LogoutHook } from '@vercel/commerce/types/logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: mutation.SessionDestroy, + }, + async fetcher({ options, fetch }) { + await fetch({ + ...options, + variables: {}, + }) + + setToken() + setCSRFToken() + setCheckoutToken() + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/auth/use-signup.tsx b/packages/saleor/src/auth/use-signup.tsx new file mode 100644 index 0000000..e29ee3b --- /dev/null +++ b/packages/saleor/src/auth/use-signup.tsx @@ -0,0 +1,56 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import useCustomer from '../customer/use-customer' +import { AccountRegisterInput, Mutation, MutationAccountRegisterArgs } from '../../schema' + +import * as mutation from '../utils/mutations' +import { handleAutomaticLogin, throwUserErrors } from '../utils' +import { SignupHook } from '@vercel/commerce/types/signup' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: mutation.AccountCreate, + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'A first name, last name, email and password are required to signup', + }) + } + + const { customerCreate } = await fetch({ + ...options, + variables: { + input: { + email, + password, + redirectUrl: 'https://localhost.com', + channel: 'default-channel', + }, + }, + }) + + throwUserErrors(customerCreate?.errors) + await handleAutomaticLogin(fetch, { email, password }) + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/cart/index.ts b/packages/saleor/src/cart/index.ts new file mode 100644 index 0000000..f6d36b4 --- /dev/null +++ b/packages/saleor/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useUpdateItem } from './use-update-item' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/saleor/src/cart/use-add-item.tsx b/packages/saleor/src/cart/use-add-item.tsx new file mode 100644 index 0000000..2db0702 --- /dev/null +++ b/packages/saleor/src/cart/use-add-item.tsx @@ -0,0 +1,54 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import useCart from './use-cart' + +import * as mutation from '../utils/mutations' + +import { getCheckoutId, checkoutToCart } from '../utils' + +import { Mutation, MutationCheckoutLinesAddArgs } from '../../schema' +import { AddItemHook } from '@vercel/commerce/types/cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { query: mutation.CheckoutLineAdd }, + async fetcher({ input: item, options, fetch }) { + if (item.quantity && (!Number.isInteger(item.quantity) || item.quantity! < 1)) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const { checkoutLinesAdd } = await fetch({ + ...options, + variables: { + checkoutId: getCheckoutId().checkoutId, + lineItems: [ + { + variantId: item.variantId, + quantity: item.quantity ?? 1, + }, + ], + }, + }) + + return checkoutToCart(checkoutLinesAdd) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/cart/use-cart.tsx b/packages/saleor/src/cart/use-cart.tsx new file mode 100644 index 0000000..9360875 --- /dev/null +++ b/packages/saleor/src/cart/use-cart.tsx @@ -0,0 +1,53 @@ +import { useMemo } from 'react' +import useCommerceCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +import { SWRHook } from '@vercel/commerce/utils/types' +import { checkoutCreate, checkoutToCart, getCheckoutId } from '../utils' +import * as query from '../utils/queries' +import { GetCartHook } from '@vercel/commerce/types/cart' + +export default useCommerceCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: query.CheckoutOne, + }, + async fetcher({ input: { cartId: checkoutId }, options, fetch }) { + let checkout + + if (checkoutId) { + const checkoutId = getCheckoutId().checkoutToken + const data = await fetch({ + ...options, + variables: { checkoutId }, + }) + + checkout = data + } + + if (checkout?.completedAt || !checkoutId) { + checkout = await checkoutCreate(fetch) + } + + return checkoutToCart(checkout) + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/saleor/src/cart/use-remove-item.tsx b/packages/saleor/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..09d1aca --- /dev/null +++ b/packages/saleor/src/cart/use-remove-item.tsx @@ -0,0 +1,39 @@ +import { useCallback } from 'react' +import type { MutationHookContext, HookFetcherContext, MutationHook } from '@vercel/commerce/utils/types' +import useRemoveItem, { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import useCart from './use-cart' +import * as mutation from '../utils/mutations' +import { getCheckoutId, checkoutToCart } from '../utils' +import { Mutation, MutationCheckoutLineDeleteArgs } from '../../schema' +import { LineItem, RemoveItemHook } from '../types/cart' + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { query: mutation.CheckoutLineDelete }, + async fetcher({ input: { itemId }, options, fetch }: HookFetcherContext) { + const data = await fetch({ + ...options, + variables: { + checkoutId: getCheckoutId().checkoutId, + lineId: itemId, + }, + }) + return checkoutToCart(data.checkoutLineDelete) + }, + useHook: + ({ fetch }: MutationHookContext) => + () => { + const { mutate } = useCart() + + return useCallback( + async function removeItem(input) { + const data = await fetch({ input: { itemId: input.id } }) + await mutate(data, false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/cart/use-update-item.tsx b/packages/saleor/src/cart/use-update-item.tsx new file mode 100644 index 0000000..ffca9b2 --- /dev/null +++ b/packages/saleor/src/cart/use-update-item.tsx @@ -0,0 +1,96 @@ +import { useCallback } from 'react' +import debounce from 'lodash.debounce' +import type { HookFetcherContext, MutationHookContext } from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { UseUpdateItem } from '@vercel/commerce/cart/use-update-item' + +import useCart from './use-cart' +import { handler as removeItemHandler } from './use-remove-item' +import type { LineItem } from '../types' +import { checkoutToCart } from '../utils' +import { getCheckoutId } from '../utils' +import { Mutation, MutationCheckoutLinesUpdateArgs } from '../../schema' + +import * as mutation from '../utils/mutations' + +import type { UpdateItemHook } from '../types/cart' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler = { + fetchOptions: { query: mutation.CheckoutLineUpdate }, + async fetcher({ input: { itemId, item }, options, fetch }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + + const checkoutId = getCheckoutId().checkoutId + const { checkoutLinesUpdate } = await fetch({ + ...options, + variables: { + checkoutId, + lineItems: [ + { + variantId: item.variantId, + quantity: item.quantity, + }, + ], + }, + }) + + return checkoutToCart(checkoutLinesUpdate) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + item: { + productId, + variantId, + quantity: input.quantity, + }, + itemId, + }, + }) + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/saleor/src/checkout/use-checkout.tsx b/packages/saleor/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..cab52bb --- /dev/null +++ b/packages/saleor/src/checkout/use-checkout.tsx @@ -0,0 +1,14 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { UseCheckout } from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/saleor/src/commerce.config.json b/packages/saleor/src/commerce.config.json new file mode 100644 index 0000000..eddd306 --- /dev/null +++ b/packages/saleor/src/commerce.config.json @@ -0,0 +1,6 @@ +{ + "provider": "saleor", + "features": { + "wishlist": false + } +} diff --git a/packages/saleor/src/const.ts b/packages/saleor/src/const.ts new file mode 100644 index 0000000..df34877 --- /dev/null +++ b/packages/saleor/src/const.ts @@ -0,0 +1,5 @@ +export const API_URL = process.env.NEXT_PUBLIC_SALEOR_API_URL +export const API_CHANNEL = process.env.NEXT_PUBLIC_SALEOR_CHANNEL +export const CHECKOUT_ID_COOKIE = 'saleor.CheckoutID' +export const SALEOR_TOKEN = 'saleor.Token' +export const SALEOR_CRSF_TOKEN = 'saleor.CSRFToken' diff --git a/packages/saleor/src/customer/address/use-add-item.tsx b/packages/saleor/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..fabd11b --- /dev/null +++ b/packages/saleor/src/customer/address/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/saleor/src/customer/card/use-add-item.tsx b/packages/saleor/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..938e6cd --- /dev/null +++ b/packages/saleor/src/customer/card/use-add-item.tsx @@ -0,0 +1,15 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/saleor/src/customer/index.ts b/packages/saleor/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/saleor/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/saleor/src/customer/use-customer.tsx b/packages/saleor/src/customer/use-customer.tsx new file mode 100644 index 0000000..8417938 --- /dev/null +++ b/packages/saleor/src/customer/use-customer.tsx @@ -0,0 +1,30 @@ +import useCustomer, { UseCustomer } from '@vercel/commerce/customer/use-customer' +import { CustomerHook } from '@vercel/commerce/types/customer' +import { SWRHook } from '@vercel/commerce/utils/types' + +import * as query from '../utils/queries' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + query: query.CustomerCurrent, + }, + async fetcher({ options, fetch }) { + const data = await fetch({ + ...options, + variables: {}, + }) + return data.me ?? null + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/saleor/src/fetcher.ts b/packages/saleor/src/fetcher.ts new file mode 100644 index 0000000..c1be921 --- /dev/null +++ b/packages/saleor/src/fetcher.ts @@ -0,0 +1,20 @@ +import { Fetcher } from '@vercel/commerce/utils/types' +import { API_URL } from './const' +import { getToken, handleFetchResponse } from './utils' + +const fetcher: Fetcher = async ({ url = API_URL, method = 'POST', variables, query }) => { + const token = getToken() + + return handleFetchResponse( + await fetch(url!, { + method, + body: JSON.stringify({ query, variables }), + headers: { + Authorization: `JWT ${token}`, + 'Content-Type': 'application/json', + }, + }) + ) +} + +export default fetcher diff --git a/packages/saleor/src/index.tsx b/packages/saleor/src/index.tsx new file mode 100644 index 0000000..cf9aaf6 --- /dev/null +++ b/packages/saleor/src/index.tsx @@ -0,0 +1,9 @@ +import { getCommerceProvider, useCommerce as useCoreCommerce } from '@vercel/commerce' +import { saleorProvider, SaleorProvider } from './provider' + +export { saleorProvider } +export type { SaleorProvider } + +export const CommerceProvider = getCommerceProvider(saleorProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/saleor/src/next.config.cjs b/packages/saleor/src/next.config.cjs new file mode 100644 index 0000000..397a37b --- /dev/null +++ b/packages/saleor/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: [process.env.COMMERCE_IMAGE_HOST], + }, +} diff --git a/packages/saleor/src/product/use-price.tsx b/packages/saleor/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/saleor/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/saleor/src/product/use-search.tsx b/packages/saleor/src/product/use-search.tsx new file mode 100644 index 0000000..69212cb --- /dev/null +++ b/packages/saleor/src/product/use-search.tsx @@ -0,0 +1,74 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import { Product } from '@vercel/commerce/types/product' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' + +import { ProductCountableEdge } from '../../schema' +import { getSearchVariables, normalizeProduct } from '../utils' + +import * as query from '../utils/queries' +import { SearchProductsHook } from '@vercel/commerce/types/product' + +export default useSearch as UseSearch + +export type SearchProductsInput = { + search?: string + categoryId?: string | number + brandId?: string | number + sort?: string +} + +export type SearchProductsData = { + products: Product[] + found: boolean +} + +export const handler: SWRHook = { + fetchOptions: { + query: query.ProductMany, + }, + async fetcher({ input, options, fetch }) { + const { categoryId, brandId } = input + + const data = await fetch({ + query: categoryId ? query.CollectionOne : options.query, + method: options?.method, + variables: getSearchVariables(input), + }) + + let edges + + if (categoryId) { + edges = data.collection?.products?.edges ?? [] + // FIXME @zaiste, no `vendor` in Saleor + // if (brandId) { + // edges = edges.filter( + // ({ node: { vendor } }: ProductCountableEdge) => + // vendor.replace(/\s+/g, '-').toLowerCase() === brandId + // ) + // } + } else { + edges = data.products?.edges ?? [] + } + + return { + products: edges.map(({ node }: ProductCountableEdge) => normalizeProduct(node)), + found: !!edges.length, + } + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/saleor/src/provider.ts b/packages/saleor/src/provider.ts new file mode 100644 index 0000000..becf299 --- /dev/null +++ b/packages/saleor/src/provider.ts @@ -0,0 +1,26 @@ +import { CHECKOUT_ID_COOKIE } from './const' +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import fetcher from './fetcher' + +export const saleorProvider = { + locale: 'en-us', + cartCookie: CHECKOUT_ID_COOKIE, + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type SaleorProvider = typeof saleorProvider diff --git a/packages/saleor/src/types.ts b/packages/saleor/src/types.ts new file mode 100644 index 0000000..1bbf94c --- /dev/null +++ b/packages/saleor/src/types.ts @@ -0,0 +1,43 @@ +import type { Cart as CoreCart } from '@vercel/commerce/types' +import { CheckoutLine } from '../schema' + +export type SaleorCheckout = { + id: string + webUrl: string + lineItems: CheckoutLine[] +} + +export type Cart = CoreCart.Cart & { + lineItems: LineItem[] +} +export interface LineItem extends CoreCart.LineItem { + options?: any[] +} + +/** + * Cart mutations + */ + +export type OptionSelections = { + option_id: number + option_value: number | string +} + +export type CartItemBody = CoreCart.CartItemBody & { + productId: string // The product id is always required for BC + optionSelections?: OptionSelections +} + +// export type GetCartHandlerBody = CoreCart.GetCartHandlerBody + +// export type AddCartItemBody = Core.AddCartItemBody + +// export type AddCartItemHandlerBody = Core.AddCartItemHandlerBody + +// export type UpdateCartItemBody = Core.UpdateCartItemBody + +// export type UpdateCartItemHandlerBody = Core.UpdateCartItemHandlerBody + +// export type RemoveCartItemBody = Core.RemoveCartItemBody + +// export type RemoveCartItemHandlerBody = Core.RemoveCartItemHandlerBody diff --git a/packages/saleor/src/types/cart.ts b/packages/saleor/src/types/cart.ts new file mode 100644 index 0000000..9a4d293 --- /dev/null +++ b/packages/saleor/src/types/cart.ts @@ -0,0 +1,32 @@ +import * as Core from '@vercel/commerce/types/cart' + +export * from '@vercel/commerce/types/cart' + +export type SaleorCart = {} + +/** + * Extend core cart types + */ + +export type Cart = Core.Cart & { + lineItems: Core.LineItem[] + url?: string +} + +export type CartTypes = Core.CartTypes + +export type CartHooks = Core.CartHooks + +export type GetCartHook = CartHooks['getCart'] +export type AddItemHook = CartHooks['addItem'] +export type UpdateItemHook = CartHooks['updateItem'] +export type RemoveItemHook = CartHooks['removeItem'] + +export type CartSchema = Core.CartSchema + +export type CartHandlers = Core.CartHandlers + +export type GetCartHandler = CartHandlers['getCart'] +export type AddItemHandler = CartHandlers['addItem'] +export type UpdateItemHandler = CartHandlers['updateItem'] +export type RemoveItemHandler = CartHandlers['removeItem'] diff --git a/packages/saleor/src/utils/checkout-attach.ts b/packages/saleor/src/utils/checkout-attach.ts new file mode 100644 index 0000000..c7ab44a --- /dev/null +++ b/packages/saleor/src/utils/checkout-attach.ts @@ -0,0 +1,12 @@ +import * as mutation from './mutations' +import { CheckoutCustomerAttach } from '../../schema' + +export const checkoutAttach = async (fetch: any, { variables, headers }: any): Promise => { + const data = await fetch({ + query: mutation.CheckoutAttach, + variables, + headers, + }) + + return data +} diff --git a/packages/saleor/src/utils/checkout-create.ts b/packages/saleor/src/utils/checkout-create.ts new file mode 100644 index 0000000..0e86c13 --- /dev/null +++ b/packages/saleor/src/utils/checkout-create.ts @@ -0,0 +1,25 @@ +import Cookies from 'js-cookie' + +import * as mutation from './mutations' +import { CheckoutCreate } from '../../schema' +import { CHECKOUT_ID_COOKIE } from '../const' + +export const checkoutCreate = async (fetch: any): Promise => { + const data = await fetch({ query: mutation.CheckoutCreate }) + const checkout = data.checkoutCreate?.checkout + const checkoutId = checkout?.id + const checkoutToken = checkout?.token + + const value = `${checkoutId}:${checkoutToken}` + + if (checkoutId) { + const options = { + expires: 60 * 60 * 24 * 30, + } + Cookies.set(CHECKOUT_ID_COOKIE, value, options) + } + + return checkout +} + +export default checkoutCreate diff --git a/packages/saleor/src/utils/checkout-to-cart.ts b/packages/saleor/src/utils/checkout-to-cart.ts new file mode 100644 index 0000000..4c228ad --- /dev/null +++ b/packages/saleor/src/utils/checkout-to-cart.ts @@ -0,0 +1,48 @@ +import { Cart } from '../types' +import { CommerceError } from '@vercel/commerce/utils/errors' + +import { + CheckoutLinesAdd, + CheckoutLinesUpdate, + CheckoutCreate, + CheckoutError, + Checkout, + Maybe, + CheckoutLineDelete, +} from '../../schema' + +import { normalizeCart } from './normalize' +import throwUserErrors from './throw-user-errors' + +export type CheckoutQuery = { + checkout: Checkout + errors?: Array +} + +export type CheckoutPayload = + | CheckoutLinesAdd + | CheckoutLinesUpdate + | CheckoutCreate + | CheckoutQuery + | CheckoutLineDelete + +const checkoutToCart = (checkoutPayload?: Maybe): Cart => { + if (!checkoutPayload) { + throw new CommerceError({ + message: 'Missing checkout payload from response', + }) + } + + const checkout = checkoutPayload?.checkout + throwUserErrors(checkoutPayload?.errors) + + if (!checkout) { + throw new CommerceError({ + message: 'Missing checkout object from response', + }) + } + + return normalizeCart(checkout) +} + +export default checkoutToCart diff --git a/packages/saleor/src/utils/customer-token.ts b/packages/saleor/src/utils/customer-token.ts new file mode 100644 index 0000000..dd15fbe --- /dev/null +++ b/packages/saleor/src/utils/customer-token.ts @@ -0,0 +1,25 @@ +import Cookies, { CookieAttributes } from 'js-cookie' +import * as Const from '../const' + +export const getToken = () => Cookies.get(Const.SALEOR_TOKEN) +export const setToken = (token?: string, options?: CookieAttributes) => { + setCookie(Const.SALEOR_TOKEN, token, options) +} + +export const getCSRFToken = () => Cookies.get(Const.SALEOR_CRSF_TOKEN) +export const setCSRFToken = (token?: string, options?: CookieAttributes) => { + setCookie(Const.SALEOR_CRSF_TOKEN, token, options) +} + +export const getCheckoutToken = () => Cookies.get(Const.CHECKOUT_ID_COOKIE) +export const setCheckoutToken = (token?: string, options?: CookieAttributes) => { + setCookie(Const.CHECKOUT_ID_COOKIE, token, options) +} + +const setCookie = (name: string, token?: string, options?: CookieAttributes) => { + if (!token) { + Cookies.remove(name) + } else { + Cookies.set(name, token, options ?? { expires: 60 * 60 * 24 * 30 }) + } +} diff --git a/packages/saleor/src/utils/fragments/checkout-details.ts b/packages/saleor/src/utils/fragments/checkout-details.ts new file mode 100644 index 0000000..437c247 --- /dev/null +++ b/packages/saleor/src/utils/fragments/checkout-details.ts @@ -0,0 +1,49 @@ +export const CheckoutDetails = /* GraphQL */ ` + fragment CheckoutDetails on Checkout { + id + token + created + totalPrice { + currency + gross { + amount + } + } + subtotalPrice { + currency + gross { + amount + } + } + + lines { + id + variant { + id + name + sku + product { + name + slug + } + media { + url + } + pricing { + price { + gross { + amount + } + } + } + } + quantity + totalPrice { + currency + gross { + amount + } + } + } + } +` diff --git a/packages/saleor/src/utils/fragments/index.ts b/packages/saleor/src/utils/fragments/index.ts new file mode 100644 index 0000000..6c0c889 --- /dev/null +++ b/packages/saleor/src/utils/fragments/index.ts @@ -0,0 +1,2 @@ +export { ProductConnection } from './product' +export { CheckoutDetails } from './checkout-details' diff --git a/packages/saleor/src/utils/fragments/product.ts b/packages/saleor/src/utils/fragments/product.ts new file mode 100644 index 0000000..1ea59c0 --- /dev/null +++ b/packages/saleor/src/utils/fragments/product.ts @@ -0,0 +1,29 @@ +export const ProductConnection = /* GraphQL */ ` + fragment ProductConnection on ProductCountableConnection { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + id + name + description + slug + pricing { + priceRange { + start { + net { + amount + } + } + } + } + media { + url + alt + } + } + } + } +` diff --git a/packages/saleor/src/utils/get-categories.ts b/packages/saleor/src/utils/get-categories.ts new file mode 100644 index 0000000..e2cc725 --- /dev/null +++ b/packages/saleor/src/utils/get-categories.ts @@ -0,0 +1,23 @@ +import { Category } from '@vercel/commerce/types/site' +import { SaleorConfig } from '../api' +import { CollectionCountableEdge } from '../../schema' +import * as query from './queries' + +const getCategories = async (config: SaleorConfig): Promise => { + const { data } = await config.fetch(query.CollectionMany, { + variables: { + first: 100, + }, + }) + + return ( + data.collections?.edges?.map(({ node: { id, name, slug } }: CollectionCountableEdge) => ({ + id, + name, + slug, + path: `/${slug}`, + })) ?? [] + ) +} + +export default getCategories diff --git a/packages/saleor/src/utils/get-checkout-id.ts b/packages/saleor/src/utils/get-checkout-id.ts new file mode 100644 index 0000000..de495a9 --- /dev/null +++ b/packages/saleor/src/utils/get-checkout-id.ts @@ -0,0 +1,9 @@ +import Cookies from 'js-cookie' +import { CHECKOUT_ID_COOKIE } from '../const' + +const getCheckoutId = (id?: string) => { + const r = Cookies.get(CHECKOUT_ID_COOKIE)?.split(':') || [] + return { checkoutId: r[0], checkoutToken: r[1] } +} + +export default getCheckoutId diff --git a/packages/saleor/src/utils/get-search-variables.ts b/packages/saleor/src/utils/get-search-variables.ts new file mode 100644 index 0000000..5adf938 --- /dev/null +++ b/packages/saleor/src/utils/get-search-variables.ts @@ -0,0 +1,18 @@ +import { getSortVariables } from './get-sort-variables' +import type { SearchProductsInput } from '../product/use-search' + +export const getSearchVariables = ({ brandId, search, categoryId, sort }: SearchProductsInput) => { + const sortBy = { + field: 'NAME', + direction: 'ASC', + ...getSortVariables(sort, !!categoryId), + channel: 'default-channel', + } + return { + categoryId, + filter: { search }, + sortBy, + } +} + +export default getSearchVariables diff --git a/packages/saleor/src/utils/get-sort-variables.ts b/packages/saleor/src/utils/get-sort-variables.ts new file mode 100644 index 0000000..fe040a0 --- /dev/null +++ b/packages/saleor/src/utils/get-sort-variables.ts @@ -0,0 +1,30 @@ +export const getSortVariables = (sort?: string, isCategory: boolean = false) => { + let output = {} + switch (sort) { + case 'price-asc': + output = { + field: 'PRICE', + direction: 'ASC', + } + break + case 'price-desc': + output = { + field: 'PRICE', + direction: 'DESC', + } + break + case 'trending-desc': + output = { + field: 'RANK', + direction: 'DESC', + } + break + case 'latest-desc': + output = { + field: 'DATE', + direction: 'DESC', + } + break + } + return output +} diff --git a/packages/saleor/src/utils/get-vendors.ts b/packages/saleor/src/utils/get-vendors.ts new file mode 100644 index 0000000..caae555 --- /dev/null +++ b/packages/saleor/src/utils/get-vendors.ts @@ -0,0 +1,41 @@ +import { SaleorConfig } from '../api' + +export type Brand = { + entityId: string + name: string + path: string +} + +export type BrandEdge = { + node: Brand +} + +export type Brands = BrandEdge[] + +// TODO: Find a way to get vendors from meta +const getVendors = async (config: SaleorConfig): Promise => { + // const vendors = await fetchAllProducts({ + // config, + // query: getAllProductVendors, + // variables: { + // first: 100, + // }, + // }) + + // let vendorsStrings = vendors.map(({ node: { vendor } }) => vendor) + + // return [...new Set(vendorsStrings)].map((v) => { + // const id = v.replace(/\s+/g, '-').toLowerCase() + // return { + // node: { + // entityId: id, + // name: v, + // path: `brands/${id}`, + // }, + // } + // }) + + return [] +} + +export default getVendors diff --git a/packages/saleor/src/utils/handle-fetch-response.ts b/packages/saleor/src/utils/handle-fetch-response.ts new file mode 100644 index 0000000..33fe15c --- /dev/null +++ b/packages/saleor/src/utils/handle-fetch-response.ts @@ -0,0 +1,27 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' + +export function getError(errors: any[], status: number) { + errors = errors ?? [{ message: 'Failed to fetch Saleor API' }] + return new FetcherError({ errors, status }) +} + +export async function getAsyncError(res: Response) { + const data = await res.json() + return getError(data.errors, res.status) +} + +const handleFetchResponse = async (res: Response) => { + if (res.ok) { + const { data, errors } = await res.json() + + if (errors && errors.length) { + throw getError(errors, res.status) + } + + return data + } + + throw await getAsyncError(res) +} + +export default handleFetchResponse diff --git a/packages/saleor/src/utils/handle-login.ts b/packages/saleor/src/utils/handle-login.ts new file mode 100644 index 0000000..b1beaed --- /dev/null +++ b/packages/saleor/src/utils/handle-login.ts @@ -0,0 +1,35 @@ +import { FetcherOptions } from '@vercel/commerce/utils/types' +import { CreateToken, Mutation, MutationTokenCreateArgs } from '../../schema' +import { setToken, setCSRFToken } from './customer-token' +import * as mutation from './mutations' +import throwUserErrors from './throw-user-errors' + +const handleLogin = (data: CreateToken) => { + throwUserErrors(data?.errors) + + const token = data?.token + + if (token) { + setToken(token) + setCSRFToken(token) + } + + return token +} + +export const handleAutomaticLogin = async ( + fetch: (options: FetcherOptions) => Promise, + input: MutationTokenCreateArgs +) => { + try { + const { tokenCreate } = await fetch({ + query: mutation.SessionCreate, + variables: { ...input }, + }) + handleLogin(tokenCreate!) + } catch (error) { + // + } +} + +export default handleLogin diff --git a/packages/saleor/src/utils/index.ts b/packages/saleor/src/utils/index.ts new file mode 100644 index 0000000..de81eea --- /dev/null +++ b/packages/saleor/src/utils/index.ts @@ -0,0 +1,19 @@ +export { getSortVariables } from './get-sort-variables' + +export { default as handleFetchResponse } from './handle-fetch-response' +export { default as getSearchVariables } from './get-search-variables' +export { default as getVendors } from './get-vendors' +export { default as getCategories } from './get-categories' +export { default as getCheckoutId } from './get-checkout-id' + +export { default as checkoutCreate } from './checkout-create' +export { checkoutAttach } from './checkout-attach' + +export { default as checkoutToCart } from './checkout-to-cart' +export { default as handleLogin, handleAutomaticLogin } from './handle-login' +export { default as throwUserErrors } from './throw-user-errors' + +export * from './queries' +export * from './mutations' +export * from './normalize' +export * from './customer-token' diff --git a/packages/saleor/src/utils/mutations/account-create.ts b/packages/saleor/src/utils/mutations/account-create.ts new file mode 100644 index 0000000..f50fe6d --- /dev/null +++ b/packages/saleor/src/utils/mutations/account-create.ts @@ -0,0 +1,15 @@ +export const AccountCreate = /* GraphQL */ ` + mutation AccountCreate($input: AccountRegisterInput!) { + accountRegister(input: $input) { + errors { + code + field + message + } + user { + email + isActive + } + } + } +` diff --git a/packages/saleor/src/utils/mutations/checkout-attach.ts b/packages/saleor/src/utils/mutations/checkout-attach.ts new file mode 100644 index 0000000..435be05 --- /dev/null +++ b/packages/saleor/src/utils/mutations/checkout-attach.ts @@ -0,0 +1,12 @@ +export const CheckoutAttach = /* GraphQl */ ` + mutation CheckoutAttach($checkoutId: ID!) { + checkoutCustomerAttach(checkoutId: $checkoutId) { + errors { + message + } + checkout { + id + } + } + } +` diff --git a/packages/saleor/src/utils/mutations/checkout-create.ts b/packages/saleor/src/utils/mutations/checkout-create.ts new file mode 100644 index 0000000..3cfe9d4 --- /dev/null +++ b/packages/saleor/src/utils/mutations/checkout-create.ts @@ -0,0 +1,17 @@ +import * as fragment from '../fragments' + +export const CheckoutCreate = /* GraphQL */ ` + mutation CheckoutCreate { + checkoutCreate(input: { email: "customer@example.com", lines: [], channel: "default-channel" }) { + errors { + code + field + message + } + checkout { + ...CheckoutDetails + } + } + } + ${fragment.CheckoutDetails} +` diff --git a/packages/saleor/src/utils/mutations/checkout-line-add.ts b/packages/saleor/src/utils/mutations/checkout-line-add.ts new file mode 100644 index 0000000..e7b8e0a --- /dev/null +++ b/packages/saleor/src/utils/mutations/checkout-line-add.ts @@ -0,0 +1,17 @@ +import * as fragment from '../fragments' + +export const CheckoutLineAdd = /* GraphQL */ ` + mutation CheckoutLineAdd($checkoutId: ID!, $lineItems: [CheckoutLineInput!]!) { + checkoutLinesAdd(checkoutId: $checkoutId, lines: $lineItems) { + errors { + code + field + message + } + checkout { + ...CheckoutDetails + } + } + } + ${fragment.CheckoutDetails} +` diff --git a/packages/saleor/src/utils/mutations/checkout-line-remove.ts b/packages/saleor/src/utils/mutations/checkout-line-remove.ts new file mode 100644 index 0000000..191ef54 --- /dev/null +++ b/packages/saleor/src/utils/mutations/checkout-line-remove.ts @@ -0,0 +1,17 @@ +import * as fragment from '../fragments' + +export const CheckoutLineDelete = /* GraphQL */ ` + mutation CheckoutLineDelete($checkoutId: ID!, $lineId: ID!) { + checkoutLineDelete(checkoutId: $checkoutId, lineId: $lineId) { + errors { + code + field + message + } + checkout { + ...CheckoutDetails + } + } + } + ${fragment.CheckoutDetails} +` diff --git a/packages/saleor/src/utils/mutations/checkout-line-update.ts b/packages/saleor/src/utils/mutations/checkout-line-update.ts new file mode 100644 index 0000000..50019d6 --- /dev/null +++ b/packages/saleor/src/utils/mutations/checkout-line-update.ts @@ -0,0 +1,17 @@ +import * as fragment from '../fragments' + +export const CheckoutLineUpdate = /* GraphQL */ ` + mutation CheckoutLineUpdate($checkoutId: ID!, $lineItems: [CheckoutLineInput!]!) { + checkoutLinesUpdate(checkoutId: $checkoutId, lines: $lineItems) { + errors { + code + field + message + } + checkout { + ...CheckoutDetails + } + } + } + ${fragment.CheckoutDetails} +` diff --git a/packages/saleor/src/utils/mutations/index.ts b/packages/saleor/src/utils/mutations/index.ts new file mode 100644 index 0000000..a1f3d60 --- /dev/null +++ b/packages/saleor/src/utils/mutations/index.ts @@ -0,0 +1,8 @@ +export { AccountCreate } from './account-create' +export { CheckoutCreate } from './checkout-create' +export { CheckoutLineAdd } from './checkout-line-add' +export { CheckoutLineUpdate } from './checkout-line-update' +export { CheckoutLineDelete } from './checkout-line-remove' +export { SessionCreate } from './session-create' +export { SessionDestroy } from './session-destroy' +export { CheckoutAttach } from './checkout-attach' diff --git a/packages/saleor/src/utils/mutations/session-create.ts b/packages/saleor/src/utils/mutations/session-create.ts new file mode 100644 index 0000000..d3c5a51 --- /dev/null +++ b/packages/saleor/src/utils/mutations/session-create.ts @@ -0,0 +1,14 @@ +export const SessionCreate = /* GraphQL */ ` + mutation SessionCreate($email: String!, $password: String!) { + tokenCreate(email: $email, password: $password) { + token + refreshToken + csrfToken + errors { + code + field + message + } + } + } +` diff --git a/packages/saleor/src/utils/mutations/session-destroy.ts b/packages/saleor/src/utils/mutations/session-destroy.ts new file mode 100644 index 0000000..def3a04 --- /dev/null +++ b/packages/saleor/src/utils/mutations/session-destroy.ts @@ -0,0 +1,10 @@ +export const SessionDestroy = /* GraphQL */ ` + mutation SessionDestroy { + tokensDeactivateAll { + errors { + field + message + } + } + } +` diff --git a/packages/saleor/src/utils/normalize.ts b/packages/saleor/src/utils/normalize.ts new file mode 100644 index 0000000..a4ff4b5 --- /dev/null +++ b/packages/saleor/src/utils/normalize.ts @@ -0,0 +1,133 @@ +import { Product } from '@vercel/commerce/types/product' + +import { Product as SaleorProduct, Checkout, CheckoutLine, Money, ProductVariant } from '../../schema' + +import type { Cart, LineItem } from '../types' + +// TODO: Check nextjs-commerce bug if no images are added for a product +const placeholderImg = '/product-img-placeholder.svg' + +const money = ({ amount, currency }: Money) => { + return { + value: +amount, + currencyCode: currency || 'USD', + } +} + +const normalizeProductOptions = (options: ProductVariant[]) => { + return options + ?.map((option) => option?.attributes) + .flat(1) + .reduce((acc, x) => { + if (acc.find(({ displayName }: any) => displayName === x.attribute.name)) { + return acc.map((opt: any) => { + return opt.displayName === x.attribute.name + ? { + ...opt, + values: [ + ...opt.values, + ...x.values.map((value: any) => ({ + label: value?.name, + })), + ], + } + : opt + }) + } + + return acc.concat({ + __typename: 'MultipleChoiceOption', + displayName: x.attribute.name, + variant: 'size', + values: x.values.map((value: any) => ({ + label: value?.name, + })), + }) + }, []) +} + +const normalizeProductVariants = (variants: ProductVariant[]) => { + return variants?.map((variant) => { + const { id, sku, name, pricing } = variant + const price = pricing?.price?.net && money(pricing.price.net)?.value + + return { + id, + name, + sku: sku ?? id, + price, + listPrice: price, + requiresShipping: true, + options: normalizeProductOptions([variant]), + } + }) +} + +export function normalizeProduct(productNode: SaleorProduct): Product { + const { id, name, media = [], variants, description, slug, pricing, ...rest } = productNode + + const product = { + id, + name, + vendor: '', + description: description ? JSON.parse(description)?.blocks[0]?.data.text : '', + path: `/${slug}`, + slug: slug?.replace(/^\/+|\/+$/g, ''), + price: (pricing?.priceRange?.start?.net && money(pricing.priceRange.start.net)) || { + value: 0, + currencyCode: 'USD', + }, + // TODO: Check nextjs-commerce bug if no images are added for a product + images: media?.length ? media : [{ url: placeholderImg }], + variants: variants && variants.length > 0 ? normalizeProductVariants(variants as ProductVariant[]) : [], + options: variants && variants.length > 0 ? normalizeProductOptions(variants as ProductVariant[]) : [], + ...rest, + } + + return product as Product +} + +export function normalizeCart(checkout: Checkout): Cart { + const lines = checkout.lines as CheckoutLine[] + const lineItems: LineItem[] = lines.length > 0 ? lines?.map(normalizeLineItem) : [] + + return { + id: checkout.id, + customerId: '', + email: '', + createdAt: checkout.created, + currency: { + code: checkout.totalPrice?.currency!, + }, + taxesIncluded: false, + lineItems, + lineItemsSubtotalPrice: checkout.subtotalPrice?.gross?.amount!, + subtotalPrice: checkout.subtotalPrice?.gross?.amount!, + totalPrice: checkout.totalPrice?.gross.amount!, + discounts: [], + } +} + +function normalizeLineItem({ id, variant, quantity }: CheckoutLine): LineItem { + return { + id, + variantId: String(variant?.id), + productId: String(variant?.id), + name: `${variant.product.name}`, + quantity, + variant: { + id: String(variant?.id), + sku: variant?.sku ?? '', + name: variant?.name!, + image: { + url: variant?.media![0] ? variant?.media![0].url : placeholderImg, + }, + requiresShipping: false, + price: variant?.pricing?.price?.gross.amount!, + listPrice: 0, + }, + path: String(variant?.product?.slug), + discounts: [], + options: [], + } +} diff --git a/packages/saleor/src/utils/queries/checkout-one.ts b/packages/saleor/src/utils/queries/checkout-one.ts new file mode 100644 index 0000000..ce48236 --- /dev/null +++ b/packages/saleor/src/utils/queries/checkout-one.ts @@ -0,0 +1,12 @@ +import * as fragment from '../fragments' + +export const CheckoutOne = /* GraphQL */ ` + query CheckoutOne($checkoutId: UUID!) { + checkout(token: $checkoutId) { + ... on Checkout { + ...CheckoutDetails + } + } + } + ${fragment.CheckoutDetails} +` diff --git a/packages/saleor/src/utils/queries/collection-many.ts b/packages/saleor/src/utils/queries/collection-many.ts new file mode 100644 index 0000000..b556e3f --- /dev/null +++ b/packages/saleor/src/utils/queries/collection-many.ts @@ -0,0 +1,13 @@ +export const CollectionMany = /* GraphQL */ ` + query CollectionMany($first: Int!, $channel: String = "default-channel") { + collections(first: $first, channel: $channel) { + edges { + node { + id + name + slug + } + } + } + } +` diff --git a/packages/saleor/src/utils/queries/collection-one.ts b/packages/saleor/src/utils/queries/collection-one.ts new file mode 100644 index 0000000..c2e593f --- /dev/null +++ b/packages/saleor/src/utils/queries/collection-one.ts @@ -0,0 +1,13 @@ +import * as fragment from '../fragments' + +export const CollectionOne = /* GraphQL */ ` + query getProductsFromCollection($categoryId: ID!, $first: Int = 100, $channel: String = "default-channel") { + collection(id: $categoryId, channel: $channel) { + id + products(first: $first) { + ...ProductConnection + } + } + } + ${fragment.ProductConnection} +` diff --git a/packages/saleor/src/utils/queries/customer-current.ts b/packages/saleor/src/utils/queries/customer-current.ts new file mode 100644 index 0000000..7965451 --- /dev/null +++ b/packages/saleor/src/utils/queries/customer-current.ts @@ -0,0 +1,11 @@ +export const CustomerCurrent = /* GraphQL */ ` + query CustomerCurrent { + me { + id + email + firstName + lastName + dateJoined + } + } +` diff --git a/packages/saleor/src/utils/queries/customer-one.ts b/packages/saleor/src/utils/queries/customer-one.ts new file mode 100644 index 0000000..d35b3f5 --- /dev/null +++ b/packages/saleor/src/utils/queries/customer-one.ts @@ -0,0 +1,7 @@ +export const CustomerOne = /* GraphQL */ ` + query CustomerOne($customerAccessToken: String!) { + customer(customerAccessToken: $customerAccessToken) { + id + } + } +` diff --git a/packages/saleor/src/utils/queries/get-all-product-vendors-query.ts b/packages/saleor/src/utils/queries/get-all-product-vendors-query.ts new file mode 100644 index 0000000..7d0f016 --- /dev/null +++ b/packages/saleor/src/utils/queries/get-all-product-vendors-query.ts @@ -0,0 +1,16 @@ +export const getAllProductVendors = /* GraphQL */ ` + query getAllProductVendors($first: Int = 250, $cursor: String) { + products(first: $first, after: $cursor) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + vendor + } + cursor + } + } + } +` diff --git a/packages/saleor/src/utils/queries/get-all-products-paths-query.ts b/packages/saleor/src/utils/queries/get-all-products-paths-query.ts new file mode 100644 index 0000000..d9acb82 --- /dev/null +++ b/packages/saleor/src/utils/queries/get-all-products-paths-query.ts @@ -0,0 +1,16 @@ +export const getAllProductsPathsQuery = /* GraphQL */ ` + query getAllProductPaths($first: Int = 100, $cursor: String, $channel: String = "default-channel") { + products(first: $first, after: $cursor, channel: $channel) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + slug + } + cursor + } + } + } +` diff --git a/packages/saleor/src/utils/queries/index.ts b/packages/saleor/src/utils/queries/index.ts new file mode 100644 index 0000000..542c46f --- /dev/null +++ b/packages/saleor/src/utils/queries/index.ts @@ -0,0 +1,14 @@ +export { CollectionMany } from './collection-many' +export { ProductOneBySlug } from './product-one-by-slug' +export { ProductMany } from './product-many' +export { CollectionOne } from './collection-one' +export { CheckoutOne } from './checkout-one' +export { PageMany } from './page-many' +export { PageOne } from './page-one' +export { CustomerCurrent } from './customer-current' + +// getCustomerIdQuery +export { CustomerOne } from './customer-one' + +export { getAllProductsPathsQuery } from './get-all-products-paths-query' +export { getAllProductVendors } from './get-all-product-vendors-query' diff --git a/packages/saleor/src/utils/queries/page-many.ts b/packages/saleor/src/utils/queries/page-many.ts new file mode 100644 index 0000000..94bba69 --- /dev/null +++ b/packages/saleor/src/utils/queries/page-many.ts @@ -0,0 +1,13 @@ +export const PageMany = /* GraphQL */ ` + query PageMany($first: Int = 100) { + pages(first: $first) { + edges { + node { + id + title + slug + } + } + } + } +` diff --git a/packages/saleor/src/utils/queries/page-one.ts b/packages/saleor/src/utils/queries/page-one.ts new file mode 100644 index 0000000..6d9789a --- /dev/null +++ b/packages/saleor/src/utils/queries/page-one.ts @@ -0,0 +1,9 @@ +export const PageOne = /* GraphQL */ ` + query PageOne($id: ID!) { + page(id: $id) { + id + title + slug + } + } +` diff --git a/packages/saleor/src/utils/queries/product-many.ts b/packages/saleor/src/utils/queries/product-many.ts new file mode 100644 index 0000000..7e0aa9a --- /dev/null +++ b/packages/saleor/src/utils/queries/product-many.ts @@ -0,0 +1,15 @@ +import * as fragment from '../fragments' + +export const ProductMany = /* GraphQL */ ` + query ProductMany( + $first: Int = 100 + $filter: ProductFilterInput + $sortBy: ProductOrder + $channel: String = "default-channel" + ) { + products(first: $first, channel: $channel, filter: $filter, sortBy: $sortBy) { + ...ProductConnection + } + } + ${fragment.ProductConnection} +` diff --git a/packages/saleor/src/utils/queries/product-one-by-slug.ts b/packages/saleor/src/utils/queries/product-one-by-slug.ts new file mode 100644 index 0000000..e9169f0 --- /dev/null +++ b/packages/saleor/src/utils/queries/product-one-by-slug.ts @@ -0,0 +1,43 @@ +export const ProductOneBySlug = /* GraphQL */ ` + query ProductOneBySlug($slug: String!, $channel: String = "default-channel") { + product(slug: $slug, channel: $channel) { + id + slug + name + description + pricing { + priceRange { + start { + net { + amount + } + } + } + } + variants { + id + name + attributes { + attribute { + name + } + values { + name + } + } + pricing { + price { + net { + amount + currency + } + } + } + } + media { + url + alt + } + } + } +` diff --git a/packages/saleor/src/utils/throw-user-errors.ts b/packages/saleor/src/utils/throw-user-errors.ts new file mode 100644 index 0000000..59345e7 --- /dev/null +++ b/packages/saleor/src/utils/throw-user-errors.ts @@ -0,0 +1,20 @@ +import { ValidationError } from '@vercel/commerce/utils/errors' + +import { CheckoutError, CheckoutErrorCode, AppError, AccountError, AccountErrorCode } from '../../schema' + +export type UserErrors = Array + +export type UserErrorCode = CheckoutErrorCode | AccountErrorCode | null | undefined + +export const throwUserErrors = (errors?: UserErrors) => { + if (errors && errors.length) { + throw new ValidationError({ + errors: errors.map(({ code, message }) => ({ + code: code ?? 'validation_error', + message: message || '', + })), + }) + } +} + +export default throwUserErrors diff --git a/packages/saleor/src/wishlist/use-add-item.tsx b/packages/saleor/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/saleor/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/saleor/src/wishlist/use-remove-item.tsx b/packages/saleor/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/saleor/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/saleor/src/wishlist/use-wishlist.tsx b/packages/saleor/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..56e7ea0 --- /dev/null +++ b/packages/saleor/src/wishlist/use-wishlist.tsx @@ -0,0 +1,46 @@ +// TODO: replace this hook and other wishlist hooks with a handler, or remove them if +// Saleor doesn't have a wishlist + +import { HookFetcher } from '@vercel/commerce/utils/types' +import { Product } from '../../schema' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/saleor/taskfile.js b/packages/saleor/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/saleor/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/saleor/tsconfig.json b/packages/saleor/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/saleor/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/sfcc/.env.template b/packages/sfcc/.env.template new file mode 100644 index 0000000..a649427 --- /dev/null +++ b/packages/sfcc/.env.template @@ -0,0 +1,7 @@ +COMMERCE_PROVIDER=@vercel/commerce-sfcc + +SFCC_CLIENT_ID= +SFCC_CLIENT_SECRET= +SFCC_ORG_ID= +SFCC_SHORT_CODE= +SFCC_SITE_ID= \ No newline at end of file diff --git a/packages/sfcc/.prettierignore b/packages/sfcc/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/sfcc/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/sfcc/.prettierrc b/packages/sfcc/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/sfcc/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/sfcc/README.md b/packages/sfcc/README.md new file mode 100644 index 0000000..feaa76f --- /dev/null +++ b/packages/sfcc/README.md @@ -0,0 +1,40 @@ +# Next.js SalesForce Cloud Commerce Provider + +SalesForce Cloud Commerce Demo: https://salesforce-cloud-commerce.vercel.store/ + +## Installation + +1. Copy the `.env.template` file in this directory to `/site/.env.local` in the main directory +2. Run `yarn` and then `yarn dev` in root folder + +## Features: + +```json +{ + "provider": "sfcc", + "features": { + "wishlist": false, + "cart": false, + "search": true, + "customerAuth": false, + "customCheckout": false + } +} +``` + +## References + +- SDK: https://github.com/SalesforceCommerceCloud/commerce-sdk +- isomorphic SDK (currently not used atm): https://github.com/SalesforceCommerceCloud/commerce-sdk-isomorphic +- PWA Kit storefront example: https://pwa-kit.mobify-storefront.com/ + +## Training Material and Documentation: + +For a detailed introduction into commerce clouds feature set and data setup please refer to our Training Material and Documentation: + +- [Salesforce Trailhead for B2C Commerce Cloud](https://trailhead.salesforce.com/en/content/learn/trails/cc-overview) +- [Salesforce Trailhead for Development on B2C Commerce Cloud](https://trailhead.salesforce.com/en/content/learn/trails/develop-for-commerce-cloud) +- [B2C Commerce Cloud Documentation](https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp) +- [B2C Commerce Cloud Open Commerce API Doc](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/OCAPI/current/usage/OpenCommerceAPI.html?cp=0_15) +- [Developer Center for Commerce Cloud (Commerce APIs specifically)](https://developer.salesforce.com/docs/commerce/commerce-api/overview) +- [SLAS Org Admin Setup Guide](https://developer.salesforce.com/docs/commerce/commerce-api/references?meta=slas-admin:Summary) diff --git a/packages/sfcc/package.json b/packages/sfcc/package.json new file mode 100644 index 0000000..c04dc19 --- /dev/null +++ b/packages/sfcc/package.json @@ -0,0 +1,80 @@ +{ + "name": "@vercel/commerce-sfcc", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "commerce-sdk": "^2.7.0" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/sfcc/src/api/endpoints/cart/index.ts b/packages/sfcc/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/cart/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/catalog/products/get-products.ts b/packages/sfcc/src/api/endpoints/catalog/products/get-products.ts new file mode 100644 index 0000000..3b676e5 --- /dev/null +++ b/packages/sfcc/src/api/endpoints/catalog/products/get-products.ts @@ -0,0 +1,32 @@ +import { normalizeSearchProducts } from '../../../utils/normalise-product' +import { ProductsEndpoint } from '.' + +const getProducts: ProductsEndpoint['handlers']['getProducts'] = async ({ + req, + res, + body: { search, categoryId, brandId, sort }, + config, +}) => { + const { sdk } = config + + // 'clothing' is our main category default, and a manually set category has priority + const searchTerm = categoryId ? (categoryId as string) : search || 'clothing' + + const searchClient = await sdk.getSearchClient() + // use SDK search API for initial products + const searchResults = await searchClient.productSearch({ + parameters: { + q: searchTerm, + limit: 20, + }, + }) + let products = [] + let found = false + if (searchResults.total) { + found = true + products = normalizeSearchProducts(searchResults.hits) as any[] + } + res.status(200).json({ data: { products, found } }) +} + +export default getProducts diff --git a/packages/sfcc/src/api/endpoints/catalog/products/index.ts b/packages/sfcc/src/api/endpoints/catalog/products/index.ts new file mode 100644 index 0000000..196eb04 --- /dev/null +++ b/packages/sfcc/src/api/endpoints/catalog/products/index.ts @@ -0,0 +1,19 @@ +import type { SFCCProviderAPI } from '../../..' + +import { createEndpoint, GetAPISchema } from '@vercel/commerce/api' +import { ProductsSchema } from '@vercel/commerce/types/product' +import getProducts from './get-products' +import productsEndpoint from '@vercel/commerce/api/endpoints/catalog/products' + +export type ProductsAPI = GetAPISchema + +export type ProductsEndpoint = ProductsAPI['endpoint'] + +export const handlers: ProductsEndpoint['handlers'] = { getProducts } + +const productsApi = createEndpoint({ + handler: productsEndpoint, + handlers, +}) + +export default productsApi diff --git a/packages/sfcc/src/api/endpoints/checkout/index.ts b/packages/sfcc/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/checkout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/address.ts b/packages/sfcc/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/card.ts b/packages/sfcc/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/customer/index.ts b/packages/sfcc/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/login/index.ts b/packages/sfcc/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/login/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/logout/index.ts b/packages/sfcc/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/signup/index.ts b/packages/sfcc/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/endpoints/wishlist/index.tsx b/packages/sfcc/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/sfcc/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/sfcc/src/api/index.ts b/packages/sfcc/src/api/index.ts new file mode 100644 index 0000000..50c6f46 --- /dev/null +++ b/packages/sfcc/src/api/index.ts @@ -0,0 +1,48 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' +import createFetcher from './utils/fetch-local' +import sdk, { Sdk } from './utils/sfcc-sdk' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface SFCCConfig extends CommerceAPIConfig { + sdk: Sdk +} +const config: SFCCConfig = { + commerceUrl: '', + apiToken: '', + cartCookie: '', + customerCookie: '', + cartCookieMaxAge: 2592000, + fetch: createFetcher(() => getCommerceApi().getConfig()), + sdk, // SalesForce Cloud Commerce API SDK +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider +export type SFCCProviderAPI

= CommerceAPI< + P | any +> + +export function getCommerceApi

( + customProvider: P = provider as any +): SFCCProviderAPI

{ + return commerceApi(customProvider as any) +} diff --git a/packages/sfcc/src/api/operations/get-all-pages.ts b/packages/sfcc/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..4465fe6 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-all-pages.ts @@ -0,0 +1,19 @@ +export type Page = { url: string } +export type GetAllPagesResult = { pages: Page[] } +import type { SFCCConfig } from '../index' + +export default function getAllPagesOperation() { + function getAllPages({ + config, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + }): Promise { + return Promise.resolve({ + pages: [], + }) + } + return getAllPages +} diff --git a/packages/sfcc/src/api/operations/get-all-product-paths.ts b/packages/sfcc/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..85dd4f5 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,45 @@ +import { Product } from '@vercel/commerce/types/product' +import { OperationContext } from '@vercel/commerce/api/operations' +import { normalizeSearchProducts } from '../utils/normalise-product' +import { SFCCConfig } from '..' + +export type GetAllProductPathsResult = { + products: Array<{ path: string }> +} + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths({ + query, + config, + variables, + }: { + query?: string + config?: SFCCConfig + variables?: any + } = {}): Promise { + // TODO: support locale + const { sdk, locale } = commerce.getConfig(config) as SFCCConfig + const searchClient = await sdk.getSearchClient() + + // use SDK search API for initial products same as getAllProductsOperation + const searchResults = await searchClient.productSearch({ + parameters: { q: 'dress', limit: variables?.first }, + }) + + let products = [] as Product[] + + if (searchResults.total) { + products = normalizeSearchProducts(searchResults.hits) + } + + return { + products: products?.map(({ slug }: Product) => ({ + path: `/${slug}`, + })), + } + } + + return getAllProductPaths +} diff --git a/packages/sfcc/src/api/operations/get-all-products.ts b/packages/sfcc/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..cb891e7 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-all-products.ts @@ -0,0 +1,40 @@ +import { Product } from '@vercel/commerce/types/product' +import { GetAllProductsOperation } from '@vercel/commerce/types/product' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { SFCCConfig } from '../index' +import { normalizeSearchProducts } from '../utils/normalise-product' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts({ + query = '', + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + // TODO: support locale + const { sdk, locale } = commerce.getConfig(config) as SFCCConfig + const searchClient = await sdk.getSearchClient() + + // use SDK search API for initial products + const searchResults = await searchClient.productSearch({ + parameters: { q: 'dress', limit: variables?.first }, + }) + + let products = [] as Product[] + + if (searchResults.total) { + products = normalizeSearchProducts(searchResults.hits) + } + + return { + products: products, + } + } + return getAllProducts +} diff --git a/packages/sfcc/src/api/operations/get-customer-wishlist.ts b/packages/sfcc/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..8c34b9e --- /dev/null +++ b/packages/sfcc/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,6 @@ +export default function getCustomerWishlistOperation() { + function getCustomerWishlist(): any { + return { wishlist: {} } + } + return getCustomerWishlist +} diff --git a/packages/sfcc/src/api/operations/get-page.ts b/packages/sfcc/src/api/operations/get-page.ts new file mode 100644 index 0000000..b0cfdf5 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-page.ts @@ -0,0 +1,13 @@ +export type Page = any +export type GetPageResult = { page?: Page } + +export type PageVariables = { + id: number +} + +export default function getPageOperation() { + function getPage(): Promise { + return Promise.resolve({}) + } + return getPage +} diff --git a/packages/sfcc/src/api/operations/get-product.ts b/packages/sfcc/src/api/operations/get-product.ts new file mode 100644 index 0000000..72449c5 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-product.ts @@ -0,0 +1,33 @@ +import { GetProductOperation, Product } from '@vercel/commerce/types/product' +import type { SFCCConfig } from '../index' +import type { OperationContext } from '@vercel/commerce/api/operations' +import { normalizeProduct } from '../utils/normalise-product' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + query = '', + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + // TODO: support locale + const { sdk, locale } = commerce.getConfig(config) as SFCCConfig + const shopperProductsClient = await sdk.getshopperProductsClient() + const product = await shopperProductsClient.getProduct({ + parameters: { id: variables?.slug as string }, + }) + const normalizedProduct = normalizeProduct(product) + + return { + product: normalizedProduct, + } + } + + return getProduct +} diff --git a/packages/sfcc/src/api/operations/get-site-info.ts b/packages/sfcc/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..43a74b1 --- /dev/null +++ b/packages/sfcc/src/api/operations/get-site-info.ts @@ -0,0 +1,43 @@ +import { OperationContext } from '@vercel/commerce/api/operations' +import { Category } from '@vercel/commerce/types/site' +import { SFCCConfig } from '../index' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({}: OperationContext) { + function getSiteInfo({ + query, + variables, + config: cfg, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + return Promise.resolve({ + categories: [ + { + id: 'new-arrivals', + name: 'New Arrivals', + slug: 'new-arrivals', + path: '/new-arrivals', + }, + { + id: 'womens-clothing-dresses', + name: 'Womens Clothing Dresses', + slug: 'womens-clothing-dresses', + path: '/womens-clothing-dresses', + }, + ], + brands: [], + }) + } + + return getSiteInfo +} diff --git a/packages/sfcc/src/api/operations/index.ts b/packages/sfcc/src/api/operations/index.ts new file mode 100644 index 0000000..086fdf8 --- /dev/null +++ b/packages/sfcc/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getAllPages } from './get-all-pages' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/sfcc/src/api/utils/fetch-local.ts b/packages/sfcc/src/api/utils/fetch-local.ts new file mode 100644 index 0000000..5a2bab0 --- /dev/null +++ b/packages/sfcc/src/api/utils/fetch-local.ts @@ -0,0 +1,34 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import type { SFCCConfig } from '../index' +import fetch from './fetch' + +const fetchGraphqlApi: (getConfig: () => SFCCConfig) => GraphQLFetcher = + (getConfig) => + async (query: string, { variables, preview } = {}, fetchOptions) => { + const config = getConfig() + const res = await fetch(config.commerceUrl, { + ...fetchOptions, + method: 'POST', + headers: { + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch for API' }], + status: res.status, + }) + } + + return { data: json.data, res } + } + +export default fetchGraphqlApi diff --git a/packages/sfcc/src/api/utils/fetch.ts b/packages/sfcc/src/api/utils/fetch.ts new file mode 100644 index 0000000..9d9fff3 --- /dev/null +++ b/packages/sfcc/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import zeitFetch from '@vercel/fetch' + +export default zeitFetch() diff --git a/packages/sfcc/src/api/utils/get-auth-token.ts b/packages/sfcc/src/api/utils/get-auth-token.ts new file mode 100644 index 0000000..373d6c6 --- /dev/null +++ b/packages/sfcc/src/api/utils/get-auth-token.ts @@ -0,0 +1,42 @@ +import { ClientConfig, Customer } from 'commerce-sdk' + +// client configuration parameters +export const clientConfig: ClientConfig = { + headers: { + authorization: ``, + }, + parameters: { + clientId: process.env.SFCC_CLIENT_ID || '', + organizationId: process.env.SFCC_ORG_ID || '', + shortCode: process.env.SFCC_SHORT_CODE || '', + siteId: process.env.SFCC_SITE_ID || '', + }, +} + +/** + * Get the shopper or guest JWT/access token, along with a refresh token, using client credentials + * + * @returns guest user authorization token + */ +export async function getGuestUserAuthToken(): Promise { + const credentials = `${process.env.SFCC_CLIENT_ID}:${process.env.SFCC_CLIENT_SECRET}` + const base64data = Buffer.from(credentials).toString('base64') + const headers = { Authorization: `Basic ${base64data}` } + const client = new Customer.ShopperLogin(clientConfig) + + return await client.getAccessToken({ + headers, + body: { + grant_type: 'client_credentials', + }, + }) +} + +export const getConfigAuth = async () => { + const shopperToken = await getGuestUserAuthToken() + const configAuth = { + ...clientConfig, + headers: { authorization: `Bearer ${shopperToken.access_token}` }, + } + return configAuth +} diff --git a/packages/sfcc/src/api/utils/normalise-product.ts b/packages/sfcc/src/api/utils/normalise-product.ts new file mode 100644 index 0000000..b8d0e2e --- /dev/null +++ b/packages/sfcc/src/api/utils/normalise-product.ts @@ -0,0 +1,96 @@ +import { Product as SFCCProduct, Search } from 'commerce-sdk' +import type { + Product, + ProductImage, + ProductOption, + ProductVariant, +} from '@vercel/commerce/types/product' + +const normaliseOptions = ( + options: SFCCProduct.ShopperProducts.Product['variationAttributes'] +): Product['options'] => { + if (!Array.isArray(options)) return [] + + return options.map((option) => { + return { + id: option.id, + displayName: option.name as string, + values: option.values!.map((value) => ({ label: value.name })), + } as ProductOption + }) +} + +const normaliseVariants = ( + variants: SFCCProduct.ShopperProducts.Product['variants'] +): Product['variants'] => { + if (!Array.isArray(variants)) return [] + + return variants.map((variant) => { + const options = [] as ProductOption[] + + if (variant.variationValues) { + for (const [key, value] of Object.entries(variant.variationValues)) { + const variantOptionObject = { + id: `${variant.productId}-${key}`, + displayName: key, + values: [ + { + label: value, + }, + ], + } + options.push(variantOptionObject) + } + } + + return { + id: variant.productId, + options, + } as ProductVariant + }) +} + +export function normalizeProduct( + product: SFCCProduct.ShopperProducts.Product +): Product { + return { + id: product.id, + // TODO: use `name-ID` as a virtual slug (for search 1:1) + slug: product.id, // use product ID as a slug + name: product.name!, + description: product.longDescription!, + price: { + value: product.price!, + currencyCode: product.currency, + }, + images: product.imageGroups![0].images.map((image) => ({ + url: image.disBaseLink, + altText: image.title, + })) as ProductImage[], + variants: normaliseVariants(product.variants), + options: normaliseOptions(product.variationAttributes), + } +} + +export function normalizeSearchProducts( + products: Search.ShopperSearch.ProductSearchHit[] +): Product[] { + return products.map((product) => ({ + id: product.productId, + slug: product.productId, // use product ID as a slug + name: product.productName!, + description: '', + price: { + value: product.price!, + currencyCode: product.currency, + }, + images: [ + { + url: product.image!.link, + altText: product.productName, + } as ProductImage, + ], + variants: normaliseVariants(product.variants), + options: normaliseOptions(product.variationAttributes), + })) +} diff --git a/packages/sfcc/src/api/utils/sfcc-sdk.ts b/packages/sfcc/src/api/utils/sfcc-sdk.ts new file mode 100644 index 0000000..8d20b67 --- /dev/null +++ b/packages/sfcc/src/api/utils/sfcc-sdk.ts @@ -0,0 +1,19 @@ +import { Product, Search } from 'commerce-sdk' +import { getConfigAuth } from './get-auth-token' + +const getSearchClient = async () => { + const configAuth = await getConfigAuth() + return new Search.ShopperSearch(configAuth) +} + +const getshopperProductsClient = async () => { + const configAuth = await getConfigAuth() + return new Product.ShopperProducts(configAuth) +} + +export const sdk = { + getshopperProductsClient, + getSearchClient, +} +export type Sdk = typeof sdk +export default sdk diff --git a/packages/sfcc/src/auth/index.ts b/packages/sfcc/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/sfcc/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/sfcc/src/auth/use-login.tsx b/packages/sfcc/src/auth/use-login.tsx new file mode 100644 index 0000000..20e3ed2 --- /dev/null +++ b/packages/sfcc/src/auth/use-login.tsx @@ -0,0 +1,16 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: () => () => { + return async function () {} + }, +} diff --git a/packages/sfcc/src/auth/use-logout.tsx b/packages/sfcc/src/auth/use-logout.tsx new file mode 100644 index 0000000..4e74908 --- /dev/null +++ b/packages/sfcc/src/auth/use-logout.tsx @@ -0,0 +1,17 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + async () => {}, +} diff --git a/packages/sfcc/src/auth/use-signup.tsx b/packages/sfcc/src/auth/use-signup.tsx new file mode 100644 index 0000000..e488114 --- /dev/null +++ b/packages/sfcc/src/auth/use-signup.tsx @@ -0,0 +1,19 @@ +import { useCallback } from 'react' +import useCustomer from '../customer/use-customer' +import { MutationHook } from '@vercel/commerce/utils/types' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return null + }, + useHook: + ({ fetch }) => + () => + () => {}, +} diff --git a/packages/sfcc/src/cart/index.ts b/packages/sfcc/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/sfcc/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/sfcc/src/cart/use-add-item.tsx b/packages/sfcc/src/cart/use-add-item.tsx new file mode 100644 index 0000000..2be6e0a --- /dev/null +++ b/packages/sfcc/src/cart/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/sfcc/src/cart/use-cart.tsx b/packages/sfcc/src/cart/use-cart.tsx new file mode 100644 index 0000000..8f92de3 --- /dev/null +++ b/packages/sfcc/src/cart/use-cart.tsx @@ -0,0 +1,42 @@ +import { useMemo } from 'react' +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher() { + return { + id: '', + createdAt: '', + currency: { code: '' }, + taxesIncluded: '', + lineItems: [], + lineItemsSubtotalPrice: '', + subtotalPrice: 0, + totalPrice: 0, + } + }, + useHook: + ({ useData }) => + (input) => { + return useMemo( + () => + Object.create( + {}, + { + isEmpty: { + get() { + return true + }, + enumerable: true, + }, + } + ), + [] + ) + }, +} diff --git a/packages/sfcc/src/cart/use-remove-item.tsx b/packages/sfcc/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..92d52c9 --- /dev/null +++ b/packages/sfcc/src/cart/use-remove-item.tsx @@ -0,0 +1,20 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function removeItem(input) { + return {} + } + }, +} diff --git a/packages/sfcc/src/cart/use-update-item.tsx b/packages/sfcc/src/cart/use-update-item.tsx new file mode 100644 index 0000000..950f422 --- /dev/null +++ b/packages/sfcc/src/cart/use-update-item.tsx @@ -0,0 +1,20 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/sfcc/src/checkout/use-checkout.tsx b/packages/sfcc/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..76997be --- /dev/null +++ b/packages/sfcc/src/checkout/use-checkout.tsx @@ -0,0 +1,16 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/sfcc/src/commerce.config.json b/packages/sfcc/src/commerce.config.json new file mode 100644 index 0000000..1d20645 --- /dev/null +++ b/packages/sfcc/src/commerce.config.json @@ -0,0 +1,10 @@ +{ + "provider": "sfcc", + "features": { + "wishlist": false, + "cart": false, + "search": true, + "customerAuth": false, + "customCheckout": false + } +} diff --git a/packages/sfcc/src/customer/address/use-add-item.tsx b/packages/sfcc/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..4f85c84 --- /dev/null +++ b/packages/sfcc/src/customer/address/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/sfcc/src/customer/card/use-add-item.tsx b/packages/sfcc/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..77d149e --- /dev/null +++ b/packages/sfcc/src/customer/card/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/sfcc/src/customer/index.ts b/packages/sfcc/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/sfcc/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/sfcc/src/customer/use-customer.tsx b/packages/sfcc/src/customer/use-customer.tsx new file mode 100644 index 0000000..04c4894 --- /dev/null +++ b/packages/sfcc/src/customer/use-customer.tsx @@ -0,0 +1,17 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { + UseCustomer, +} from '@vercel/commerce/customer/use-customer' + +export default useCustomer as UseCustomer +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: () => () => { + return async function addItem() { + return {} + } + }, +} diff --git a/packages/sfcc/src/fetcher.ts b/packages/sfcc/src/fetcher.ts new file mode 100644 index 0000000..1da3571 --- /dev/null +++ b/packages/sfcc/src/fetcher.ts @@ -0,0 +1,17 @@ +import { Fetcher } from '@vercel/commerce/utils/types' + +const clientFetcher: Fetcher = async ({ method, url, body }) => { + const response = await fetch(url!, { + method, + body: body ? JSON.stringify(body) : undefined, + headers: { + 'Content-Type': 'application/json', + }, + }) + .then((response) => response.json()) + .then((response) => response.data) + + return response +} + +export default clientFetcher diff --git a/packages/sfcc/src/index.tsx b/packages/sfcc/src/index.tsx new file mode 100644 index 0000000..561f641 --- /dev/null +++ b/packages/sfcc/src/index.tsx @@ -0,0 +1,12 @@ +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { sfccProvider, SfccProvider } from './provider' + +export { sfccProvider } +export type { SfccProvider } + +export const CommerceProvider = getCommerceProvider(sfccProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/sfcc/src/next.config.cjs b/packages/sfcc/src/next.config.cjs new file mode 100644 index 0000000..6c42018 --- /dev/null +++ b/packages/sfcc/src/next.config.cjs @@ -0,0 +1,12 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: [ + 'localhost', + 'edge.disstg.commercecloud.salesforce.com', + 'zzte-053.sandbox.us02.dx.commercecloud.salesforce.com', + ], + }, +} diff --git a/packages/sfcc/src/product/index.ts b/packages/sfcc/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/sfcc/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/sfcc/src/product/use-price.tsx b/packages/sfcc/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/sfcc/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/sfcc/src/product/use-search.tsx b/packages/sfcc/src/product/use-search.tsx new file mode 100644 index 0000000..bb5e971 --- /dev/null +++ b/packages/sfcc/src/product/use-search.tsx @@ -0,0 +1,42 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import { SearchProductsHook } from '@vercel/commerce/types/product' +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + url: '/api/catalog/products', + method: 'GET', + }, + fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + console.log('search', search, categoryId, options) + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + if (search) url.searchParams.set('search', String(search)) + if (categoryId) url.searchParams.set('categoryId', String(categoryId)) + if (brandId) url.searchParams.set('brandId', String(brandId)) + if (sort) url.searchParams.set('sort', String(sort)) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/sfcc/src/provider.ts b/packages/sfcc/src/provider.ts new file mode 100644 index 0000000..47063f8 --- /dev/null +++ b/packages/sfcc/src/provider.ts @@ -0,0 +1,22 @@ +import fetcher from './fetcher' +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +export const sfccProvider = { + locale: 'en-us', + cartCookie: 'session', + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type SfccProvider = typeof sfccProvider diff --git a/packages/sfcc/src/wishlist/use-add-item.tsx b/packages/sfcc/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/sfcc/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/sfcc/src/wishlist/use-remove-item.tsx b/packages/sfcc/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/sfcc/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/sfcc/src/wishlist/use-wishlist.tsx b/packages/sfcc/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..b2785d4 --- /dev/null +++ b/packages/sfcc/src/wishlist/use-wishlist.tsx @@ -0,0 +1,43 @@ +import { HookFetcher } from '@vercel/commerce/utils/types' +import type { Product } from '@vercel/commerce/types/product' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/sfcc/taskfile.js b/packages/sfcc/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/sfcc/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/sfcc/tsconfig.json b/packages/sfcc/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/sfcc/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/shopify/.env.template b/packages/shopify/.env.template new file mode 100644 index 0000000..7ad711e --- /dev/null +++ b/packages/shopify/.env.template @@ -0,0 +1,4 @@ +COMMERCE_PROVIDER=@vercel/commerce-shopify + +NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN= +NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN= diff --git a/packages/shopify/.prettierignore b/packages/shopify/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/shopify/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/shopify/.prettierrc b/packages/shopify/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/shopify/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/shopify/README.md b/packages/shopify/README.md new file mode 100644 index 0000000..15a6e1f --- /dev/null +++ b/packages/shopify/README.md @@ -0,0 +1,135 @@ +## Shopify Provider + +**Demo:** https://shopify.demo.vercel.store/ + +Before getting started, a [Shopify](https://www.shopify.com/) account and store is required before using the provider. + +Next, copy the `.env.template` file in this directory to `.env.local` in the main directory (which will be ignored by Git): + +```bash +cp packages/shopify/.env.template .env.local +``` + +Then, set the environment variables in `.env.local` to match the ones from your store. + +## Contribute + +Our commitment to Open Source can be found [here](https://vercel.com/oss). + +If you find an issue with the provider or want a new feature, feel free to open a PR or [create a new issue](https://github.com/vercel/commerce/issues). + +## Modifications + +These modifications are temporarily until contributions are made to remove them. + +### Adding item to Cart + +```js +// components/product/ProductView/ProductView.tsx +const ProductView: FC = ({ product }) => { + const addToCart = async () => { + setLoading(true) + try { + await addItem({ + productId: product.id, + variantId: variant ? variant.id : product.variants[0].id, + }) + openSidebar() + setLoading(false) + } catch (err) { + setLoading(false) + } + } +} +``` + +### Proceed to Checkout + +```js +// components/cart/CartSidebarView/CartSidebarView.tsx +import { useCommerce } from '@framework' + +const CartSidebarView: FC = () => { + const { checkout } = useCommerce() + return ( + + ) +} +``` + +## APIs + +Collections of APIs to fetch data from a Shopify store. + +The data is fetched using the [Shopify JavaScript Buy SDK](https://github.com/Shopify/js-buy-sdk#readme). Read the [Shopify Storefront API reference](https://shopify.dev/docs/storefront-api/reference) for more information. + +### getProduct + +Get a single product by its `handle`. + +```js +import getProduct from '@framework/product/get-product' +import { getConfig } from '@framework/api' + +const config = getConfig() + +const product = await getProduct({ + variables: { slug }, + config, +}) +``` + +### getAllProducts + +```js +import getAllProducts from '@framework/product/get-all-products' +import { getConfig } from '@framework/api' + +const config = getConfig() + +const { products } = await getAllProducts({ + variables: { first: 12 }, + config, +}) +``` + +### getAllCollections + +```js +import getAllCollections from '@framework/product/get-all-collections' +import { getConfig } from '@framework/api' + +const config = getConfig() + +const collections = await getAllCollections({ + config, +}) +``` + +### getAllPages + +```js +import getAllPages from '@framework/common/get-all-pages' +import { getConfig } from '@framework/api' + +const config = getConfig() + +const pages = await getAllPages({ + variables: { first: 12 }, + config, +}) +``` + +## Code generation + +This provider makes use of GraphQL code generation. The [schema.graphql](./schema.graphql) and [schema.d.ts](./schema.d.ts) files contain the generated types & schema introspection results. + +When developing the provider, changes to any GraphQL operations should be followed by re-generation of the types and schema files: + +From the project root dir, run: + +```sh +yarn generate:shopify +``` diff --git a/packages/shopify/codegen.json b/packages/shopify/codegen.json new file mode 100644 index 0000000..c82882c --- /dev/null +++ b/packages/shopify/codegen.json @@ -0,0 +1,32 @@ +{ + "schema": { + "https://${NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN}/api/2022-04/graphql.json": { + "headers": { + "X-Shopify-Storefront-Access-Token": "${NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN}" + } + } + }, + "documents": [ + { + "./src/**/*.{ts,tsx}": { + "noRequire": true + } + } + ], + "generates": { + "./schema.d.ts": { + "plugins": ["typescript", "typescript-operations"], + "config": { + "scalars": { + "ID": "string" + } + } + }, + "./schema.graphql": { + "plugins": ["schema-ast"] + } + }, + "hooks": { + "afterAllFileWrite": ["prettier --write"] + } +} diff --git a/packages/shopify/package.json b/packages/shopify/package.json new file mode 100644 index 0000000..6cc45b4 --- /dev/null +++ b/packages/shopify/package.json @@ -0,0 +1,88 @@ +{ + "name": "@vercel/commerce-shopify", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write .", + "generate": "DOTENV_CONFIG_PATH=./.env graphql-codegen -r dotenv/config" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist", + "schema.d.ts" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@graphql-codegen/cli": "^2.3.1", + "@graphql-codegen/schema-ast": "^2.4.1", + "@graphql-codegen/typescript": "^2.4.2", + "@graphql-codegen/typescript-operations": "^2.2.2", + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "dotenv": "^12.0.3", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/shopify/schema.d.ts b/packages/shopify/schema.d.ts new file mode 100644 index 0000000..328f0ff --- /dev/null +++ b/packages/shopify/schema.d.ts @@ -0,0 +1,5586 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & + { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & + { [SubKey in K]: Maybe } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** An ISO-8601 encoded UTC date time string. Example value: `"2019-07-03T20:47:55Z"`. */ + DateTime: any + /** A signed decimal number, which supports arbitrary precision and is serialized as a string. Example value: `"29.99"`. */ + Decimal: any + /** A string containing HTML code. Example value: `"

Grey cotton knit sweater.

"`. */ + HTML: any + /** A monetary value string. Example value: `"100.57"`. */ + Money: any + /** + * An RFC 3986 and RFC 3987 compliant URI string. + * + * Example value: `"https://johns-apparel.myshopify.com"`. + * + */ + URL: any +} + +/** A version of the API. */ +export type ApiVersion = { + __typename?: 'ApiVersion' + /** The human-readable name of the version. */ + displayName: Scalars['String'] + /** The unique identifier of an ApiVersion. All supported API versions have a date-based (YYYY-MM) or `unstable` handle. */ + handle: Scalars['String'] + /** Whether the version is actively supported by Shopify. Supported API versions are guaranteed to be stable. Unsupported API versions include unstable, release candidate, and end-of-life versions that are marked as unsupported. For more information, refer to [Versioning](https://shopify.dev/concepts/about-apis/versioning). */ + supported: Scalars['Boolean'] +} + +/** Details about the gift card used on the checkout. */ +export type AppliedGiftCard = Node & { + __typename?: 'AppliedGiftCard' + /** + * The amount that was taken from the gift card by applying it. + * @deprecated Use `amountUsedV2` instead + */ + amountUsed: Scalars['Money'] + /** The amount that was taken from the gift card by applying it. */ + amountUsedV2: MoneyV2 + /** + * The amount left on the gift card. + * @deprecated Use `balanceV2` instead + */ + balance: Scalars['Money'] + /** The amount left on the gift card. */ + balanceV2: MoneyV2 + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The last characters of the gift card. */ + lastCharacters: Scalars['String'] + /** The amount that was applied to the checkout in its currency. */ + presentmentAmountUsed: MoneyV2 +} + +/** An article in an online store blog. */ +export type Article = Node & { + __typename?: 'Article' + /** + * The article's author. + * @deprecated Use `authorV2` instead + */ + author: ArticleAuthor + /** The article's author. */ + authorV2?: Maybe + /** The blog that the article belongs to. */ + blog: Blog + /** List of comments posted on the article. */ + comments: CommentConnection + /** Stripped content of the article, single line with HTML tags removed. */ + content: Scalars['String'] + /** The content of the article, complete with HTML formatting. */ + contentHtml: Scalars['HTML'] + /** Stripped excerpt of the article, single line with HTML tags removed. */ + excerpt?: Maybe + /** The excerpt of the article, complete with HTML formatting. */ + excerptHtml?: Maybe + /** A human-friendly unique string for the Article automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The image associated with the article. */ + image?: Maybe + /** The date and time when the article was published. */ + publishedAt: Scalars['DateTime'] + /** The article’s SEO information. */ + seo?: Maybe + /** A categorization that a article can be tagged with. */ + tags: Array + /** The article’s name. */ + title: Scalars['String'] + /** The url pointing to the article accessible from the web. */ + url: Scalars['URL'] +} + +/** An article in an online store blog. */ +export type ArticleCommentsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleContentArgs = { + truncateAt?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleExcerptArgs = { + truncateAt?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** The author of an article. */ +export type ArticleAuthor = { + __typename?: 'ArticleAuthor' + /** The author's bio. */ + bio?: Maybe + /** The author’s email. */ + email: Scalars['String'] + /** The author's first name. */ + firstName: Scalars['String'] + /** The author's last name. */ + lastName: Scalars['String'] + /** The author's full name. */ + name: Scalars['String'] +} + +/** An auto-generated type for paginating through multiple Articles. */ +export type ArticleConnection = { + __typename?: 'ArticleConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Article and a cursor during pagination. */ +export type ArticleEdge = { + __typename?: 'ArticleEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ArticleEdge. */ + node: Article +} + +/** The set of valid sort keys for the Article query. */ +export enum ArticleSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `blog_title` value. */ + BlogTitle = 'BLOG_TITLE', + /** Sort by the `author` value. */ + Author = 'AUTHOR', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `published_at` value. */ + PublishedAt = 'PUBLISHED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Represents a generic custom attribute. */ +export type Attribute = { + __typename?: 'Attribute' + /** Key or name of the attribute. */ + key: Scalars['String'] + /** Value of the attribute. */ + value?: Maybe +} + +/** Specifies the input fields required for an attribute. */ +export type AttributeInput = { + /** Key or name of the attribute. */ + key: Scalars['String'] + /** Value of the attribute. */ + value: Scalars['String'] +} + +/** Automatic discount applications capture the intentions of a discount that was automatically applied. */ +export type AutomaticDiscountApplication = DiscountApplication & { + __typename?: 'AutomaticDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** A collection of available shipping rates for a checkout. */ +export type AvailableShippingRates = { + __typename?: 'AvailableShippingRates' + /** + * Whether or not the shipping rates are ready. + * The `shippingRates` field is `null` when this value is `false`. + * This field should be polled until its value becomes `true`. + */ + ready: Scalars['Boolean'] + /** The fetched shipping rates. `null` until the `ready` field is `true`. */ + shippingRates?: Maybe> +} + +/** An online store blog. */ +export type Blog = Node & { + __typename?: 'Blog' + /** Find an article by its handle. */ + articleByHandle?: Maybe
+ /** List of the blog's articles. */ + articles: ArticleConnection + /** The authors who have contributed to the blog. */ + authors: Array + /** A human-friendly unique string for the Blog automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The blog's SEO information. */ + seo?: Maybe + /** The blogs’s title. */ + title: Scalars['String'] + /** The url pointing to the blog accessible from the web. */ + url: Scalars['URL'] +} + +/** An online store blog. */ +export type BlogArticleByHandleArgs = { + handle: Scalars['String'] +} + +/** An online store blog. */ +export type BlogArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** An auto-generated type for paginating through multiple Blogs. */ +export type BlogConnection = { + __typename?: 'BlogConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Blog and a cursor during pagination. */ +export type BlogEdge = { + __typename?: 'BlogEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of BlogEdge. */ + node: Blog +} + +/** The set of valid sort keys for the Blog query. */ +export enum BlogSortKeys { + /** Sort by the `handle` value. */ + Handle = 'HANDLE', + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Card brand, such as Visa or Mastercard, which can be used for payments. */ +export enum CardBrand { + /** Visa. */ + Visa = 'VISA', + /** Mastercard. */ + Mastercard = 'MASTERCARD', + /** Discover. */ + Discover = 'DISCOVER', + /** American Express. */ + AmericanExpress = 'AMERICAN_EXPRESS', + /** Diners Club. */ + DinersClub = 'DINERS_CLUB', + /** JCB. */ + Jcb = 'JCB', +} + +/** A container for all the information required to checkout items and pay. */ +export type Checkout = Node & { + __typename?: 'Checkout' + /** The gift cards used on the checkout. */ + appliedGiftCards: Array + /** + * The available shipping rates for this Checkout. + * Should only be used when checkout `requiresShipping` is `true` and + * the shipping address is valid. + */ + availableShippingRates?: Maybe + /** The date and time when the checkout was completed. */ + completedAt?: Maybe + /** The date and time when the checkout was created. */ + createdAt: Scalars['DateTime'] + /** The currency code for the Checkout. */ + currencyCode: CurrencyCode + /** A list of extra information that is added to the checkout. */ + customAttributes: Array + /** + * The customer associated with the checkout. + * @deprecated This field will always return null. If you have an authentication token for the customer, you can use the `customer` field on the query root to retrieve it. + */ + customer?: Maybe + /** Discounts that have been applied on the checkout. */ + discountApplications: DiscountApplicationConnection + /** The email attached to this checkout. */ + email?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** A list of line item objects, each one containing information about an item in the checkout. */ + lineItems: CheckoutLineItemConnection + /** The sum of all the prices of all the items in the checkout. Duties, taxes, shipping and discounts excluded. */ + lineItemsSubtotalPrice: MoneyV2 + /** The note associated with the checkout. */ + note?: Maybe + /** The resulting order from a paid checkout. */ + order?: Maybe + /** The Order Status Page for this Checkout, null when checkout is not completed. */ + orderStatusUrl?: Maybe + /** + * The amount left to be paid. This is equal to the cost of the line items, taxes and shipping minus discounts and gift cards. + * @deprecated Use `paymentDueV2` instead + */ + paymentDue: Scalars['Money'] + /** The amount left to be paid. This is equal to the cost of the line items, duties, taxes and shipping minus discounts and gift cards. */ + paymentDueV2: MoneyV2 + /** + * Whether or not the Checkout is ready and can be completed. Checkouts may + * have asynchronous operations that can take time to finish. If you want + * to complete a checkout or ensure all the fields are populated and up to + * date, polling is required until the value is true. + */ + ready: Scalars['Boolean'] + /** States whether or not the fulfillment requires shipping. */ + requiresShipping: Scalars['Boolean'] + /** The shipping address to where the line items will be shipped. */ + shippingAddress?: Maybe + /** The discounts that have been allocated onto the shipping line by discount applications. */ + shippingDiscountAllocations: Array + /** Once a shipping rate is selected by the customer it is transitioned to a `shipping_line` object. */ + shippingLine?: Maybe + /** + * Price of the checkout before shipping and taxes. + * @deprecated Use `subtotalPriceV2` instead + */ + subtotalPrice: Scalars['Money'] + /** Price of the checkout before duties, shipping and taxes. */ + subtotalPriceV2: MoneyV2 + /** Specifies if the Checkout is tax exempt. */ + taxExempt: Scalars['Boolean'] + /** Specifies if taxes are included in the line item and shipping line prices. */ + taxesIncluded: Scalars['Boolean'] + /** + * The sum of all the prices of all the items in the checkout, taxes and discounts included. + * @deprecated Use `totalPriceV2` instead + */ + totalPrice: Scalars['Money'] + /** The sum of all the prices of all the items in the checkout, duties, taxes and discounts included. */ + totalPriceV2: MoneyV2 + /** + * The sum of all the taxes applied to the line items and shipping lines in the checkout. + * @deprecated Use `totalTaxV2` instead + */ + totalTax: Scalars['Money'] + /** The sum of all the taxes applied to the line items and shipping lines in the checkout. */ + totalTaxV2: MoneyV2 + /** The date and time when the checkout was last updated. */ + updatedAt: Scalars['DateTime'] + /** The url pointing to the checkout accessible from the web. */ + webUrl: Scalars['URL'] +} + +/** A container for all the information required to checkout items and pay. */ +export type CheckoutDiscountApplicationsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A container for all the information required to checkout items and pay. */ +export type CheckoutLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Specifies the fields required to update a checkout's attributes. */ +export type CheckoutAttributesUpdateInput = { + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of the addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe +} + +/** Return type for `checkoutAttributesUpdate` mutation. */ +export type CheckoutAttributesUpdatePayload = { + __typename?: 'CheckoutAttributesUpdatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to update a checkout's attributes. */ +export type CheckoutAttributesUpdateV2Input = { + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of the addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe +} + +/** Return type for `checkoutAttributesUpdateV2` mutation. */ +export type CheckoutAttributesUpdateV2Payload = { + __typename?: 'CheckoutAttributesUpdateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteFree` mutation. */ +export type CheckoutCompleteFreePayload = { + __typename?: 'CheckoutCompleteFreePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithCreditCard` mutation. */ +export type CheckoutCompleteWithCreditCardPayload = { + __typename?: 'CheckoutCompleteWithCreditCardPayload' + /** The checkout on which the payment was applied. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithCreditCardV2` mutation. */ +export type CheckoutCompleteWithCreditCardV2Payload = { + __typename?: 'CheckoutCompleteWithCreditCardV2Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPayment` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentPayload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentPayload' + /** The checkout on which the payment was applied. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPaymentV2` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentV2Payload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentV2Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPaymentV3` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentV3Payload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentV3Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to create a checkout. */ +export type CheckoutCreateInput = { + /** The email with which the customer wants to checkout. */ + email?: Maybe + /** A list of line item objects, each one containing information about an item in the checkout. */ + lineItems?: Maybe> + /** The shipping address to where the line items will be shipped. */ + shippingAddress?: Maybe + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe + /** + * The three-letter currency code of one of the shop's enabled presentment currencies. + * Including this field creates a checkout in the specified currency. By default, new + * checkouts are created in the shop's primary currency. + */ + presentmentCurrencyCode?: Maybe +} + +/** Return type for `checkoutCreate` mutation. */ +export type CheckoutCreatePayload = { + __typename?: 'CheckoutCreatePayload' + /** The new checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerAssociate` mutation. */ +export type CheckoutCustomerAssociatePayload = { + __typename?: 'CheckoutCustomerAssociatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** The associated customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `checkoutCustomerAssociateV2` mutation. */ +export type CheckoutCustomerAssociateV2Payload = { + __typename?: 'CheckoutCustomerAssociateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** The associated customer object. */ + customer?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerDisassociate` mutation. */ +export type CheckoutCustomerDisassociatePayload = { + __typename?: 'CheckoutCustomerDisassociatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerDisassociateV2` mutation. */ +export type CheckoutCustomerDisassociateV2Payload = { + __typename?: 'CheckoutCustomerDisassociateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeApply` mutation. */ +export type CheckoutDiscountCodeApplyPayload = { + __typename?: 'CheckoutDiscountCodeApplyPayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeApplyV2` mutation. */ +export type CheckoutDiscountCodeApplyV2Payload = { + __typename?: 'CheckoutDiscountCodeApplyV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeRemove` mutation. */ +export type CheckoutDiscountCodeRemovePayload = { + __typename?: 'CheckoutDiscountCodeRemovePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutEmailUpdate` mutation. */ +export type CheckoutEmailUpdatePayload = { + __typename?: 'CheckoutEmailUpdatePayload' + /** The checkout object with the updated email. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutEmailUpdateV2` mutation. */ +export type CheckoutEmailUpdateV2Payload = { + __typename?: 'CheckoutEmailUpdateV2Payload' + /** The checkout object with the updated email. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Possible error codes that could be returned by CheckoutUserError. */ +export enum CheckoutErrorCode { + /** Input value is blank. */ + Blank = 'BLANK', + /** Input value is invalid. */ + Invalid = 'INVALID', + /** Input value is too long. */ + TooLong = 'TOO_LONG', + /** Input value is not present. */ + Present = 'PRESENT', + /** Input value should be less than maximum allowed value. */ + LessThan = 'LESS_THAN', + /** Input value should be greater than or equal to minimum allowed value. */ + GreaterThanOrEqualTo = 'GREATER_THAN_OR_EQUAL_TO', + /** Input value should be less or equal to maximum allowed value. */ + LessThanOrEqualTo = 'LESS_THAN_OR_EQUAL_TO', + /** Checkout is already completed. */ + AlreadyCompleted = 'ALREADY_COMPLETED', + /** Checkout is locked. */ + Locked = 'LOCKED', + /** Input value is not supported. */ + NotSupported = 'NOT_SUPPORTED', + /** Input email contains an invalid domain name. */ + BadDomain = 'BAD_DOMAIN', + /** Input Zip is invalid for country provided. */ + InvalidForCountry = 'INVALID_FOR_COUNTRY', + /** Input Zip is invalid for country and province provided. */ + InvalidForCountryAndProvince = 'INVALID_FOR_COUNTRY_AND_PROVINCE', + /** Invalid state in country. */ + InvalidStateInCountry = 'INVALID_STATE_IN_COUNTRY', + /** Invalid province in country. */ + InvalidProvinceInCountry = 'INVALID_PROVINCE_IN_COUNTRY', + /** Invalid region in country. */ + InvalidRegionInCountry = 'INVALID_REGION_IN_COUNTRY', + /** Shipping rate expired. */ + ShippingRateExpired = 'SHIPPING_RATE_EXPIRED', + /** Gift card cannot be applied to a checkout that contains a gift card. */ + GiftCardUnusable = 'GIFT_CARD_UNUSABLE', + /** Gift card is disabled. */ + GiftCardDisabled = 'GIFT_CARD_DISABLED', + /** Gift card code is invalid. */ + GiftCardCodeInvalid = 'GIFT_CARD_CODE_INVALID', + /** Gift card has already been applied. */ + GiftCardAlreadyApplied = 'GIFT_CARD_ALREADY_APPLIED', + /** Gift card currency does not match checkout currency. */ + GiftCardCurrencyMismatch = 'GIFT_CARD_CURRENCY_MISMATCH', + /** Gift card is expired. */ + GiftCardExpired = 'GIFT_CARD_EXPIRED', + /** Gift card has no funds left. */ + GiftCardDepleted = 'GIFT_CARD_DEPLETED', + /** Gift card was not found. */ + GiftCardNotFound = 'GIFT_CARD_NOT_FOUND', + /** Cart does not meet discount requirements notice. */ + CartDoesNotMeetDiscountRequirementsNotice = 'CART_DOES_NOT_MEET_DISCOUNT_REQUIREMENTS_NOTICE', + /** Discount expired. */ + DiscountExpired = 'DISCOUNT_EXPIRED', + /** Discount disabled. */ + DiscountDisabled = 'DISCOUNT_DISABLED', + /** Discount limit reached. */ + DiscountLimitReached = 'DISCOUNT_LIMIT_REACHED', + /** Discount not found. */ + DiscountNotFound = 'DISCOUNT_NOT_FOUND', + /** Customer already used once per customer discount notice. */ + CustomerAlreadyUsedOncePerCustomerDiscountNotice = 'CUSTOMER_ALREADY_USED_ONCE_PER_CUSTOMER_DISCOUNT_NOTICE', + /** Checkout is already completed. */ + Empty = 'EMPTY', + /** Not enough in stock. */ + NotEnoughInStock = 'NOT_ENOUGH_IN_STOCK', + /** Missing payment input. */ + MissingPaymentInput = 'MISSING_PAYMENT_INPUT', + /** The amount of the payment does not match the value to be paid. */ + TotalPriceMismatch = 'TOTAL_PRICE_MISMATCH', + /** Line item was not found in checkout. */ + LineItemNotFound = 'LINE_ITEM_NOT_FOUND', + /** Unable to apply discount. */ + UnableToApply = 'UNABLE_TO_APPLY', + /** Discount already applied. */ + DiscountAlreadyApplied = 'DISCOUNT_ALREADY_APPLIED', +} + +/** Return type for `checkoutGiftCardApply` mutation. */ +export type CheckoutGiftCardApplyPayload = { + __typename?: 'CheckoutGiftCardApplyPayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardRemove` mutation. */ +export type CheckoutGiftCardRemovePayload = { + __typename?: 'CheckoutGiftCardRemovePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardRemoveV2` mutation. */ +export type CheckoutGiftCardRemoveV2Payload = { + __typename?: 'CheckoutGiftCardRemoveV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardsAppend` mutation. */ +export type CheckoutGiftCardsAppendPayload = { + __typename?: 'CheckoutGiftCardsAppendPayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** A single line item in the checkout, grouped by variant and attributes. */ +export type CheckoutLineItem = Node & { + __typename?: 'CheckoutLineItem' + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes: Array + /** The discounts that have been allocated onto the checkout line item by discount applications. */ + discountAllocations: Array + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The quantity of the line item. */ + quantity: Scalars['Int'] + /** Title of the line item. Defaults to the product's title. */ + title: Scalars['String'] + /** Unit price of the line item. */ + unitPrice?: Maybe + /** Product variant of the line item. */ + variant?: Maybe +} + +/** An auto-generated type for paginating through multiple CheckoutLineItems. */ +export type CheckoutLineItemConnection = { + __typename?: 'CheckoutLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one CheckoutLineItem and a cursor during pagination. */ +export type CheckoutLineItemEdge = { + __typename?: 'CheckoutLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CheckoutLineItemEdge. */ + node: CheckoutLineItem +} + +/** Specifies the input fields to create a line item on a checkout. */ +export type CheckoutLineItemInput = { + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes?: Maybe> + /** The quantity of the line item. */ + quantity: Scalars['Int'] + /** The identifier of the product variant for the line item. */ + variantId: Scalars['ID'] +} + +/** Specifies the input fields to update a line item on the checkout. */ +export type CheckoutLineItemUpdateInput = { + /** The identifier of the line item. */ + id?: Maybe + /** The variant identifier of the line item. */ + variantId?: Maybe + /** The quantity of the line item. */ + quantity?: Maybe + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes?: Maybe> +} + +/** Return type for `checkoutLineItemsAdd` mutation. */ +export type CheckoutLineItemsAddPayload = { + __typename?: 'CheckoutLineItemsAddPayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutLineItemsRemove` mutation. */ +export type CheckoutLineItemsRemovePayload = { + __typename?: 'CheckoutLineItemsRemovePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutLineItemsReplace` mutation. */ +export type CheckoutLineItemsReplacePayload = { + __typename?: 'CheckoutLineItemsReplacePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `checkoutLineItemsUpdate` mutation. */ +export type CheckoutLineItemsUpdatePayload = { + __typename?: 'CheckoutLineItemsUpdatePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutShippingAddressUpdate` mutation. */ +export type CheckoutShippingAddressUpdatePayload = { + __typename?: 'CheckoutShippingAddressUpdatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutShippingAddressUpdateV2` mutation. */ +export type CheckoutShippingAddressUpdateV2Payload = { + __typename?: 'CheckoutShippingAddressUpdateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutShippingLineUpdate` mutation. */ +export type CheckoutShippingLineUpdatePayload = { + __typename?: 'CheckoutShippingLineUpdatePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Represents an error that happens during execution of a checkout mutation. */ +export type CheckoutUserError = DisplayableError & { + __typename?: 'CheckoutUserError' + /** Error code to uniquely identify the error. */ + code?: Maybe + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type Collection = Node & { + __typename?: 'Collection' + /** Stripped description of the collection, single line with HTML tags removed. */ + description: Scalars['String'] + /** The description of the collection, complete with HTML formatting. */ + descriptionHtml: Scalars['HTML'] + /** + * A human-friendly unique string for the collection automatically generated from its title. + * Limit of 255 characters. + */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Image associated with the collection. */ + image?: Maybe + /** List of products in the collection. */ + products: ProductConnection + /** The collection’s name. Limit of 255 characters. */ + title: Scalars['String'] + /** The date and time when the collection was last modified. */ + updatedAt: Scalars['DateTime'] +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionDescriptionArgs = { + truncateAt?: Maybe +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** An auto-generated type for paginating through multiple Collections. */ +export type CollectionConnection = { + __typename?: 'CollectionConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Collection and a cursor during pagination. */ +export type CollectionEdge = { + __typename?: 'CollectionEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CollectionEdge. */ + node: Collection +} + +/** The set of valid sort keys for the Collection query. */ +export enum CollectionSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A comment on an article. */ +export type Comment = Node & { + __typename?: 'Comment' + /** The comment’s author. */ + author: CommentAuthor + /** Stripped content of the comment, single line with HTML tags removed. */ + content: Scalars['String'] + /** The content of the comment, complete with HTML formatting. */ + contentHtml: Scalars['HTML'] + /** Globally unique identifier. */ + id: Scalars['ID'] +} + +/** A comment on an article. */ +export type CommentContentArgs = { + truncateAt?: Maybe +} + +/** The author of a comment. */ +export type CommentAuthor = { + __typename?: 'CommentAuthor' + /** The author's email. */ + email: Scalars['String'] + /** The author’s name. */ + name: Scalars['String'] +} + +/** An auto-generated type for paginating through multiple Comments. */ +export type CommentConnection = { + __typename?: 'CommentConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Comment and a cursor during pagination. */ +export type CommentEdge = { + __typename?: 'CommentEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CommentEdge. */ + node: Comment +} + +/** ISO 3166-1 alpha-2 country codes with some differences. */ +export enum CountryCode { + /** Afghanistan. */ + Af = 'AF', + /** Åland Islands. */ + Ax = 'AX', + /** Albania. */ + Al = 'AL', + /** Algeria. */ + Dz = 'DZ', + /** Andorra. */ + Ad = 'AD', + /** Angola. */ + Ao = 'AO', + /** Anguilla. */ + Ai = 'AI', + /** Antigua & Barbuda. */ + Ag = 'AG', + /** Argentina. */ + Ar = 'AR', + /** Armenia. */ + Am = 'AM', + /** Aruba. */ + Aw = 'AW', + /** Ascension Island. */ + Ac = 'AC', + /** Australia. */ + Au = 'AU', + /** Austria. */ + At = 'AT', + /** Azerbaijan. */ + Az = 'AZ', + /** Bahamas. */ + Bs = 'BS', + /** Bahrain. */ + Bh = 'BH', + /** Bangladesh. */ + Bd = 'BD', + /** Barbados. */ + Bb = 'BB', + /** Belarus. */ + By = 'BY', + /** Belgium. */ + Be = 'BE', + /** Belize. */ + Bz = 'BZ', + /** Benin. */ + Bj = 'BJ', + /** Bermuda. */ + Bm = 'BM', + /** Bhutan. */ + Bt = 'BT', + /** Bolivia. */ + Bo = 'BO', + /** Bosnia & Herzegovina. */ + Ba = 'BA', + /** Botswana. */ + Bw = 'BW', + /** Bouvet Island. */ + Bv = 'BV', + /** Brazil. */ + Br = 'BR', + /** British Indian Ocean Territory. */ + Io = 'IO', + /** Brunei. */ + Bn = 'BN', + /** Bulgaria. */ + Bg = 'BG', + /** Burkina Faso. */ + Bf = 'BF', + /** Burundi. */ + Bi = 'BI', + /** Cambodia. */ + Kh = 'KH', + /** Canada. */ + Ca = 'CA', + /** Cape Verde. */ + Cv = 'CV', + /** Caribbean Netherlands. */ + Bq = 'BQ', + /** Cayman Islands. */ + Ky = 'KY', + /** Central African Republic. */ + Cf = 'CF', + /** Chad. */ + Td = 'TD', + /** Chile. */ + Cl = 'CL', + /** China. */ + Cn = 'CN', + /** Christmas Island. */ + Cx = 'CX', + /** Cocos (Keeling) Islands. */ + Cc = 'CC', + /** Colombia. */ + Co = 'CO', + /** Comoros. */ + Km = 'KM', + /** Congo - Brazzaville. */ + Cg = 'CG', + /** Congo - Kinshasa. */ + Cd = 'CD', + /** Cook Islands. */ + Ck = 'CK', + /** Costa Rica. */ + Cr = 'CR', + /** Croatia. */ + Hr = 'HR', + /** Cuba. */ + Cu = 'CU', + /** Curaçao. */ + Cw = 'CW', + /** Cyprus. */ + Cy = 'CY', + /** Czechia. */ + Cz = 'CZ', + /** Côte d’Ivoire. */ + Ci = 'CI', + /** Denmark. */ + Dk = 'DK', + /** Djibouti. */ + Dj = 'DJ', + /** Dominica. */ + Dm = 'DM', + /** Dominican Republic. */ + Do = 'DO', + /** Ecuador. */ + Ec = 'EC', + /** Egypt. */ + Eg = 'EG', + /** El Salvador. */ + Sv = 'SV', + /** Equatorial Guinea. */ + Gq = 'GQ', + /** Eritrea. */ + Er = 'ER', + /** Estonia. */ + Ee = 'EE', + /** Eswatini. */ + Sz = 'SZ', + /** Ethiopia. */ + Et = 'ET', + /** Falkland Islands. */ + Fk = 'FK', + /** Faroe Islands. */ + Fo = 'FO', + /** Fiji. */ + Fj = 'FJ', + /** Finland. */ + Fi = 'FI', + /** France. */ + Fr = 'FR', + /** French Guiana. */ + Gf = 'GF', + /** French Polynesia. */ + Pf = 'PF', + /** French Southern Territories. */ + Tf = 'TF', + /** Gabon. */ + Ga = 'GA', + /** Gambia. */ + Gm = 'GM', + /** Georgia. */ + Ge = 'GE', + /** Germany. */ + De = 'DE', + /** Ghana. */ + Gh = 'GH', + /** Gibraltar. */ + Gi = 'GI', + /** Greece. */ + Gr = 'GR', + /** Greenland. */ + Gl = 'GL', + /** Grenada. */ + Gd = 'GD', + /** Guadeloupe. */ + Gp = 'GP', + /** Guatemala. */ + Gt = 'GT', + /** Guernsey. */ + Gg = 'GG', + /** Guinea. */ + Gn = 'GN', + /** Guinea-Bissau. */ + Gw = 'GW', + /** Guyana. */ + Gy = 'GY', + /** Haiti. */ + Ht = 'HT', + /** Heard & McDonald Islands. */ + Hm = 'HM', + /** Vatican City. */ + Va = 'VA', + /** Honduras. */ + Hn = 'HN', + /** Hong Kong SAR. */ + Hk = 'HK', + /** Hungary. */ + Hu = 'HU', + /** Iceland. */ + Is = 'IS', + /** India. */ + In = 'IN', + /** Indonesia. */ + Id = 'ID', + /** Iran. */ + Ir = 'IR', + /** Iraq. */ + Iq = 'IQ', + /** Ireland. */ + Ie = 'IE', + /** Isle of Man. */ + Im = 'IM', + /** Israel. */ + Il = 'IL', + /** Italy. */ + It = 'IT', + /** Jamaica. */ + Jm = 'JM', + /** Japan. */ + Jp = 'JP', + /** Jersey. */ + Je = 'JE', + /** Jordan. */ + Jo = 'JO', + /** Kazakhstan. */ + Kz = 'KZ', + /** Kenya. */ + Ke = 'KE', + /** Kiribati. */ + Ki = 'KI', + /** North Korea. */ + Kp = 'KP', + /** Kosovo. */ + Xk = 'XK', + /** Kuwait. */ + Kw = 'KW', + /** Kyrgyzstan. */ + Kg = 'KG', + /** Laos. */ + La = 'LA', + /** Latvia. */ + Lv = 'LV', + /** Lebanon. */ + Lb = 'LB', + /** Lesotho. */ + Ls = 'LS', + /** Liberia. */ + Lr = 'LR', + /** Libya. */ + Ly = 'LY', + /** Liechtenstein. */ + Li = 'LI', + /** Lithuania. */ + Lt = 'LT', + /** Luxembourg. */ + Lu = 'LU', + /** Macao SAR. */ + Mo = 'MO', + /** Madagascar. */ + Mg = 'MG', + /** Malawi. */ + Mw = 'MW', + /** Malaysia. */ + My = 'MY', + /** Maldives. */ + Mv = 'MV', + /** Mali. */ + Ml = 'ML', + /** Malta. */ + Mt = 'MT', + /** Martinique. */ + Mq = 'MQ', + /** Mauritania. */ + Mr = 'MR', + /** Mauritius. */ + Mu = 'MU', + /** Mayotte. */ + Yt = 'YT', + /** Mexico. */ + Mx = 'MX', + /** Moldova. */ + Md = 'MD', + /** Monaco. */ + Mc = 'MC', + /** Mongolia. */ + Mn = 'MN', + /** Montenegro. */ + Me = 'ME', + /** Montserrat. */ + Ms = 'MS', + /** Morocco. */ + Ma = 'MA', + /** Mozambique. */ + Mz = 'MZ', + /** Myanmar (Burma). */ + Mm = 'MM', + /** Namibia. */ + Na = 'NA', + /** Nauru. */ + Nr = 'NR', + /** Nepal. */ + Np = 'NP', + /** Netherlands. */ + Nl = 'NL', + /** Netherlands Antilles. */ + An = 'AN', + /** New Caledonia. */ + Nc = 'NC', + /** New Zealand. */ + Nz = 'NZ', + /** Nicaragua. */ + Ni = 'NI', + /** Niger. */ + Ne = 'NE', + /** Nigeria. */ + Ng = 'NG', + /** Niue. */ + Nu = 'NU', + /** Norfolk Island. */ + Nf = 'NF', + /** North Macedonia. */ + Mk = 'MK', + /** Norway. */ + No = 'NO', + /** Oman. */ + Om = 'OM', + /** Pakistan. */ + Pk = 'PK', + /** Palestinian Territories. */ + Ps = 'PS', + /** Panama. */ + Pa = 'PA', + /** Papua New Guinea. */ + Pg = 'PG', + /** Paraguay. */ + Py = 'PY', + /** Peru. */ + Pe = 'PE', + /** Philippines. */ + Ph = 'PH', + /** Pitcairn Islands. */ + Pn = 'PN', + /** Poland. */ + Pl = 'PL', + /** Portugal. */ + Pt = 'PT', + /** Qatar. */ + Qa = 'QA', + /** Cameroon. */ + Cm = 'CM', + /** Réunion. */ + Re = 'RE', + /** Romania. */ + Ro = 'RO', + /** Russia. */ + Ru = 'RU', + /** Rwanda. */ + Rw = 'RW', + /** St. Barthélemy. */ + Bl = 'BL', + /** St. Helena. */ + Sh = 'SH', + /** St. Kitts & Nevis. */ + Kn = 'KN', + /** St. Lucia. */ + Lc = 'LC', + /** St. Martin. */ + Mf = 'MF', + /** St. Pierre & Miquelon. */ + Pm = 'PM', + /** Samoa. */ + Ws = 'WS', + /** San Marino. */ + Sm = 'SM', + /** São Tomé & Príncipe. */ + St = 'ST', + /** Saudi Arabia. */ + Sa = 'SA', + /** Senegal. */ + Sn = 'SN', + /** Serbia. */ + Rs = 'RS', + /** Seychelles. */ + Sc = 'SC', + /** Sierra Leone. */ + Sl = 'SL', + /** Singapore. */ + Sg = 'SG', + /** Sint Maarten. */ + Sx = 'SX', + /** Slovakia. */ + Sk = 'SK', + /** Slovenia. */ + Si = 'SI', + /** Solomon Islands. */ + Sb = 'SB', + /** Somalia. */ + So = 'SO', + /** South Africa. */ + Za = 'ZA', + /** South Georgia & South Sandwich Islands. */ + Gs = 'GS', + /** South Korea. */ + Kr = 'KR', + /** South Sudan. */ + Ss = 'SS', + /** Spain. */ + Es = 'ES', + /** Sri Lanka. */ + Lk = 'LK', + /** St. Vincent & Grenadines. */ + Vc = 'VC', + /** Sudan. */ + Sd = 'SD', + /** Suriname. */ + Sr = 'SR', + /** Svalbard & Jan Mayen. */ + Sj = 'SJ', + /** Sweden. */ + Se = 'SE', + /** Switzerland. */ + Ch = 'CH', + /** Syria. */ + Sy = 'SY', + /** Taiwan. */ + Tw = 'TW', + /** Tajikistan. */ + Tj = 'TJ', + /** Tanzania. */ + Tz = 'TZ', + /** Thailand. */ + Th = 'TH', + /** Timor-Leste. */ + Tl = 'TL', + /** Togo. */ + Tg = 'TG', + /** Tokelau. */ + Tk = 'TK', + /** Tonga. */ + To = 'TO', + /** Trinidad & Tobago. */ + Tt = 'TT', + /** Tristan da Cunha. */ + Ta = 'TA', + /** Tunisia. */ + Tn = 'TN', + /** Turkey. */ + Tr = 'TR', + /** Turkmenistan. */ + Tm = 'TM', + /** Turks & Caicos Islands. */ + Tc = 'TC', + /** Tuvalu. */ + Tv = 'TV', + /** Uganda. */ + Ug = 'UG', + /** Ukraine. */ + Ua = 'UA', + /** United Arab Emirates. */ + Ae = 'AE', + /** United Kingdom. */ + Gb = 'GB', + /** United States. */ + Us = 'US', + /** U.S. Outlying Islands. */ + Um = 'UM', + /** Uruguay. */ + Uy = 'UY', + /** Uzbekistan. */ + Uz = 'UZ', + /** Vanuatu. */ + Vu = 'VU', + /** Venezuela. */ + Ve = 'VE', + /** Vietnam. */ + Vn = 'VN', + /** British Virgin Islands. */ + Vg = 'VG', + /** Wallis & Futuna. */ + Wf = 'WF', + /** Western Sahara. */ + Eh = 'EH', + /** Yemen. */ + Ye = 'YE', + /** Zambia. */ + Zm = 'ZM', + /** Zimbabwe. */ + Zw = 'ZW', +} + +/** Credit card information used for a payment. */ +export type CreditCard = { + __typename?: 'CreditCard' + /** The brand of the credit card. */ + brand?: Maybe + /** The expiry month of the credit card. */ + expiryMonth?: Maybe + /** The expiry year of the credit card. */ + expiryYear?: Maybe + /** The credit card's BIN number. */ + firstDigits?: Maybe + /** The first name of the card holder. */ + firstName?: Maybe + /** The last 4 digits of the credit card. */ + lastDigits?: Maybe + /** The last name of the card holder. */ + lastName?: Maybe + /** The masked credit card number with only the last 4 digits displayed. */ + maskedNumber?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a Shopify vaulted credit card payment. + */ +export type CreditCardPaymentInput = { + /** The amount of the payment. */ + amount: Scalars['Money'] + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The ID returned by Shopify's Card Vault. */ + vaultId: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a Shopify vaulted credit card payment. + */ +export type CreditCardPaymentInputV2 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The ID returned by Shopify's Card Vault. */ + vaultId: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe +} + +/** The part of the image that should remain after cropping. */ +export enum CropRegion { + /** Keep the center of the image. */ + Center = 'CENTER', + /** Keep the top of the image. */ + Top = 'TOP', + /** Keep the bottom of the image. */ + Bottom = 'BOTTOM', + /** Keep the left of the image. */ + Left = 'LEFT', + /** Keep the right of the image. */ + Right = 'RIGHT', +} + +/** Currency codes. */ +export enum CurrencyCode { + /** United States Dollars (USD). */ + Usd = 'USD', + /** Euro (EUR). */ + Eur = 'EUR', + /** United Kingdom Pounds (GBP). */ + Gbp = 'GBP', + /** Canadian Dollars (CAD). */ + Cad = 'CAD', + /** Afghan Afghani (AFN). */ + Afn = 'AFN', + /** Albanian Lek (ALL). */ + All = 'ALL', + /** Algerian Dinar (DZD). */ + Dzd = 'DZD', + /** Angolan Kwanza (AOA). */ + Aoa = 'AOA', + /** Argentine Pesos (ARS). */ + Ars = 'ARS', + /** Armenian Dram (AMD). */ + Amd = 'AMD', + /** Aruban Florin (AWG). */ + Awg = 'AWG', + /** Australian Dollars (AUD). */ + Aud = 'AUD', + /** Barbadian Dollar (BBD). */ + Bbd = 'BBD', + /** Azerbaijani Manat (AZN). */ + Azn = 'AZN', + /** Bangladesh Taka (BDT). */ + Bdt = 'BDT', + /** Bahamian Dollar (BSD). */ + Bsd = 'BSD', + /** Bahraini Dinar (BHD). */ + Bhd = 'BHD', + /** Burundian Franc (BIF). */ + Bif = 'BIF', + /** Belize Dollar (BZD). */ + Bzd = 'BZD', + /** Bermudian Dollar (BMD). */ + Bmd = 'BMD', + /** Bhutanese Ngultrum (BTN). */ + Btn = 'BTN', + /** Bosnia and Herzegovina Convertible Mark (BAM). */ + Bam = 'BAM', + /** Brazilian Real (BRL). */ + Brl = 'BRL', + /** Bolivian Boliviano (BOB). */ + Bob = 'BOB', + /** Botswana Pula (BWP). */ + Bwp = 'BWP', + /** Brunei Dollar (BND). */ + Bnd = 'BND', + /** Bulgarian Lev (BGN). */ + Bgn = 'BGN', + /** Burmese Kyat (MMK). */ + Mmk = 'MMK', + /** Cambodian Riel. */ + Khr = 'KHR', + /** Cape Verdean escudo (CVE). */ + Cve = 'CVE', + /** Cayman Dollars (KYD). */ + Kyd = 'KYD', + /** Central African CFA Franc (XAF). */ + Xaf = 'XAF', + /** Chilean Peso (CLP). */ + Clp = 'CLP', + /** Chinese Yuan Renminbi (CNY). */ + Cny = 'CNY', + /** Colombian Peso (COP). */ + Cop = 'COP', + /** Comorian Franc (KMF). */ + Kmf = 'KMF', + /** Congolese franc (CDF). */ + Cdf = 'CDF', + /** Costa Rican Colones (CRC). */ + Crc = 'CRC', + /** Croatian Kuna (HRK). */ + Hrk = 'HRK', + /** Czech Koruny (CZK). */ + Czk = 'CZK', + /** Danish Kroner (DKK). */ + Dkk = 'DKK', + /** Dominican Peso (DOP). */ + Dop = 'DOP', + /** East Caribbean Dollar (XCD). */ + Xcd = 'XCD', + /** Egyptian Pound (EGP). */ + Egp = 'EGP', + /** Ethiopian Birr (ETB). */ + Etb = 'ETB', + /** CFP Franc (XPF). */ + Xpf = 'XPF', + /** Fijian Dollars (FJD). */ + Fjd = 'FJD', + /** Gambian Dalasi (GMD). */ + Gmd = 'GMD', + /** Ghanaian Cedi (GHS). */ + Ghs = 'GHS', + /** Guatemalan Quetzal (GTQ). */ + Gtq = 'GTQ', + /** Guyanese Dollar (GYD). */ + Gyd = 'GYD', + /** Georgian Lari (GEL). */ + Gel = 'GEL', + /** Haitian Gourde (HTG). */ + Htg = 'HTG', + /** Honduran Lempira (HNL). */ + Hnl = 'HNL', + /** Hong Kong Dollars (HKD). */ + Hkd = 'HKD', + /** Hungarian Forint (HUF). */ + Huf = 'HUF', + /** Icelandic Kronur (ISK). */ + Isk = 'ISK', + /** Indian Rupees (INR). */ + Inr = 'INR', + /** Indonesian Rupiah (IDR). */ + Idr = 'IDR', + /** Israeli New Shekel (NIS). */ + Ils = 'ILS', + /** Iraqi Dinar (IQD). */ + Iqd = 'IQD', + /** Jamaican Dollars (JMD). */ + Jmd = 'JMD', + /** Japanese Yen (JPY). */ + Jpy = 'JPY', + /** Jersey Pound. */ + Jep = 'JEP', + /** Jordanian Dinar (JOD). */ + Jod = 'JOD', + /** Kazakhstani Tenge (KZT). */ + Kzt = 'KZT', + /** Kenyan Shilling (KES). */ + Kes = 'KES', + /** Kuwaiti Dinar (KWD). */ + Kwd = 'KWD', + /** Kyrgyzstani Som (KGS). */ + Kgs = 'KGS', + /** Laotian Kip (LAK). */ + Lak = 'LAK', + /** Latvian Lati (LVL). */ + Lvl = 'LVL', + /** Lebanese Pounds (LBP). */ + Lbp = 'LBP', + /** Lesotho Loti (LSL). */ + Lsl = 'LSL', + /** Liberian Dollar (LRD). */ + Lrd = 'LRD', + /** Lithuanian Litai (LTL). */ + Ltl = 'LTL', + /** Malagasy Ariary (MGA). */ + Mga = 'MGA', + /** Macedonia Denar (MKD). */ + Mkd = 'MKD', + /** Macanese Pataca (MOP). */ + Mop = 'MOP', + /** Malawian Kwacha (MWK). */ + Mwk = 'MWK', + /** Maldivian Rufiyaa (MVR). */ + Mvr = 'MVR', + /** Mexican Pesos (MXN). */ + Mxn = 'MXN', + /** Malaysian Ringgits (MYR). */ + Myr = 'MYR', + /** Mauritian Rupee (MUR). */ + Mur = 'MUR', + /** Moldovan Leu (MDL). */ + Mdl = 'MDL', + /** Moroccan Dirham. */ + Mad = 'MAD', + /** Mongolian Tugrik. */ + Mnt = 'MNT', + /** Mozambican Metical. */ + Mzn = 'MZN', + /** Namibian Dollar. */ + Nad = 'NAD', + /** Nepalese Rupee (NPR). */ + Npr = 'NPR', + /** Netherlands Antillean Guilder. */ + Ang = 'ANG', + /** New Zealand Dollars (NZD). */ + Nzd = 'NZD', + /** Nicaraguan Córdoba (NIO). */ + Nio = 'NIO', + /** Nigerian Naira (NGN). */ + Ngn = 'NGN', + /** Norwegian Kroner (NOK). */ + Nok = 'NOK', + /** Omani Rial (OMR). */ + Omr = 'OMR', + /** Panamian Balboa (PAB). */ + Pab = 'PAB', + /** Pakistani Rupee (PKR). */ + Pkr = 'PKR', + /** Papua New Guinean Kina (PGK). */ + Pgk = 'PGK', + /** Paraguayan Guarani (PYG). */ + Pyg = 'PYG', + /** Peruvian Nuevo Sol (PEN). */ + Pen = 'PEN', + /** Philippine Peso (PHP). */ + Php = 'PHP', + /** Polish Zlotych (PLN). */ + Pln = 'PLN', + /** Qatari Rial (QAR). */ + Qar = 'QAR', + /** Romanian Lei (RON). */ + Ron = 'RON', + /** Russian Rubles (RUB). */ + Rub = 'RUB', + /** Rwandan Franc (RWF). */ + Rwf = 'RWF', + /** Samoan Tala (WST). */ + Wst = 'WST', + /** Saudi Riyal (SAR). */ + Sar = 'SAR', + /** Sao Tome And Principe Dobra (STD). */ + Std = 'STD', + /** Serbian dinar (RSD). */ + Rsd = 'RSD', + /** Seychellois Rupee (SCR). */ + Scr = 'SCR', + /** Singapore Dollars (SGD). */ + Sgd = 'SGD', + /** Sudanese Pound (SDG). */ + Sdg = 'SDG', + /** Syrian Pound (SYP). */ + Syp = 'SYP', + /** South African Rand (ZAR). */ + Zar = 'ZAR', + /** South Korean Won (KRW). */ + Krw = 'KRW', + /** South Sudanese Pound (SSP). */ + Ssp = 'SSP', + /** Solomon Islands Dollar (SBD). */ + Sbd = 'SBD', + /** Sri Lankan Rupees (LKR). */ + Lkr = 'LKR', + /** Surinamese Dollar (SRD). */ + Srd = 'SRD', + /** Swazi Lilangeni (SZL). */ + Szl = 'SZL', + /** Swedish Kronor (SEK). */ + Sek = 'SEK', + /** Swiss Francs (CHF). */ + Chf = 'CHF', + /** Taiwan Dollars (TWD). */ + Twd = 'TWD', + /** Thai baht (THB). */ + Thb = 'THB', + /** Tanzanian Shilling (TZS). */ + Tzs = 'TZS', + /** Trinidad and Tobago Dollars (TTD). */ + Ttd = 'TTD', + /** Tunisian Dinar (TND). */ + Tnd = 'TND', + /** Turkish Lira (TRY). */ + Try = 'TRY', + /** Turkmenistani Manat (TMT). */ + Tmt = 'TMT', + /** Ugandan Shilling (UGX). */ + Ugx = 'UGX', + /** Ukrainian Hryvnia (UAH). */ + Uah = 'UAH', + /** United Arab Emirates Dirham (AED). */ + Aed = 'AED', + /** Uruguayan Pesos (UYU). */ + Uyu = 'UYU', + /** Uzbekistan som (UZS). */ + Uzs = 'UZS', + /** Vanuatu Vatu (VUV). */ + Vuv = 'VUV', + /** Vietnamese đồng (VND). */ + Vnd = 'VND', + /** West African CFA franc (XOF). */ + Xof = 'XOF', + /** Yemeni Rial (YER). */ + Yer = 'YER', + /** Zambian Kwacha (ZMW). */ + Zmw = 'ZMW', + /** Belarusian Ruble (BYN). */ + Byn = 'BYN', + /** Belarusian Ruble (BYR). */ + Byr = 'BYR', + /** Djiboutian Franc (DJF). */ + Djf = 'DJF', + /** Eritrean Nakfa (ERN). */ + Ern = 'ERN', + /** Falkland Islands Pounds (FKP). */ + Fkp = 'FKP', + /** Gibraltar Pounds (GIP). */ + Gip = 'GIP', + /** Guinean Franc (GNF). */ + Gnf = 'GNF', + /** Iranian Rial (IRR). */ + Irr = 'IRR', + /** Kiribati Dollar (KID). */ + Kid = 'KID', + /** Libyan Dinar (LYD). */ + Lyd = 'LYD', + /** Mauritanian Ouguiya (MRU). */ + Mru = 'MRU', + /** Sierra Leonean Leone (SLL). */ + Sll = 'SLL', + /** Saint Helena Pounds (SHP). */ + Shp = 'SHP', + /** Somali Shilling (SOS). */ + Sos = 'SOS', + /** Tajikistani Somoni (TJS). */ + Tjs = 'TJS', + /** Tongan Pa'anga (TOP). */ + Top = 'TOP', + /** Venezuelan Bolivares (VEF). */ + Vef = 'VEF', + /** Venezuelan Bolivares (VES). */ + Ves = 'VES', +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type Customer = { + __typename?: 'Customer' + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing: Scalars['Boolean'] + /** A list of addresses for the customer. */ + addresses: MailingAddressConnection + /** The date and time when the customer was created. */ + createdAt: Scalars['DateTime'] + /** The customer’s default address. */ + defaultAddress?: Maybe + /** The customer’s name, email or phone number. */ + displayName: Scalars['String'] + /** The customer’s email address. */ + email?: Maybe + /** The customer’s first name. */ + firstName?: Maybe + /** A unique identifier for the customer. */ + id: Scalars['ID'] + /** The customer's most recently updated, incomplete checkout. */ + lastIncompleteCheckout?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The orders associated with the customer. */ + orders: OrderConnection + /** The customer’s phone number. */ + phone?: Maybe + /** + * A comma separated list of tags that have been added to the customer. + * Additional access scope required: unauthenticated_read_customer_tags. + */ + tags: Array + /** The date and time when the customer information was updated. */ + updatedAt: Scalars['DateTime'] +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type CustomerAddressesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type CustomerOrdersArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** A CustomerAccessToken represents the unique token required to make modifications to the customer object. */ +export type CustomerAccessToken = { + __typename?: 'CustomerAccessToken' + /** The customer’s access token. */ + accessToken: Scalars['String'] + /** The date and time when the customer access token expires. */ + expiresAt: Scalars['DateTime'] +} + +/** Specifies the input fields required to create a customer access token. */ +export type CustomerAccessTokenCreateInput = { + /** The email associated to the customer. */ + email: Scalars['String'] + /** The login password to be used by the customer. */ + password: Scalars['String'] +} + +/** Return type for `customerAccessTokenCreate` mutation. */ +export type CustomerAccessTokenCreatePayload = { + __typename?: 'CustomerAccessTokenCreatePayload' + /** The newly created customer access token object. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAccessTokenCreateWithMultipass` mutation. */ +export type CustomerAccessTokenCreateWithMultipassPayload = { + __typename?: 'CustomerAccessTokenCreateWithMultipassPayload' + /** An access token object associated with the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array +} + +/** Return type for `customerAccessTokenDelete` mutation. */ +export type CustomerAccessTokenDeletePayload = { + __typename?: 'CustomerAccessTokenDeletePayload' + /** The destroyed access token. */ + deletedAccessToken?: Maybe + /** ID of the destroyed customer access token. */ + deletedCustomerAccessTokenId?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `customerAccessTokenRenew` mutation. */ +export type CustomerAccessTokenRenewPayload = { + __typename?: 'CustomerAccessTokenRenewPayload' + /** The renewed customer access token object. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `customerActivateByUrl` mutation. */ +export type CustomerActivateByUrlPayload = { + __typename?: 'CustomerActivateByUrlPayload' + /** The customer that was activated. */ + customer?: Maybe + /** A new customer access token for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array +} + +/** Specifies the input fields required to activate a customer. */ +export type CustomerActivateInput = { + /** The activation token required to activate the customer. */ + activationToken: Scalars['String'] + /** New password that will be set during activation. */ + password: Scalars['String'] +} + +/** Return type for `customerActivate` mutation. */ +export type CustomerActivatePayload = { + __typename?: 'CustomerActivatePayload' + /** The customer object. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressCreate` mutation. */ +export type CustomerAddressCreatePayload = { + __typename?: 'CustomerAddressCreatePayload' + /** The new customer address object. */ + customerAddress?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressDelete` mutation. */ +export type CustomerAddressDeletePayload = { + __typename?: 'CustomerAddressDeletePayload' + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** ID of the deleted customer address. */ + deletedCustomerAddressId?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressUpdate` mutation. */ +export type CustomerAddressUpdatePayload = { + __typename?: 'CustomerAddressUpdatePayload' + /** The customer’s updated mailing address. */ + customerAddress?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to create a new customer. */ +export type CustomerCreateInput = { + /** The customer’s first name. */ + firstName?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The customer’s email. */ + email: Scalars['String'] + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The login password used by the customer. */ + password: Scalars['String'] + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing?: Maybe +} + +/** Return type for `customerCreate` mutation. */ +export type CustomerCreatePayload = { + __typename?: 'CustomerCreatePayload' + /** The created customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerDefaultAddressUpdate` mutation. */ +export type CustomerDefaultAddressUpdatePayload = { + __typename?: 'CustomerDefaultAddressUpdatePayload' + /** The updated customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Possible error codes that could be returned by CustomerUserError. */ +export enum CustomerErrorCode { + /** Input value is blank. */ + Blank = 'BLANK', + /** Input value is invalid. */ + Invalid = 'INVALID', + /** Input value is already taken. */ + Taken = 'TAKEN', + /** Input value is too long. */ + TooLong = 'TOO_LONG', + /** Input value is too short. */ + TooShort = 'TOO_SHORT', + /** Unidentified customer. */ + UnidentifiedCustomer = 'UNIDENTIFIED_CUSTOMER', + /** Customer is disabled. */ + CustomerDisabled = 'CUSTOMER_DISABLED', + /** Input password starts or ends with whitespace. */ + PasswordStartsOrEndsWithWhitespace = 'PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE', + /** Input contains HTML tags. */ + ContainsHtmlTags = 'CONTAINS_HTML_TAGS', + /** Input contains URL. */ + ContainsUrl = 'CONTAINS_URL', + /** Invalid activation token. */ + TokenInvalid = 'TOKEN_INVALID', + /** Customer already enabled. */ + AlreadyEnabled = 'ALREADY_ENABLED', + /** Address does not exist. */ + NotFound = 'NOT_FOUND', + /** Input email contains an invalid domain name. */ + BadDomain = 'BAD_DOMAIN', + /** Multipass token is not valid. */ + InvalidMultipassRequest = 'INVALID_MULTIPASS_REQUEST', +} + +/** Return type for `customerRecover` mutation. */ +export type CustomerRecoverPayload = { + __typename?: 'CustomerRecoverPayload' + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerResetByUrl` mutation. */ +export type CustomerResetByUrlPayload = { + __typename?: 'CustomerResetByUrlPayload' + /** The customer object which was reset. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to reset a customer’s password. */ +export type CustomerResetInput = { + /** The reset token required to reset the customer’s password. */ + resetToken: Scalars['String'] + /** New password that will be set as part of the reset password process. */ + password: Scalars['String'] +} + +/** Return type for `customerReset` mutation. */ +export type CustomerResetPayload = { + __typename?: 'CustomerResetPayload' + /** The customer object which was reset. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to update the Customer information. */ +export type CustomerUpdateInput = { + /** The customer’s first name. */ + firstName?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The customer’s email. */ + email?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. To remove the phone number, specify `null`. + */ + phone?: Maybe + /** The login password used by the customer. */ + password?: Maybe + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing?: Maybe +} + +/** Return type for `customerUpdate` mutation. */ +export type CustomerUpdatePayload = { + __typename?: 'CustomerUpdatePayload' + /** The updated customer object. */ + customer?: Maybe + /** + * The newly created customer access token. If the customer's password is updated, all previous access tokens + * (including the one used to perform this mutation) become invalid, and a new token is generated. + */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Represents an error that happens during execution of a customer mutation. */ +export type CustomerUserError = DisplayableError & { + __typename?: 'CustomerUserError' + /** Error code to uniquely identify the error. */ + code?: Maybe + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Digital wallet, such as Apple Pay, which can be used for accelerated checkouts. */ +export enum DigitalWallet { + /** Apple Pay. */ + ApplePay = 'APPLE_PAY', + /** Android Pay. */ + AndroidPay = 'ANDROID_PAY', + /** Google Pay. */ + GooglePay = 'GOOGLE_PAY', + /** Shopify Pay. */ + ShopifyPay = 'SHOPIFY_PAY', +} + +/** An amount discounting the line that has been allocated by a discount. */ +export type DiscountAllocation = { + __typename?: 'DiscountAllocation' + /** Amount of discount allocated. */ + allocatedAmount: MoneyV2 + /** The discount this allocated amount originated from. */ + discountApplication: DiscountApplication +} + +/** + * Discount applications capture the intentions of a discount source at + * the time of application. + */ +export type DiscountApplication = { + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The value of the discount application. */ + value: PricingValue +} + +/** The method by which the discount's value is allocated onto its entitled lines. */ +export enum DiscountApplicationAllocationMethod { + /** The value is spread across all entitled lines. */ + Across = 'ACROSS', + /** The value is applied onto every entitled line. */ + Each = 'EACH', + /** The value is specifically applied onto a particular line. */ + One = 'ONE', +} + +/** An auto-generated type for paginating through multiple DiscountApplications. */ +export type DiscountApplicationConnection = { + __typename?: 'DiscountApplicationConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one DiscountApplication and a cursor during pagination. */ +export type DiscountApplicationEdge = { + __typename?: 'DiscountApplicationEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of DiscountApplicationEdge. */ + node: DiscountApplication +} + +/** + * Which lines on the order that the discount is allocated over, of the type + * defined by the Discount Application's target_type. + */ +export enum DiscountApplicationTargetSelection { + /** The discount is allocated onto all the lines. */ + All = 'ALL', + /** The discount is allocated onto only the lines it is entitled for. */ + Entitled = 'ENTITLED', + /** The discount is allocated onto explicitly chosen lines. */ + Explicit = 'EXPLICIT', +} + +/** The type of line (i.e. line item or shipping line) on an order that the discount is applicable towards. */ +export enum DiscountApplicationTargetType { + /** The discount applies onto line items. */ + LineItem = 'LINE_ITEM', + /** The discount applies onto shipping lines. */ + ShippingLine = 'SHIPPING_LINE', +} + +/** + * Discount code applications capture the intentions of a discount code at + * the time that it is applied. + */ +export type DiscountCodeApplication = DiscountApplication & { + __typename?: 'DiscountCodeApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Specifies whether the discount code was applied successfully. */ + applicable: Scalars['Boolean'] + /** The string identifying the discount code that was used at the time of application. */ + code: Scalars['String'] + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The value of the discount application. */ + value: PricingValue +} + +/** Represents an error in the input of a mutation. */ +export type DisplayableError = { + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Represents a web address. */ +export type Domain = { + __typename?: 'Domain' + /** The host name of the domain (eg: `example.com`). */ + host: Scalars['String'] + /** Whether SSL is enabled or not. */ + sslEnabled: Scalars['Boolean'] + /** The URL of the domain (eg: `https://example.com`). */ + url: Scalars['URL'] +} + +/** Represents a video hosted outside of Shopify. */ +export type ExternalVideo = Node & + Media & { + __typename?: 'ExternalVideo' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** The URL. */ + embeddedUrl: Scalars['URL'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + } + +/** Represents a single fulfillment in an order. */ +export type Fulfillment = { + __typename?: 'Fulfillment' + /** List of the fulfillment's line items. */ + fulfillmentLineItems: FulfillmentLineItemConnection + /** The name of the tracking company. */ + trackingCompany?: Maybe + /** + * Tracking information associated with the fulfillment, + * such as the tracking number and tracking URL. + */ + trackingInfo: Array +} + +/** Represents a single fulfillment in an order. */ +export type FulfillmentFulfillmentLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Represents a single fulfillment in an order. */ +export type FulfillmentTrackingInfoArgs = { + first?: Maybe +} + +/** Represents a single line item in a fulfillment. There is at most one fulfillment line item for each order line item. */ +export type FulfillmentLineItem = { + __typename?: 'FulfillmentLineItem' + /** The associated order's line item. */ + lineItem: OrderLineItem + /** The amount fulfilled in this fulfillment. */ + quantity: Scalars['Int'] +} + +/** An auto-generated type for paginating through multiple FulfillmentLineItems. */ +export type FulfillmentLineItemConnection = { + __typename?: 'FulfillmentLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one FulfillmentLineItem and a cursor during pagination. */ +export type FulfillmentLineItemEdge = { + __typename?: 'FulfillmentLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of FulfillmentLineItemEdge. */ + node: FulfillmentLineItem +} + +/** Tracking information associated with the fulfillment. */ +export type FulfillmentTrackingInfo = { + __typename?: 'FulfillmentTrackingInfo' + /** The tracking number of the fulfillment. */ + number?: Maybe + /** The URL to track the fulfillment. */ + url?: Maybe +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafields = { + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafieldsMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafieldsMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Represents an image resource. */ +export type Image = { + __typename?: 'Image' + /** A word or phrase to share the nature or contents of an image. */ + altText?: Maybe + /** The original height of the image in pixels. Returns `null` if the image is not hosted by Shopify. */ + height?: Maybe + /** A unique identifier for the image. */ + id?: Maybe + /** + * The location of the original image as a URL. + * + * If there are any existing transformations in the original source URL, they will remain and not be stripped. + */ + originalSrc: Scalars['URL'] + /** + * The location of the image as a URL. + * @deprecated Previously an image had a single `src` field. This could either return the original image + * location or a URL that contained transformations such as sizing or scale. + * + * These transformations were specified by arguments on the parent field. + * + * Now an image has two distinct URL fields: `originalSrc` and `transformedSrc`. + * + * * `originalSrc` - the original unmodified image URL + * * `transformedSrc` - the image URL with the specified transformations included + * + * To migrate to the new fields, image transformations should be moved from the parent field to `transformedSrc`. + * + * Before: + * ```graphql + * { + * shop { + * productImages(maxWidth: 200, scale: 2) { + * edges { + * node { + * src + * } + * } + * } + * } + * } + * ``` + * + * After: + * ```graphql + * { + * shop { + * productImages { + * edges { + * node { + * transformedSrc(maxWidth: 200, scale: 2) + * } + * } + * } + * } + * } + * ``` + * + */ + src: Scalars['URL'] + /** + * The location of the transformed image as a URL. + * + * All transformation arguments are considered "best-effort". If they can be applied to an image, they will be. + * Otherwise any transformations which an image type does not support will be ignored. + */ + transformedSrc: Scalars['URL'] + /** The original width of the image in pixels. Returns `null` if the image is not hosted by Shopify. */ + width?: Maybe +} + +/** Represents an image resource. */ +export type ImageTransformedSrcArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe + preferredContentType?: Maybe +} + +/** An auto-generated type for paginating through multiple Images. */ +export type ImageConnection = { + __typename?: 'ImageConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** List of supported image content types. */ +export enum ImageContentType { + /** A PNG image. */ + Png = 'PNG', + /** A JPG image. */ + Jpg = 'JPG', + /** A WEBP image. */ + Webp = 'WEBP', +} + +/** An auto-generated type which holds one Image and a cursor during pagination. */ +export type ImageEdge = { + __typename?: 'ImageEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ImageEdge. */ + node: Image +} + +/** Represents a mailing address for customers and shipping. */ +export type MailingAddress = Node & { + __typename?: 'MailingAddress' + /** The first line of the address. Typically the street address or PO Box number. */ + address1?: Maybe + /** The second line of the address. Typically the number of the apartment, suite, or unit. */ + address2?: Maybe + /** The name of the city, district, village, or town. */ + city?: Maybe + /** The name of the customer's company or organization. */ + company?: Maybe + /** The name of the country. */ + country?: Maybe + /** + * The two-letter code for the country of the address. + * + * For example, US. + * @deprecated Use `countryCodeV2` instead + */ + countryCode?: Maybe + /** + * The two-letter code for the country of the address. + * + * For example, US. + */ + countryCodeV2?: Maybe + /** The first name of the customer. */ + firstName?: Maybe + /** A formatted version of the address, customized by the provided arguments. */ + formatted: Array + /** A comma-separated list of the values for city, province, and country. */ + formattedArea?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The last name of the customer. */ + lastName?: Maybe + /** The latitude coordinate of the customer address. */ + latitude?: Maybe + /** The longitude coordinate of the customer address. */ + longitude?: Maybe + /** The full name of the customer, based on firstName and lastName. */ + name?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The region of the address, such as the province, state, or district. */ + province?: Maybe + /** + * The two-letter code for the region. + * + * For example, ON. + */ + provinceCode?: Maybe + /** The zip or postal code of the address. */ + zip?: Maybe +} + +/** Represents a mailing address for customers and shipping. */ +export type MailingAddressFormattedArgs = { + withName?: Maybe + withCompany?: Maybe +} + +/** An auto-generated type for paginating through multiple MailingAddresses. */ +export type MailingAddressConnection = { + __typename?: 'MailingAddressConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one MailingAddress and a cursor during pagination. */ +export type MailingAddressEdge = { + __typename?: 'MailingAddressEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MailingAddressEdge. */ + node: MailingAddress +} + +/** Specifies the fields accepted to create or update a mailing address. */ +export type MailingAddressInput = { + /** The first line of the address. Typically the street address or PO Box number. */ + address1?: Maybe + /** The second line of the address. Typically the number of the apartment, suite, or unit. */ + address2?: Maybe + /** The name of the city, district, village, or town. */ + city?: Maybe + /** The name of the customer's company or organization. */ + company?: Maybe + /** The name of the country. */ + country?: Maybe + /** The first name of the customer. */ + firstName?: Maybe + /** The last name of the customer. */ + lastName?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The region of the address, such as the province, state, or district. */ + province?: Maybe + /** The zip or postal code of the address. */ + zip?: Maybe +} + +/** Manual discount applications capture the intentions of a discount that was manually created. */ +export type ManualDiscountApplication = DiscountApplication & { + __typename?: 'ManualDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** The description of the application. */ + description?: Maybe + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** Represents a media interface. */ +export type Media = { + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe +} + +/** An auto-generated type for paginating through multiple Media. */ +export type MediaConnection = { + __typename?: 'MediaConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** The possible content types for a media object. */ +export enum MediaContentType { + /** An externally hosted video. */ + ExternalVideo = 'EXTERNAL_VIDEO', + /** A Shopify hosted image. */ + Image = 'IMAGE', + /** A 3d model. */ + Model_3D = 'MODEL_3D', + /** A Shopify hosted video. */ + Video = 'VIDEO', +} + +/** An auto-generated type which holds one Media and a cursor during pagination. */ +export type MediaEdge = { + __typename?: 'MediaEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MediaEdge. */ + node: Media +} + +/** Represents a Shopify hosted image. */ +export type MediaImage = Node & + Media & { + __typename?: 'MediaImage' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The image for the media. */ + image?: Maybe + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + } + +/** + * Metafields represent custom metadata attached to a resource. Metafields can be sorted into namespaces and are + * comprised of keys, values, and value types. + */ +export type Metafield = Node & { + __typename?: 'Metafield' + /** The date and time when the storefront metafield was created. */ + createdAt: Scalars['DateTime'] + /** The description of a metafield. */ + description?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The key name for a metafield. */ + key: Scalars['String'] + /** The namespace for a metafield. */ + namespace: Scalars['String'] + /** The parent object that the metafield belongs to. */ + parentResource: MetafieldParentResource + /** The date and time when the storefront metafield was updated. */ + updatedAt: Scalars['DateTime'] + /** The value of a metafield. */ + value: Scalars['String'] + /** Represents the metafield value type. */ + valueType: MetafieldValueType +} + +/** An auto-generated type for paginating through multiple Metafields. */ +export type MetafieldConnection = { + __typename?: 'MetafieldConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Metafield and a cursor during pagination. */ +export type MetafieldEdge = { + __typename?: 'MetafieldEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MetafieldEdge. */ + node: Metafield +} + +/** A resource that the metafield belongs to. */ +export type MetafieldParentResource = Product | ProductVariant + +/** Metafield value types. */ +export enum MetafieldValueType { + /** A string metafield. */ + String = 'STRING', + /** An integer metafield. */ + Integer = 'INTEGER', + /** A json string metafield. */ + JsonString = 'JSON_STRING', +} + +/** Represents a Shopify hosted 3D model. */ +export type Model3d = Node & + Media & { + __typename?: 'Model3d' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + /** The sources for a 3d model. */ + sources: Array + } + +/** Represents a source for a Shopify hosted 3d model. */ +export type Model3dSource = { + __typename?: 'Model3dSource' + /** The filesize of the 3d model. */ + filesize: Scalars['Int'] + /** The format of the 3d model. */ + format: Scalars['String'] + /** The MIME type of the 3d model. */ + mimeType: Scalars['String'] + /** The URL of the 3d model. */ + url: Scalars['String'] +} + +/** Specifies the fields for a monetary value with currency. */ +export type MoneyInput = { + /** Decimal money amount. */ + amount: Scalars['Decimal'] + /** Currency of the money. */ + currencyCode: CurrencyCode +} + +/** + * A monetary value with currency. + * + * To format currencies, combine this type's amount and currencyCode fields with your client's locale. + * + * For example, in JavaScript you could use Intl.NumberFormat: + * + * ```js + * new Intl.NumberFormat(locale, { + * style: 'currency', + * currency: currencyCode + * }).format(amount); + * ``` + * + * Other formatting libraries include: + * + * * iOS - [NumberFormatter](https://developer.apple.com/documentation/foundation/numberformatter) + * * Android - [NumberFormat](https://developer.android.com/reference/java/text/NumberFormat.html) + * * PHP - [NumberFormatter](http://php.net/manual/en/class.numberformatter.php) + * + * For a more general solution, the [Unicode CLDR number formatting database] is available with many implementations + * (such as [TwitterCldr](https://github.com/twitter/twitter-cldr-rb)). + */ +export type MoneyV2 = { + __typename?: 'MoneyV2' + /** Decimal money amount. */ + amount: Scalars['Decimal'] + /** Currency of the money. */ + currencyCode: CurrencyCode +} + +/** An auto-generated type for paginating through multiple MoneyV2s. */ +export type MoneyV2Connection = { + __typename?: 'MoneyV2Connection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one MoneyV2 and a cursor during pagination. */ +export type MoneyV2Edge = { + __typename?: 'MoneyV2Edge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MoneyV2Edge. */ + node: MoneyV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type Mutation = { + __typename?: 'Mutation' + /** + * Updates the attributes of a checkout. + * @deprecated Use `checkoutAttributesUpdateV2` instead + */ + checkoutAttributesUpdate?: Maybe + /** Updates the attributes of a checkout. */ + checkoutAttributesUpdateV2?: Maybe + /** Completes a checkout without providing payment information. You can use this mutation for free items or items whose purchase price is covered by a gift card. */ + checkoutCompleteFree?: Maybe + /** + * Completes a checkout using a credit card token from Shopify's Vault. + * @deprecated Use `checkoutCompleteWithCreditCardV2` instead + */ + checkoutCompleteWithCreditCard?: Maybe + /** Completes a checkout using a credit card token from Shopify's card vault. Before you can complete checkouts using CheckoutCompleteWithCreditCardV2, you need to [_request payment processing_](https://help.shopify.com/api/guides/sales-channel-sdk/getting-started#request-payment-processing). */ + checkoutCompleteWithCreditCardV2?: Maybe + /** + * Completes a checkout with a tokenized payment. + * @deprecated Use `checkoutCompleteWithTokenizedPaymentV2` instead + */ + checkoutCompleteWithTokenizedPayment?: Maybe + /** + * Completes a checkout with a tokenized payment. + * @deprecated Use `checkoutCompleteWithTokenizedPaymentV3` instead + */ + checkoutCompleteWithTokenizedPaymentV2?: Maybe + /** Completes a checkout with a tokenized payment. */ + checkoutCompleteWithTokenizedPaymentV3?: Maybe + /** Creates a new checkout. */ + checkoutCreate?: Maybe + /** + * Associates a customer to the checkout. + * @deprecated Use `checkoutCustomerAssociateV2` instead + */ + checkoutCustomerAssociate?: Maybe + /** Associates a customer to the checkout. */ + checkoutCustomerAssociateV2?: Maybe + /** + * Disassociates the current checkout customer from the checkout. + * @deprecated Use `checkoutCustomerDisassociateV2` instead + */ + checkoutCustomerDisassociate?: Maybe + /** Disassociates the current checkout customer from the checkout. */ + checkoutCustomerDisassociateV2?: Maybe + /** + * Applies a discount to an existing checkout using a discount code. + * @deprecated Use `checkoutDiscountCodeApplyV2` instead + */ + checkoutDiscountCodeApply?: Maybe + /** Applies a discount to an existing checkout using a discount code. */ + checkoutDiscountCodeApplyV2?: Maybe + /** Removes the applied discount from an existing checkout. */ + checkoutDiscountCodeRemove?: Maybe + /** + * Updates the email on an existing checkout. + * @deprecated Use `checkoutEmailUpdateV2` instead + */ + checkoutEmailUpdate?: Maybe + /** Updates the email on an existing checkout. */ + checkoutEmailUpdateV2?: Maybe + /** + * Applies a gift card to an existing checkout using a gift card code. This will replace all currently applied gift cards. + * @deprecated Use `checkoutGiftCardsAppend` instead + */ + checkoutGiftCardApply?: Maybe + /** + * Removes an applied gift card from the checkout. + * @deprecated Use `checkoutGiftCardRemoveV2` instead + */ + checkoutGiftCardRemove?: Maybe + /** Removes an applied gift card from the checkout. */ + checkoutGiftCardRemoveV2?: Maybe + /** Appends gift cards to an existing checkout. */ + checkoutGiftCardsAppend?: Maybe + /** Adds a list of line items to a checkout. */ + checkoutLineItemsAdd?: Maybe + /** Removes line items from an existing checkout. */ + checkoutLineItemsRemove?: Maybe + /** Sets a list of line items to a checkout. */ + checkoutLineItemsReplace?: Maybe + /** Updates line items on a checkout. */ + checkoutLineItemsUpdate?: Maybe + /** + * Updates the shipping address of an existing checkout. + * @deprecated Use `checkoutShippingAddressUpdateV2` instead + */ + checkoutShippingAddressUpdate?: Maybe + /** Updates the shipping address of an existing checkout. */ + checkoutShippingAddressUpdateV2?: Maybe + /** Updates the shipping lines on an existing checkout. */ + checkoutShippingLineUpdate?: Maybe + /** + * Creates a customer access token. + * The customer access token is required to modify the customer object in any way. + */ + customerAccessTokenCreate?: Maybe + /** + * Creates a customer access token using a multipass token instead of email and password. + * A customer record is created if customer does not exist. If a customer record already + * exists but the record is disabled, then it's enabled. + */ + customerAccessTokenCreateWithMultipass?: Maybe + /** Permanently destroys a customer access token. */ + customerAccessTokenDelete?: Maybe + /** + * Renews a customer access token. + * + * Access token renewal must happen *before* a token expires. + * If a token has already expired, a new one should be created instead via `customerAccessTokenCreate`. + */ + customerAccessTokenRenew?: Maybe + /** Activates a customer. */ + customerActivate?: Maybe + /** Activates a customer with the activation url received from `customerCreate`. */ + customerActivateByUrl?: Maybe + /** Creates a new address for a customer. */ + customerAddressCreate?: Maybe + /** Permanently deletes the address of an existing customer. */ + customerAddressDelete?: Maybe + /** Updates the address of an existing customer. */ + customerAddressUpdate?: Maybe + /** Creates a new customer. */ + customerCreate?: Maybe + /** Updates the default address of an existing customer. */ + customerDefaultAddressUpdate?: Maybe + /** Sends a reset password email to the customer, as the first step in the reset password process. */ + customerRecover?: Maybe + /** Resets a customer’s password with a token received from `CustomerRecover`. */ + customerReset?: Maybe + /** Resets a customer’s password with the reset password url received from `CustomerRecover`. */ + customerResetByUrl?: Maybe + /** Updates an existing customer. */ + customerUpdate?: Maybe +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutAttributesUpdateArgs = { + checkoutId: Scalars['ID'] + input: CheckoutAttributesUpdateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutAttributesUpdateV2Args = { + checkoutId: Scalars['ID'] + input: CheckoutAttributesUpdateV2Input +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteFreeArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithCreditCardArgs = { + checkoutId: Scalars['ID'] + payment: CreditCardPaymentInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithCreditCardV2Args = { + checkoutId: Scalars['ID'] + payment: CreditCardPaymentInputV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentArgs = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentV2Args = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInputV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentV3Args = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInputV3 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCreateArgs = { + input: CheckoutCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerAssociateArgs = { + checkoutId: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerAssociateV2Args = { + checkoutId: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerDisassociateArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerDisassociateV2Args = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeApplyArgs = { + discountCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeApplyV2Args = { + discountCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeRemoveArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutEmailUpdateArgs = { + checkoutId: Scalars['ID'] + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutEmailUpdateV2Args = { + checkoutId: Scalars['ID'] + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardApplyArgs = { + giftCardCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardRemoveArgs = { + appliedGiftCardId: Scalars['ID'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardRemoveV2Args = { + appliedGiftCardId: Scalars['ID'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardsAppendArgs = { + giftCardCodes: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsAddArgs = { + lineItems: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsRemoveArgs = { + checkoutId: Scalars['ID'] + lineItemIds: Array +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsReplaceArgs = { + lineItems: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsUpdateArgs = { + checkoutId: Scalars['ID'] + lineItems: Array +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingAddressUpdateArgs = { + shippingAddress: MailingAddressInput + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingAddressUpdateV2Args = { + shippingAddress: MailingAddressInput + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingLineUpdateArgs = { + checkoutId: Scalars['ID'] + shippingRateHandle: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenCreateArgs = { + input: CustomerAccessTokenCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenCreateWithMultipassArgs = { + multipassToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenDeleteArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenRenewArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerActivateArgs = { + id: Scalars['ID'] + input: CustomerActivateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerActivateByUrlArgs = { + activationUrl: Scalars['URL'] + password: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressCreateArgs = { + customerAccessToken: Scalars['String'] + address: MailingAddressInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressDeleteArgs = { + id: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressUpdateArgs = { + customerAccessToken: Scalars['String'] + id: Scalars['ID'] + address: MailingAddressInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerCreateArgs = { + input: CustomerCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerDefaultAddressUpdateArgs = { + customerAccessToken: Scalars['String'] + addressId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerRecoverArgs = { + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerResetArgs = { + id: Scalars['ID'] + input: CustomerResetInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerResetByUrlArgs = { + resetUrl: Scalars['URL'] + password: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerUpdateArgs = { + customerAccessToken: Scalars['String'] + customer: CustomerUpdateInput +} + +/** An object with an ID to support global identification. */ +export type Node = { + /** Globally unique identifier. */ + id: Scalars['ID'] +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type Order = Node & { + __typename?: 'Order' + /** The reason for the order's cancellation. Returns `null` if the order wasn't canceled. */ + cancelReason?: Maybe + /** The date and time when the order was canceled. Returns null if the order wasn't canceled. */ + canceledAt?: Maybe + /** The code of the currency used for the payment. */ + currencyCode: CurrencyCode + /** The subtotal of line items and their discounts, excluding line items that have been removed. Does not contain order-level discounts, duties, shipping costs, or shipping discounts. Taxes are not included unless the order is a taxes-included order. */ + currentSubtotalPrice: MoneyV2 + /** The total amount of the order, including duties, taxes and discounts, minus amounts for line items that have been removed. */ + currentTotalPrice: MoneyV2 + /** The total of all taxes applied to the order, excluding taxes for returned line items. */ + currentTotalTax: MoneyV2 + /** The locale code in which this specific order happened. */ + customerLocale?: Maybe + /** The unique URL that the customer can use to access the order. */ + customerUrl?: Maybe + /** Discounts that have been applied on the order. */ + discountApplications: DiscountApplicationConnection + /** Whether the order has had any edits applied or not. */ + edited: Scalars['Boolean'] + /** The customer's email address. */ + email?: Maybe + /** The financial status of the order. */ + financialStatus?: Maybe + /** The fulfillment status for the order. */ + fulfillmentStatus: OrderFulfillmentStatus + /** Globally unique identifier. */ + id: Scalars['ID'] + /** List of the order’s line items. */ + lineItems: OrderLineItemConnection + /** + * Unique identifier for the order that appears on the order. + * For example, _#1000_ or _Store1001. + */ + name: Scalars['String'] + /** A unique numeric identifier for the order for use by shop owner and customer. */ + orderNumber: Scalars['Int'] + /** The total price of the order before any applied edits. */ + originalTotalPrice: MoneyV2 + /** The customer's phone number for receiving SMS notifications. */ + phone?: Maybe + /** + * The date and time when the order was imported. + * This value can be set to dates in the past when importing from other systems. + * If no value is provided, it will be auto-generated based on current date and time. + */ + processedAt: Scalars['DateTime'] + /** The address to where the order will be shipped. */ + shippingAddress?: Maybe + /** The discounts that have been allocated onto the shipping line by discount applications. */ + shippingDiscountAllocations: Array + /** The unique URL for the order's status page. */ + statusUrl: Scalars['URL'] + /** + * Price of the order before shipping and taxes. + * @deprecated Use `subtotalPriceV2` instead + */ + subtotalPrice?: Maybe + /** Price of the order before duties, shipping and taxes. */ + subtotalPriceV2?: Maybe + /** List of the order’s successful fulfillments. */ + successfulFulfillments?: Maybe> + /** + * The sum of all the prices of all the items in the order, taxes and discounts included (must be positive). + * @deprecated Use `totalPriceV2` instead + */ + totalPrice: Scalars['Money'] + /** The sum of all the prices of all the items in the order, duties, taxes and discounts included (must be positive). */ + totalPriceV2: MoneyV2 + /** + * The total amount that has been refunded. + * @deprecated Use `totalRefundedV2` instead + */ + totalRefunded: Scalars['Money'] + /** The total amount that has been refunded. */ + totalRefundedV2: MoneyV2 + /** + * The total cost of shipping. + * @deprecated Use `totalShippingPriceV2` instead + */ + totalShippingPrice: Scalars['Money'] + /** The total cost of shipping. */ + totalShippingPriceV2: MoneyV2 + /** + * The total cost of taxes. + * @deprecated Use `totalTaxV2` instead + */ + totalTax?: Maybe + /** The total cost of taxes. */ + totalTaxV2?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderDiscountApplicationsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderSuccessfulFulfillmentsArgs = { + first?: Maybe +} + +/** Represents the reason for the order's cancellation. */ +export enum OrderCancelReason { + /** The customer wanted to cancel the order. */ + Customer = 'CUSTOMER', + /** The order was fraudulent. */ + Fraud = 'FRAUD', + /** There was insufficient inventory. */ + Inventory = 'INVENTORY', + /** Payment was declined. */ + Declined = 'DECLINED', + /** The order was canceled for an unlisted reason. */ + Other = 'OTHER', +} + +/** An auto-generated type for paginating through multiple Orders. */ +export type OrderConnection = { + __typename?: 'OrderConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Order and a cursor during pagination. */ +export type OrderEdge = { + __typename?: 'OrderEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of OrderEdge. */ + node: Order +} + +/** Represents the order's current financial status. */ +export enum OrderFinancialStatus { + /** Displayed as **Pending**. */ + Pending = 'PENDING', + /** Displayed as **Authorized**. */ + Authorized = 'AUTHORIZED', + /** Displayed as **Partially paid**. */ + PartiallyPaid = 'PARTIALLY_PAID', + /** Displayed as **Partially refunded**. */ + PartiallyRefunded = 'PARTIALLY_REFUNDED', + /** Displayed as **Voided**. */ + Voided = 'VOIDED', + /** Displayed as **Paid**. */ + Paid = 'PAID', + /** Displayed as **Refunded**. */ + Refunded = 'REFUNDED', +} + +/** Represents the order's current fulfillment status. */ +export enum OrderFulfillmentStatus { + /** Displayed as **Unfulfilled**. */ + Unfulfilled = 'UNFULFILLED', + /** Displayed as **Partially fulfilled**. */ + PartiallyFulfilled = 'PARTIALLY_FULFILLED', + /** Displayed as **Fulfilled**. */ + Fulfilled = 'FULFILLED', + /** Displayed as **Restocked**. */ + Restocked = 'RESTOCKED', + /** Displayed as **Pending fulfillment**. */ + PendingFulfillment = 'PENDING_FULFILLMENT', + /** Displayed as **Open**. */ + Open = 'OPEN', + /** Displayed as **In progress**. */ + InProgress = 'IN_PROGRESS', + /** Displayed as **Scheduled**. */ + Scheduled = 'SCHEDULED', +} + +/** Represents a single line in an order. There is one line item for each distinct product variant. */ +export type OrderLineItem = { + __typename?: 'OrderLineItem' + /** The number of entries associated to the line item minus the items that have been removed. */ + currentQuantity: Scalars['Int'] + /** List of custom attributes associated to the line item. */ + customAttributes: Array + /** The discounts that have been allocated onto the order line item by discount applications. */ + discountAllocations: Array + /** The total price of the line item, including discounts, and displayed in the presentment currency. */ + discountedTotalPrice: MoneyV2 + /** The total price of the line item, not including any discounts. The total price is calculated using the original unit price multiplied by the quantity, and it is displayed in the presentment currency. */ + originalTotalPrice: MoneyV2 + /** The number of products variants associated to the line item. */ + quantity: Scalars['Int'] + /** The title of the product combined with title of the variant. */ + title: Scalars['String'] + /** The product variant object associated to the line item. */ + variant?: Maybe +} + +/** An auto-generated type for paginating through multiple OrderLineItems. */ +export type OrderLineItemConnection = { + __typename?: 'OrderLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one OrderLineItem and a cursor during pagination. */ +export type OrderLineItemEdge = { + __typename?: 'OrderLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of OrderLineItemEdge. */ + node: OrderLineItem +} + +/** The set of valid sort keys for the Order query. */ +export enum OrderSortKeys { + /** Sort by the `processed_at` value. */ + ProcessedAt = 'PROCESSED_AT', + /** Sort by the `total_price` value. */ + TotalPrice = 'TOTAL_PRICE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Shopify merchants can create pages to hold static HTML content. Each Page object represents a custom page on the online store. */ +export type Page = Node & { + __typename?: 'Page' + /** The description of the page, complete with HTML formatting. */ + body: Scalars['HTML'] + /** Summary of the page body. */ + bodySummary: Scalars['String'] + /** The timestamp of the page creation. */ + createdAt: Scalars['DateTime'] + /** A human-friendly unique string for the page automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The page's SEO information. */ + seo?: Maybe + /** The title of the page. */ + title: Scalars['String'] + /** The timestamp of the latest page update. */ + updatedAt: Scalars['DateTime'] + /** The url pointing to the page accessible from the web. */ + url: Scalars['URL'] +} + +/** An auto-generated type for paginating through multiple Pages. */ +export type PageConnection = { + __typename?: 'PageConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Page and a cursor during pagination. */ +export type PageEdge = { + __typename?: 'PageEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of PageEdge. */ + node: Page +} + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: 'PageInfo' + /** Indicates if there are more pages to fetch. */ + hasNextPage: Scalars['Boolean'] + /** Indicates if there are any pages prior to the current page. */ + hasPreviousPage: Scalars['Boolean'] +} + +/** The set of valid sort keys for the Page query. */ +export enum PageSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A payment applied to a checkout. */ +export type Payment = Node & { + __typename?: 'Payment' + /** + * The amount of the payment. + * @deprecated Use `amountV2` instead + */ + amount: Scalars['Money'] + /** The amount of the payment. */ + amountV2: MoneyV2 + /** The billing address for the payment. */ + billingAddress?: Maybe + /** The checkout to which the payment belongs. */ + checkout: Checkout + /** The credit card used for the payment in the case of direct payments. */ + creditCard?: Maybe + /** A message describing a processing error during asynchronous processing. */ + errorMessage?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** + * A client-side generated token to identify a payment and perform idempotent operations. + * For more information, refer to + * [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + */ + idempotencyKey?: Maybe + /** The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. */ + nextActionUrl?: Maybe + /** Whether or not the payment is still processing asynchronously. */ + ready: Scalars['Boolean'] + /** A flag to indicate if the payment is to be done in test mode for gateways that support it. */ + test: Scalars['Boolean'] + /** The actual transaction recorded by Shopify after having processed the payment with the gateway. */ + transaction?: Maybe +} + +/** Settings related to payments. */ +export type PaymentSettings = { + __typename?: 'PaymentSettings' + /** List of the card brands which the shop accepts. */ + acceptedCardBrands: Array + /** The url pointing to the endpoint to vault credit cards. */ + cardVaultUrl: Scalars['URL'] + /** The country where the shop is located. */ + countryCode: CountryCode + /** The three-letter code for the shop's primary currency. */ + currencyCode: CurrencyCode + /** A list of enabled currencies (ISO 4217 format) that the shop accepts. Merchants can enable currencies from their Shopify Payments settings in the Shopify admin. */ + enabledPresentmentCurrencies: Array + /** The shop’s Shopify Payments account id. */ + shopifyPaymentsAccountId?: Maybe + /** List of the digital wallets which the shop supports. */ + supportedDigitalWallets: Array +} + +/** The valid values for the types of payment token. */ +export enum PaymentTokenType { + /** Apple Pay token type. */ + ApplePay = 'APPLE_PAY', + /** Vault payment token type. */ + Vault = 'VAULT', + /** Shopify Pay token type. */ + ShopifyPay = 'SHOPIFY_PAY', + /** Google Pay token type. */ + GooglePay = 'GOOGLE_PAY', +} + +/** The value of the percentage pricing object. */ +export type PricingPercentageValue = { + __typename?: 'PricingPercentageValue' + /** The percentage value of the object. */ + percentage: Scalars['Float'] +} + +/** The price value (fixed or percentage) for a discount application. */ +export type PricingValue = MoneyV2 | PricingPercentageValue + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type Product = Node & + HasMetafields & { + __typename?: 'Product' + /** Indicates if at least one product variant is available for sale. */ + availableForSale: Scalars['Boolean'] + /** List of collections a product belongs to. */ + collections: CollectionConnection + /** The compare at price of the product across all variants. */ + compareAtPriceRange: ProductPriceRange + /** The date and time when the product was created. */ + createdAt: Scalars['DateTime'] + /** Stripped description of the product, single line with HTML tags removed. */ + description: Scalars['String'] + /** The description of the product, complete with HTML formatting. */ + descriptionHtml: Scalars['HTML'] + /** + * A human-friendly unique string for the Product automatically generated from its title. + * They are used by the Liquid templating language to refer to objects. + */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** List of images associated with the product. */ + images: ImageConnection + /** The media associated with the product. */ + media: MediaConnection + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection + /** + * The online store URL for the product. + * A value of `null` indicates that the product is not published to the Online Store sales channel. + */ + onlineStoreUrl?: Maybe + /** List of product options. */ + options: Array + /** List of price ranges in the presentment currencies for this shop. */ + presentmentPriceRanges: ProductPriceRangeConnection + /** The price range. */ + priceRange: ProductPriceRange + /** A categorization that a product can be tagged with, commonly used for filtering and searching. */ + productType: Scalars['String'] + /** The date and time when the product was published to the channel. */ + publishedAt: Scalars['DateTime'] + /** The product's SEO information. */ + seo: Seo + /** + * A comma separated list of tags that have been added to the product. + * Additional access scope required for private apps: unauthenticated_read_product_tags. + */ + tags: Array + /** The product’s title. */ + title: Scalars['String'] + /** The total quantity of inventory in stock for this Product. */ + totalInventory?: Maybe + /** + * The date and time when the product was last modified. + * A product's `updatedAt` value can change for different reasons. For example, if an order + * is placed for a product that has inventory tracking set up, then the inventory adjustment + * is counted as an update. + */ + updatedAt: Scalars['DateTime'] + /** + * Find a product’s variant based on its selected options. + * This is useful for converting a user’s selection of product options into a single matching variant. + * If there is not a variant for the selected options, `null` will be returned. + */ + variantBySelectedOptions?: Maybe + /** List of the product’s variants. */ + variants: ProductVariantConnection + /** The product’s vendor name. */ + vendor: Scalars['String'] + } + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductDescriptionArgs = { + truncateAt?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductImagesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMediaArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductOptionsArgs = { + first?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductPresentmentPriceRangesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductVariantBySelectedOptionsArgs = { + selectedOptions: Array +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductVariantsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** The set of valid sort keys for the ProductCollection query. */ +export enum ProductCollectionSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `price` value. */ + Price = 'PRICE', + /** Sort by the `best-selling` value. */ + BestSelling = 'BEST_SELLING', + /** Sort by the `created` value. */ + Created = 'CREATED', + /** Sort by the `id` value. */ + Id = 'ID', + /** Sort by the `manual` value. */ + Manual = 'MANUAL', + /** Sort by the `collection-default` value. */ + CollectionDefault = 'COLLECTION_DEFAULT', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** An auto-generated type for paginating through multiple Products. */ +export type ProductConnection = { + __typename?: 'ProductConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Product and a cursor during pagination. */ +export type ProductEdge = { + __typename?: 'ProductEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductEdge. */ + node: Product +} + +/** The set of valid sort keys for the ProductImage query. */ +export enum ProductImageSortKeys { + /** Sort by the `created_at` value. */ + CreatedAt = 'CREATED_AT', + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** The set of valid sort keys for the ProductMedia query. */ +export enum ProductMediaSortKeys { + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** + * Product property names like "Size", "Color", and "Material" that the customers can select. + * Variants are selected based on permutations of these options. + * 255 characters limit each. + */ +export type ProductOption = Node & { + __typename?: 'ProductOption' + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The product option’s name. */ + name: Scalars['String'] + /** The corresponding value to the product option name. */ + values: Array +} + +/** The price range of the product. */ +export type ProductPriceRange = { + __typename?: 'ProductPriceRange' + /** The highest variant's price. */ + maxVariantPrice: MoneyV2 + /** The lowest variant's price. */ + minVariantPrice: MoneyV2 +} + +/** An auto-generated type for paginating through multiple ProductPriceRanges. */ +export type ProductPriceRangeConnection = { + __typename?: 'ProductPriceRangeConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductPriceRange and a cursor during pagination. */ +export type ProductPriceRangeEdge = { + __typename?: 'ProductPriceRangeEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductPriceRangeEdge. */ + node: ProductPriceRange +} + +/** The set of valid sort keys for the Product query. */ +export enum ProductSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `product_type` value. */ + ProductType = 'PRODUCT_TYPE', + /** Sort by the `vendor` value. */ + Vendor = 'VENDOR', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `created_at` value. */ + CreatedAt = 'CREATED_AT', + /** Sort by the `best_selling` value. */ + BestSelling = 'BEST_SELLING', + /** Sort by the `price` value. */ + Price = 'PRICE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariant = Node & + HasMetafields & { + __typename?: 'ProductVariant' + /** + * Indicates if the product variant is in stock. + * @deprecated Use `availableForSale` instead + */ + available?: Maybe + /** Indicates if the product variant is available for sale. */ + availableForSale: Scalars['Boolean'] + /** + * The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPrice` is higher than `price`. + * @deprecated Use `compareAtPriceV2` instead + */ + compareAtPrice?: Maybe + /** The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPriceV2` is higher than `priceV2`. */ + compareAtPriceV2?: Maybe + /** Whether a product is out of stock but still available for purchase (used for backorders). */ + currentlyNotInStock: Scalars['Boolean'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Image associated with the product variant. This field falls back to the product image if no image is available. */ + image?: Maybe + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection + /** List of prices and compare-at prices in the presentment currencies for this shop. */ + presentmentPrices: ProductVariantPricePairConnection + /** List of unit prices in the presentment currencies for this shop. */ + presentmentUnitPrices: MoneyV2Connection + /** + * The product variant’s price. + * @deprecated Use `priceV2` instead + */ + price: Scalars['Money'] + /** The product variant’s price. */ + priceV2: MoneyV2 + /** The product object that the product variant belongs to. */ + product: Product + /** The total sellable quantity of the variant for online sales channels. */ + quantityAvailable?: Maybe + /** Whether a customer needs to provide a shipping address when placing an order for the product variant. */ + requiresShipping: Scalars['Boolean'] + /** List of product options applied to the variant. */ + selectedOptions: Array + /** The SKU (stock keeping unit) associated with the variant. */ + sku?: Maybe + /** The product variant’s title. */ + title: Scalars['String'] + /** The unit price value for the variant based on the variant's measurement. */ + unitPrice?: Maybe + /** The unit price measurement for the variant. */ + unitPriceMeasurement?: Maybe + /** The weight of the product variant in the unit system specified with `weight_unit`. */ + weight?: Maybe + /** Unit of measurement for weight. */ + weightUnit: WeightUnit + } + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantPresentmentPricesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantPresentmentUnitPricesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An auto-generated type for paginating through multiple ProductVariants. */ +export type ProductVariantConnection = { + __typename?: 'ProductVariantConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductVariant and a cursor during pagination. */ +export type ProductVariantEdge = { + __typename?: 'ProductVariantEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductVariantEdge. */ + node: ProductVariant +} + +/** The compare-at price and price of a variant sharing a currency. */ +export type ProductVariantPricePair = { + __typename?: 'ProductVariantPricePair' + /** The compare-at price of the variant with associated currency. */ + compareAtPrice?: Maybe + /** The price of the variant with associated currency. */ + price: MoneyV2 +} + +/** An auto-generated type for paginating through multiple ProductVariantPricePairs. */ +export type ProductVariantPricePairConnection = { + __typename?: 'ProductVariantPricePairConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductVariantPricePair and a cursor during pagination. */ +export type ProductVariantPricePairEdge = { + __typename?: 'ProductVariantPricePairEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductVariantPricePairEdge. */ + node: ProductVariantPricePair +} + +/** The set of valid sort keys for the ProductVariant query. */ +export enum ProductVariantSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `sku` value. */ + Sku = 'SKU', + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRoot = { + __typename?: 'QueryRoot' + /** List of the shop's articles. */ + articles: ArticleConnection + /** Find a blog by its handle. */ + blogByHandle?: Maybe + /** List of the shop's blogs. */ + blogs: BlogConnection + /** Find a collection by its handle. */ + collectionByHandle?: Maybe + /** List of the shop’s collections. */ + collections: CollectionConnection + /** Find a customer by its access token. */ + customer?: Maybe + /** Returns a specific node by ID. */ + node?: Maybe + /** Returns the list of nodes with the given IDs. */ + nodes: Array> + /** Find a page by its handle. */ + pageByHandle?: Maybe + /** List of the shop's pages. */ + pages: PageConnection + /** Find a product by its handle. */ + productByHandle?: Maybe + /** + * Find recommended products related to a given `product_id`. + * To learn more about how recommendations are generated, see + * [*Showing product recommendations on product pages*](https://help.shopify.com/themes/development/recommended-products). + */ + productRecommendations?: Maybe> + /** + * Tags added to products. + * Additional access scope required: unauthenticated_read_product_tags. + */ + productTags: StringConnection + /** List of product types for the shop's products that are published to your app. */ + productTypes: StringConnection + /** List of the shop’s products. */ + products: ProductConnection + /** The list of public Storefront API versions, including supported, release candidate and unstable versions. */ + publicApiVersions: Array + /** The shop associated with the storefront access token. */ + shop: Shop +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootBlogByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootBlogsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCollectionByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCustomerArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootNodeArgs = { + id: Scalars['ID'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootNodesArgs = { + ids: Array +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootPageByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootPagesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductRecommendationsArgs = { + productId: Scalars['ID'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductTagsArgs = { + first: Scalars['Int'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductTypesArgs = { + first: Scalars['Int'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** SEO information. */ +export type Seo = { + __typename?: 'SEO' + /** The meta description. */ + description?: Maybe + /** The SEO title. */ + title?: Maybe +} + +/** + * Script discount applications capture the intentions of a discount that + * was created by a Shopify Script. + */ +export type ScriptDiscountApplication = DiscountApplication & { + __typename?: 'ScriptDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** + * The description of the application as defined by the Script. + * @deprecated Use `title` instead + */ + description: Scalars['String'] + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application as defined by the Script. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** + * Properties used by customers to select a product variant. + * Products can have multiple options, like different sizes or colors. + */ +export type SelectedOption = { + __typename?: 'SelectedOption' + /** The product option’s name. */ + name: Scalars['String'] + /** The product option’s value. */ + value: Scalars['String'] +} + +/** Specifies the input fields required for a selected option. */ +export type SelectedOptionInput = { + /** The product option’s name. */ + name: Scalars['String'] + /** The product option’s value. */ + value: Scalars['String'] +} + +/** A shipping rate to be applied to a checkout. */ +export type ShippingRate = { + __typename?: 'ShippingRate' + /** Human-readable unique identifier for this shipping rate. */ + handle: Scalars['String'] + /** + * Price of this shipping rate. + * @deprecated Use `priceV2` instead + */ + price: Scalars['Money'] + /** Price of this shipping rate. */ + priceV2: MoneyV2 + /** Title of this shipping rate. */ + title: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type Shop = { + __typename?: 'Shop' + /** + * List of the shop' articles. + * @deprecated Use `QueryRoot.articles` instead. + */ + articles: ArticleConnection + /** + * List of the shop' blogs. + * @deprecated Use `QueryRoot.blogs` instead. + */ + blogs: BlogConnection + /** + * Find a collection by its handle. + * @deprecated Use `QueryRoot.collectionByHandle` instead. + */ + collectionByHandle?: Maybe + /** + * List of the shop’s collections. + * @deprecated Use `QueryRoot.collections` instead. + */ + collections: CollectionConnection + /** + * The three-letter code for the currency that the shop accepts. + * @deprecated Use `paymentSettings` instead + */ + currencyCode: CurrencyCode + /** A description of the shop. */ + description?: Maybe + /** A string representing the way currency is formatted when the currency isn’t specified. */ + moneyFormat: Scalars['String'] + /** The shop’s name. */ + name: Scalars['String'] + /** Settings related to payments. */ + paymentSettings: PaymentSettings + /** The shop’s primary domain. */ + primaryDomain: Domain + /** The shop’s privacy policy. */ + privacyPolicy?: Maybe + /** + * Find a product by its handle. + * @deprecated Use `QueryRoot.productByHandle` instead. + */ + productByHandle?: Maybe + /** + * A list of tags that have been added to products. + * Additional access scope required: unauthenticated_read_product_tags. + * @deprecated Use `QueryRoot.productTags` instead. + */ + productTags: StringConnection + /** + * List of the shop’s product types. + * @deprecated Use `QueryRoot.productTypes` instead. + */ + productTypes: StringConnection + /** + * List of the shop’s products. + * @deprecated Use `QueryRoot.products` instead. + */ + products: ProductConnection + /** The shop’s refund policy. */ + refundPolicy?: Maybe + /** The shop’s shipping policy. */ + shippingPolicy?: Maybe + /** Countries that the shop ships to. */ + shipsToCountries: Array + /** + * The shop’s Shopify Payments account id. + * @deprecated Use `paymentSettings` instead + */ + shopifyPaymentsAccountId?: Maybe + /** The shop’s terms of service. */ + termsOfService?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopBlogsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopCollectionByHandleArgs = { + handle: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductByHandleArgs = { + handle: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductTagsArgs = { + first: Scalars['Int'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductTypesArgs = { + first: Scalars['Int'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Policy that a merchant has configured for their store, such as their refund or privacy policy. */ +export type ShopPolicy = Node & { + __typename?: 'ShopPolicy' + /** Policy text, maximum size of 64kb. */ + body: Scalars['String'] + /** Policy’s handle. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Policy’s title. */ + title: Scalars['String'] + /** Public URL to the policy. */ + url: Scalars['URL'] +} + +/** An auto-generated type for paginating through multiple Strings. */ +export type StringConnection = { + __typename?: 'StringConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one String and a cursor during pagination. */ +export type StringEdge = { + __typename?: 'StringEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of StringEdge. */ + node: Scalars['String'] +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInput = { + /** The amount of the payment. */ + amount: Scalars['Money'] + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The type of payment token. */ + type: Scalars['String'] + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInputV2 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe + /** The type of payment token. */ + type: Scalars['String'] +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInputV3 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe + /** The type of payment token. */ + type: PaymentTokenType +} + +/** An object representing exchange of money for a product or service. */ +export type Transaction = { + __typename?: 'Transaction' + /** + * The amount of money that the transaction was for. + * @deprecated Use `amountV2` instead + */ + amount: Scalars['Money'] + /** The amount of money that the transaction was for. */ + amountV2: MoneyV2 + /** The kind of the transaction. */ + kind: TransactionKind + /** + * The status of the transaction. + * @deprecated Use `statusV2` instead + */ + status: TransactionStatus + /** The status of the transaction. */ + statusV2?: Maybe + /** Whether the transaction was done in test mode or not. */ + test: Scalars['Boolean'] +} + +/** The different kinds of order transactions. */ +export enum TransactionKind { + /** An authorization and capture performed together in a single step. */ + Sale = 'SALE', + /** A transfer of the money that was reserved during the authorization stage. */ + Capture = 'CAPTURE', + /** + * An amount reserved against the cardholder's funding source. + * Money does not change hands until the authorization is captured. + */ + Authorization = 'AUTHORIZATION', + /** An authorization for a payment taken with an EMV credit card reader. */ + EmvAuthorization = 'EMV_AUTHORIZATION', + /** Money returned to the customer when they have paid too much. */ + Change = 'CHANGE', +} + +/** Transaction statuses describe the status of a transaction. */ +export enum TransactionStatus { + /** The transaction is pending. */ + Pending = 'PENDING', + /** The transaction succeeded. */ + Success = 'SUCCESS', + /** The transaction failed. */ + Failure = 'FAILURE', + /** There was an error while processing the transaction. */ + Error = 'ERROR', +} + +/** The measurement used to calculate a unit price for a product variant (e.g. $9.99 / 100ml). */ +export type UnitPriceMeasurement = { + __typename?: 'UnitPriceMeasurement' + /** The type of unit of measurement for the unit price measurement. */ + measuredType?: Maybe + /** The quantity unit for the unit price measurement. */ + quantityUnit?: Maybe + /** The quantity value for the unit price measurement. */ + quantityValue: Scalars['Float'] + /** The reference unit for the unit price measurement. */ + referenceUnit?: Maybe + /** The reference value for the unit price measurement. */ + referenceValue: Scalars['Int'] +} + +/** The accepted types of unit of measurement. */ +export enum UnitPriceMeasurementMeasuredType { + /** Unit of measurements representing volumes. */ + Volume = 'VOLUME', + /** Unit of measurements representing weights. */ + Weight = 'WEIGHT', + /** Unit of measurements representing lengths. */ + Length = 'LENGTH', + /** Unit of measurements representing areas. */ + Area = 'AREA', +} + +/** The valid units of measurement for a unit price measurement. */ +export enum UnitPriceMeasurementMeasuredUnit { + /** 1000 milliliters equals 1 liter. */ + Ml = 'ML', + /** 100 centiliters equals 1 liter. */ + Cl = 'CL', + /** Metric system unit of volume. */ + L = 'L', + /** 1 cubic meter equals 1000 liters. */ + M3 = 'M3', + /** 1000 milligrams equals 1 gram. */ + Mg = 'MG', + /** Metric system unit of weight. */ + G = 'G', + /** 1 kilogram equals 1000 grams. */ + Kg = 'KG', + /** 1000 millimeters equals 1 meter. */ + Mm = 'MM', + /** 100 centimeters equals 1 meter. */ + Cm = 'CM', + /** Metric system unit of length. */ + M = 'M', + /** Metric system unit of area. */ + M2 = 'M2', +} + +/** Represents an error in the input of a mutation. */ +export type UserError = DisplayableError & { + __typename?: 'UserError' + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Represents a Shopify hosted video. */ +export type Video = Node & + Media & { + __typename?: 'Video' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + /** The sources for a video. */ + sources: Array + } + +/** Represents a source for a Shopify hosted video. */ +export type VideoSource = { + __typename?: 'VideoSource' + /** The format of the video source. */ + format: Scalars['String'] + /** The height of the video. */ + height: Scalars['Int'] + /** The video MIME type. */ + mimeType: Scalars['String'] + /** The URL of the video. */ + url: Scalars['String'] + /** The width of the video. */ + width: Scalars['Int'] +} + +/** Units of measurement for weight. */ +export enum WeightUnit { + /** 1 kilogram equals 1000 grams. */ + Kilograms = 'KILOGRAMS', + /** Metric system unit of mass. */ + Grams = 'GRAMS', + /** 1 pound equals 16 ounces. */ + Pounds = 'POUNDS', + /** Imperial system unit of mass. */ + Ounces = 'OUNCES', +} + +export type AssociateCustomerWithCheckoutMutationVariables = Exact<{ + checkoutId: Scalars['ID'] + customerAccessToken: Scalars['String'] +}> + +export type AssociateCustomerWithCheckoutMutation = { + __typename?: 'Mutation' +} & { + checkoutCustomerAssociateV2?: Maybe< + { __typename?: 'CheckoutCustomerAssociateV2Payload' } & { + checkout?: Maybe<{ __typename?: 'Checkout' } & Pick> + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + } + > +} + +export type CheckoutCreateMutationVariables = Exact<{ + input?: Maybe +}> + +export type CheckoutCreateMutation = { __typename?: 'Mutation' } & { + checkoutCreate?: Maybe< + { __typename?: 'CheckoutCreatePayload' } & { + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment> + } + > +} + +export type CheckoutLineItemAddMutationVariables = Exact<{ + checkoutId: Scalars['ID'] + lineItems: Array | CheckoutLineItemInput +}> + +export type CheckoutLineItemAddMutation = { __typename?: 'Mutation' } & { + checkoutLineItemsAdd?: Maybe< + { __typename?: 'CheckoutLineItemsAddPayload' } & { + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment> + } + > +} + +export type CheckoutLineItemRemoveMutationVariables = Exact<{ + checkoutId: Scalars['ID'] + lineItemIds: Array | Scalars['ID'] +}> + +export type CheckoutLineItemRemoveMutation = { __typename?: 'Mutation' } & { + checkoutLineItemsRemove?: Maybe< + { __typename?: 'CheckoutLineItemsRemovePayload' } & { + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment> + } + > +} + +export type CheckoutLineItemUpdateMutationVariables = Exact<{ + checkoutId: Scalars['ID'] + lineItems: Array | CheckoutLineItemUpdateInput +}> + +export type CheckoutLineItemUpdateMutation = { __typename?: 'Mutation' } & { + checkoutLineItemsUpdate?: Maybe< + { __typename?: 'CheckoutLineItemsUpdatePayload' } & { + checkoutUserErrors: Array< + { __typename?: 'CheckoutUserError' } & Pick< + CheckoutUserError, + 'code' | 'field' | 'message' + > + > + checkout?: Maybe<{ __typename?: 'Checkout' } & CheckoutDetailsFragment> + } + > +} + +export type CustomerAccessTokenCreateMutationVariables = Exact<{ + input: CustomerAccessTokenCreateInput +}> + +export type CustomerAccessTokenCreateMutation = { __typename?: 'Mutation' } & { + customerAccessTokenCreate?: Maybe< + { __typename?: 'CustomerAccessTokenCreatePayload' } & { + customerAccessToken?: Maybe< + { __typename?: 'CustomerAccessToken' } & Pick< + CustomerAccessToken, + 'accessToken' | 'expiresAt' + > + > + customerUserErrors: Array< + { __typename?: 'CustomerUserError' } & Pick< + CustomerUserError, + 'code' | 'field' | 'message' + > + > + } + > +} + +export type CustomerAccessTokenDeleteMutationVariables = Exact<{ + customerAccessToken: Scalars['String'] +}> + +export type CustomerAccessTokenDeleteMutation = { __typename?: 'Mutation' } & { + customerAccessTokenDelete?: Maybe< + { __typename?: 'CustomerAccessTokenDeletePayload' } & Pick< + CustomerAccessTokenDeletePayload, + 'deletedAccessToken' | 'deletedCustomerAccessTokenId' + > & { + userErrors: Array< + { __typename?: 'UserError' } & Pick + > + } + > +} + +export type CustomerActivateByUrlMutationVariables = Exact<{ + activationUrl: Scalars['URL'] + password: Scalars['String'] +}> + +export type CustomerActivateByUrlMutation = { __typename?: 'Mutation' } & { + customerActivateByUrl?: Maybe< + { __typename?: 'CustomerActivateByUrlPayload' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + customerAccessToken?: Maybe< + { __typename?: 'CustomerAccessToken' } & Pick< + CustomerAccessToken, + 'accessToken' | 'expiresAt' + > + > + customerUserErrors: Array< + { __typename?: 'CustomerUserError' } & Pick< + CustomerUserError, + 'code' | 'field' | 'message' + > + > + } + > +} + +export type CustomerActivateMutationVariables = Exact<{ + id: Scalars['ID'] + input: CustomerActivateInput +}> + +export type CustomerActivateMutation = { __typename?: 'Mutation' } & { + customerActivate?: Maybe< + { __typename?: 'CustomerActivatePayload' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + customerAccessToken?: Maybe< + { __typename?: 'CustomerAccessToken' } & Pick< + CustomerAccessToken, + 'accessToken' | 'expiresAt' + > + > + customerUserErrors: Array< + { __typename?: 'CustomerUserError' } & Pick< + CustomerUserError, + 'code' | 'field' | 'message' + > + > + } + > +} + +export type CustomerCreateMutationVariables = Exact<{ + input: CustomerCreateInput +}> + +export type CustomerCreateMutation = { __typename?: 'Mutation' } & { + customerCreate?: Maybe< + { __typename?: 'CustomerCreatePayload' } & { + customerUserErrors: Array< + { __typename?: 'CustomerUserError' } & Pick< + CustomerUserError, + 'code' | 'field' | 'message' + > + > + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + } + > +} + +export type GetSiteCollectionsQueryVariables = Exact<{ + first: Scalars['Int'] +}> + +export type GetSiteCollectionsQuery = { __typename?: 'QueryRoot' } & { + collections: { __typename?: 'CollectionConnection' } & { + edges: Array< + { __typename?: 'CollectionEdge' } & { + node: { __typename?: 'Collection' } & Pick< + Collection, + 'id' | 'title' | 'handle' + > + } + > + } +} + +export type GetAllPagesQueryVariables = Exact<{ + first?: Maybe +}> + +export type GetAllPagesQuery = { __typename?: 'QueryRoot' } & { + pages: { __typename?: 'PageConnection' } & { + edges: Array< + { __typename?: 'PageEdge' } & { + node: { __typename?: 'Page' } & Pick + } + > + } +} + +export type GetAllProductVendorsQueryVariables = Exact<{ + first?: Maybe + cursor?: Maybe +}> + +export type GetAllProductVendorsQuery = { __typename?: 'QueryRoot' } & { + products: { __typename?: 'ProductConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductEdge' } & Pick & { + node: { __typename?: 'Product' } & Pick + } + > + } +} + +export type GetAllProductPathsQueryVariables = Exact<{ + first?: Maybe + cursor?: Maybe +}> + +export type GetAllProductPathsQuery = { __typename?: 'QueryRoot' } & { + products: { __typename?: 'ProductConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductEdge' } & Pick & { + node: { __typename?: 'Product' } & Pick + } + > + } +} + +export type ProductConnectionFragment = { __typename?: 'ProductConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductEdge' } & { + node: { __typename?: 'Product' } & Pick< + Product, + 'id' | 'title' | 'vendor' | 'handle' + > & { + priceRange: { __typename?: 'ProductPriceRange' } & { + minVariantPrice: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + } + images: { __typename?: 'ImageConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ImageEdge' } & { + node: { __typename?: 'Image' } & Pick< + Image, + 'originalSrc' | 'altText' | 'width' | 'height' + > + } + > + } + } + } + > +} + +export type GetAllProductsQueryVariables = Exact<{ + first?: Maybe + query?: Maybe + sortKey?: Maybe + reverse?: Maybe +}> + +export type GetAllProductsQuery = { __typename?: 'QueryRoot' } & { + products: { __typename?: 'ProductConnection' } & ProductConnectionFragment +} + +export type CheckoutDetailsFragment = { __typename?: 'Checkout' } & Pick< + Checkout, + 'id' | 'webUrl' | 'completedAt' | 'createdAt' | 'taxesIncluded' +> & { + subtotalPriceV2: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + totalTaxV2: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + totalPriceV2: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + lineItems: { __typename?: 'CheckoutLineItemConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'CheckoutLineItemEdge' } & { + node: { __typename?: 'CheckoutLineItem' } & Pick< + CheckoutLineItem, + 'id' | 'title' | 'quantity' + > & { + variant?: Maybe< + { __typename?: 'ProductVariant' } & Pick< + ProductVariant, + 'id' | 'sku' | 'title' + > & { + image?: Maybe< + { __typename?: 'Image' } & Pick< + Image, + 'originalSrc' | 'altText' | 'width' | 'height' + > + > + priceV2: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + compareAtPriceV2?: Maybe< + { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + > + product: { __typename?: 'Product' } & Pick< + Product, + 'handle' + > + } + > + } + } + > + } + } + +export type GetCheckoutQueryVariables = Exact<{ + checkoutId: Scalars['ID'] +}> + +export type GetCheckoutQuery = { __typename?: 'QueryRoot' } & { + node?: Maybe< + | { __typename?: 'AppliedGiftCard' } + | { __typename?: 'Article' } + | { __typename?: 'Blog' } + | ({ __typename?: 'Checkout' } & CheckoutDetailsFragment) + | { __typename?: 'CheckoutLineItem' } + | { __typename?: 'Collection' } + | { __typename?: 'Comment' } + | { __typename?: 'ExternalVideo' } + | { __typename?: 'MailingAddress' } + | { __typename?: 'MediaImage' } + | { __typename?: 'Metafield' } + | { __typename?: 'Model3d' } + | { __typename?: 'Order' } + | { __typename?: 'Page' } + | { __typename?: 'Payment' } + | { __typename?: 'Product' } + | { __typename?: 'ProductOption' } + | { __typename?: 'ProductVariant' } + | { __typename?: 'ShopPolicy' } + | { __typename?: 'Video' } + > +} + +export type GetProductsFromCollectionQueryVariables = Exact<{ + categoryId: Scalars['ID'] + first?: Maybe + sortKey?: Maybe + reverse?: Maybe +}> + +export type GetProductsFromCollectionQuery = { __typename?: 'QueryRoot' } & { + node?: Maybe< + | ({ __typename?: 'AppliedGiftCard' } & Pick) + | ({ __typename?: 'Article' } & Pick) + | ({ __typename?: 'Blog' } & Pick) + | ({ __typename?: 'Checkout' } & Pick) + | ({ __typename?: 'CheckoutLineItem' } & Pick) + | ({ __typename?: 'Collection' } & Pick & { + products: { + __typename?: 'ProductConnection' + } & ProductConnectionFragment + }) + | ({ __typename?: 'Comment' } & Pick) + | ({ __typename?: 'ExternalVideo' } & Pick) + | ({ __typename?: 'MailingAddress' } & Pick) + | ({ __typename?: 'MediaImage' } & Pick) + | ({ __typename?: 'Metafield' } & Pick) + | ({ __typename?: 'Model3d' } & Pick) + | ({ __typename?: 'Order' } & Pick) + | ({ __typename?: 'Page' } & Pick) + | ({ __typename?: 'Payment' } & Pick) + | ({ __typename?: 'Product' } & Pick) + | ({ __typename?: 'ProductOption' } & Pick) + | ({ __typename?: 'ProductVariant' } & Pick) + | ({ __typename?: 'ShopPolicy' } & Pick) + | ({ __typename?: 'Video' } & Pick) + > +} + +export type GetCustomerIdQueryVariables = Exact<{ + customerAccessToken: Scalars['String'] +}> + +export type GetCustomerIdQuery = { __typename?: 'QueryRoot' } & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> +} + +export type GetCustomerQueryVariables = Exact<{ + customerAccessToken: Scalars['String'] +}> + +export type GetCustomerQuery = { __typename?: 'QueryRoot' } & { + customer?: Maybe< + { __typename?: 'Customer' } & Pick< + Customer, + | 'id' + | 'firstName' + | 'lastName' + | 'displayName' + | 'email' + | 'phone' + | 'tags' + | 'acceptsMarketing' + | 'createdAt' + > + > +} + +export type GetPageQueryVariables = Exact<{ + id: Scalars['ID'] +}> + +export type GetPageQuery = { __typename?: 'QueryRoot' } & { + node?: Maybe< + | ({ __typename?: 'AppliedGiftCard' } & Pick) + | ({ __typename?: 'Article' } & Pick) + | ({ __typename?: 'Blog' } & Pick) + | ({ __typename?: 'Checkout' } & Pick) + | ({ __typename?: 'CheckoutLineItem' } & Pick) + | ({ __typename?: 'Collection' } & Pick) + | ({ __typename?: 'Comment' } & Pick) + | ({ __typename?: 'ExternalVideo' } & Pick) + | ({ __typename?: 'MailingAddress' } & Pick) + | ({ __typename?: 'MediaImage' } & Pick) + | ({ __typename?: 'Metafield' } & Pick) + | ({ __typename?: 'Model3d' } & Pick) + | ({ __typename?: 'Order' } & Pick) + | ({ __typename?: 'Page' } & Pick< + Page, + 'title' | 'handle' | 'body' | 'bodySummary' | 'id' + >) + | ({ __typename?: 'Payment' } & Pick) + | ({ __typename?: 'Product' } & Pick) + | ({ __typename?: 'ProductOption' } & Pick) + | ({ __typename?: 'ProductVariant' } & Pick) + | ({ __typename?: 'ShopPolicy' } & Pick) + | ({ __typename?: 'Video' } & Pick) + > +} + +export type GetProductBySlugQueryVariables = Exact<{ + slug: Scalars['String'] +}> + +export type GetProductBySlugQuery = { __typename?: 'QueryRoot' } & { + productByHandle?: Maybe< + { __typename?: 'Product' } & Pick< + Product, + | 'id' + | 'handle' + | 'title' + | 'productType' + | 'vendor' + | 'description' + | 'descriptionHtml' + > & { + options: Array< + { __typename?: 'ProductOption' } & Pick< + ProductOption, + 'id' | 'name' | 'values' + > + > + priceRange: { __typename?: 'ProductPriceRange' } & { + maxVariantPrice: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + minVariantPrice: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + } + variants: { __typename?: 'ProductVariantConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ProductVariantEdge' } & { + node: { __typename?: 'ProductVariant' } & Pick< + ProductVariant, + 'id' | 'title' | 'sku' + > & { + selectedOptions: Array< + { __typename?: 'SelectedOption' } & Pick< + SelectedOption, + 'name' | 'value' + > + > + priceV2: { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + compareAtPriceV2?: Maybe< + { __typename?: 'MoneyV2' } & Pick< + MoneyV2, + 'amount' | 'currencyCode' + > + > + } + } + > + } + images: { __typename?: 'ImageConnection' } & { + pageInfo: { __typename?: 'PageInfo' } & Pick< + PageInfo, + 'hasNextPage' | 'hasPreviousPage' + > + edges: Array< + { __typename?: 'ImageEdge' } & { + node: { __typename?: 'Image' } & Pick< + Image, + 'originalSrc' | 'altText' | 'width' | 'height' + > + } + > + } + } + > +} + +export type GetSiteInfoQueryVariables = Exact<{ [key: string]: never }> + +export type GetSiteInfoQuery = { __typename?: 'QueryRoot' } & { + shop: { __typename?: 'Shop' } & Pick +} diff --git a/packages/shopify/schema.graphql b/packages/shopify/schema.graphql new file mode 100644 index 0000000..9c657fe --- /dev/null +++ b/packages/shopify/schema.graphql @@ -0,0 +1,9702 @@ +schema { + query: QueryRoot + mutation: Mutation +} + +""" +Marks an element of a GraphQL schema as having restricted access. +""" +directive @accessRestricted( + """ + Explains the reason around this restriction + """ + reason: String = null +) on FIELD_DEFINITION | OBJECT + +""" +Contextualize data. +""" +directive @inContext( + """ + The country code for context. + """ + country: CountryCode! +) on QUERY | MUTATION + +""" +A version of the API. +""" +type ApiVersion { + """ + The human-readable name of the version. + """ + displayName: String! + + """ + The unique identifier of an ApiVersion. All supported API versions have a date-based (YYYY-MM) or `unstable` handle. + """ + handle: String! + + """ + Whether the version is actively supported by Shopify. Supported API versions are guaranteed to be stable. Unsupported API versions include unstable, release candidate, and end-of-life versions that are marked as unsupported. For more information, refer to [Versioning](https://shopify.dev/concepts/about-apis/versioning). + """ + supported: Boolean! +} + +""" +Details about the gift card used on the checkout. +""" +type AppliedGiftCard implements Node { + """ + The amount that was taken from the gift card by applying it. + """ + amountUsed: Money! @deprecated(reason: "Use `amountUsedV2` instead") + + """ + The amount that was taken from the gift card by applying it. + """ + amountUsedV2: MoneyV2! + + """ + The amount left on the gift card. + """ + balance: Money! @deprecated(reason: "Use `balanceV2` instead") + + """ + The amount left on the gift card. + """ + balanceV2: MoneyV2! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The last characters of the gift card. + """ + lastCharacters: String! + + """ + The amount that was applied to the checkout in its currency. + """ + presentmentAmountUsed: MoneyV2! +} + +""" +An article in an online store blog. +""" +type Article implements Node { + """ + The article's author. + """ + author: ArticleAuthor! @deprecated(reason: "Use `authorV2` instead") + + """ + The article's author. + """ + authorV2: ArticleAuthor + + """ + The blog that the article belongs to. + """ + blog: Blog! + + """ + List of comments posted on the article. + """ + comments( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CommentConnection! + + """ + Stripped content of the article, single line with HTML tags removed. + """ + content( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The content of the article, complete with HTML formatting. + """ + contentHtml: HTML! + + """ + Stripped excerpt of the article, single line with HTML tags removed. + """ + excerpt( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String + + """ + The excerpt of the article, complete with HTML formatting. + """ + excerptHtml: HTML + + """ + A human-friendly unique string for the Article automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The image associated with the article. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + The date and time when the article was published. + """ + publishedAt: DateTime! + + """ + The article’s SEO information. + """ + seo: SEO + + """ + A categorization that a article can be tagged with. + """ + tags: [String!]! + + """ + The article’s name. + """ + title: String! + + """ + The url pointing to the article accessible from the web. + """ + url: URL! +} + +""" +The author of an article. +""" +type ArticleAuthor { + """ + The author's bio. + """ + bio: String + + """ + The author’s email. + """ + email: String! + + """ + The author's first name. + """ + firstName: String! + + """ + The author's last name. + """ + lastName: String! + + """ + The author's full name. + """ + name: String! +} + +""" +An auto-generated type for paginating through multiple Articles. +""" +type ArticleConnection { + """ + A list of edges. + """ + edges: [ArticleEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Article and a cursor during pagination. +""" +type ArticleEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ArticleEdge. + """ + node: Article! +} + +""" +The set of valid sort keys for the Article query. +""" +enum ArticleSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `blog_title` value. + """ + BLOG_TITLE + + """ + Sort by the `author` value. + """ + AUTHOR + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `published_at` value. + """ + PUBLISHED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Represents a generic custom attribute. +""" +type Attribute { + """ + Key or name of the attribute. + """ + key: String! + + """ + Value of the attribute. + """ + value: String +} + +""" +Specifies the input fields required for an attribute. +""" +input AttributeInput { + """ + Key or name of the attribute. + """ + key: String! + + """ + Value of the attribute. + """ + value: String! +} + +""" +Automatic discount applications capture the intentions of a discount that was automatically applied. +""" +type AutomaticDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +A collection of available shipping rates for a checkout. +""" +type AvailableShippingRates { + """ + Whether or not the shipping rates are ready. + The `shippingRates` field is `null` when this value is `false`. + This field should be polled until its value becomes `true`. + """ + ready: Boolean! + + """ + The fetched shipping rates. `null` until the `ready` field is `true`. + """ + shippingRates: [ShippingRate!] +} + +""" +An online store blog. +""" +type Blog implements Node { + """ + Find an article by its handle. + """ + articleByHandle( + """ + The handle of the article. + """ + handle: String! + ): Article + + """ + List of the blog's articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! + + """ + The authors who have contributed to the blog. + """ + authors: [ArticleAuthor!]! + + """ + A human-friendly unique string for the Blog automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The blog's SEO information. + """ + seo: SEO + + """ + The blogs’s title. + """ + title: String! + + """ + The url pointing to the blog accessible from the web. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Blogs. +""" +type BlogConnection { + """ + A list of edges. + """ + edges: [BlogEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Blog and a cursor during pagination. +""" +type BlogEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of BlogEdge. + """ + node: Blog! +} + +""" +The set of valid sort keys for the Blog query. +""" +enum BlogSortKeys { + """ + Sort by the `handle` value. + """ + HANDLE + + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Card brand, such as Visa or Mastercard, which can be used for payments. +""" +enum CardBrand { + """ + Visa. + """ + VISA + + """ + Mastercard. + """ + MASTERCARD + + """ + Discover. + """ + DISCOVER + + """ + American Express. + """ + AMERICAN_EXPRESS + + """ + Diners Club. + """ + DINERS_CLUB + + """ + JCB. + """ + JCB +} + +""" +A container for all the information required to checkout items and pay. +""" +type Checkout implements Node { + """ + The gift cards used on the checkout. + """ + appliedGiftCards: [AppliedGiftCard!]! + + """ + The available shipping rates for this Checkout. + Should only be used when checkout `requiresShipping` is `true` and + the shipping address is valid. + """ + availableShippingRates: AvailableShippingRates + + """ + The date and time when the checkout was completed. + """ + completedAt: DateTime + + """ + The date and time when the checkout was created. + """ + createdAt: DateTime! + + """ + The currency code for the Checkout. + """ + currencyCode: CurrencyCode! + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [Attribute!]! + + """ + The customer associated with the checkout. + """ + customer: Customer + @deprecated( + reason: "This field will always return null. If you have an authentication token for the customer, you can use the `customer` field on the query root to retrieve it." + ) + + """ + Discounts that have been applied on the checkout. + """ + discountApplications( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): DiscountApplicationConnection! + + """ + The email attached to this checkout. + """ + email: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + A list of line item objects, each one containing information about an item in the checkout. + """ + lineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CheckoutLineItemConnection! + + """ + The sum of all the prices of all the items in the checkout. Duties, taxes, shipping and discounts excluded. + """ + lineItemsSubtotalPrice: MoneyV2! + + """ + The note associated with the checkout. + """ + note: String + + """ + The resulting order from a paid checkout. + """ + order: Order + + """ + The Order Status Page for this Checkout, null when checkout is not completed. + """ + orderStatusUrl: URL + + """ + The amount left to be paid. This is equal to the cost of the line items, taxes and shipping minus discounts and gift cards. + """ + paymentDue: Money! @deprecated(reason: "Use `paymentDueV2` instead") + + """ + The amount left to be paid. This is equal to the cost of the line items, duties, taxes and shipping minus discounts and gift cards. + """ + paymentDueV2: MoneyV2! + + """ + Whether or not the Checkout is ready and can be completed. Checkouts may + have asynchronous operations that can take time to finish. If you want + to complete a checkout or ensure all the fields are populated and up to + date, polling is required until the value is true. + """ + ready: Boolean! + + """ + States whether or not the fulfillment requires shipping. + """ + requiresShipping: Boolean! + + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddress + + """ + The discounts that have been allocated onto the shipping line by discount applications. + """ + shippingDiscountAllocations: [DiscountAllocation!]! + + """ + Once a shipping rate is selected by the customer it is transitioned to a `shipping_line` object. + """ + shippingLine: ShippingRate + + """ + Price of the checkout before shipping and taxes. + """ + subtotalPrice: Money! @deprecated(reason: "Use `subtotalPriceV2` instead") + + """ + Price of the checkout before duties, shipping and taxes. + """ + subtotalPriceV2: MoneyV2! + + """ + Specifies if the Checkout is tax exempt. + """ + taxExempt: Boolean! + + """ + Specifies if taxes are included in the line item and shipping line prices. + """ + taxesIncluded: Boolean! + + """ + The sum of all the prices of all the items in the checkout, taxes and discounts included. + """ + totalPrice: Money! @deprecated(reason: "Use `totalPriceV2` instead") + + """ + The sum of all the prices of all the items in the checkout, duties, taxes and discounts included. + """ + totalPriceV2: MoneyV2! + + """ + The sum of all the taxes applied to the line items and shipping lines in the checkout. + """ + totalTax: Money! @deprecated(reason: "Use `totalTaxV2` instead") + + """ + The sum of all the taxes applied to the line items and shipping lines in the checkout. + """ + totalTaxV2: MoneyV2! + + """ + The date and time when the checkout was last updated. + """ + updatedAt: DateTime! + + """ + The url pointing to the checkout accessible from the web. + """ + webUrl: URL! +} + +""" +Specifies the fields required to update a checkout's attributes. +""" +input CheckoutAttributesUpdateInput { + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of the addresses is still done at complete time. + """ + allowPartialAddresses: Boolean +} + +""" +Return type for `checkoutAttributesUpdate` mutation. +""" +type CheckoutAttributesUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Specifies the fields required to update a checkout's attributes. +""" +input CheckoutAttributesUpdateV2Input { + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of the addresses is still done at complete time. + """ + allowPartialAddresses: Boolean +} + +""" +Return type for `checkoutAttributesUpdateV2` mutation. +""" +type CheckoutAttributesUpdateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteFree` mutation. +""" +type CheckoutCompleteFreePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithCreditCard` mutation. +""" +type CheckoutCompleteWithCreditCardPayload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithCreditCardV2` mutation. +""" +type CheckoutCompleteWithCreditCardV2Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPayment` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentPayload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPaymentV2` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentV2Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPaymentV3` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentV3Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Specifies the fields required to create a checkout. +""" +input CheckoutCreateInput { + """ + The email with which the customer wants to checkout. + """ + email: String + + """ + A list of line item objects, each one containing information about an item in the checkout. + """ + lineItems: [CheckoutLineItemInput!] + + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput + + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of addresses is still done at complete time. + """ + allowPartialAddresses: Boolean + + """ + The three-letter currency code of one of the shop's enabled presentment currencies. + Including this field creates a checkout in the specified currency. By default, new + checkouts are created in the shop's primary currency. + """ + presentmentCurrencyCode: CurrencyCode +} + +""" +Return type for `checkoutCreate` mutation. +""" +type CheckoutCreatePayload { + """ + The new checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerAssociate` mutation. +""" +type CheckoutCustomerAssociatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + The associated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `checkoutCustomerAssociateV2` mutation. +""" +type CheckoutCustomerAssociateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + The associated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerDisassociate` mutation. +""" +type CheckoutCustomerDisassociatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerDisassociateV2` mutation. +""" +type CheckoutCustomerDisassociateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeApply` mutation. +""" +type CheckoutDiscountCodeApplyPayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeApplyV2` mutation. +""" +type CheckoutDiscountCodeApplyV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeRemove` mutation. +""" +type CheckoutDiscountCodeRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutEmailUpdate` mutation. +""" +type CheckoutEmailUpdatePayload { + """ + The checkout object with the updated email. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutEmailUpdateV2` mutation. +""" +type CheckoutEmailUpdateV2Payload { + """ + The checkout object with the updated email. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Possible error codes that could be returned by CheckoutUserError. +""" +enum CheckoutErrorCode { + """ + Input value is blank. + """ + BLANK + + """ + Input value is invalid. + """ + INVALID + + """ + Input value is too long. + """ + TOO_LONG + + """ + Input value is not present. + """ + PRESENT + + """ + Input value should be less than maximum allowed value. + """ + LESS_THAN + + """ + Input value should be greater than or equal to minimum allowed value. + """ + GREATER_THAN_OR_EQUAL_TO + + """ + Input value should be less or equal to maximum allowed value. + """ + LESS_THAN_OR_EQUAL_TO + + """ + Checkout is already completed. + """ + ALREADY_COMPLETED + + """ + Checkout is locked. + """ + LOCKED + + """ + Input value is not supported. + """ + NOT_SUPPORTED + + """ + Input email contains an invalid domain name. + """ + BAD_DOMAIN + + """ + Input Zip is invalid for country provided. + """ + INVALID_FOR_COUNTRY + + """ + Input Zip is invalid for country and province provided. + """ + INVALID_FOR_COUNTRY_AND_PROVINCE + + """ + Invalid state in country. + """ + INVALID_STATE_IN_COUNTRY + + """ + Invalid province in country. + """ + INVALID_PROVINCE_IN_COUNTRY + + """ + Invalid region in country. + """ + INVALID_REGION_IN_COUNTRY + + """ + Shipping rate expired. + """ + SHIPPING_RATE_EXPIRED + + """ + Gift card cannot be applied to a checkout that contains a gift card. + """ + GIFT_CARD_UNUSABLE + + """ + Gift card is disabled. + """ + GIFT_CARD_DISABLED + + """ + Gift card code is invalid. + """ + GIFT_CARD_CODE_INVALID + + """ + Gift card has already been applied. + """ + GIFT_CARD_ALREADY_APPLIED + + """ + Gift card currency does not match checkout currency. + """ + GIFT_CARD_CURRENCY_MISMATCH + + """ + Gift card is expired. + """ + GIFT_CARD_EXPIRED + + """ + Gift card has no funds left. + """ + GIFT_CARD_DEPLETED + + """ + Gift card was not found. + """ + GIFT_CARD_NOT_FOUND + + """ + Cart does not meet discount requirements notice. + """ + CART_DOES_NOT_MEET_DISCOUNT_REQUIREMENTS_NOTICE + + """ + Discount expired. + """ + DISCOUNT_EXPIRED + + """ + Discount disabled. + """ + DISCOUNT_DISABLED + + """ + Discount limit reached. + """ + DISCOUNT_LIMIT_REACHED + + """ + Discount not found. + """ + DISCOUNT_NOT_FOUND + + """ + Customer already used once per customer discount notice. + """ + CUSTOMER_ALREADY_USED_ONCE_PER_CUSTOMER_DISCOUNT_NOTICE + + """ + Checkout is already completed. + """ + EMPTY + + """ + Not enough in stock. + """ + NOT_ENOUGH_IN_STOCK + + """ + Missing payment input. + """ + MISSING_PAYMENT_INPUT + + """ + The amount of the payment does not match the value to be paid. + """ + TOTAL_PRICE_MISMATCH + + """ + Line item was not found in checkout. + """ + LINE_ITEM_NOT_FOUND + + """ + Unable to apply discount. + """ + UNABLE_TO_APPLY + + """ + Discount already applied. + """ + DISCOUNT_ALREADY_APPLIED +} + +""" +Return type for `checkoutGiftCardApply` mutation. +""" +type CheckoutGiftCardApplyPayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardRemove` mutation. +""" +type CheckoutGiftCardRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardRemoveV2` mutation. +""" +type CheckoutGiftCardRemoveV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardsAppend` mutation. +""" +type CheckoutGiftCardsAppendPayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +A single line item in the checkout, grouped by variant and attributes. +""" +type CheckoutLineItem implements Node { + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [Attribute!]! + + """ + The discounts that have been allocated onto the checkout line item by discount applications. + """ + discountAllocations: [DiscountAllocation!]! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The quantity of the line item. + """ + quantity: Int! + + """ + Title of the line item. Defaults to the product's title. + """ + title: String! + + """ + Unit price of the line item. + """ + unitPrice: MoneyV2 + + """ + Product variant of the line item. + """ + variant: ProductVariant +} + +""" +An auto-generated type for paginating through multiple CheckoutLineItems. +""" +type CheckoutLineItemConnection { + """ + A list of edges. + """ + edges: [CheckoutLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one CheckoutLineItem and a cursor during pagination. +""" +type CheckoutLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CheckoutLineItemEdge. + """ + node: CheckoutLineItem! +} + +""" +Specifies the input fields to create a line item on a checkout. +""" +input CheckoutLineItemInput { + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [AttributeInput!] + + """ + The quantity of the line item. + """ + quantity: Int! + + """ + The identifier of the product variant for the line item. + """ + variantId: ID! +} + +""" +Specifies the input fields to update a line item on the checkout. +""" +input CheckoutLineItemUpdateInput { + """ + The identifier of the line item. + """ + id: ID + + """ + The variant identifier of the line item. + """ + variantId: ID + + """ + The quantity of the line item. + """ + quantity: Int + + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [AttributeInput!] +} + +""" +Return type for `checkoutLineItemsAdd` mutation. +""" +type CheckoutLineItemsAddPayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutLineItemsRemove` mutation. +""" +type CheckoutLineItemsRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutLineItemsReplace` mutation. +""" +type CheckoutLineItemsReplacePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [CheckoutUserError!]! +} + +""" +Return type for `checkoutLineItemsUpdate` mutation. +""" +type CheckoutLineItemsUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingAddressUpdate` mutation. +""" +type CheckoutShippingAddressUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingAddressUpdateV2` mutation. +""" +type CheckoutShippingAddressUpdateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingLineUpdate` mutation. +""" +type CheckoutShippingLineUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Represents an error that happens during execution of a checkout mutation. +""" +type CheckoutUserError implements DisplayableError { + """ + Error code to uniquely identify the error. + """ + code: CheckoutErrorCode + + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. +""" +type Collection implements Node { + """ + Stripped description of the collection, single line with HTML tags removed. + """ + description( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The description of the collection, complete with HTML formatting. + """ + descriptionHtml: HTML! + + """ + A human-friendly unique string for the collection automatically generated from its title. + Limit of 255 characters. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Image associated with the collection. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + List of products in the collection. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductCollectionSortKeys = COLLECTION_DEFAULT + ): ProductConnection! + + """ + The collection’s name. Limit of 255 characters. + """ + title: String! + + """ + The date and time when the collection was last modified. + """ + updatedAt: DateTime! +} + +""" +An auto-generated type for paginating through multiple Collections. +""" +type CollectionConnection { + """ + A list of edges. + """ + edges: [CollectionEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Collection and a cursor during pagination. +""" +type CollectionEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CollectionEdge. + """ + node: Collection! +} + +""" +The set of valid sort keys for the Collection query. +""" +enum CollectionSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A comment on an article. +""" +type Comment implements Node { + """ + The comment’s author. + """ + author: CommentAuthor! + + """ + Stripped content of the comment, single line with HTML tags removed. + """ + content( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The content of the comment, complete with HTML formatting. + """ + contentHtml: HTML! + + """ + Globally unique identifier. + """ + id: ID! +} + +""" +The author of a comment. +""" +type CommentAuthor { + """ + The author's email. + """ + email: String! + + """ + The author’s name. + """ + name: String! +} + +""" +An auto-generated type for paginating through multiple Comments. +""" +type CommentConnection { + """ + A list of edges. + """ + edges: [CommentEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Comment and a cursor during pagination. +""" +type CommentEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CommentEdge. + """ + node: Comment! +} + +""" +ISO 3166-1 alpha-2 country codes with some differences. +""" +enum CountryCode { + """ + Afghanistan. + """ + AF + + """ + Åland Islands. + """ + AX + + """ + Albania. + """ + AL + + """ + Algeria. + """ + DZ + + """ + Andorra. + """ + AD + + """ + Angola. + """ + AO + + """ + Anguilla. + """ + AI + + """ + Antigua & Barbuda. + """ + AG + + """ + Argentina. + """ + AR + + """ + Armenia. + """ + AM + + """ + Aruba. + """ + AW + + """ + Ascension Island. + """ + AC + + """ + Australia. + """ + AU + + """ + Austria. + """ + AT + + """ + Azerbaijan. + """ + AZ + + """ + Bahamas. + """ + BS + + """ + Bahrain. + """ + BH + + """ + Bangladesh. + """ + BD + + """ + Barbados. + """ + BB + + """ + Belarus. + """ + BY + + """ + Belgium. + """ + BE + + """ + Belize. + """ + BZ + + """ + Benin. + """ + BJ + + """ + Bermuda. + """ + BM + + """ + Bhutan. + """ + BT + + """ + Bolivia. + """ + BO + + """ + Bosnia & Herzegovina. + """ + BA + + """ + Botswana. + """ + BW + + """ + Bouvet Island. + """ + BV + + """ + Brazil. + """ + BR + + """ + British Indian Ocean Territory. + """ + IO + + """ + Brunei. + """ + BN + + """ + Bulgaria. + """ + BG + + """ + Burkina Faso. + """ + BF + + """ + Burundi. + """ + BI + + """ + Cambodia. + """ + KH + + """ + Canada. + """ + CA + + """ + Cape Verde. + """ + CV + + """ + Caribbean Netherlands. + """ + BQ + + """ + Cayman Islands. + """ + KY + + """ + Central African Republic. + """ + CF + + """ + Chad. + """ + TD + + """ + Chile. + """ + CL + + """ + China. + """ + CN + + """ + Christmas Island. + """ + CX + + """ + Cocos (Keeling) Islands. + """ + CC + + """ + Colombia. + """ + CO + + """ + Comoros. + """ + KM + + """ + Congo - Brazzaville. + """ + CG + + """ + Congo - Kinshasa. + """ + CD + + """ + Cook Islands. + """ + CK + + """ + Costa Rica. + """ + CR + + """ + Croatia. + """ + HR + + """ + Cuba. + """ + CU + + """ + Curaçao. + """ + CW + + """ + Cyprus. + """ + CY + + """ + Czechia. + """ + CZ + + """ + Côte d’Ivoire. + """ + CI + + """ + Denmark. + """ + DK + + """ + Djibouti. + """ + DJ + + """ + Dominica. + """ + DM + + """ + Dominican Republic. + """ + DO + + """ + Ecuador. + """ + EC + + """ + Egypt. + """ + EG + + """ + El Salvador. + """ + SV + + """ + Equatorial Guinea. + """ + GQ + + """ + Eritrea. + """ + ER + + """ + Estonia. + """ + EE + + """ + Eswatini. + """ + SZ + + """ + Ethiopia. + """ + ET + + """ + Falkland Islands. + """ + FK + + """ + Faroe Islands. + """ + FO + + """ + Fiji. + """ + FJ + + """ + Finland. + """ + FI + + """ + France. + """ + FR + + """ + French Guiana. + """ + GF + + """ + French Polynesia. + """ + PF + + """ + French Southern Territories. + """ + TF + + """ + Gabon. + """ + GA + + """ + Gambia. + """ + GM + + """ + Georgia. + """ + GE + + """ + Germany. + """ + DE + + """ + Ghana. + """ + GH + + """ + Gibraltar. + """ + GI + + """ + Greece. + """ + GR + + """ + Greenland. + """ + GL + + """ + Grenada. + """ + GD + + """ + Guadeloupe. + """ + GP + + """ + Guatemala. + """ + GT + + """ + Guernsey. + """ + GG + + """ + Guinea. + """ + GN + + """ + Guinea-Bissau. + """ + GW + + """ + Guyana. + """ + GY + + """ + Haiti. + """ + HT + + """ + Heard & McDonald Islands. + """ + HM + + """ + Vatican City. + """ + VA + + """ + Honduras. + """ + HN + + """ + Hong Kong SAR. + """ + HK + + """ + Hungary. + """ + HU + + """ + Iceland. + """ + IS + + """ + India. + """ + IN + + """ + Indonesia. + """ + ID + + """ + Iran. + """ + IR + + """ + Iraq. + """ + IQ + + """ + Ireland. + """ + IE + + """ + Isle of Man. + """ + IM + + """ + Israel. + """ + IL + + """ + Italy. + """ + IT + + """ + Jamaica. + """ + JM + + """ + Japan. + """ + JP + + """ + Jersey. + """ + JE + + """ + Jordan. + """ + JO + + """ + Kazakhstan. + """ + KZ + + """ + Kenya. + """ + KE + + """ + Kiribati. + """ + KI + + """ + North Korea. + """ + KP + + """ + Kosovo. + """ + XK + + """ + Kuwait. + """ + KW + + """ + Kyrgyzstan. + """ + KG + + """ + Laos. + """ + LA + + """ + Latvia. + """ + LV + + """ + Lebanon. + """ + LB + + """ + Lesotho. + """ + LS + + """ + Liberia. + """ + LR + + """ + Libya. + """ + LY + + """ + Liechtenstein. + """ + LI + + """ + Lithuania. + """ + LT + + """ + Luxembourg. + """ + LU + + """ + Macao SAR. + """ + MO + + """ + Madagascar. + """ + MG + + """ + Malawi. + """ + MW + + """ + Malaysia. + """ + MY + + """ + Maldives. + """ + MV + + """ + Mali. + """ + ML + + """ + Malta. + """ + MT + + """ + Martinique. + """ + MQ + + """ + Mauritania. + """ + MR + + """ + Mauritius. + """ + MU + + """ + Mayotte. + """ + YT + + """ + Mexico. + """ + MX + + """ + Moldova. + """ + MD + + """ + Monaco. + """ + MC + + """ + Mongolia. + """ + MN + + """ + Montenegro. + """ + ME + + """ + Montserrat. + """ + MS + + """ + Morocco. + """ + MA + + """ + Mozambique. + """ + MZ + + """ + Myanmar (Burma). + """ + MM + + """ + Namibia. + """ + NA + + """ + Nauru. + """ + NR + + """ + Nepal. + """ + NP + + """ + Netherlands. + """ + NL + + """ + Netherlands Antilles. + """ + AN + + """ + New Caledonia. + """ + NC + + """ + New Zealand. + """ + NZ + + """ + Nicaragua. + """ + NI + + """ + Niger. + """ + NE + + """ + Nigeria. + """ + NG + + """ + Niue. + """ + NU + + """ + Norfolk Island. + """ + NF + + """ + North Macedonia. + """ + MK + + """ + Norway. + """ + NO + + """ + Oman. + """ + OM + + """ + Pakistan. + """ + PK + + """ + Palestinian Territories. + """ + PS + + """ + Panama. + """ + PA + + """ + Papua New Guinea. + """ + PG + + """ + Paraguay. + """ + PY + + """ + Peru. + """ + PE + + """ + Philippines. + """ + PH + + """ + Pitcairn Islands. + """ + PN + + """ + Poland. + """ + PL + + """ + Portugal. + """ + PT + + """ + Qatar. + """ + QA + + """ + Cameroon. + """ + CM + + """ + Réunion. + """ + RE + + """ + Romania. + """ + RO + + """ + Russia. + """ + RU + + """ + Rwanda. + """ + RW + + """ + St. Barthélemy. + """ + BL + + """ + St. Helena. + """ + SH + + """ + St. Kitts & Nevis. + """ + KN + + """ + St. Lucia. + """ + LC + + """ + St. Martin. + """ + MF + + """ + St. Pierre & Miquelon. + """ + PM + + """ + Samoa. + """ + WS + + """ + San Marino. + """ + SM + + """ + São Tomé & Príncipe. + """ + ST + + """ + Saudi Arabia. + """ + SA + + """ + Senegal. + """ + SN + + """ + Serbia. + """ + RS + + """ + Seychelles. + """ + SC + + """ + Sierra Leone. + """ + SL + + """ + Singapore. + """ + SG + + """ + Sint Maarten. + """ + SX + + """ + Slovakia. + """ + SK + + """ + Slovenia. + """ + SI + + """ + Solomon Islands. + """ + SB + + """ + Somalia. + """ + SO + + """ + South Africa. + """ + ZA + + """ + South Georgia & South Sandwich Islands. + """ + GS + + """ + South Korea. + """ + KR + + """ + South Sudan. + """ + SS + + """ + Spain. + """ + ES + + """ + Sri Lanka. + """ + LK + + """ + St. Vincent & Grenadines. + """ + VC + + """ + Sudan. + """ + SD + + """ + Suriname. + """ + SR + + """ + Svalbard & Jan Mayen. + """ + SJ + + """ + Sweden. + """ + SE + + """ + Switzerland. + """ + CH + + """ + Syria. + """ + SY + + """ + Taiwan. + """ + TW + + """ + Tajikistan. + """ + TJ + + """ + Tanzania. + """ + TZ + + """ + Thailand. + """ + TH + + """ + Timor-Leste. + """ + TL + + """ + Togo. + """ + TG + + """ + Tokelau. + """ + TK + + """ + Tonga. + """ + TO + + """ + Trinidad & Tobago. + """ + TT + + """ + Tristan da Cunha. + """ + TA + + """ + Tunisia. + """ + TN + + """ + Turkey. + """ + TR + + """ + Turkmenistan. + """ + TM + + """ + Turks & Caicos Islands. + """ + TC + + """ + Tuvalu. + """ + TV + + """ + Uganda. + """ + UG + + """ + Ukraine. + """ + UA + + """ + United Arab Emirates. + """ + AE + + """ + United Kingdom. + """ + GB + + """ + United States. + """ + US + + """ + U.S. Outlying Islands. + """ + UM + + """ + Uruguay. + """ + UY + + """ + Uzbekistan. + """ + UZ + + """ + Vanuatu. + """ + VU + + """ + Venezuela. + """ + VE + + """ + Vietnam. + """ + VN + + """ + British Virgin Islands. + """ + VG + + """ + Wallis & Futuna. + """ + WF + + """ + Western Sahara. + """ + EH + + """ + Yemen. + """ + YE + + """ + Zambia. + """ + ZM + + """ + Zimbabwe. + """ + ZW +} + +""" +Credit card information used for a payment. +""" +type CreditCard { + """ + The brand of the credit card. + """ + brand: String + + """ + The expiry month of the credit card. + """ + expiryMonth: Int + + """ + The expiry year of the credit card. + """ + expiryYear: Int + + """ + The credit card's BIN number. + """ + firstDigits: String + + """ + The first name of the card holder. + """ + firstName: String + + """ + The last 4 digits of the credit card. + """ + lastDigits: String + + """ + The last name of the card holder. + """ + lastName: String + + """ + The masked credit card number with only the last 4 digits displayed. + """ + maskedNumber: String +} + +""" +Specifies the fields required to complete a checkout with +a Shopify vaulted credit card payment. +""" +input CreditCardPaymentInput { + """ + The amount of the payment. + """ + amount: Money! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The ID returned by Shopify's Card Vault. + """ + vaultId: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean +} + +""" +Specifies the fields required to complete a checkout with +a Shopify vaulted credit card payment. +""" +input CreditCardPaymentInputV2 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The ID returned by Shopify's Card Vault. + """ + vaultId: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean +} + +""" +The part of the image that should remain after cropping. +""" +enum CropRegion { + """ + Keep the center of the image. + """ + CENTER + + """ + Keep the top of the image. + """ + TOP + + """ + Keep the bottom of the image. + """ + BOTTOM + + """ + Keep the left of the image. + """ + LEFT + + """ + Keep the right of the image. + """ + RIGHT +} + +""" +Currency codes. +""" +enum CurrencyCode { + """ + United States Dollars (USD). + """ + USD + + """ + Euro (EUR). + """ + EUR + + """ + United Kingdom Pounds (GBP). + """ + GBP + + """ + Canadian Dollars (CAD). + """ + CAD + + """ + Afghan Afghani (AFN). + """ + AFN + + """ + Albanian Lek (ALL). + """ + ALL + + """ + Algerian Dinar (DZD). + """ + DZD + + """ + Angolan Kwanza (AOA). + """ + AOA + + """ + Argentine Pesos (ARS). + """ + ARS + + """ + Armenian Dram (AMD). + """ + AMD + + """ + Aruban Florin (AWG). + """ + AWG + + """ + Australian Dollars (AUD). + """ + AUD + + """ + Barbadian Dollar (BBD). + """ + BBD + + """ + Azerbaijani Manat (AZN). + """ + AZN + + """ + Bangladesh Taka (BDT). + """ + BDT + + """ + Bahamian Dollar (BSD). + """ + BSD + + """ + Bahraini Dinar (BHD). + """ + BHD + + """ + Burundian Franc (BIF). + """ + BIF + + """ + Belize Dollar (BZD). + """ + BZD + + """ + Bermudian Dollar (BMD). + """ + BMD + + """ + Bhutanese Ngultrum (BTN). + """ + BTN + + """ + Bosnia and Herzegovina Convertible Mark (BAM). + """ + BAM + + """ + Brazilian Real (BRL). + """ + BRL + + """ + Bolivian Boliviano (BOB). + """ + BOB + + """ + Botswana Pula (BWP). + """ + BWP + + """ + Brunei Dollar (BND). + """ + BND + + """ + Bulgarian Lev (BGN). + """ + BGN + + """ + Burmese Kyat (MMK). + """ + MMK + + """ + Cambodian Riel. + """ + KHR + + """ + Cape Verdean escudo (CVE). + """ + CVE + + """ + Cayman Dollars (KYD). + """ + KYD + + """ + Central African CFA Franc (XAF). + """ + XAF + + """ + Chilean Peso (CLP). + """ + CLP + + """ + Chinese Yuan Renminbi (CNY). + """ + CNY + + """ + Colombian Peso (COP). + """ + COP + + """ + Comorian Franc (KMF). + """ + KMF + + """ + Congolese franc (CDF). + """ + CDF + + """ + Costa Rican Colones (CRC). + """ + CRC + + """ + Croatian Kuna (HRK). + """ + HRK + + """ + Czech Koruny (CZK). + """ + CZK + + """ + Danish Kroner (DKK). + """ + DKK + + """ + Dominican Peso (DOP). + """ + DOP + + """ + East Caribbean Dollar (XCD). + """ + XCD + + """ + Egyptian Pound (EGP). + """ + EGP + + """ + Ethiopian Birr (ETB). + """ + ETB + + """ + CFP Franc (XPF). + """ + XPF + + """ + Fijian Dollars (FJD). + """ + FJD + + """ + Gambian Dalasi (GMD). + """ + GMD + + """ + Ghanaian Cedi (GHS). + """ + GHS + + """ + Guatemalan Quetzal (GTQ). + """ + GTQ + + """ + Guyanese Dollar (GYD). + """ + GYD + + """ + Georgian Lari (GEL). + """ + GEL + + """ + Haitian Gourde (HTG). + """ + HTG + + """ + Honduran Lempira (HNL). + """ + HNL + + """ + Hong Kong Dollars (HKD). + """ + HKD + + """ + Hungarian Forint (HUF). + """ + HUF + + """ + Icelandic Kronur (ISK). + """ + ISK + + """ + Indian Rupees (INR). + """ + INR + + """ + Indonesian Rupiah (IDR). + """ + IDR + + """ + Israeli New Shekel (NIS). + """ + ILS + + """ + Iraqi Dinar (IQD). + """ + IQD + + """ + Jamaican Dollars (JMD). + """ + JMD + + """ + Japanese Yen (JPY). + """ + JPY + + """ + Jersey Pound. + """ + JEP + + """ + Jordanian Dinar (JOD). + """ + JOD + + """ + Kazakhstani Tenge (KZT). + """ + KZT + + """ + Kenyan Shilling (KES). + """ + KES + + """ + Kuwaiti Dinar (KWD). + """ + KWD + + """ + Kyrgyzstani Som (KGS). + """ + KGS + + """ + Laotian Kip (LAK). + """ + LAK + + """ + Latvian Lati (LVL). + """ + LVL + + """ + Lebanese Pounds (LBP). + """ + LBP + + """ + Lesotho Loti (LSL). + """ + LSL + + """ + Liberian Dollar (LRD). + """ + LRD + + """ + Lithuanian Litai (LTL). + """ + LTL + + """ + Malagasy Ariary (MGA). + """ + MGA + + """ + Macedonia Denar (MKD). + """ + MKD + + """ + Macanese Pataca (MOP). + """ + MOP + + """ + Malawian Kwacha (MWK). + """ + MWK + + """ + Maldivian Rufiyaa (MVR). + """ + MVR + + """ + Mexican Pesos (MXN). + """ + MXN + + """ + Malaysian Ringgits (MYR). + """ + MYR + + """ + Mauritian Rupee (MUR). + """ + MUR + + """ + Moldovan Leu (MDL). + """ + MDL + + """ + Moroccan Dirham. + """ + MAD + + """ + Mongolian Tugrik. + """ + MNT + + """ + Mozambican Metical. + """ + MZN + + """ + Namibian Dollar. + """ + NAD + + """ + Nepalese Rupee (NPR). + """ + NPR + + """ + Netherlands Antillean Guilder. + """ + ANG + + """ + New Zealand Dollars (NZD). + """ + NZD + + """ + Nicaraguan Córdoba (NIO). + """ + NIO + + """ + Nigerian Naira (NGN). + """ + NGN + + """ + Norwegian Kroner (NOK). + """ + NOK + + """ + Omani Rial (OMR). + """ + OMR + + """ + Panamian Balboa (PAB). + """ + PAB + + """ + Pakistani Rupee (PKR). + """ + PKR + + """ + Papua New Guinean Kina (PGK). + """ + PGK + + """ + Paraguayan Guarani (PYG). + """ + PYG + + """ + Peruvian Nuevo Sol (PEN). + """ + PEN + + """ + Philippine Peso (PHP). + """ + PHP + + """ + Polish Zlotych (PLN). + """ + PLN + + """ + Qatari Rial (QAR). + """ + QAR + + """ + Romanian Lei (RON). + """ + RON + + """ + Russian Rubles (RUB). + """ + RUB + + """ + Rwandan Franc (RWF). + """ + RWF + + """ + Samoan Tala (WST). + """ + WST + + """ + Saudi Riyal (SAR). + """ + SAR + + """ + Sao Tome And Principe Dobra (STD). + """ + STD + + """ + Serbian dinar (RSD). + """ + RSD + + """ + Seychellois Rupee (SCR). + """ + SCR + + """ + Singapore Dollars (SGD). + """ + SGD + + """ + Sudanese Pound (SDG). + """ + SDG + + """ + Syrian Pound (SYP). + """ + SYP + + """ + South African Rand (ZAR). + """ + ZAR + + """ + South Korean Won (KRW). + """ + KRW + + """ + South Sudanese Pound (SSP). + """ + SSP + + """ + Solomon Islands Dollar (SBD). + """ + SBD + + """ + Sri Lankan Rupees (LKR). + """ + LKR + + """ + Surinamese Dollar (SRD). + """ + SRD + + """ + Swazi Lilangeni (SZL). + """ + SZL + + """ + Swedish Kronor (SEK). + """ + SEK + + """ + Swiss Francs (CHF). + """ + CHF + + """ + Taiwan Dollars (TWD). + """ + TWD + + """ + Thai baht (THB). + """ + THB + + """ + Tanzanian Shilling (TZS). + """ + TZS + + """ + Trinidad and Tobago Dollars (TTD). + """ + TTD + + """ + Tunisian Dinar (TND). + """ + TND + + """ + Turkish Lira (TRY). + """ + TRY + + """ + Turkmenistani Manat (TMT). + """ + TMT + + """ + Ugandan Shilling (UGX). + """ + UGX + + """ + Ukrainian Hryvnia (UAH). + """ + UAH + + """ + United Arab Emirates Dirham (AED). + """ + AED + + """ + Uruguayan Pesos (UYU). + """ + UYU + + """ + Uzbekistan som (UZS). + """ + UZS + + """ + Vanuatu Vatu (VUV). + """ + VUV + + """ + Vietnamese đồng (VND). + """ + VND + + """ + West African CFA franc (XOF). + """ + XOF + + """ + Yemeni Rial (YER). + """ + YER + + """ + Zambian Kwacha (ZMW). + """ + ZMW + + """ + Belarusian Ruble (BYN). + """ + BYN + + """ + Belarusian Ruble (BYR). + """ + BYR + + """ + Djiboutian Franc (DJF). + """ + DJF + + """ + Eritrean Nakfa (ERN). + """ + ERN + + """ + Falkland Islands Pounds (FKP). + """ + FKP + + """ + Gibraltar Pounds (GIP). + """ + GIP + + """ + Guinean Franc (GNF). + """ + GNF + + """ + Iranian Rial (IRR). + """ + IRR + + """ + Kiribati Dollar (KID). + """ + KID + + """ + Libyan Dinar (LYD). + """ + LYD + + """ + Mauritanian Ouguiya (MRU). + """ + MRU + + """ + Sierra Leonean Leone (SLL). + """ + SLL + + """ + Saint Helena Pounds (SHP). + """ + SHP + + """ + Somali Shilling (SOS). + """ + SOS + + """ + Tajikistani Somoni (TJS). + """ + TJS + + """ + Tongan Pa'anga (TOP). + """ + TOP + + """ + Venezuelan Bolivares (VEF). + """ + VEF + + """ + Venezuelan Bolivares (VES). + """ + VES +} + +""" +A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. +""" +type Customer { + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean! + + """ + A list of addresses for the customer. + """ + addresses( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MailingAddressConnection! + + """ + The date and time when the customer was created. + """ + createdAt: DateTime! + + """ + The customer’s default address. + """ + defaultAddress: MailingAddress + + """ + The customer’s name, email or phone number. + """ + displayName: String! + + """ + The customer’s email address. + """ + email: String + + """ + The customer’s first name. + """ + firstName: String + + """ + A unique identifier for the customer. + """ + id: ID! + + """ + The customer's most recently updated, incomplete checkout. + """ + lastIncompleteCheckout: Checkout + + """ + The customer’s last name. + """ + lastName: String + + """ + The orders associated with the customer. + """ + orders( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: OrderSortKeys = ID + + """ + Supported filter parameters: + - `processed_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): OrderConnection! + + """ + The customer’s phone number. + """ + phone: String + + """ + A comma separated list of tags that have been added to the customer. + Additional access scope required: unauthenticated_read_customer_tags. + """ + tags: [String!]! + + """ + The date and time when the customer information was updated. + """ + updatedAt: DateTime! +} + +""" +A CustomerAccessToken represents the unique token required to make modifications to the customer object. +""" +type CustomerAccessToken { + """ + The customer’s access token. + """ + accessToken: String! + + """ + The date and time when the customer access token expires. + """ + expiresAt: DateTime! +} + +""" +Specifies the input fields required to create a customer access token. +""" +input CustomerAccessTokenCreateInput { + """ + The email associated to the customer. + """ + email: String! + + """ + The login password to be used by the customer. + """ + password: String! +} + +""" +Return type for `customerAccessTokenCreate` mutation. +""" +type CustomerAccessTokenCreatePayload { + """ + The newly created customer access token object. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAccessTokenCreateWithMultipass` mutation. +""" +type CustomerAccessTokenCreateWithMultipassPayload { + """ + An access token object associated with the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! +} + +""" +Return type for `customerAccessTokenDelete` mutation. +""" +type CustomerAccessTokenDeletePayload { + """ + The destroyed access token. + """ + deletedAccessToken: String + + """ + ID of the destroyed customer access token. + """ + deletedCustomerAccessTokenId: String + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `customerAccessTokenRenew` mutation. +""" +type CustomerAccessTokenRenewPayload { + """ + The renewed customer access token object. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `customerActivateByUrl` mutation. +""" +type CustomerActivateByUrlPayload { + """ + The customer that was activated. + """ + customer: Customer + + """ + A new customer access token for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! +} + +""" +Specifies the input fields required to activate a customer. +""" +input CustomerActivateInput { + """ + The activation token required to activate the customer. + """ + activationToken: String! + + """ + New password that will be set during activation. + """ + password: String! +} + +""" +Return type for `customerActivate` mutation. +""" +type CustomerActivatePayload { + """ + The customer object. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressCreate` mutation. +""" +type CustomerAddressCreatePayload { + """ + The new customer address object. + """ + customerAddress: MailingAddress + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressDelete` mutation. +""" +type CustomerAddressDeletePayload { + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + ID of the deleted customer address. + """ + deletedCustomerAddressId: String + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressUpdate` mutation. +""" +type CustomerAddressUpdatePayload { + """ + The customer’s updated mailing address. + """ + customerAddress: MailingAddress + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to create a new customer. +""" +input CustomerCreateInput { + """ + The customer’s first name. + """ + firstName: String + + """ + The customer’s last name. + """ + lastName: String + + """ + The customer’s email. + """ + email: String! + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The login password used by the customer. + """ + password: String! + + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean +} + +""" +Return type for `customerCreate` mutation. +""" +type CustomerCreatePayload { + """ + The created customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerDefaultAddressUpdate` mutation. +""" +type CustomerDefaultAddressUpdatePayload { + """ + The updated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Possible error codes that could be returned by CustomerUserError. +""" +enum CustomerErrorCode { + """ + Input value is blank. + """ + BLANK + + """ + Input value is invalid. + """ + INVALID + + """ + Input value is already taken. + """ + TAKEN + + """ + Input value is too long. + """ + TOO_LONG + + """ + Input value is too short. + """ + TOO_SHORT + + """ + Unidentified customer. + """ + UNIDENTIFIED_CUSTOMER + + """ + Customer is disabled. + """ + CUSTOMER_DISABLED + + """ + Input password starts or ends with whitespace. + """ + PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE + + """ + Input contains HTML tags. + """ + CONTAINS_HTML_TAGS + + """ + Input contains URL. + """ + CONTAINS_URL + + """ + Invalid activation token. + """ + TOKEN_INVALID + + """ + Customer already enabled. + """ + ALREADY_ENABLED + + """ + Address does not exist. + """ + NOT_FOUND + + """ + Input email contains an invalid domain name. + """ + BAD_DOMAIN + + """ + Multipass token is not valid. + """ + INVALID_MULTIPASS_REQUEST +} + +""" +Return type for `customerRecover` mutation. +""" +type CustomerRecoverPayload { + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerResetByUrl` mutation. +""" +type CustomerResetByUrlPayload { + """ + The customer object which was reset. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to reset a customer’s password. +""" +input CustomerResetInput { + """ + The reset token required to reset the customer’s password. + """ + resetToken: String! + + """ + New password that will be set as part of the reset password process. + """ + password: String! +} + +""" +Return type for `customerReset` mutation. +""" +type CustomerResetPayload { + """ + The customer object which was reset. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to update the Customer information. +""" +input CustomerUpdateInput { + """ + The customer’s first name. + """ + firstName: String + + """ + The customer’s last name. + """ + lastName: String + + """ + The customer’s email. + """ + email: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. To remove the phone number, specify `null`. + """ + phone: String + + """ + The login password used by the customer. + """ + password: String + + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean +} + +""" +Return type for `customerUpdate` mutation. +""" +type CustomerUpdatePayload { + """ + The updated customer object. + """ + customer: Customer + + """ + The newly created customer access token. If the customer's password is updated, all previous access tokens + (including the one used to perform this mutation) become invalid, and a new token is generated. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Represents an error that happens during execution of a customer mutation. +""" +type CustomerUserError implements DisplayableError { + """ + Error code to uniquely identify the error. + """ + code: CustomerErrorCode + + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +An ISO-8601 encoded UTC date time string. Example value: `"2019-07-03T20:47:55Z"`. +""" +scalar DateTime + +""" +A signed decimal number, which supports arbitrary precision and is serialized as a string. Example value: `"29.99"`. +""" +scalar Decimal + +""" +Digital wallet, such as Apple Pay, which can be used for accelerated checkouts. +""" +enum DigitalWallet { + """ + Apple Pay. + """ + APPLE_PAY + + """ + Android Pay. + """ + ANDROID_PAY + + """ + Google Pay. + """ + GOOGLE_PAY + + """ + Shopify Pay. + """ + SHOPIFY_PAY +} + +""" +An amount discounting the line that has been allocated by a discount. +""" +type DiscountAllocation { + """ + Amount of discount allocated. + """ + allocatedAmount: MoneyV2! + + """ + The discount this allocated amount originated from. + """ + discountApplication: DiscountApplication! +} + +""" +Discount applications capture the intentions of a discount source at +the time of application. +""" +interface DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +The method by which the discount's value is allocated onto its entitled lines. +""" +enum DiscountApplicationAllocationMethod { + """ + The value is spread across all entitled lines. + """ + ACROSS + + """ + The value is applied onto every entitled line. + """ + EACH + + """ + The value is specifically applied onto a particular line. + """ + ONE +} + +""" +An auto-generated type for paginating through multiple DiscountApplications. +""" +type DiscountApplicationConnection { + """ + A list of edges. + """ + edges: [DiscountApplicationEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one DiscountApplication and a cursor during pagination. +""" +type DiscountApplicationEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of DiscountApplicationEdge. + """ + node: DiscountApplication! +} + +""" +Which lines on the order that the discount is allocated over, of the type +defined by the Discount Application's target_type. +""" +enum DiscountApplicationTargetSelection { + """ + The discount is allocated onto all the lines. + """ + ALL + + """ + The discount is allocated onto only the lines it is entitled for. + """ + ENTITLED + + """ + The discount is allocated onto explicitly chosen lines. + """ + EXPLICIT +} + +""" +The type of line (i.e. line item or shipping line) on an order that the discount is applicable towards. +""" +enum DiscountApplicationTargetType { + """ + The discount applies onto line items. + """ + LINE_ITEM + + """ + The discount applies onto shipping lines. + """ + SHIPPING_LINE +} + +""" +Discount code applications capture the intentions of a discount code at +the time that it is applied. +""" +type DiscountCodeApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Specifies whether the discount code was applied successfully. + """ + applicable: Boolean! + + """ + The string identifying the discount code that was used at the time of application. + """ + code: String! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Represents an error in the input of a mutation. +""" +interface DisplayableError { + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +Represents a web address. +""" +type Domain { + """ + The host name of the domain (eg: `example.com`). + """ + host: String! + + """ + Whether SSL is enabled or not. + """ + sslEnabled: Boolean! + + """ + The URL of the domain (eg: `https://example.com`). + """ + url: URL! +} + +""" +Represents a video hosted outside of Shopify. +""" +type ExternalVideo implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + The URL. + """ + embeddedUrl: URL! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +Represents a single fulfillment in an order. +""" +type Fulfillment { + """ + List of the fulfillment's line items. + """ + fulfillmentLineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): FulfillmentLineItemConnection! + + """ + The name of the tracking company. + """ + trackingCompany: String + + """ + Tracking information associated with the fulfillment, + such as the tracking number and tracking URL. + """ + trackingInfo( + """ + Truncate the array result to this size. + """ + first: Int + ): [FulfillmentTrackingInfo!]! +} + +""" +Represents a single line item in a fulfillment. There is at most one fulfillment line item for each order line item. +""" +type FulfillmentLineItem { + """ + The associated order's line item. + """ + lineItem: OrderLineItem! + + """ + The amount fulfilled in this fulfillment. + """ + quantity: Int! +} + +""" +An auto-generated type for paginating through multiple FulfillmentLineItems. +""" +type FulfillmentLineItemConnection { + """ + A list of edges. + """ + edges: [FulfillmentLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one FulfillmentLineItem and a cursor during pagination. +""" +type FulfillmentLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of FulfillmentLineItemEdge. + """ + node: FulfillmentLineItem! +} + +""" +Tracking information associated with the fulfillment. +""" +type FulfillmentTrackingInfo { + """ + The tracking number of the fulfillment. + """ + number: String + + """ + The URL to track the fulfillment. + """ + url: URL +} + +""" +A string containing HTML code. Example value: `"

Grey cotton knit sweater.

"`. +""" +scalar HTML + +""" +Represents information about the metafields associated to the specified resource. +""" +interface HasMetafields { + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! +} + +""" +Represents an image resource. +""" +type Image { + """ + A word or phrase to share the nature or contents of an image. + """ + altText: String + + """ + The original height of the image in pixels. Returns `null` if the image is not hosted by Shopify. + """ + height: Int + + """ + A unique identifier for the image. + """ + id: ID + + """ + The location of the original image as a URL. + + If there are any existing transformations in the original source URL, they will remain and not be stripped. + """ + originalSrc: URL! + + """ + The location of the image as a URL. + """ + src: URL! + @deprecated( + reason: "Previously an image had a single `src` field. This could either return the original image\nlocation or a URL that contained transformations such as sizing or scale.\n\nThese transformations were specified by arguments on the parent field.\n\nNow an image has two distinct URL fields: `originalSrc` and `transformedSrc`.\n\n* `originalSrc` - the original unmodified image URL\n* `transformedSrc` - the image URL with the specified transformations included\n\nTo migrate to the new fields, image transformations should be moved from the parent field to `transformedSrc`.\n\nBefore:\n```graphql\n{\n shop {\n productImages(maxWidth: 200, scale: 2) {\n edges {\n node {\n src\n }\n }\n }\n }\n}\n```\n\nAfter:\n```graphql\n{\n shop {\n productImages {\n edges {\n node {\n transformedSrc(maxWidth: 200, scale: 2)\n }\n }\n }\n }\n}\n```\n" + ) + + """ + The location of the transformed image as a URL. + + All transformation arguments are considered "best-effort". If they can be applied to an image, they will be. + Otherwise any transformations which an image type does not support will be ignored. + """ + transformedSrc( + """ + Image width in pixels between 1 and 5760. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 5760. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. + """ + scale: Int = 1 + + """ + Best effort conversion of image into content type (SVG -> PNG, Anything -> JGP, Anything -> WEBP are supported). + """ + preferredContentType: ImageContentType + ): URL! + + """ + The original width of the image in pixels. Returns `null` if the image is not hosted by Shopify. + """ + width: Int +} + +""" +An auto-generated type for paginating through multiple Images. +""" +type ImageConnection { + """ + A list of edges. + """ + edges: [ImageEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +List of supported image content types. +""" +enum ImageContentType { + """ + A PNG image. + """ + PNG + + """ + A JPG image. + """ + JPG + + """ + A WEBP image. + """ + WEBP +} + +""" +An auto-generated type which holds one Image and a cursor during pagination. +""" +type ImageEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ImageEdge. + """ + node: Image! +} + +""" +Represents a mailing address for customers and shipping. +""" +type MailingAddress implements Node { + """ + The first line of the address. Typically the street address or PO Box number. + """ + address1: String + + """ + The second line of the address. Typically the number of the apartment, suite, or unit. + """ + address2: String + + """ + The name of the city, district, village, or town. + """ + city: String + + """ + The name of the customer's company or organization. + """ + company: String + + """ + The name of the country. + """ + country: String + + """ + The two-letter code for the country of the address. + + For example, US. + """ + countryCode: String @deprecated(reason: "Use `countryCodeV2` instead") + + """ + The two-letter code for the country of the address. + + For example, US. + """ + countryCodeV2: CountryCode + + """ + The first name of the customer. + """ + firstName: String + + """ + A formatted version of the address, customized by the provided arguments. + """ + formatted( + """ + Whether to include the customer's name in the formatted address. + """ + withName: Boolean = false + + """ + Whether to include the customer's company in the formatted address. + """ + withCompany: Boolean = true + ): [String!]! + + """ + A comma-separated list of the values for city, province, and country. + """ + formattedArea: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The last name of the customer. + """ + lastName: String + + """ + The latitude coordinate of the customer address. + """ + latitude: Float + + """ + The longitude coordinate of the customer address. + """ + longitude: Float + + """ + The full name of the customer, based on firstName and lastName. + """ + name: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The region of the address, such as the province, state, or district. + """ + province: String + + """ + The two-letter code for the region. + + For example, ON. + """ + provinceCode: String + + """ + The zip or postal code of the address. + """ + zip: String +} + +""" +An auto-generated type for paginating through multiple MailingAddresses. +""" +type MailingAddressConnection { + """ + A list of edges. + """ + edges: [MailingAddressEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one MailingAddress and a cursor during pagination. +""" +type MailingAddressEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MailingAddressEdge. + """ + node: MailingAddress! +} + +""" +Specifies the fields accepted to create or update a mailing address. +""" +input MailingAddressInput { + """ + The first line of the address. Typically the street address or PO Box number. + """ + address1: String + + """ + The second line of the address. Typically the number of the apartment, suite, or unit. + """ + address2: String + + """ + The name of the city, district, village, or town. + """ + city: String + + """ + The name of the customer's company or organization. + """ + company: String + + """ + The name of the country. + """ + country: String + + """ + The first name of the customer. + """ + firstName: String + + """ + The last name of the customer. + """ + lastName: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The region of the address, such as the province, state, or district. + """ + province: String + + """ + The zip or postal code of the address. + """ + zip: String +} + +""" +Manual discount applications capture the intentions of a discount that was manually created. +""" +type ManualDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + The description of the application. + """ + description: String + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Represents a media interface. +""" +interface Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +An auto-generated type for paginating through multiple Media. +""" +type MediaConnection { + """ + A list of edges. + """ + edges: [MediaEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +The possible content types for a media object. +""" +enum MediaContentType { + """ + An externally hosted video. + """ + EXTERNAL_VIDEO + + """ + A Shopify hosted image. + """ + IMAGE + + """ + A 3d model. + """ + MODEL_3D + + """ + A Shopify hosted video. + """ + VIDEO +} + +""" +An auto-generated type which holds one Media and a cursor during pagination. +""" +type MediaEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MediaEdge. + """ + node: Media! +} + +""" +Represents a Shopify hosted image. +""" +type MediaImage implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The image for the media. + """ + image: Image + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +Metafields represent custom metadata attached to a resource. Metafields can be sorted into namespaces and are +comprised of keys, values, and value types. +""" +type Metafield implements Node { + """ + The date and time when the storefront metafield was created. + """ + createdAt: DateTime! + + """ + The description of a metafield. + """ + description: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The key name for a metafield. + """ + key: String! + + """ + The namespace for a metafield. + """ + namespace: String! + + """ + The parent object that the metafield belongs to. + """ + parentResource: MetafieldParentResource! + + """ + The date and time when the storefront metafield was updated. + """ + updatedAt: DateTime! + + """ + The value of a metafield. + """ + value: String! + + """ + Represents the metafield value type. + """ + valueType: MetafieldValueType! +} + +""" +An auto-generated type for paginating through multiple Metafields. +""" +type MetafieldConnection { + """ + A list of edges. + """ + edges: [MetafieldEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Metafield and a cursor during pagination. +""" +type MetafieldEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MetafieldEdge. + """ + node: Metafield! +} + +""" +A resource that the metafield belongs to. +""" +union MetafieldParentResource = Product | ProductVariant + +""" +Metafield value types. +""" +enum MetafieldValueType { + """ + A string metafield. + """ + STRING + + """ + An integer metafield. + """ + INTEGER + + """ + A json string metafield. + """ + JSON_STRING +} + +""" +Represents a Shopify hosted 3D model. +""" +type Model3d implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image + + """ + The sources for a 3d model. + """ + sources: [Model3dSource!]! +} + +""" +Represents a source for a Shopify hosted 3d model. +""" +type Model3dSource { + """ + The filesize of the 3d model. + """ + filesize: Int! + + """ + The format of the 3d model. + """ + format: String! + + """ + The MIME type of the 3d model. + """ + mimeType: String! + + """ + The URL of the 3d model. + """ + url: String! +} + +""" +A monetary value string. Example value: `"100.57"`. +""" +scalar Money + +""" +Specifies the fields for a monetary value with currency. +""" +input MoneyInput { + """ + Decimal money amount. + """ + amount: Decimal! + + """ + Currency of the money. + """ + currencyCode: CurrencyCode! +} + +""" +A monetary value with currency. + +To format currencies, combine this type's amount and currencyCode fields with your client's locale. + +For example, in JavaScript you could use Intl.NumberFormat: + +```js +new Intl.NumberFormat(locale, { + style: 'currency', + currency: currencyCode +}).format(amount); +``` + +Other formatting libraries include: + +* iOS - [NumberFormatter](https://developer.apple.com/documentation/foundation/numberformatter) +* Android - [NumberFormat](https://developer.android.com/reference/java/text/NumberFormat.html) +* PHP - [NumberFormatter](http://php.net/manual/en/class.numberformatter.php) + +For a more general solution, the [Unicode CLDR number formatting database] is available with many implementations +(such as [TwitterCldr](https://github.com/twitter/twitter-cldr-rb)). +""" +type MoneyV2 { + """ + Decimal money amount. + """ + amount: Decimal! + + """ + Currency of the money. + """ + currencyCode: CurrencyCode! +} + +""" +An auto-generated type for paginating through multiple MoneyV2s. +""" +type MoneyV2Connection { + """ + A list of edges. + """ + edges: [MoneyV2Edge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one MoneyV2 and a cursor during pagination. +""" +type MoneyV2Edge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MoneyV2Edge. + """ + node: MoneyV2! +} + +""" +The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. +""" +type Mutation { + """ + Updates the attributes of a checkout. + """ + checkoutAttributesUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The fields used to update a checkout's attributes. + """ + input: CheckoutAttributesUpdateInput! + ): CheckoutAttributesUpdatePayload + @deprecated(reason: "Use `checkoutAttributesUpdateV2` instead") + + """ + Updates the attributes of a checkout. + """ + checkoutAttributesUpdateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The checkout attributes to update. + """ + input: CheckoutAttributesUpdateV2Input! + ): CheckoutAttributesUpdateV2Payload + + """ + Completes a checkout without providing payment information. You can use this mutation for free items or items whose purchase price is covered by a gift card. + """ + checkoutCompleteFree( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCompleteFreePayload + + """ + Completes a checkout using a credit card token from Shopify's Vault. + """ + checkoutCompleteWithCreditCard( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The credit card info to apply as a payment. + """ + payment: CreditCardPaymentInput! + ): CheckoutCompleteWithCreditCardPayload + @deprecated(reason: "Use `checkoutCompleteWithCreditCardV2` instead") + + """ + Completes a checkout using a credit card token from Shopify's card vault. Before you can complete checkouts using CheckoutCompleteWithCreditCardV2, you need to [_request payment processing_](https://help.shopify.com/api/guides/sales-channel-sdk/getting-started#request-payment-processing). + """ + checkoutCompleteWithCreditCardV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The credit card info to apply as a payment. + """ + payment: CreditCardPaymentInputV2! + ): CheckoutCompleteWithCreditCardV2Payload + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPayment( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInput! + ): CheckoutCompleteWithTokenizedPaymentPayload + @deprecated(reason: "Use `checkoutCompleteWithTokenizedPaymentV2` instead") + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPaymentV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInputV2! + ): CheckoutCompleteWithTokenizedPaymentV2Payload + @deprecated(reason: "Use `checkoutCompleteWithTokenizedPaymentV3` instead") + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPaymentV3( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInputV3! + ): CheckoutCompleteWithTokenizedPaymentV3Payload + + """ + Creates a new checkout. + """ + checkoutCreate( + """ + The fields used to create a checkout. + """ + input: CheckoutCreateInput! + ): CheckoutCreatePayload + + """ + Associates a customer to the checkout. + """ + checkoutCustomerAssociate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The customer access token of the customer to associate. + """ + customerAccessToken: String! + ): CheckoutCustomerAssociatePayload + @deprecated(reason: "Use `checkoutCustomerAssociateV2` instead") + + """ + Associates a customer to the checkout. + """ + checkoutCustomerAssociateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The customer access token of the customer to associate. + """ + customerAccessToken: String! + ): CheckoutCustomerAssociateV2Payload + + """ + Disassociates the current checkout customer from the checkout. + """ + checkoutCustomerDisassociate( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCustomerDisassociatePayload + @deprecated(reason: "Use `checkoutCustomerDisassociateV2` instead") + + """ + Disassociates the current checkout customer from the checkout. + """ + checkoutCustomerDisassociateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCustomerDisassociateV2Payload + + """ + Applies a discount to an existing checkout using a discount code. + """ + checkoutDiscountCodeApply( + """ + The discount code to apply to the checkout. + """ + discountCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeApplyPayload + @deprecated(reason: "Use `checkoutDiscountCodeApplyV2` instead") + + """ + Applies a discount to an existing checkout using a discount code. + """ + checkoutDiscountCodeApplyV2( + """ + The discount code to apply to the checkout. + """ + discountCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeApplyV2Payload + + """ + Removes the applied discount from an existing checkout. + """ + checkoutDiscountCodeRemove( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeRemovePayload + + """ + Updates the email on an existing checkout. + """ + checkoutEmailUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The email to update the checkout with. + """ + email: String! + ): CheckoutEmailUpdatePayload + @deprecated(reason: "Use `checkoutEmailUpdateV2` instead") + + """ + Updates the email on an existing checkout. + """ + checkoutEmailUpdateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The email to update the checkout with. + """ + email: String! + ): CheckoutEmailUpdateV2Payload + + """ + Applies a gift card to an existing checkout using a gift card code. This will replace all currently applied gift cards. + """ + checkoutGiftCardApply( + """ + The code of the gift card to apply on the checkout. + """ + giftCardCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardApplyPayload + @deprecated(reason: "Use `checkoutGiftCardsAppend` instead") + + """ + Removes an applied gift card from the checkout. + """ + checkoutGiftCardRemove( + """ + The ID of the Applied Gift Card to remove from the Checkout. + """ + appliedGiftCardId: ID! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardRemovePayload + @deprecated(reason: "Use `checkoutGiftCardRemoveV2` instead") + + """ + Removes an applied gift card from the checkout. + """ + checkoutGiftCardRemoveV2( + """ + The ID of the Applied Gift Card to remove from the Checkout. + """ + appliedGiftCardId: ID! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardRemoveV2Payload + + """ + Appends gift cards to an existing checkout. + """ + checkoutGiftCardsAppend( + """ + A list of gift card codes to append to the checkout. + """ + giftCardCodes: [String!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardsAppendPayload + + """ + Adds a list of line items to a checkout. + """ + checkoutLineItemsAdd( + """ + A list of line item objects to add to the checkout. + """ + lineItems: [CheckoutLineItemInput!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutLineItemsAddPayload + + """ + Removes line items from an existing checkout. + """ + checkoutLineItemsRemove( + """ + The checkout on which to remove line items. + """ + checkoutId: ID! + + """ + Line item ids to remove. + """ + lineItemIds: [ID!]! + ): CheckoutLineItemsRemovePayload + + """ + Sets a list of line items to a checkout. + """ + checkoutLineItemsReplace( + """ + A list of line item objects to set on the checkout. + """ + lineItems: [CheckoutLineItemInput!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutLineItemsReplacePayload + + """ + Updates line items on a checkout. + """ + checkoutLineItemsUpdate( + """ + The checkout on which to update line items. + """ + checkoutId: ID! + + """ + Line items to update. + """ + lineItems: [CheckoutLineItemUpdateInput!]! + ): CheckoutLineItemsUpdatePayload + + """ + Updates the shipping address of an existing checkout. + """ + checkoutShippingAddressUpdate( + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutShippingAddressUpdatePayload + @deprecated(reason: "Use `checkoutShippingAddressUpdateV2` instead") + + """ + Updates the shipping address of an existing checkout. + """ + checkoutShippingAddressUpdateV2( + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutShippingAddressUpdateV2Payload + + """ + Updates the shipping lines on an existing checkout. + """ + checkoutShippingLineUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + A unique identifier to a Checkout’s shipping provider, price, and title combination, enabling the customer to select the availableShippingRates. + """ + shippingRateHandle: String! + ): CheckoutShippingLineUpdatePayload + + """ + Creates a customer access token. + The customer access token is required to modify the customer object in any way. + """ + customerAccessTokenCreate( + """ + The fields used to create a customer access token. + """ + input: CustomerAccessTokenCreateInput! + ): CustomerAccessTokenCreatePayload + + """ + Creates a customer access token using a multipass token instead of email and password. + A customer record is created if customer does not exist. If a customer record already + exists but the record is disabled, then it's enabled. + """ + customerAccessTokenCreateWithMultipass( + """ + A valid multipass token to be authenticated. + """ + multipassToken: String! + ): CustomerAccessTokenCreateWithMultipassPayload + + """ + Permanently destroys a customer access token. + """ + customerAccessTokenDelete( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAccessTokenDeletePayload + + """ + Renews a customer access token. + + Access token renewal must happen *before* a token expires. + If a token has already expired, a new one should be created instead via `customerAccessTokenCreate`. + """ + customerAccessTokenRenew( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAccessTokenRenewPayload + + """ + Activates a customer. + """ + customerActivate( + """ + Specifies the customer to activate. + """ + id: ID! + + """ + The fields used to activate a customer. + """ + input: CustomerActivateInput! + ): CustomerActivatePayload + + """ + Activates a customer with the activation url received from `customerCreate`. + """ + customerActivateByUrl( + """ + The customer activation URL. + """ + activationUrl: URL! + + """ + A new password set during activation. + """ + password: String! + ): CustomerActivateByUrlPayload + + """ + Creates a new address for a customer. + """ + customerAddressCreate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + The customer mailing address to create. + """ + address: MailingAddressInput! + ): CustomerAddressCreatePayload + + """ + Permanently deletes the address of an existing customer. + """ + customerAddressDelete( + """ + Specifies the address to delete. + """ + id: ID! + + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAddressDeletePayload + + """ + Updates the address of an existing customer. + """ + customerAddressUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + Specifies the customer address to update. + """ + id: ID! + + """ + The customer’s mailing address. + """ + address: MailingAddressInput! + ): CustomerAddressUpdatePayload + + """ + Creates a new customer. + """ + customerCreate( + """ + The fields used to create a new customer. + """ + input: CustomerCreateInput! + ): CustomerCreatePayload + + """ + Updates the default address of an existing customer. + """ + customerDefaultAddressUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + ID of the address to set as the new default for the customer. + """ + addressId: ID! + ): CustomerDefaultAddressUpdatePayload + + """ + Sends a reset password email to the customer, as the first step in the reset password process. + """ + customerRecover( + """ + The email address of the customer to recover. + """ + email: String! + ): CustomerRecoverPayload + + """ + Resets a customer’s password with a token received from `CustomerRecover`. + """ + customerReset( + """ + Specifies the customer to reset. + """ + id: ID! + + """ + The fields used to reset a customer’s password. + """ + input: CustomerResetInput! + ): CustomerResetPayload + + """ + Resets a customer’s password with the reset password url received from `CustomerRecover`. + """ + customerResetByUrl( + """ + The customer's reset password url. + """ + resetUrl: URL! + + """ + New password that will be set as part of the reset password process. + """ + password: String! + ): CustomerResetByUrlPayload + + """ + Updates an existing customer. + """ + customerUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + The customer object input. + """ + customer: CustomerUpdateInput! + ): CustomerUpdatePayload +} + +""" +An object with an ID to support global identification. +""" +interface Node { + """ + Globally unique identifier. + """ + id: ID! +} + +""" +An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. +""" +type Order implements Node { + """ + The reason for the order's cancellation. Returns `null` if the order wasn't canceled. + """ + cancelReason: OrderCancelReason + + """ + The date and time when the order was canceled. Returns null if the order wasn't canceled. + """ + canceledAt: DateTime + + """ + The code of the currency used for the payment. + """ + currencyCode: CurrencyCode! + + """ + The subtotal of line items and their discounts, excluding line items that have been removed. Does not contain order-level discounts, duties, shipping costs, or shipping discounts. Taxes are not included unless the order is a taxes-included order. + """ + currentSubtotalPrice: MoneyV2! + + """ + The total amount of the order, including duties, taxes and discounts, minus amounts for line items that have been removed. + """ + currentTotalPrice: MoneyV2! + + """ + The total of all taxes applied to the order, excluding taxes for returned line items. + """ + currentTotalTax: MoneyV2! + + """ + The locale code in which this specific order happened. + """ + customerLocale: String + + """ + The unique URL that the customer can use to access the order. + """ + customerUrl: URL + + """ + Discounts that have been applied on the order. + """ + discountApplications( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): DiscountApplicationConnection! + + """ + Whether the order has had any edits applied or not. + """ + edited: Boolean! + + """ + The customer's email address. + """ + email: String + + """ + The financial status of the order. + """ + financialStatus: OrderFinancialStatus + + """ + The fulfillment status for the order. + """ + fulfillmentStatus: OrderFulfillmentStatus! + + """ + Globally unique identifier. + """ + id: ID! + + """ + List of the order’s line items. + """ + lineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): OrderLineItemConnection! + + """ + Unique identifier for the order that appears on the order. + For example, _#1000_ or _Store1001. + """ + name: String! + + """ + A unique numeric identifier for the order for use by shop owner and customer. + """ + orderNumber: Int! + + """ + The total price of the order before any applied edits. + """ + originalTotalPrice: MoneyV2! + + """ + The customer's phone number for receiving SMS notifications. + """ + phone: String + + """ + The date and time when the order was imported. + This value can be set to dates in the past when importing from other systems. + If no value is provided, it will be auto-generated based on current date and time. + """ + processedAt: DateTime! + + """ + The address to where the order will be shipped. + """ + shippingAddress: MailingAddress + + """ + The discounts that have been allocated onto the shipping line by discount applications. + """ + shippingDiscountAllocations: [DiscountAllocation!]! + + """ + The unique URL for the order's status page. + """ + statusUrl: URL! + + """ + Price of the order before shipping and taxes. + """ + subtotalPrice: Money @deprecated(reason: "Use `subtotalPriceV2` instead") + + """ + Price of the order before duties, shipping and taxes. + """ + subtotalPriceV2: MoneyV2 + + """ + List of the order’s successful fulfillments. + """ + successfulFulfillments( + """ + Truncate the array result to this size. + """ + first: Int + ): [Fulfillment!] + + """ + The sum of all the prices of all the items in the order, taxes and discounts included (must be positive). + """ + totalPrice: Money! @deprecated(reason: "Use `totalPriceV2` instead") + + """ + The sum of all the prices of all the items in the order, duties, taxes and discounts included (must be positive). + """ + totalPriceV2: MoneyV2! + + """ + The total amount that has been refunded. + """ + totalRefunded: Money! @deprecated(reason: "Use `totalRefundedV2` instead") + + """ + The total amount that has been refunded. + """ + totalRefundedV2: MoneyV2! + + """ + The total cost of shipping. + """ + totalShippingPrice: Money! + @deprecated(reason: "Use `totalShippingPriceV2` instead") + + """ + The total cost of shipping. + """ + totalShippingPriceV2: MoneyV2! + + """ + The total cost of taxes. + """ + totalTax: Money @deprecated(reason: "Use `totalTaxV2` instead") + + """ + The total cost of taxes. + """ + totalTaxV2: MoneyV2 +} + +""" +Represents the reason for the order's cancellation. +""" +enum OrderCancelReason { + """ + The customer wanted to cancel the order. + """ + CUSTOMER + + """ + The order was fraudulent. + """ + FRAUD + + """ + There was insufficient inventory. + """ + INVENTORY + + """ + Payment was declined. + """ + DECLINED + + """ + The order was canceled for an unlisted reason. + """ + OTHER +} + +""" +An auto-generated type for paginating through multiple Orders. +""" +type OrderConnection { + """ + A list of edges. + """ + edges: [OrderEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Order and a cursor during pagination. +""" +type OrderEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of OrderEdge. + """ + node: Order! +} + +""" +Represents the order's current financial status. +""" +enum OrderFinancialStatus { + """ + Displayed as **Pending**. + """ + PENDING + + """ + Displayed as **Authorized**. + """ + AUTHORIZED + + """ + Displayed as **Partially paid**. + """ + PARTIALLY_PAID + + """ + Displayed as **Partially refunded**. + """ + PARTIALLY_REFUNDED + + """ + Displayed as **Voided**. + """ + VOIDED + + """ + Displayed as **Paid**. + """ + PAID + + """ + Displayed as **Refunded**. + """ + REFUNDED +} + +""" +Represents the order's current fulfillment status. +""" +enum OrderFulfillmentStatus { + """ + Displayed as **Unfulfilled**. + """ + UNFULFILLED + + """ + Displayed as **Partially fulfilled**. + """ + PARTIALLY_FULFILLED + + """ + Displayed as **Fulfilled**. + """ + FULFILLED + + """ + Displayed as **Restocked**. + """ + RESTOCKED + + """ + Displayed as **Pending fulfillment**. + """ + PENDING_FULFILLMENT + + """ + Displayed as **Open**. + """ + OPEN + + """ + Displayed as **In progress**. + """ + IN_PROGRESS + + """ + Displayed as **Scheduled**. + """ + SCHEDULED +} + +""" +Represents a single line in an order. There is one line item for each distinct product variant. +""" +type OrderLineItem { + """ + The number of entries associated to the line item minus the items that have been removed. + """ + currentQuantity: Int! + + """ + List of custom attributes associated to the line item. + """ + customAttributes: [Attribute!]! + + """ + The discounts that have been allocated onto the order line item by discount applications. + """ + discountAllocations: [DiscountAllocation!]! + + """ + The total price of the line item, including discounts, and displayed in the presentment currency. + """ + discountedTotalPrice: MoneyV2! + + """ + The total price of the line item, not including any discounts. The total price is calculated using the original unit price multiplied by the quantity, and it is displayed in the presentment currency. + """ + originalTotalPrice: MoneyV2! + + """ + The number of products variants associated to the line item. + """ + quantity: Int! + + """ + The title of the product combined with title of the variant. + """ + title: String! + + """ + The product variant object associated to the line item. + """ + variant: ProductVariant +} + +""" +An auto-generated type for paginating through multiple OrderLineItems. +""" +type OrderLineItemConnection { + """ + A list of edges. + """ + edges: [OrderLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one OrderLineItem and a cursor during pagination. +""" +type OrderLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of OrderLineItemEdge. + """ + node: OrderLineItem! +} + +""" +The set of valid sort keys for the Order query. +""" +enum OrderSortKeys { + """ + Sort by the `processed_at` value. + """ + PROCESSED_AT + + """ + Sort by the `total_price` value. + """ + TOTAL_PRICE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Shopify merchants can create pages to hold static HTML content. Each Page object represents a custom page on the online store. +""" +type Page implements Node { + """ + The description of the page, complete with HTML formatting. + """ + body: HTML! + + """ + Summary of the page body. + """ + bodySummary: String! + + """ + The timestamp of the page creation. + """ + createdAt: DateTime! + + """ + A human-friendly unique string for the page automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The page's SEO information. + """ + seo: SEO + + """ + The title of the page. + """ + title: String! + + """ + The timestamp of the latest page update. + """ + updatedAt: DateTime! + + """ + The url pointing to the page accessible from the web. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Pages. +""" +type PageConnection { + """ + A list of edges. + """ + edges: [PageEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Page and a cursor during pagination. +""" +type PageEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of PageEdge. + """ + node: Page! +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + Indicates if there are more pages to fetch. + """ + hasNextPage: Boolean! + + """ + Indicates if there are any pages prior to the current page. + """ + hasPreviousPage: Boolean! +} + +""" +The set of valid sort keys for the Page query. +""" +enum PageSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A payment applied to a checkout. +""" +type Payment implements Node { + """ + The amount of the payment. + """ + amount: Money! @deprecated(reason: "Use `amountV2` instead") + + """ + The amount of the payment. + """ + amountV2: MoneyV2! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddress + + """ + The checkout to which the payment belongs. + """ + checkout: Checkout! + + """ + The credit card used for the payment in the case of direct payments. + """ + creditCard: CreditCard + + """ + A message describing a processing error during asynchronous processing. + """ + errorMessage: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + A client-side generated token to identify a payment and perform idempotent operations. + For more information, refer to + [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String + + """ + The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. + """ + nextActionUrl: URL + + """ + Whether or not the payment is still processing asynchronously. + """ + ready: Boolean! + + """ + A flag to indicate if the payment is to be done in test mode for gateways that support it. + """ + test: Boolean! + + """ + The actual transaction recorded by Shopify after having processed the payment with the gateway. + """ + transaction: Transaction +} + +""" +Settings related to payments. +""" +type PaymentSettings { + """ + List of the card brands which the shop accepts. + """ + acceptedCardBrands: [CardBrand!]! + + """ + The url pointing to the endpoint to vault credit cards. + """ + cardVaultUrl: URL! + + """ + The country where the shop is located. + """ + countryCode: CountryCode! + + """ + The three-letter code for the shop's primary currency. + """ + currencyCode: CurrencyCode! + + """ + A list of enabled currencies (ISO 4217 format) that the shop accepts. Merchants can enable currencies from their Shopify Payments settings in the Shopify admin. + """ + enabledPresentmentCurrencies: [CurrencyCode!]! + + """ + The shop’s Shopify Payments account id. + """ + shopifyPaymentsAccountId: String + + """ + List of the digital wallets which the shop supports. + """ + supportedDigitalWallets: [DigitalWallet!]! +} + +""" +The valid values for the types of payment token. +""" +enum PaymentTokenType { + """ + Apple Pay token type. + """ + APPLE_PAY + + """ + Vault payment token type. + """ + VAULT + + """ + Shopify Pay token type. + """ + SHOPIFY_PAY + + """ + Google Pay token type. + """ + GOOGLE_PAY +} + +""" +The value of the percentage pricing object. +""" +type PricingPercentageValue { + """ + The percentage value of the object. + """ + percentage: Float! +} + +""" +The price value (fixed or percentage) for a discount application. +""" +union PricingValue = MoneyV2 | PricingPercentageValue + +""" +A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. +For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). +""" +type Product implements Node & HasMetafields { + """ + Indicates if at least one product variant is available for sale. + """ + availableForSale: Boolean! + + """ + List of collections a product belongs to. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CollectionConnection! + + """ + The compare at price of the product across all variants. + """ + compareAtPriceRange: ProductPriceRange! + + """ + The date and time when the product was created. + """ + createdAt: DateTime! + + """ + Stripped description of the product, single line with HTML tags removed. + """ + description( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The description of the product, complete with HTML formatting. + """ + descriptionHtml: HTML! + + """ + A human-friendly unique string for the Product automatically generated from its title. + They are used by the Liquid templating language to refer to objects. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + List of images associated with the product. + """ + images( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductImageSortKeys = POSITION + + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): ImageConnection! + + """ + The media associated with the product. + """ + media( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductMediaSortKeys = POSITION + ): MediaConnection! + + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! + + """ + The online store URL for the product. + A value of `null` indicates that the product is not published to the Online Store sales channel. + """ + onlineStoreUrl: URL + + """ + List of product options. + """ + options( + """ + Truncate the array result to this size. + """ + first: Int + ): [ProductOption!]! + + """ + List of price ranges in the presentment currencies for this shop. + """ + presentmentPriceRanges( + """ + Specifies the presentment currencies to return a price range in. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): ProductPriceRangeConnection! + + """ + The price range. + """ + priceRange: ProductPriceRange! + + """ + A categorization that a product can be tagged with, commonly used for filtering and searching. + """ + productType: String! + + """ + The date and time when the product was published to the channel. + """ + publishedAt: DateTime! + + """ + The product's SEO information. + """ + seo: SEO! + + """ + A comma separated list of tags that have been added to the product. + Additional access scope required for private apps: unauthenticated_read_product_tags. + """ + tags: [String!]! + + """ + The product’s title. + """ + title: String! + + """ + The total quantity of inventory in stock for this Product. + """ + totalInventory: Int + + """ + The date and time when the product was last modified. + A product's `updatedAt` value can change for different reasons. For example, if an order + is placed for a product that has inventory tracking set up, then the inventory adjustment + is counted as an update. + """ + updatedAt: DateTime! + + """ + Find a product’s variant based on its selected options. + This is useful for converting a user’s selection of product options into a single matching variant. + If there is not a variant for the selected options, `null` will be returned. + """ + variantBySelectedOptions( + """ + The input fields used for a selected option. + """ + selectedOptions: [SelectedOptionInput!]! + ): ProductVariant + + """ + List of the product’s variants. + """ + variants( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductVariantSortKeys = POSITION + ): ProductVariantConnection! + + """ + The product’s vendor name. + """ + vendor: String! +} + +""" +The set of valid sort keys for the ProductCollection query. +""" +enum ProductCollectionSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `price` value. + """ + PRICE + + """ + Sort by the `best-selling` value. + """ + BEST_SELLING + + """ + Sort by the `created` value. + """ + CREATED + + """ + Sort by the `id` value. + """ + ID + + """ + Sort by the `manual` value. + """ + MANUAL + + """ + Sort by the `collection-default` value. + """ + COLLECTION_DEFAULT + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +An auto-generated type for paginating through multiple Products. +""" +type ProductConnection { + """ + A list of edges. + """ + edges: [ProductEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Product and a cursor during pagination. +""" +type ProductEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductEdge. + """ + node: Product! +} + +""" +The set of valid sort keys for the ProductImage query. +""" +enum ProductImageSortKeys { + """ + Sort by the `created_at` value. + """ + CREATED_AT + + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +The set of valid sort keys for the ProductMedia query. +""" +enum ProductMediaSortKeys { + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Product property names like "Size", "Color", and "Material" that the customers can select. +Variants are selected based on permutations of these options. +255 characters limit each. +""" +type ProductOption implements Node { + """ + Globally unique identifier. + """ + id: ID! + + """ + The product option’s name. + """ + name: String! + + """ + The corresponding value to the product option name. + """ + values: [String!]! +} + +""" +The price range of the product. +""" +type ProductPriceRange { + """ + The highest variant's price. + """ + maxVariantPrice: MoneyV2! + + """ + The lowest variant's price. + """ + minVariantPrice: MoneyV2! +} + +""" +An auto-generated type for paginating through multiple ProductPriceRanges. +""" +type ProductPriceRangeConnection { + """ + A list of edges. + """ + edges: [ProductPriceRangeEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductPriceRange and a cursor during pagination. +""" +type ProductPriceRangeEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductPriceRangeEdge. + """ + node: ProductPriceRange! +} + +""" +The set of valid sort keys for the Product query. +""" +enum ProductSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `product_type` value. + """ + PRODUCT_TYPE + + """ + Sort by the `vendor` value. + """ + VENDOR + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `created_at` value. + """ + CREATED_AT + + """ + Sort by the `best_selling` value. + """ + BEST_SELLING + + """ + Sort by the `price` value. + """ + PRICE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A product variant represents a different version of a product, such as differing sizes or differing colors. +""" +type ProductVariant implements Node & HasMetafields { + """ + Indicates if the product variant is in stock. + """ + available: Boolean @deprecated(reason: "Use `availableForSale` instead") + + """ + Indicates if the product variant is available for sale. + """ + availableForSale: Boolean! + + """ + The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPrice` is higher than `price`. + """ + compareAtPrice: Money @deprecated(reason: "Use `compareAtPriceV2` instead") + + """ + The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPriceV2` is higher than `priceV2`. + """ + compareAtPriceV2: MoneyV2 + + """ + Whether a product is out of stock but still available for purchase (used for backorders). + """ + currentlyNotInStock: Boolean! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Image associated with the product variant. This field falls back to the product image if no image is available. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! + + """ + List of prices and compare-at prices in the presentment currencies for this shop. + """ + presentmentPrices( + """ + The presentment currencies prices should return in. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): ProductVariantPricePairConnection! + + """ + List of unit prices in the presentment currencies for this shop. + """ + presentmentUnitPrices( + """ + Specify the currencies in which to return presentment unit prices. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MoneyV2Connection! + + """ + The product variant’s price. + """ + price: Money! @deprecated(reason: "Use `priceV2` instead") + + """ + The product variant’s price. + """ + priceV2: MoneyV2! + + """ + The product object that the product variant belongs to. + """ + product: Product! + + """ + The total sellable quantity of the variant for online sales channels. + """ + quantityAvailable: Int + + """ + Whether a customer needs to provide a shipping address when placing an order for the product variant. + """ + requiresShipping: Boolean! + + """ + List of product options applied to the variant. + """ + selectedOptions: [SelectedOption!]! + + """ + The SKU (stock keeping unit) associated with the variant. + """ + sku: String + + """ + The product variant’s title. + """ + title: String! + + """ + The unit price value for the variant based on the variant's measurement. + """ + unitPrice: MoneyV2 + + """ + The unit price measurement for the variant. + """ + unitPriceMeasurement: UnitPriceMeasurement + + """ + The weight of the product variant in the unit system specified with `weight_unit`. + """ + weight: Float + + """ + Unit of measurement for weight. + """ + weightUnit: WeightUnit! +} + +""" +An auto-generated type for paginating through multiple ProductVariants. +""" +type ProductVariantConnection { + """ + A list of edges. + """ + edges: [ProductVariantEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductVariant and a cursor during pagination. +""" +type ProductVariantEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductVariantEdge. + """ + node: ProductVariant! +} + +""" +The compare-at price and price of a variant sharing a currency. +""" +type ProductVariantPricePair { + """ + The compare-at price of the variant with associated currency. + """ + compareAtPrice: MoneyV2 + + """ + The price of the variant with associated currency. + """ + price: MoneyV2! +} + +""" +An auto-generated type for paginating through multiple ProductVariantPricePairs. +""" +type ProductVariantPricePairConnection { + """ + A list of edges. + """ + edges: [ProductVariantPricePairEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductVariantPricePair and a cursor during pagination. +""" +type ProductVariantPricePairEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductVariantPricePairEdge. + """ + node: ProductVariantPricePair! +} + +""" +The set of valid sort keys for the ProductVariant query. +""" +enum ProductVariantSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `sku` value. + """ + SKU + + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. +""" +type QueryRoot { + """ + List of the shop's articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! + + """ + Find a blog by its handle. + """ + blogByHandle( + """ + The handle of the blog. + """ + handle: String! + ): Blog + + """ + List of the shop's blogs. + """ + blogs( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: BlogSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): BlogConnection! + + """ + Find a collection by its handle. + """ + collectionByHandle( + """ + The handle of the collection. + """ + handle: String! + ): Collection + + """ + List of the shop’s collections. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: CollectionSortKeys = ID + + """ + Supported filter parameters: + - `collection_type` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): CollectionConnection! + + """ + Find a customer by its access token. + """ + customer( + """ + The customer access token. + """ + customerAccessToken: String! + ): Customer + + """ + Returns a specific node by ID. + """ + node( + """ + The ID of the Node to return. + """ + id: ID! + ): Node + + """ + Returns the list of nodes with the given IDs. + """ + nodes( + """ + The IDs of the Nodes to return. + """ + ids: [ID!]! + ): [Node]! + + """ + Find a page by its handle. + """ + pageByHandle( + """ + The handle of the page. + """ + handle: String! + ): Page + + """ + List of the shop's pages. + """ + pages( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: PageSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): PageConnection! + + """ + Find a product by its handle. + """ + productByHandle( + """ + The handle of the product. + """ + handle: String! + ): Product + + """ + Find recommended products related to a given `product_id`. + To learn more about how recommendations are generated, see + [*Showing product recommendations on product pages*](https://help.shopify.com/themes/development/recommended-products). + """ + productRecommendations( + """ + The id of the product. + """ + productId: ID! + ): [Product!] + + """ + Tags added to products. + Additional access scope required: unauthenticated_read_product_tags. + """ + productTags( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + + """ + List of product types for the shop's products that are published to your app. + """ + productTypes( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + + """ + List of the shop’s products. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductSortKeys = ID + + """ + Supported filter parameters: + - `available_for_sale` + - `created_at` + - `product_type` + - `tag` + - `title` + - `updated_at` + - `variants.price` + - `vendor` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ProductConnection! + + """ + The list of public Storefront API versions, including supported, release candidate and unstable versions. + """ + publicApiVersions: [ApiVersion!]! + + """ + The shop associated with the storefront access token. + """ + shop: Shop! +} + +""" +SEO information. +""" +type SEO { + """ + The meta description. + """ + description: String + + """ + The SEO title. + """ + title: String +} + +""" +Script discount applications capture the intentions of a discount that +was created by a Shopify Script. +""" +type ScriptDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + The description of the application as defined by the Script. + """ + description: String! @deprecated(reason: "Use `title` instead") + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application as defined by the Script. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Properties used by customers to select a product variant. +Products can have multiple options, like different sizes or colors. +""" +type SelectedOption { + """ + The product option’s name. + """ + name: String! + + """ + The product option’s value. + """ + value: String! +} + +""" +Specifies the input fields required for a selected option. +""" +input SelectedOptionInput { + """ + The product option’s name. + """ + name: String! + + """ + The product option’s value. + """ + value: String! +} + +""" +A shipping rate to be applied to a checkout. +""" +type ShippingRate { + """ + Human-readable unique identifier for this shipping rate. + """ + handle: String! + + """ + Price of this shipping rate. + """ + price: Money! @deprecated(reason: "Use `priceV2` instead") + + """ + Price of this shipping rate. + """ + priceV2: MoneyV2! + + """ + Title of this shipping rate. + """ + title: String! +} + +""" +Shop represents a collection of the general settings and information about the shop. +""" +type Shop { + """ + List of the shop' articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! @deprecated(reason: "Use `QueryRoot.articles` instead.") + + """ + List of the shop' blogs. + """ + blogs( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: BlogSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): BlogConnection! @deprecated(reason: "Use `QueryRoot.blogs` instead.") + + """ + Find a collection by its handle. + """ + collectionByHandle( + """ + The handle of the collection. + """ + handle: String! + ): Collection + @deprecated(reason: "Use `QueryRoot.collectionByHandle` instead.") + + """ + List of the shop’s collections. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: CollectionSortKeys = ID + + """ + Supported filter parameters: + - `collection_type` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): CollectionConnection! + @deprecated(reason: "Use `QueryRoot.collections` instead.") + + """ + The three-letter code for the currency that the shop accepts. + """ + currencyCode: CurrencyCode! + @deprecated(reason: "Use `paymentSettings` instead") + + """ + A description of the shop. + """ + description: String + + """ + A string representing the way currency is formatted when the currency isn’t specified. + """ + moneyFormat: String! + + """ + The shop’s name. + """ + name: String! + + """ + Settings related to payments. + """ + paymentSettings: PaymentSettings! + + """ + The shop’s primary domain. + """ + primaryDomain: Domain! + + """ + The shop’s privacy policy. + """ + privacyPolicy: ShopPolicy + + """ + Find a product by its handle. + """ + productByHandle( + """ + The handle of the product. + """ + handle: String! + ): Product @deprecated(reason: "Use `QueryRoot.productByHandle` instead.") + + """ + A list of tags that have been added to products. + Additional access scope required: unauthenticated_read_product_tags. + """ + productTags( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + @deprecated(reason: "Use `QueryRoot.productTags` instead.") + + """ + List of the shop’s product types. + """ + productTypes( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + @deprecated(reason: "Use `QueryRoot.productTypes` instead.") + + """ + List of the shop’s products. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductSortKeys = ID + + """ + Supported filter parameters: + - `available_for_sale` + - `created_at` + - `product_type` + - `tag` + - `title` + - `updated_at` + - `variants.price` + - `vendor` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ProductConnection! @deprecated(reason: "Use `QueryRoot.products` instead.") + + """ + The shop’s refund policy. + """ + refundPolicy: ShopPolicy + + """ + The shop’s shipping policy. + """ + shippingPolicy: ShopPolicy + + """ + Countries that the shop ships to. + """ + shipsToCountries: [CountryCode!]! + + """ + The shop’s Shopify Payments account id. + """ + shopifyPaymentsAccountId: String + @deprecated(reason: "Use `paymentSettings` instead") + + """ + The shop’s terms of service. + """ + termsOfService: ShopPolicy +} + +""" +Policy that a merchant has configured for their store, such as their refund or privacy policy. +""" +type ShopPolicy implements Node { + """ + Policy text, maximum size of 64kb. + """ + body: String! + + """ + Policy’s handle. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Policy’s title. + """ + title: String! + + """ + Public URL to the policy. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Strings. +""" +type StringConnection { + """ + A list of edges. + """ + edges: [StringEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one String and a cursor during pagination. +""" +type StringEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of StringEdge. + """ + node: String! +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInput { + """ + The amount of the payment. + """ + amount: Money! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The type of payment token. + """ + type: String! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInputV2 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String + + """ + The type of payment token. + """ + type: String! +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInputV3 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. For more information, refer to [Idempotent requests](https://shopify.dev/concepts/about-apis/idempotent-requests). + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String + + """ + The type of payment token. + """ + type: PaymentTokenType! +} + +""" +An object representing exchange of money for a product or service. +""" +type Transaction { + """ + The amount of money that the transaction was for. + """ + amount: Money! @deprecated(reason: "Use `amountV2` instead") + + """ + The amount of money that the transaction was for. + """ + amountV2: MoneyV2! + + """ + The kind of the transaction. + """ + kind: TransactionKind! + + """ + The status of the transaction. + """ + status: TransactionStatus! @deprecated(reason: "Use `statusV2` instead") + + """ + The status of the transaction. + """ + statusV2: TransactionStatus + + """ + Whether the transaction was done in test mode or not. + """ + test: Boolean! +} + +""" +The different kinds of order transactions. +""" +enum TransactionKind { + """ + An authorization and capture performed together in a single step. + """ + SALE + + """ + A transfer of the money that was reserved during the authorization stage. + """ + CAPTURE + + """ + An amount reserved against the cardholder's funding source. + Money does not change hands until the authorization is captured. + """ + AUTHORIZATION + + """ + An authorization for a payment taken with an EMV credit card reader. + """ + EMV_AUTHORIZATION + + """ + Money returned to the customer when they have paid too much. + """ + CHANGE +} + +""" +Transaction statuses describe the status of a transaction. +""" +enum TransactionStatus { + """ + The transaction is pending. + """ + PENDING + + """ + The transaction succeeded. + """ + SUCCESS + + """ + The transaction failed. + """ + FAILURE + + """ + There was an error while processing the transaction. + """ + ERROR +} + +""" +An RFC 3986 and RFC 3987 compliant URI string. + +Example value: `"https://johns-apparel.myshopify.com"`. +""" +scalar URL + +""" +The measurement used to calculate a unit price for a product variant (e.g. $9.99 / 100ml). +""" +type UnitPriceMeasurement { + """ + The type of unit of measurement for the unit price measurement. + """ + measuredType: UnitPriceMeasurementMeasuredType + + """ + The quantity unit for the unit price measurement. + """ + quantityUnit: UnitPriceMeasurementMeasuredUnit + + """ + The quantity value for the unit price measurement. + """ + quantityValue: Float! + + """ + The reference unit for the unit price measurement. + """ + referenceUnit: UnitPriceMeasurementMeasuredUnit + + """ + The reference value for the unit price measurement. + """ + referenceValue: Int! +} + +""" +The accepted types of unit of measurement. +""" +enum UnitPriceMeasurementMeasuredType { + """ + Unit of measurements representing volumes. + """ + VOLUME + + """ + Unit of measurements representing weights. + """ + WEIGHT + + """ + Unit of measurements representing lengths. + """ + LENGTH + + """ + Unit of measurements representing areas. + """ + AREA +} + +""" +The valid units of measurement for a unit price measurement. +""" +enum UnitPriceMeasurementMeasuredUnit { + """ + 1000 milliliters equals 1 liter. + """ + ML + + """ + 100 centiliters equals 1 liter. + """ + CL + + """ + Metric system unit of volume. + """ + L + + """ + 1 cubic meter equals 1000 liters. + """ + M3 + + """ + 1000 milligrams equals 1 gram. + """ + MG + + """ + Metric system unit of weight. + """ + G + + """ + 1 kilogram equals 1000 grams. + """ + KG + + """ + 1000 millimeters equals 1 meter. + """ + MM + + """ + 100 centimeters equals 1 meter. + """ + CM + + """ + Metric system unit of length. + """ + M + + """ + Metric system unit of area. + """ + M2 +} + +""" +Represents an error in the input of a mutation. +""" +type UserError implements DisplayableError { + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +Represents a Shopify hosted video. +""" +type Video implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image + + """ + The sources for a video. + """ + sources: [VideoSource!]! +} + +""" +Represents a source for a Shopify hosted video. +""" +type VideoSource { + """ + The format of the video source. + """ + format: String! + + """ + The height of the video. + """ + height: Int! + + """ + The video MIME type. + """ + mimeType: String! + + """ + The URL of the video. + """ + url: String! + + """ + The width of the video. + """ + width: Int! +} + +""" +Units of measurement for weight. +""" +enum WeightUnit { + """ + 1 kilogram equals 1000 grams. + """ + KILOGRAMS + + """ + Metric system unit of mass. + """ + GRAMS + + """ + 1 pound equals 16 ounces. + """ + POUNDS + + """ + Imperial system unit of mass. + """ + OUNCES +} diff --git a/packages/shopify/src/api/endpoints/cart.ts b/packages/shopify/src/api/endpoints/cart.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/cart.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/catalog/products.ts b/packages/shopify/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/checkout/get-checkout.ts b/packages/shopify/src/api/endpoints/checkout/get-checkout.ts new file mode 100644 index 0000000..1889150 --- /dev/null +++ b/packages/shopify/src/api/endpoints/checkout/get-checkout.ts @@ -0,0 +1,38 @@ +import { + SHOPIFY_CHECKOUT_ID_COOKIE, + SHOPIFY_CHECKOUT_URL_COOKIE, + SHOPIFY_CUSTOMER_TOKEN_COOKIE, +} from '../../../const' +import associateCustomerWithCheckoutMutation from '../../../utils/mutations/associate-customer-with-checkout' +import type { CheckoutEndpoint } from '.' + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ + req, + res, + config, +}) => { + const { cookies } = req + const checkoutUrl = cookies[SHOPIFY_CHECKOUT_URL_COOKIE] + const customerCookie = cookies[SHOPIFY_CUSTOMER_TOKEN_COOKIE] + + if (customerCookie) { + try { + await config.fetch(associateCustomerWithCheckoutMutation, { + variables: { + checkoutId: cookies[SHOPIFY_CHECKOUT_ID_COOKIE], + customerAccessToken: cookies[SHOPIFY_CUSTOMER_TOKEN_COOKIE], + }, + }) + } catch (error) { + console.error(error) + } + } + + if (checkoutUrl) { + res.redirect(checkoutUrl) + } else { + res.redirect('/cart') + } +} + +export default getCheckout diff --git a/packages/shopify/src/api/endpoints/checkout/index.ts b/packages/shopify/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..6402081 --- /dev/null +++ b/packages/shopify/src/api/endpoints/checkout/index.ts @@ -0,0 +1,18 @@ +import { GetAPISchema, createEndpoint } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' +import type { CheckoutSchema } from '../../../types/checkout' +import type { ShopifyAPI } from '../..' +import getCheckout from './get-checkout' + +export type CheckoutAPI = GetAPISchema + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/shopify/src/api/endpoints/customer/address.ts b/packages/shopify/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/shopify/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/customer/card.ts b/packages/shopify/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/shopify/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/customer/index.ts b/packages/shopify/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/shopify/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/shopify/src/api/endpoints/login.ts b/packages/shopify/src/api/endpoints/login.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/login.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/logout.ts b/packages/shopify/src/api/endpoints/logout.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/logout.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/signup.ts b/packages/shopify/src/api/endpoints/signup.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/signup.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/endpoints/wishlist.ts b/packages/shopify/src/api/endpoints/wishlist.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/shopify/src/api/endpoints/wishlist.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/shopify/src/api/index.ts b/packages/shopify/src/api/index.ts new file mode 100644 index 0000000..7ae6a42 --- /dev/null +++ b/packages/shopify/src/api/index.ts @@ -0,0 +1,55 @@ +import { + CommerceAPI, + CommerceAPIConfig, + getCommerceApi as commerceApi, +} from '@vercel/commerce/api' + +import { + API_URL, + API_TOKEN, + SHOPIFY_CUSTOMER_TOKEN_COOKIE, + SHOPIFY_CHECKOUT_ID_COOKIE, +} from '../const' + +import fetchGraphqlApi from './utils/fetch-graphql-api' + +import * as operations from './operations' + +if (!API_URL) { + throw new Error( + `The environment variable NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN is missing and it's required to access your store` + ) +} + +if (!API_TOKEN) { + throw new Error( + `The environment variable NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN is missing and it's required to access your store` + ) +} +export interface ShopifyConfig extends CommerceAPIConfig {} + +const ONE_DAY = 60 * 60 * 24 + +const config: ShopifyConfig = { + commerceUrl: API_URL, + apiToken: API_TOKEN, + customerCookie: SHOPIFY_CUSTOMER_TOKEN_COOKIE, + cartCookie: SHOPIFY_CHECKOUT_ID_COOKIE, + cartCookieMaxAge: ONE_DAY * 30, + fetch: fetchGraphqlApi, +} + +export const provider = { + config, + operations, +} + +export type Provider = typeof provider + +export type ShopifyAPI

= CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): ShopifyAPI

{ + return commerceApi(customProvider) +} diff --git a/packages/shopify/src/api/operations/get-all-pages.ts b/packages/shopify/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..2f6cc09 --- /dev/null +++ b/packages/shopify/src/api/operations/get-all-pages.ts @@ -0,0 +1,71 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { + GetAllPagesQuery, + GetAllPagesQueryVariables, + PageEdge, +} from '../../../schema' +import { normalizePages } from '../../utils' +import type { ShopifyConfig, Provider } from '..' +import type { GetAllPagesOperation, Page } from '../../types/page' +import getAllPagesQuery from '../../utils/queries/get-all-pages-query' + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllPages({ + query = getAllPagesQuery, + config, + variables, + }: { + url?: string + config?: Partial + variables?: GetAllPagesQueryVariables + preview?: boolean + query?: string + } = {}): Promise { + const { + fetch, + locale, + locales = ['en-US', 'es'], + } = commerce.getConfig(config) + + const { data } = await fetch( + query, + { + variables, + }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return { + pages: locales.reduce( + (arr, locale) => + arr.concat(normalizePages(data.pages.edges as PageEdge[], locale)), + [] + ), + } + } + + return getAllPages +} diff --git a/packages/shopify/src/api/operations/get-all-product-paths.ts b/packages/shopify/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..e5a7d2d --- /dev/null +++ b/packages/shopify/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,55 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetAllProductPathsOperation } from '../../types/product' +import { + GetAllProductPathsQuery, + GetAllProductPathsQueryVariables, + ProductEdge, +} from '../../../schema' +import type { ShopifyConfig, Provider } from '..' +import { getAllProductsQuery } from '../../utils' + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: ShopifyConfig + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: ShopifyConfig + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + query = getAllProductsQuery, + config, + variables, + }: { + query?: string + config?: ShopifyConfig + variables?: T['variables'] + } = {}): Promise { + config = commerce.getConfig(config) + + const { data } = await config.fetch< + GetAllProductPathsQuery, + GetAllProductPathsQueryVariables + >(query, { variables }) + + return { + products: data.products.edges.map(({ node: { handle } }) => ({ + path: `/${handle}`, + })), + } + } + + return getAllProductPaths +} diff --git a/packages/shopify/src/api/operations/get-all-products.ts b/packages/shopify/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..003e272 --- /dev/null +++ b/packages/shopify/src/api/operations/get-all-products.ts @@ -0,0 +1,67 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetAllProductsOperation } from '../../types/product' +import { + GetAllProductsQuery, + GetAllProductsQueryVariables, + Product as ShopifyProduct, +} from '../../../schema' +import type { ShopifyConfig, Provider } from '..' +import getAllProductsQuery from '../../utils/queries/get-all-products-query' +import { normalizeProduct } from '../../utils' + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getAllProducts( + opts: { + variables?: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllProducts({ + query = getAllProductsQuery, + variables, + config, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + } = {}): Promise { + const { fetch, locale } = commerce.getConfig(config) + + const { data } = await fetch< + GetAllProductsQuery, + GetAllProductsQueryVariables + >( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return { + products: data.products.edges.map(({ node }) => + normalizeProduct(node as ShopifyProduct) + ), + } + } + + return getAllProducts +} diff --git a/packages/shopify/src/api/operations/get-page.ts b/packages/shopify/src/api/operations/get-page.ts new file mode 100644 index 0000000..2cea521 --- /dev/null +++ b/packages/shopify/src/api/operations/get-page.ts @@ -0,0 +1,64 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { normalizePage } from '../../utils' +import type { ShopifyConfig, Provider } from '..' +import { + GetPageQuery, + GetPageQueryVariables, + Page as ShopifyPage, +} from '../../../schema' +import { GetPageOperation } from '../../types/page' +import getPageQuery from '../../utils/queries/get-page-query' + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getPage( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getPage({ + query = getPageQuery, + variables, + config, + }: { + query?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + const { fetch, locale } = commerce.getConfig(config) + + const { + data: { node: page }, + } = await fetch( + query, + { + variables, + }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return page ? { page: normalizePage(page as ShopifyPage, locale) } : {} + } + + return getPage +} diff --git a/packages/shopify/src/api/operations/get-product.ts b/packages/shopify/src/api/operations/get-product.ts new file mode 100644 index 0000000..1697b0f --- /dev/null +++ b/packages/shopify/src/api/operations/get-product.ts @@ -0,0 +1,66 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetProductOperation } from '../../types/product' +import { normalizeProduct, getProductQuery } from '../../utils' +import type { ShopifyConfig, Provider } from '..' +import { + GetProductBySlugQuery, + Product as ShopifyProduct, +} from '../../../schema' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getProduct( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getProduct({ + query = getProductQuery, + variables, + config: cfg, + }: { + query?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + const { fetch, locale } = commerce.getConfig(cfg) + + const { + data: { productByHandle }, + } = await fetch( + query, + { + variables, + }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return { + ...(productByHandle && { + product: normalizeProduct(productByHandle as ShopifyProduct), + }), + } + } + + return getProduct +} diff --git a/packages/shopify/src/api/operations/get-site-info.ts b/packages/shopify/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..6bb6de4 --- /dev/null +++ b/packages/shopify/src/api/operations/get-site-info.ts @@ -0,0 +1,62 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetSiteInfoQueryVariables } from '../../../schema' +import type { ShopifyConfig, Provider } from '..' +import { GetSiteInfoOperation } from '../../types/site' + +import { getCategories, getBrands, getSiteInfoQuery } from '../../utils' + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getSiteInfo( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getSiteInfo({ + query = getSiteInfoQuery, + config, + variables, + }: { + query?: string + config?: Partial + preview?: boolean + variables?: GetSiteInfoQueryVariables + } = {}): Promise { + const cfg = commerce.getConfig(config) + + const categoriesPromise = getCategories(cfg) + const brandsPromise = getBrands(cfg) + /* + const { fetch, locale } = cfg + const { data } = await fetch( + query, + { variables }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + */ + + return { + categories: await categoriesPromise, + brands: await brandsPromise, + } + } + + return getSiteInfo +} diff --git a/packages/shopify/src/api/operations/index.ts b/packages/shopify/src/api/operations/index.ts new file mode 100644 index 0000000..7872a20 --- /dev/null +++ b/packages/shopify/src/api/operations/index.ts @@ -0,0 +1,7 @@ +export { default as getAllPages } from './get-all-pages' +export { default as getPage } from './get-page' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' +export { default as getProduct } from './get-product' +export { default as getSiteInfo } from './get-site-info' +export { default as login } from './login' diff --git a/packages/shopify/src/api/operations/login.ts b/packages/shopify/src/api/operations/login.ts new file mode 100644 index 0000000..5fad769 --- /dev/null +++ b/packages/shopify/src/api/operations/login.ts @@ -0,0 +1,48 @@ +import type { ServerResponse } from 'http' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { LoginOperation } from '../../types/login' +import type { ShopifyConfig, Provider } from '..' +import { + customerAccessTokenCreateMutation, + setCustomerToken, + throwUserErrors, +} from '../../utils' +import { CustomerAccessTokenCreateMutation } from '../../../schema' + +export default function loginOperation({ + commerce, +}: OperationContext) { + async function login({ + query = customerAccessTokenCreateMutation, + variables, + config, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: ShopifyConfig + }): Promise { + config = commerce.getConfig(config) + + const { + data: { customerAccessTokenCreate }, + } = await config.fetch(query, { + variables, + }) + + throwUserErrors(customerAccessTokenCreate?.customerUserErrors) + + const customerAccessToken = customerAccessTokenCreate?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return { + result: customerAccessToken?.accessToken, + } + } + + return login +} diff --git a/packages/shopify/src/api/utils/fetch-graphql-api.ts b/packages/shopify/src/api/utils/fetch-graphql-api.ts new file mode 100644 index 0000000..1970db5 --- /dev/null +++ b/packages/shopify/src/api/utils/fetch-graphql-api.ts @@ -0,0 +1,45 @@ +import type { GraphQLFetcher } from '@vercel/commerce/api' +import fetch from './fetch' + +import { API_URL, API_TOKEN } from '../../const' +import { getError } from '../../utils/handle-fetch-response' + +const fetchGraphqlApi: GraphQLFetcher = async ( + query: string, + { variables } = {}, + fetchOptions +) => { + try { + const res = await fetch(API_URL, { + ...fetchOptions, + method: 'POST', + headers: { + 'X-Shopify-Storefront-Access-Token': API_TOKEN!, + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const { data, errors, status } = await res.json() + + if (errors) { + throw getError(errors, status) + } + + return { data, res } + } catch (err) { + throw getError( + [ + { + message: `${err} \n Most likely related to an unexpected output. e.g the store might be protected with password or not available.`, + }, + ], + 500 + ) + } +} +export default fetchGraphqlApi diff --git a/packages/shopify/src/api/utils/fetch.ts b/packages/shopify/src/api/utils/fetch.ts new file mode 100644 index 0000000..0b83671 --- /dev/null +++ b/packages/shopify/src/api/utils/fetch.ts @@ -0,0 +1,2 @@ +import zeitFetch from '@vercel/fetch' +export default zeitFetch() diff --git a/packages/shopify/src/auth/use-login.tsx b/packages/shopify/src/auth/use-login.tsx new file mode 100644 index 0000000..c9d183e --- /dev/null +++ b/packages/shopify/src/auth/use-login.tsx @@ -0,0 +1,63 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import type { LoginHook } from '../types/login' +import useCustomer from '../customer/use-customer' + +import { + setCustomerToken, + throwUserErrors, + customerAccessTokenCreateMutation, +} from '../utils' +import { Mutation, MutationCustomerAccessTokenCreateArgs } from '../../schema' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: customerAccessTokenCreateMutation, + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'An email and password are required to login', + }) + } + + const { customerAccessTokenCreate } = await fetch< + Mutation, + MutationCustomerAccessTokenCreateArgs + >({ + ...options, + variables: { + input: { email, password }, + }, + }) + + throwUserErrors(customerAccessTokenCreate?.customerUserErrors) + + const customerAccessToken = customerAccessTokenCreate?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/shopify/src/auth/use-logout.tsx b/packages/shopify/src/auth/use-logout.tsx new file mode 100644 index 0000000..c37b0fc --- /dev/null +++ b/packages/shopify/src/auth/use-logout.tsx @@ -0,0 +1,39 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import type { LogoutHook } from '../types/logout' +import useCustomer from '../customer/use-customer' +import customerAccessTokenDeleteMutation from '../utils/mutations/customer-access-token-delete' +import { getCustomerToken, setCustomerToken } from '../utils/customer-token' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: customerAccessTokenDeleteMutation, + }, + async fetcher({ options, fetch }) { + await fetch({ + ...options, + variables: { + customerAccessToken: getCustomerToken(), + }, + }) + setCustomerToken(null) + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/shopify/src/auth/use-signup.tsx b/packages/shopify/src/auth/use-signup.tsx new file mode 100644 index 0000000..8af0fec --- /dev/null +++ b/packages/shopify/src/auth/use-signup.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import type { SignupHook } from '../types/signup' +import useCustomer from '../customer/use-customer' +import { Mutation, MutationCustomerCreateArgs } from '../../schema' + +import { + handleAutomaticLogin, + throwUserErrors, + customerCreateMutation, +} from '../utils' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: customerCreateMutation, + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } + + const { customerCreate } = await fetch< + Mutation, + MutationCustomerCreateArgs + >({ + ...options, + variables: { + input: { + firstName, + lastName, + email, + password, + }, + }, + }) + + throwUserErrors(customerCreate?.customerUserErrors) + await handleAutomaticLogin(fetch, { email, password }) + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/shopify/src/cart/index.ts b/packages/shopify/src/cart/index.ts new file mode 100644 index 0000000..f6d36b4 --- /dev/null +++ b/packages/shopify/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useUpdateItem } from './use-update-item' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/shopify/src/cart/use-add-item.tsx b/packages/shopify/src/cart/use-add-item.tsx new file mode 100644 index 0000000..5460bd7 --- /dev/null +++ b/packages/shopify/src/cart/use-add-item.tsx @@ -0,0 +1,70 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { AddItemHook } from '../types/cart' +import useCart from './use-cart' + +import { + checkoutLineItemAddMutation, + getCheckoutId, + checkoutToCart, + checkoutCreate, +} from '../utils' +import { Mutation, MutationCheckoutLineItemsAddArgs } from '../../schema' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: checkoutLineItemAddMutation, + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const lineItems = [ + { + variantId: item.variantId, + quantity: item.quantity ?? 1, + }, + ] + + let checkoutId = getCheckoutId() + + if (!checkoutId) { + return checkoutToCart(await checkoutCreate(fetch, lineItems)) + } else { + const { checkoutLineItemsAdd } = await fetch< + Mutation, + MutationCheckoutLineItemsAddArgs + >({ + ...options, + variables: { + checkoutId, + lineItems, + }, + }) + return checkoutToCart(checkoutLineItemsAdd) + } + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/shopify/src/cart/use-cart.tsx b/packages/shopify/src/cart/use-cart.tsx new file mode 100644 index 0000000..2fe68be --- /dev/null +++ b/packages/shopify/src/cart/use-cart.tsx @@ -0,0 +1,60 @@ +import { useMemo } from 'react' +import useCommerceCart, { UseCart } from '@vercel/commerce/cart/use-cart' + +import { SWRHook } from '@vercel/commerce/utils/types' +import { checkoutToCart } from '../utils' +import getCheckoutQuery from '../utils/queries/get-checkout-query' +import { GetCartHook } from '../types/cart' +import Cookies from 'js-cookie' + +import { + SHOPIFY_CHECKOUT_ID_COOKIE, + SHOPIFY_CHECKOUT_URL_COOKIE, +} from '../const' + +export default useCommerceCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: getCheckoutQuery, + }, + async fetcher({ input: { cartId }, options, fetch }) { + if (cartId) { + const { node: checkout } = await fetch({ + ...options, + variables: { + checkoutId: cartId, + }, + }) + if (checkout?.completedAt) { + Cookies.remove(SHOPIFY_CHECKOUT_ID_COOKIE) + Cookies.remove(SHOPIFY_CHECKOUT_URL_COOKIE) + return null + } else { + return checkoutToCart({ + checkout, + }) + } + } + return null + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/shopify/src/cart/use-remove-item.tsx b/packages/shopify/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..d04c7c5 --- /dev/null +++ b/packages/shopify/src/cart/use-remove-item.tsx @@ -0,0 +1,67 @@ +import { useCallback } from 'react' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' +import type { Cart, LineItem, RemoveItemHook } from '../types/cart' +import useCart from './use-cart' + +export type RemoveItemFn = T extends LineItem + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends LineItem + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +import { + checkoutLineItemRemoveMutation, + getCheckoutId, + checkoutToCart, +} from '../utils' + +import { Mutation, MutationCheckoutLineItemsRemoveArgs } from '../../schema' + +export const handler = { + fetchOptions: { + query: checkoutLineItemRemoveMutation, + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + const data = await fetch({ + ...options, + variables: { checkoutId: getCheckoutId(), lineItemIds: [itemId] }, + }) + return checkoutToCart(data.checkoutLineItemsRemove) + }, + useHook: + ({ fetch }: MutationHookContext) => + (ctx: { item?: T } = {}) => { + const { item } = ctx + const { mutate } = useCart() + const removeItem: RemoveItemFn = async (input) => { + const itemId = input?.id ?? item?.id + + if (!itemId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ input: { itemId } }) + await mutate(data, false) + return data + } + + return useCallback(removeItem as RemoveItemFn, [fetch, mutate]) + }, +} diff --git a/packages/shopify/src/cart/use-update-item.tsx b/packages/shopify/src/cart/use-update-item.tsx new file mode 100644 index 0000000..0e8258a --- /dev/null +++ b/packages/shopify/src/cart/use-update-item.tsx @@ -0,0 +1,107 @@ +import { useCallback } from 'react' +import debounce from 'lodash.debounce' +import type { + HookFetcherContext, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' + +import useCart from './use-cart' +import { handler as removeItemHandler } from './use-remove-item' +import type { UpdateItemHook, LineItem } from '../types/cart' +import { + getCheckoutId, + checkoutLineItemUpdateMutation, + checkoutToCart, +} from '../utils' +import { Mutation, MutationCheckoutLineItemsUpdateArgs } from '../../schema' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler = { + fetchOptions: { + query: checkoutLineItemUpdateMutation, + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + const { checkoutLineItemsUpdate } = await fetch< + Mutation, + MutationCheckoutLineItemsUpdateArgs + >({ + ...options, + variables: { + checkoutId: getCheckoutId(), + lineItems: [ + { + id: itemId, + quantity: item.quantity, + }, + ], + }, + }) + + return checkoutToCart(checkoutLineItemsUpdate) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const itemId = input.id ?? item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + item: { + productId, + variantId, + quantity: input.quantity, + }, + itemId, + }, + }) + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/shopify/src/checkout/use-checkout.tsx b/packages/shopify/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..76997be --- /dev/null +++ b/packages/shopify/src/checkout/use-checkout.tsx @@ -0,0 +1,16 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/shopify/src/commerce.config.json b/packages/shopify/src/commerce.config.json new file mode 100644 index 0000000..b194b62 --- /dev/null +++ b/packages/shopify/src/commerce.config.json @@ -0,0 +1,7 @@ +{ + "provider": "shopify", + "features": { + "wishlist": false, + "customerAuth": true + } +} diff --git a/packages/shopify/src/const.ts b/packages/shopify/src/const.ts new file mode 100644 index 0000000..a8ee705 --- /dev/null +++ b/packages/shopify/src/const.ts @@ -0,0 +1,13 @@ +export const SHOPIFY_CHECKOUT_ID_COOKIE = 'shopify_checkoutId' + +export const SHOPIFY_CHECKOUT_URL_COOKIE = 'shopify_checkoutUrl' + +export const SHOPIFY_CUSTOMER_TOKEN_COOKIE = 'shopify_customerToken' + +export const STORE_DOMAIN = process.env.NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN + +export const SHOPIFY_COOKIE_EXPIRE = 30 + +export const API_URL = `https://${STORE_DOMAIN}/api/2021-07/graphql.json` + +export const API_TOKEN = process.env.NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN diff --git a/packages/shopify/src/customer/address/use-add-item.tsx b/packages/shopify/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..4f85c84 --- /dev/null +++ b/packages/shopify/src/customer/address/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/shopify/src/customer/card/use-add-item.tsx b/packages/shopify/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..77d149e --- /dev/null +++ b/packages/shopify/src/customer/card/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/shopify/src/customer/index.ts b/packages/shopify/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/shopify/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/shopify/src/customer/use-customer.tsx b/packages/shopify/src/customer/use-customer.tsx new file mode 100644 index 0000000..6fc9a53 --- /dev/null +++ b/packages/shopify/src/customer/use-customer.tsx @@ -0,0 +1,36 @@ +import useCustomer, { + UseCustomer, +} from '@vercel/commerce/customer/use-customer' +import type { CustomerHook } from '../types/customer' +import { SWRHook } from '@vercel/commerce/utils/types' +import { getCustomerQuery, getCustomerToken } from '../utils' +import { GetCustomerQuery, GetCustomerQueryVariables } from '../../schema' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + query: getCustomerQuery, + }, + async fetcher({ options, fetch }) { + const customerAccessToken = getCustomerToken() + if (customerAccessToken) { + const data = await fetch({ + ...options, + variables: { customerAccessToken: getCustomerToken() }, + }) + return data.customer + } + return null + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/shopify/src/fetcher.ts b/packages/shopify/src/fetcher.ts new file mode 100644 index 0000000..64f4926 --- /dev/null +++ b/packages/shopify/src/fetcher.ts @@ -0,0 +1,27 @@ +import { Fetcher } from '@vercel/commerce/utils/types' +import { API_TOKEN, API_URL } from './const' +import { handleFetchResponse } from './utils' + +const fetcher: Fetcher = async ({ + url = API_URL, + method = 'POST', + variables, + query, +}) => { + const { locale, ...vars } = variables ?? {} + return handleFetchResponse( + await fetch(url, { + method, + body: JSON.stringify({ query, variables: vars }), + headers: { + 'X-Shopify-Storefront-Access-Token': API_TOKEN!, + 'Content-Type': 'application/json', + ...(locale && { + 'Accept-Language': locale, + }), + }, + }) + ) +} + +export default fetcher diff --git a/packages/shopify/src/index.tsx b/packages/shopify/src/index.tsx new file mode 100644 index 0000000..51199bb --- /dev/null +++ b/packages/shopify/src/index.tsx @@ -0,0 +1,12 @@ +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { shopifyProvider, ShopifyProvider } from './provider' + +export { shopifyProvider } +export type { ShopifyProvider } + +export const CommerceProvider = getCommerceProvider(shopifyProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/shopify/src/next.config.cjs b/packages/shopify/src/next.config.cjs new file mode 100644 index 0000000..e9d48c0 --- /dev/null +++ b/packages/shopify/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['cdn.shopify.com'], + }, +} diff --git a/packages/shopify/src/product/use-price.tsx b/packages/shopify/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/shopify/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/shopify/src/product/use-search.tsx b/packages/shopify/src/product/use-search.tsx new file mode 100644 index 0000000..582423e --- /dev/null +++ b/packages/shopify/src/product/use-search.tsx @@ -0,0 +1,91 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' + +import { + CollectionEdge, + GetAllProductsQuery, + GetProductsFromCollectionQueryVariables, + Product as ShopifyProduct, + ProductEdge, +} from '../../schema' + +import { + getAllProductsQuery, + getCollectionProductsQuery, + getSearchVariables, + normalizeProduct, +} from '../utils' + +import type { SearchProductsHook } from '../types/product' + +export type SearchProductsInput = { + search?: string + categoryId?: number + brandId?: number + sort?: string + locale?: string +} + +export default useSearch as UseSearch + +export const handler: SWRHook = { + fetchOptions: { + query: getAllProductsQuery, + }, + async fetcher({ input, options, fetch }) { + const { categoryId, brandId } = input + const method = options?.method + const variables = getSearchVariables(input) + let products + + // change the query to getCollectionProductsQuery when categoryId is set + if (categoryId) { + const data = await fetch< + CollectionEdge, + GetProductsFromCollectionQueryVariables + >({ + query: getCollectionProductsQuery, + method, + variables, + }) + // filter on client when brandId & categoryId are set since is not available on collection product query + products = brandId + ? data.node?.products?.edges?.filter( + ({ node: { vendor } }: ProductEdge) => + vendor.replace(/\s+/g, '-').toLowerCase() === brandId + ) + : data.node?.products?.edges + } else { + const data = await fetch({ + query: options.query, + method, + variables, + }) + products = data.products?.edges + } + + return { + products: products?.map(({ node }) => + normalizeProduct(node as ShopifyProduct) + ), + found: !!products?.length, + } + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ['locale', input.locale], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/shopify/src/provider.ts b/packages/shopify/src/provider.ts new file mode 100644 index 0000000..00db5c1 --- /dev/null +++ b/packages/shopify/src/provider.ts @@ -0,0 +1,27 @@ +import { SHOPIFY_CHECKOUT_ID_COOKIE } from './const' + +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import fetcher from './fetcher' + +export const shopifyProvider = { + locale: 'en-us', + cartCookie: SHOPIFY_CHECKOUT_ID_COOKIE, + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type ShopifyProvider = typeof shopifyProvider diff --git a/packages/shopify/src/types/cart.ts b/packages/shopify/src/types/cart.ts new file mode 100644 index 0000000..243d369 --- /dev/null +++ b/packages/shopify/src/types/cart.ts @@ -0,0 +1,32 @@ +import * as Core from '@vercel/commerce/types/cart' + +export * from '@vercel/commerce/types/cart' + +export type ShopifyCart = {} + +/** + * Extend core cart types + */ + +export type Cart = Core.Cart & { + lineItems: Core.LineItem[] + url?: string +} + +export type CartTypes = Core.CartTypes + +export type CartHooks = Core.CartHooks + +export type GetCartHook = CartHooks['getCart'] +export type AddItemHook = CartHooks['addItem'] +export type UpdateItemHook = CartHooks['updateItem'] +export type RemoveItemHook = CartHooks['removeItem'] + +export type CartSchema = Core.CartSchema + +export type CartHandlers = Core.CartHandlers + +export type GetCartHandler = CartHandlers['getCart'] +export type AddItemHandler = CartHandlers['addItem'] +export type UpdateItemHandler = CartHandlers['updateItem'] +export type RemoveItemHandler = CartHandlers['removeItem'] diff --git a/packages/shopify/src/types/checkout.ts b/packages/shopify/src/types/checkout.ts new file mode 100644 index 0000000..d139db6 --- /dev/null +++ b/packages/shopify/src/types/checkout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/checkout' diff --git a/packages/shopify/src/types/common.ts b/packages/shopify/src/types/common.ts new file mode 100644 index 0000000..23b8daa --- /dev/null +++ b/packages/shopify/src/types/common.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/common' diff --git a/packages/shopify/src/types/customer.ts b/packages/shopify/src/types/customer.ts new file mode 100644 index 0000000..6e66366 --- /dev/null +++ b/packages/shopify/src/types/customer.ts @@ -0,0 +1,5 @@ +import * as Core from '@vercel/commerce/types/customer' + +export * from '@vercel/commerce/types/customer' + +export type CustomerSchema = Core.CustomerSchema diff --git a/packages/shopify/src/types/index.ts b/packages/shopify/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/shopify/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/shopify/src/types/login.ts b/packages/shopify/src/types/login.ts new file mode 100644 index 0000000..ab99bf8 --- /dev/null +++ b/packages/shopify/src/types/login.ts @@ -0,0 +1,8 @@ +import * as Core from '@vercel/commerce/types/login' +import type { CustomerAccessTokenCreateInput } from '../../schema' + +export * from '@vercel/commerce/types/login' + +export type LoginOperation = Core.LoginOperation & { + variables: CustomerAccessTokenCreateInput +} diff --git a/packages/shopify/src/types/logout.ts b/packages/shopify/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/shopify/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/shopify/src/types/page.ts b/packages/shopify/src/types/page.ts new file mode 100644 index 0000000..ccbc29f --- /dev/null +++ b/packages/shopify/src/types/page.ts @@ -0,0 +1,11 @@ +import * as Core from '@vercel/commerce/types/page' +export * from '@vercel/commerce/types/page' + +export type Page = Core.Page + +export type PageTypes = { + page: Page +} + +export type GetAllPagesOperation = Core.GetAllPagesOperation +export type GetPageOperation = Core.GetPageOperation diff --git a/packages/shopify/src/types/product.ts b/packages/shopify/src/types/product.ts new file mode 100644 index 0000000..72ca02f --- /dev/null +++ b/packages/shopify/src/types/product.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/product' diff --git a/packages/shopify/src/types/signup.ts b/packages/shopify/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/shopify/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/shopify/src/types/site.ts b/packages/shopify/src/types/site.ts new file mode 100644 index 0000000..96a2e47 --- /dev/null +++ b/packages/shopify/src/types/site.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/site' diff --git a/packages/shopify/src/types/wishlist.ts b/packages/shopify/src/types/wishlist.ts new file mode 100644 index 0000000..af92d9f --- /dev/null +++ b/packages/shopify/src/types/wishlist.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/wishlist' diff --git a/packages/shopify/src/utils/checkout-create.ts b/packages/shopify/src/utils/checkout-create.ts new file mode 100644 index 0000000..2f681c9 --- /dev/null +++ b/packages/shopify/src/utils/checkout-create.ts @@ -0,0 +1,45 @@ +import Cookies from 'js-cookie' + +import { + SHOPIFY_CHECKOUT_ID_COOKIE, + SHOPIFY_CHECKOUT_URL_COOKIE, + SHOPIFY_COOKIE_EXPIRE, +} from '../const' + +import checkoutCreateMutation from './mutations/checkout-create' +import { + CheckoutCreatePayload, + CheckoutLineItemInput, + Mutation, + MutationCheckoutCreateArgs, +} from '../../schema' +import { FetcherOptions } from '@vercel/commerce/utils/types' + +export const checkoutCreate = async ( + fetch: (options: FetcherOptions) => Promise, + lineItems: CheckoutLineItemInput[] +): Promise => { + const { checkoutCreate } = await fetch({ + query: checkoutCreateMutation, + variables: { + input: { lineItems }, + }, + }) + + const checkout = checkoutCreate?.checkout + + if (checkout) { + const checkoutId = checkout?.id + const options = { + expires: SHOPIFY_COOKIE_EXPIRE, + } + Cookies.set(SHOPIFY_CHECKOUT_ID_COOKIE, checkoutId, options) + if (checkout?.webUrl) { + Cookies.set(SHOPIFY_CHECKOUT_URL_COOKIE, checkout.webUrl, options) + } + } + + return checkoutCreate! +} + +export default checkoutCreate diff --git a/packages/shopify/src/utils/checkout-to-cart.ts b/packages/shopify/src/utils/checkout-to-cart.ts new file mode 100644 index 0000000..97b3f0a --- /dev/null +++ b/packages/shopify/src/utils/checkout-to-cart.ts @@ -0,0 +1,41 @@ +import type { Cart } from '../types/cart' +import { CommerceError } from '@vercel/commerce/utils/errors' + +import { + CheckoutLineItemsAddPayload, + CheckoutLineItemsRemovePayload, + CheckoutLineItemsUpdatePayload, + CheckoutCreatePayload, + CheckoutUserError, + Checkout, + Maybe, +} from '../../schema' + +import { normalizeCart } from './normalize' +import throwUserErrors from './throw-user-errors' + +export type CheckoutQuery = { + checkout: Checkout + checkoutUserErrors?: Array +} + +export type CheckoutPayload = + | CheckoutLineItemsAddPayload + | CheckoutLineItemsUpdatePayload + | CheckoutLineItemsRemovePayload + | CheckoutCreatePayload + | CheckoutQuery + +const checkoutToCart = (checkoutPayload?: Maybe): Cart => { + throwUserErrors(checkoutPayload?.checkoutUserErrors) + + if (!checkoutPayload?.checkout) { + throw new CommerceError({ + message: 'Missing checkout object from response', + }) + } + + return normalizeCart(checkoutPayload?.checkout) +} + +export default checkoutToCart diff --git a/packages/shopify/src/utils/colors.ts b/packages/shopify/src/utils/colors.ts new file mode 100644 index 0000000..f9822c4 --- /dev/null +++ b/packages/shopify/src/utils/colors.ts @@ -0,0 +1,154 @@ +export const colorMap: Record = { + aliceblue: '#F0F8FF', + antiquewhite: '#FAEBD7', + aqua: '#00FFFF', + aquamarine: '#7FFFD4', + azure: '#F0FFFF', + beige: '#F5F5DC', + bisque: '#FFE4C4', + black: '#000000', + blanchedalmond: '#FFEBCD', + blue: '#0000FF', + blueviolet: '#8A2BE2', + brown: '#A52A2A', + burlywood: '#DEB887', + burgandy: '#800020', + burgundy: '#800020', + cadetblue: '#5F9EA0', + chartreuse: '#7FFF00', + chocolate: '#D2691E', + coral: '#FF7F50', + cornflowerblue: '#6495ED', + cornsilk: '#FFF8DC', + crimson: '#DC143C', + cyan: '#00FFFF', + darkblue: '#00008B', + darkcyan: '#008B8B', + darkgoldenrod: '#B8860B', + darkgray: '#A9A9A9', + darkgreen: '#006400', + darkgrey: '#A9A9A9', + darkkhaki: '#BDB76B', + darkmagenta: '#8B008B', + darkolivegreen: '#556B2F', + darkorange: '#FF8C00', + darkorchid: '#9932CC', + darkred: '#8B0000', + darksalmon: '#E9967A', + darkseagreen: '#8FBC8F', + darkslateblue: '#483D8B', + darkslategray: '#2F4F4F', + darkslategrey: '#2F4F4F', + darkturquoise: '#00CED1', + darkviolet: '#9400D3', + deeppink: '#FF1493', + deepskyblue: '#00BFFF', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1E90FF', + firebrick: '#B22222', + floralwhite: '#FFFAF0', + forestgreen: '#228B22', + fuchsia: '#FF00FF', + gainsboro: '#DCDCDC', + ghostwhite: '#F8F8FF', + gold: '#FFD700', + goldenrod: '#DAA520', + gray: '#808080', + green: '#008000', + greenyellow: '#ADFF2F', + grey: '#808080', + honeydew: '#F0FFF0', + hotpink: '#FF69B4', + indianred: '#CD5C5C', + indigo: '#4B0082', + ivory: '#FFFFF0', + khaki: '#F0E68C', + lavender: '#E6E6FA', + lavenderblush: '#FFF0F5', + lawngreen: '#7CFC00', + lemonchiffon: '#FFFACD', + lightblue: '#ADD8E6', + lightcoral: '#F08080', + lightcyan: '#E0FFFF', + lightgoldenrodyellow: '#FAFAD2', + lightgray: '#D3D3D3', + lightgreen: '#90EE90', + lightgrey: '#D3D3D3', + lightpink: '#FFB6C1', + lightsalmon: '#FFA07A', + lightseagreen: '#20B2AA', + lightskyblue: '#87CEFA', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#B0C4DE', + lightyellow: '#FFFFE0', + lime: '#00FF00', + limegreen: '#32CD32', + linen: '#FAF0E6', + magenta: '#FF00FF', + maroon: '#800000', + mediumaquamarine: '#66CDAA', + mediumblue: '#0000CD', + mediumorchid: '#BA55D3', + mediumpurple: '#9370DB', + mediumseagreen: '#3CB371', + mediumslateblue: '#7B68EE', + mediumspringgreen: '#00FA9A', + mediumturquoise: '#48D1CC', + mediumvioletred: '#C71585', + midnightblue: '#191970', + mintcream: '#F5FFFA', + mistyrose: '#FFE4E1', + moccasin: '#FFE4B5', + navajowhite: '#FFDEAD', + navy: '#000080', + oldlace: '#FDF5E6', + olive: '#808000', + olivedrab: '#6B8E23', + orange: '#FFA500', + orangered: '#FF4500', + orchid: '#DA70D6', + palegoldenrod: '#EEE8AA', + palegreen: '#98FB98', + paleturquoise: '#AFEEEE', + palevioletred: '#DB7093', + papayawhip: '#FFEFD5', + peachpuff: '#FFDAB9', + peru: '#CD853F', + pink: '#FFC0CB', + plum: '#DDA0DD', + powderblue: '#B0E0E6', + purple: '#800080', + rebeccapurple: '#663399', + red: '#FF0000', + rosybrown: '#BC8F8F', + royalblue: '#4169E1', + saddlebrown: '#8B4513', + salmon: '#FA8072', + sandybrown: '#F4A460', + seagreen: '#2E8B57', + seashell: '#FFF5EE', + sienna: '#A0522D', + silver: '#C0C0C0', + skyblue: '#87CEEB', + slateblue: '#6A5ACD', + slategray: '#708090', + slategrey: '#708090', + spacegrey: '#65737e', + spacegray: '#65737e', + snow: '#FFFAFA', + springgreen: '#00FF7F', + steelblue: '#4682B4', + tan: '#D2B48C', + teal: '#008080', + thistle: '#D8BFD8', + tomato: '#FF6347', + turquoise: '#40E0D0', + violet: '#EE82EE', + wheat: '#F5DEB3', + white: '#FFFFFF', + whitesmoke: '#F5F5F5', + yellow: '#FFFF00', + yellowgreen: '#9ACD32', +} diff --git a/packages/shopify/src/utils/customer-token.ts b/packages/shopify/src/utils/customer-token.ts new file mode 100644 index 0000000..85454cb --- /dev/null +++ b/packages/shopify/src/utils/customer-token.ts @@ -0,0 +1,21 @@ +import Cookies, { CookieAttributes } from 'js-cookie' +import { SHOPIFY_COOKIE_EXPIRE, SHOPIFY_CUSTOMER_TOKEN_COOKIE } from '../const' + +export const getCustomerToken = () => Cookies.get(SHOPIFY_CUSTOMER_TOKEN_COOKIE) + +export const setCustomerToken = ( + token: string | null, + options?: CookieAttributes +) => { + if (!token) { + Cookies.remove(SHOPIFY_CUSTOMER_TOKEN_COOKIE) + } else { + Cookies.set( + SHOPIFY_CUSTOMER_TOKEN_COOKIE, + token, + options ?? { + expires: SHOPIFY_COOKIE_EXPIRE, + } + ) + } +} diff --git a/packages/shopify/src/utils/get-brands.ts b/packages/shopify/src/utils/get-brands.ts new file mode 100644 index 0000000..eb87b51 --- /dev/null +++ b/packages/shopify/src/utils/get-brands.ts @@ -0,0 +1,44 @@ +import { + GetAllProductVendorsQuery, + GetAllProductVendorsQueryVariables, +} from '../../schema' +import { ShopifyConfig } from '../api' +import getAllProductVendors from './queries/get-all-product-vendors-query' + +export type Brand = { + entityId: string + name: string + path: string +} + +export type BrandEdge = { + node: Brand +} + +export type Brands = BrandEdge[] + +const getBrands = async (config: ShopifyConfig): Promise => { + const { data } = await config.fetch< + GetAllProductVendorsQuery, + GetAllProductVendorsQueryVariables + >(getAllProductVendors, { + variables: { + first: 250, + }, + }) + + let vendorsStrings = data.products.edges.map(({ node: { vendor } }) => vendor) + + return [...new Set(vendorsStrings)].map((v) => { + const id = v.replace(/\s+/g, '-').toLowerCase() + return { + node: { + entityId: id, + name: v, + path: `brands/${id}`, + }, + } + }) +} + +export default getBrands diff --git a/packages/shopify/src/utils/get-categories.ts b/packages/shopify/src/utils/get-categories.ts new file mode 100644 index 0000000..e5ca16d --- /dev/null +++ b/packages/shopify/src/utils/get-categories.ts @@ -0,0 +1,34 @@ +import type { Category } from '../types/site' +import { ShopifyConfig } from '../api' +import { CollectionEdge } from '../../schema' +import { normalizeCategory } from './normalize' +import getSiteCollectionsQuery from './queries/get-all-collections-query' + +const getCategories = async ({ + fetch, + locale, +}: ShopifyConfig): Promise => { + const { data } = await fetch( + getSiteCollectionsQuery, + { + variables: { + first: 250, + }, + }, + { + ...(locale && { + headers: { + 'Accept-Language': locale, + }, + }), + } + ) + + return ( + data.collections?.edges?.map(({ node }: CollectionEdge) => + normalizeCategory(node) + ) ?? [] + ) +} + +export default getCategories diff --git a/packages/shopify/src/utils/get-checkout-id.ts b/packages/shopify/src/utils/get-checkout-id.ts new file mode 100644 index 0000000..11e3802 --- /dev/null +++ b/packages/shopify/src/utils/get-checkout-id.ts @@ -0,0 +1,8 @@ +import Cookies from 'js-cookie' +import { SHOPIFY_CHECKOUT_ID_COOKIE } from '../const' + +const getCheckoutId = (id?: string) => { + return id ?? Cookies.get(SHOPIFY_CHECKOUT_ID_COOKIE) +} + +export default getCheckoutId diff --git a/packages/shopify/src/utils/get-search-variables.ts b/packages/shopify/src/utils/get-search-variables.ts new file mode 100644 index 0000000..f486365 --- /dev/null +++ b/packages/shopify/src/utils/get-search-variables.ts @@ -0,0 +1,31 @@ +import getSortVariables from './get-sort-variables' +import { SearchProductsBody } from '../types/product' + +export const getSearchVariables = ({ + brandId, + search, + categoryId, + sort, + locale, +}: SearchProductsBody) => { + let query = '' + + if (search) { + query += `product_type:${search} OR title:${search} OR tag:${search} ` + } + + if (brandId) { + query += `${search ? 'AND ' : ''}vendor:${brandId}` + } + + return { + categoryId, + query, + ...getSortVariables(sort, !!categoryId), + ...(locale && { + locale, + }), + } +} + +export default getSearchVariables diff --git a/packages/shopify/src/utils/get-sort-variables.ts b/packages/shopify/src/utils/get-sort-variables.ts new file mode 100644 index 0000000..141d9a1 --- /dev/null +++ b/packages/shopify/src/utils/get-sort-variables.ts @@ -0,0 +1,32 @@ +const getSortVariables = (sort?: string, isCategory: boolean = false) => { + let output = {} + switch (sort) { + case 'price-asc': + output = { + sortKey: 'PRICE', + reverse: false, + } + break + case 'price-desc': + output = { + sortKey: 'PRICE', + reverse: true, + } + break + case 'trending-desc': + output = { + sortKey: 'BEST_SELLING', + reverse: false, + } + break + case 'latest-desc': + output = { + sortKey: isCategory ? 'CREATED' : 'CREATED_AT', + reverse: true, + } + break + } + return output +} + +export default getSortVariables diff --git a/packages/shopify/src/utils/handle-account-activation.ts b/packages/shopify/src/utils/handle-account-activation.ts new file mode 100644 index 0000000..2519590 --- /dev/null +++ b/packages/shopify/src/utils/handle-account-activation.ts @@ -0,0 +1,30 @@ +import { FetcherOptions } from '@vercel/commerce/utils/types' +import throwUserErrors from './throw-user-errors' + +import { + MutationCustomerActivateArgs, + MutationCustomerActivateByUrlArgs, +} from '../../schema' +import { Mutation } from '../../schema' +import { customerActivateByUrlMutation } from './mutations' + +const handleAccountActivation = async ( + fetch: (options: FetcherOptions) => Promise, + input: MutationCustomerActivateByUrlArgs +) => { + try { + const { customerActivateByUrl } = await fetch< + Mutation, + MutationCustomerActivateArgs + >({ + query: customerActivateByUrlMutation, + variables: { + input, + }, + }) + + throwUserErrors(customerActivateByUrl?.customerUserErrors) + } catch (error) {} +} + +export default handleAccountActivation diff --git a/packages/shopify/src/utils/handle-fetch-response.ts b/packages/shopify/src/utils/handle-fetch-response.ts new file mode 100644 index 0000000..927ab54 --- /dev/null +++ b/packages/shopify/src/utils/handle-fetch-response.ts @@ -0,0 +1,27 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' + +export function getError(errors: any[] | null, status: number) { + errors = errors ?? [{ message: 'Failed to fetch Shopify API' }] + return new FetcherError({ errors, status }) +} + +export async function getAsyncError(res: Response) { + const data = await res.json() + return getError(data.errors, res.status) +} + +const handleFetchResponse = async (res: Response) => { + if (res.ok) { + const { data, errors } = await res.json() + + if (errors && errors.length) { + throw getError(errors, res.status) + } + + return data + } + + throw await getAsyncError(res) +} + +export default handleFetchResponse diff --git a/packages/shopify/src/utils/handle-login.ts b/packages/shopify/src/utils/handle-login.ts new file mode 100644 index 0000000..dda6f6e --- /dev/null +++ b/packages/shopify/src/utils/handle-login.ts @@ -0,0 +1,36 @@ +import { FetcherOptions } from '@vercel/commerce/utils/types' +import { CustomerAccessTokenCreateInput } from '../../schema' +import { setCustomerToken } from './customer-token' +import { customerAccessTokenCreateMutation } from './mutations' +import throwUserErrors from './throw-user-errors' + +const handleLogin = (data: any) => { + const response = data.customerAccessTokenCreate + throwUserErrors(response?.customerUserErrors) + + const customerAccessToken = response?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return customerAccessToken +} + +export const handleAutomaticLogin = async ( + fetch: (options: FetcherOptions) => Promise, + input: CustomerAccessTokenCreateInput +) => { + try { + const loginData = await fetch({ + query: customerAccessTokenCreateMutation, + variables: { + input, + }, + }) + handleLogin(loginData) + } catch (error) {} +} + +export default handleLogin diff --git a/packages/shopify/src/utils/index.ts b/packages/shopify/src/utils/index.ts new file mode 100644 index 0000000..a8454ff --- /dev/null +++ b/packages/shopify/src/utils/index.ts @@ -0,0 +1,15 @@ +export { default as handleFetchResponse } from './handle-fetch-response' +export { default as getSearchVariables } from './get-search-variables' +export { default as getSortVariables } from './get-sort-variables' +export { default as getBrands } from './get-brands' +export { default as getCategories } from './get-categories' +export { default as getCheckoutId } from './get-checkout-id' +export { default as checkoutCreate } from './checkout-create' +export { default as checkoutToCart } from './checkout-to-cart' +export { default as handleLogin, handleAutomaticLogin } from './handle-login' +export { default as handleAccountActivation } from './handle-account-activation' +export { default as throwUserErrors } from './throw-user-errors' +export * from './queries' +export * from './mutations' +export * from './normalize' +export * from './customer-token' diff --git a/packages/shopify/src/utils/mutations/associate-customer-with-checkout.ts b/packages/shopify/src/utils/mutations/associate-customer-with-checkout.ts new file mode 100644 index 0000000..6b1350e --- /dev/null +++ b/packages/shopify/src/utils/mutations/associate-customer-with-checkout.ts @@ -0,0 +1,18 @@ +const associateCustomerWithCheckoutMutation = /* GraphQl */ ` +mutation associateCustomerWithCheckout($checkoutId: ID!, $customerAccessToken: String!) { + checkoutCustomerAssociateV2(checkoutId: $checkoutId, customerAccessToken: $customerAccessToken) { + checkout { + id + } + checkoutUserErrors { + code + field + message + } + customer { + id + } + } + } +` +export default associateCustomerWithCheckoutMutation diff --git a/packages/shopify/src/utils/mutations/checkout-create.ts b/packages/shopify/src/utils/mutations/checkout-create.ts new file mode 100644 index 0000000..7bff7e7 --- /dev/null +++ b/packages/shopify/src/utils/mutations/checkout-create.ts @@ -0,0 +1,19 @@ +import { checkoutDetailsFragment } from '../queries/get-checkout-query' + +const checkoutCreateMutation = /* GraphQL */ ` + mutation checkoutCreate($input: CheckoutCreateInput = {}) { + checkoutCreate(input: $input) { + checkoutUserErrors { + code + field + message + } + checkout { + ...checkoutDetails + } + } + } + + ${checkoutDetailsFragment} +` +export default checkoutCreateMutation diff --git a/packages/shopify/src/utils/mutations/checkout-line-item-add.ts b/packages/shopify/src/utils/mutations/checkout-line-item-add.ts new file mode 100644 index 0000000..02f5b71 --- /dev/null +++ b/packages/shopify/src/utils/mutations/checkout-line-item-add.ts @@ -0,0 +1,22 @@ +import { checkoutDetailsFragment } from '../queries/get-checkout-query' + +const checkoutLineItemAddMutation = /* GraphQL */ ` + mutation checkoutLineItemAdd( + $checkoutId: ID! + $lineItems: [CheckoutLineItemInput!]! + ) { + checkoutLineItemsAdd(checkoutId: $checkoutId, lineItems: $lineItems) { + checkoutUserErrors { + code + field + message + } + checkout { + ...checkoutDetails + } + } + } + + ${checkoutDetailsFragment} +` +export default checkoutLineItemAddMutation diff --git a/packages/shopify/src/utils/mutations/checkout-line-item-remove.ts b/packages/shopify/src/utils/mutations/checkout-line-item-remove.ts new file mode 100644 index 0000000..30cb830 --- /dev/null +++ b/packages/shopify/src/utils/mutations/checkout-line-item-remove.ts @@ -0,0 +1,21 @@ +import { checkoutDetailsFragment } from '../queries/get-checkout-query' + +const checkoutLineItemRemoveMutation = /* GraphQL */ ` + mutation checkoutLineItemRemove($checkoutId: ID!, $lineItemIds: [ID!]!) { + checkoutLineItemsRemove( + checkoutId: $checkoutId + lineItemIds: $lineItemIds + ) { + checkoutUserErrors { + code + field + message + } + checkout { + ...checkoutDetails + } + } + } + ${checkoutDetailsFragment} +` +export default checkoutLineItemRemoveMutation diff --git a/packages/shopify/src/utils/mutations/checkout-line-item-update.ts b/packages/shopify/src/utils/mutations/checkout-line-item-update.ts new file mode 100644 index 0000000..fca617f --- /dev/null +++ b/packages/shopify/src/utils/mutations/checkout-line-item-update.ts @@ -0,0 +1,22 @@ +import { checkoutDetailsFragment } from '../queries/get-checkout-query' + +const checkoutLineItemUpdateMutation = /* GraphQL */ ` + mutation checkoutLineItemUpdate( + $checkoutId: ID! + $lineItems: [CheckoutLineItemUpdateInput!]! + ) { + checkoutLineItemsUpdate(checkoutId: $checkoutId, lineItems: $lineItems) { + checkoutUserErrors { + code + field + message + } + checkout { + ...checkoutDetails + } + } + } + + ${checkoutDetailsFragment} +` +export default checkoutLineItemUpdateMutation diff --git a/packages/shopify/src/utils/mutations/customer-access-token-create.ts b/packages/shopify/src/utils/mutations/customer-access-token-create.ts new file mode 100644 index 0000000..7a45c3f --- /dev/null +++ b/packages/shopify/src/utils/mutations/customer-access-token-create.ts @@ -0,0 +1,16 @@ +const customerAccessTokenCreateMutation = /* GraphQL */ ` + mutation customerAccessTokenCreate($input: CustomerAccessTokenCreateInput!) { + customerAccessTokenCreate(input: $input) { + customerAccessToken { + accessToken + expiresAt + } + customerUserErrors { + code + field + message + } + } + } +` +export default customerAccessTokenCreateMutation diff --git a/packages/shopify/src/utils/mutations/customer-access-token-delete.ts b/packages/shopify/src/utils/mutations/customer-access-token-delete.ts new file mode 100644 index 0000000..c46eff1 --- /dev/null +++ b/packages/shopify/src/utils/mutations/customer-access-token-delete.ts @@ -0,0 +1,14 @@ +const customerAccessTokenDeleteMutation = /* GraphQL */ ` + mutation customerAccessTokenDelete($customerAccessToken: String!) { + customerAccessTokenDelete(customerAccessToken: $customerAccessToken) { + deletedAccessToken + deletedCustomerAccessTokenId + userErrors { + field + message + } + } + } +` + +export default customerAccessTokenDeleteMutation diff --git a/packages/shopify/src/utils/mutations/customer-activate-by-url.ts b/packages/shopify/src/utils/mutations/customer-activate-by-url.ts new file mode 100644 index 0000000..345d502 --- /dev/null +++ b/packages/shopify/src/utils/mutations/customer-activate-by-url.ts @@ -0,0 +1,19 @@ +const customerActivateByUrlMutation = /* GraphQL */ ` + mutation customerActivateByUrl($activationUrl: URL!, $password: String!) { + customerActivateByUrl(activationUrl: $activationUrl, password: $password) { + customer { + id + } + customerAccessToken { + accessToken + expiresAt + } + customerUserErrors { + code + field + message + } + } + } +` +export default customerActivateByUrlMutation diff --git a/packages/shopify/src/utils/mutations/customer-activate.ts b/packages/shopify/src/utils/mutations/customer-activate.ts new file mode 100644 index 0000000..b1d057c --- /dev/null +++ b/packages/shopify/src/utils/mutations/customer-activate.ts @@ -0,0 +1,19 @@ +const customerActivateMutation = /* GraphQL */ ` + mutation customerActivate($id: ID!, $input: CustomerActivateInput!) { + customerActivate(id: $id, input: $input) { + customer { + id + } + customerAccessToken { + accessToken + expiresAt + } + customerUserErrors { + code + field + message + } + } + } +` +export default customerActivateMutation diff --git a/packages/shopify/src/utils/mutations/customer-create.ts b/packages/shopify/src/utils/mutations/customer-create.ts new file mode 100644 index 0000000..05c728a --- /dev/null +++ b/packages/shopify/src/utils/mutations/customer-create.ts @@ -0,0 +1,15 @@ +const customerCreateMutation = /* GraphQL */ ` + mutation customerCreate($input: CustomerCreateInput!) { + customerCreate(input: $input) { + customerUserErrors { + code + field + message + } + customer { + id + } + } + } +` +export default customerCreateMutation diff --git a/packages/shopify/src/utils/mutations/index.ts b/packages/shopify/src/utils/mutations/index.ts new file mode 100644 index 0000000..165fb19 --- /dev/null +++ b/packages/shopify/src/utils/mutations/index.ts @@ -0,0 +1,9 @@ +export { default as customerCreateMutation } from './customer-create' +export { default as checkoutCreateMutation } from './checkout-create' +export { default as checkoutLineItemAddMutation } from './checkout-line-item-add' +export { default as checkoutLineItemUpdateMutation } from './checkout-line-item-update' +export { default as checkoutLineItemRemoveMutation } from './checkout-line-item-remove' +export { default as customerAccessTokenCreateMutation } from './customer-access-token-create' +export { default as customerAccessTokenDeleteMutation } from './customer-access-token-delete' +export { default as customerActivateMutation } from './customer-activate' +export { default as customerActivateByUrlMutation } from './customer-activate-by-url' diff --git a/packages/shopify/src/utils/normalize.ts b/packages/shopify/src/utils/normalize.ts new file mode 100644 index 0000000..2782f59 --- /dev/null +++ b/packages/shopify/src/utils/normalize.ts @@ -0,0 +1,197 @@ +import type { Page } from '../types/page' +import type { Product } from '../types/product' +import type { Cart, LineItem } from '../types/cart' +import type { Category } from '../types/site' + +import { + Product as ShopifyProduct, + Checkout, + CheckoutLineItemEdge, + SelectedOption, + ImageConnection, + ProductVariantConnection, + MoneyV2, + ProductOption, + Page as ShopifyPage, + PageEdge, + Collection, +} from '../../schema' +import { colorMap } from './colors' + +const money = ({ amount, currencyCode }: MoneyV2) => { + return { + value: +amount, + currencyCode, + } +} + +const normalizeProductOption = ({ + id, + name: displayName, + values, +}: ProductOption) => { + return { + __typename: 'MultipleChoiceOption', + id, + displayName: displayName.toLowerCase(), + values: values.map((value) => { + let output: any = { + label: value, + } + if (displayName.match(/colou?r/gi)) { + const mapedColor = colorMap[value.toLowerCase().replace(/ /g, '')] + if (mapedColor) { + output = { + ...output, + hexColors: [mapedColor], + } + } + } + return output + }), + } +} + +const normalizeProductImages = ({ edges }: ImageConnection) => + edges?.map(({ node: { originalSrc: url, ...rest } }) => ({ + url, + ...rest, + })) + +const normalizeProductVariants = ({ edges }: ProductVariantConnection) => { + return edges?.map( + ({ + node: { + id, + selectedOptions, + sku, + title, + priceV2, + compareAtPriceV2, + requiresShipping, + availableForSale, + }, + }) => { + return { + id, + name: title, + sku: sku ?? id, + price: +priceV2.amount, + listPrice: +compareAtPriceV2?.amount, + requiresShipping, + availableForSale, + options: selectedOptions.map(({ name, value }: SelectedOption) => { + const options = normalizeProductOption({ + id, + name, + values: [value], + }) + + return options + }), + } + } + ) +} + +export function normalizeProduct({ + id, + title: name, + vendor, + images, + variants, + description, + descriptionHtml, + handle, + priceRange, + options, + metafields, + ...rest +}: ShopifyProduct): Product { + return { + id, + name, + vendor, + path: `/${handle}`, + slug: handle?.replace(/^\/+|\/+$/g, ''), + price: money(priceRange?.minVariantPrice), + images: normalizeProductImages(images), + variants: variants ? normalizeProductVariants(variants) : [], + options: options + ? options + .filter((o) => o.name !== 'Title') // By default Shopify adds a 'Title' name when there's only one option. We don't need it. https://community.shopify.com/c/Shopify-APIs-SDKs/Adding-new-product-variant-is-automatically-adding-quot-Default/td-p/358095 + .map((o) => normalizeProductOption(o)) + : [], + ...(description && { description }), + ...(descriptionHtml && { descriptionHtml }), + ...rest, + } +} + +export function normalizeCart(checkout: Checkout): Cart { + return { + id: checkout.id, + url: checkout.webUrl, + customerId: '', + email: '', + createdAt: checkout.createdAt, + currency: { + code: checkout.totalPriceV2?.currencyCode, + }, + taxesIncluded: checkout.taxesIncluded, + lineItems: checkout.lineItems?.edges.map(normalizeLineItem), + lineItemsSubtotalPrice: +checkout.subtotalPriceV2?.amount, + subtotalPrice: +checkout.subtotalPriceV2?.amount, + totalPrice: checkout.totalPriceV2?.amount, + discounts: [], + } +} + +function normalizeLineItem({ + node: { id, title, variant, quantity }, +}: CheckoutLineItemEdge): LineItem { + return { + id, + variantId: String(variant?.id), + productId: String(variant?.id), + name: `${title}`, + quantity, + variant: { + id: String(variant?.id), + sku: variant?.sku ?? '', + name: variant?.title!, + image: { + url: variant?.image?.originalSrc || '/product-img-placeholder.svg', + }, + requiresShipping: variant?.requiresShipping ?? false, + price: variant?.priceV2?.amount, + listPrice: variant?.compareAtPriceV2?.amount, + }, + path: String(variant?.product?.handle), + discounts: [], + options: variant?.title == 'Default Title' ? [] : variant?.selectedOptions, + } +} + +export const normalizePage = ( + { title: name, handle, ...page }: ShopifyPage, + locale: string = 'en-US' +): Page => ({ + ...page, + url: `/${locale}/${handle}`, + name, +}) + +export const normalizePages = (edges: PageEdge[], locale?: string): Page[] => + edges?.map((edge) => normalizePage(edge.node, locale)) + +export const normalizeCategory = ({ + title: name, + handle, + id, +}: Collection): Category => ({ + id, + name, + slug: handle, + path: `/${handle}`, +}) diff --git a/packages/shopify/src/utils/queries/get-all-collections-query.ts b/packages/shopify/src/utils/queries/get-all-collections-query.ts new file mode 100644 index 0000000..2abf374 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-all-collections-query.ts @@ -0,0 +1,14 @@ +const getSiteCollectionsQuery = /* GraphQL */ ` + query getSiteCollections($first: Int!) { + collections(first: $first) { + edges { + node { + id + title + handle + } + } + } + } +` +export default getSiteCollectionsQuery diff --git a/packages/shopify/src/utils/queries/get-all-pages-query.ts b/packages/shopify/src/utils/queries/get-all-pages-query.ts new file mode 100644 index 0000000..e3aee1f --- /dev/null +++ b/packages/shopify/src/utils/queries/get-all-pages-query.ts @@ -0,0 +1,14 @@ +export const getAllPagesQuery = /* GraphQL */ ` + query getAllPages($first: Int = 250) { + pages(first: $first) { + edges { + node { + id + title + handle + } + } + } + } +` +export default getAllPagesQuery diff --git a/packages/shopify/src/utils/queries/get-all-product-vendors-query.ts b/packages/shopify/src/utils/queries/get-all-product-vendors-query.ts new file mode 100644 index 0000000..be08b8e --- /dev/null +++ b/packages/shopify/src/utils/queries/get-all-product-vendors-query.ts @@ -0,0 +1,17 @@ +const getAllProductVendors = /* GraphQL */ ` + query getAllProductVendors($first: Int = 250, $cursor: String) { + products(first: $first, after: $cursor) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + vendor + } + cursor + } + } + } +` +export default getAllProductVendors diff --git a/packages/shopify/src/utils/queries/get-all-products-paths-query.ts b/packages/shopify/src/utils/queries/get-all-products-paths-query.ts new file mode 100644 index 0000000..56298c2 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-all-products-paths-query.ts @@ -0,0 +1,17 @@ +const getAllProductsPathsQuery = /* GraphQL */ ` + query getAllProductPaths($first: Int = 250, $cursor: String) { + products(first: $first, after: $cursor) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + handle + } + cursor + } + } + } +` +export default getAllProductsPathsQuery diff --git a/packages/shopify/src/utils/queries/get-all-products-query.ts b/packages/shopify/src/utils/queries/get-all-products-query.ts new file mode 100644 index 0000000..179cf98 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-all-products-query.ts @@ -0,0 +1,57 @@ +export const productConnectionFragment = /* GraphQL */ ` + fragment productConnection on ProductConnection { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + id + title + vendor + handle + priceRange { + minVariantPrice { + amount + currencyCode + } + } + images(first: 1) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + originalSrc + altText + width + height + } + } + } + } + } + } +` + +const getAllProductsQuery = /* GraphQL */ ` + query getAllProducts( + $first: Int = 250 + $query: String = "" + $sortKey: ProductSortKeys = RELEVANCE + $reverse: Boolean = false + ) { + products( + first: $first + sortKey: $sortKey + reverse: $reverse + query: $query + ) { + ...productConnection + } + } + + ${productConnectionFragment} +` +export default getAllProductsQuery diff --git a/packages/shopify/src/utils/queries/get-checkout-query.ts b/packages/shopify/src/utils/queries/get-checkout-query.ts new file mode 100644 index 0000000..9969e67 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-checkout-query.ts @@ -0,0 +1,70 @@ +export const checkoutDetailsFragment = /* GraphQL */ ` + fragment checkoutDetails on Checkout { + id + webUrl + subtotalPriceV2 { + amount + currencyCode + } + totalTaxV2 { + amount + currencyCode + } + totalPriceV2 { + amount + currencyCode + } + completedAt + createdAt + taxesIncluded + lineItems(first: 250) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + id + title + variant { + id + sku + title + selectedOptions { + name + value + } + image { + originalSrc + altText + width + height + } + priceV2 { + amount + currencyCode + } + compareAtPriceV2 { + amount + currencyCode + } + product { + handle + } + } + quantity + } + } + } + } +` + +const getCheckoutQuery = /* GraphQL */ ` + query getCheckout($checkoutId: ID!) { + node(id: $checkoutId) { + ...checkoutDetails + } + } + ${checkoutDetailsFragment} +` +export default getCheckoutQuery diff --git a/packages/shopify/src/utils/queries/get-collection-products-query.ts b/packages/shopify/src/utils/queries/get-collection-products-query.ts new file mode 100644 index 0000000..b773a7e --- /dev/null +++ b/packages/shopify/src/utils/queries/get-collection-products-query.ts @@ -0,0 +1,21 @@ +import { productConnectionFragment } from './get-all-products-query' + +const getCollectionProductsQuery = /* GraphQL */ ` + query getProductsFromCollection( + $categoryId: ID! + $first: Int = 250 + $sortKey: ProductCollectionSortKeys = RELEVANCE + $reverse: Boolean = false + ) { + node(id: $categoryId) { + id + ... on Collection { + products(first: $first, sortKey: $sortKey, reverse: $reverse) { + ...productConnection + } + } + } + } + ${productConnectionFragment} +` +export default getCollectionProductsQuery diff --git a/packages/shopify/src/utils/queries/get-customer-id-query.ts b/packages/shopify/src/utils/queries/get-customer-id-query.ts new file mode 100644 index 0000000..076ceb1 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-customer-id-query.ts @@ -0,0 +1,8 @@ +export const getCustomerQuery = /* GraphQL */ ` + query getCustomerId($customerAccessToken: String!) { + customer(customerAccessToken: $customerAccessToken) { + id + } + } +` +export default getCustomerQuery diff --git a/packages/shopify/src/utils/queries/get-customer-query.ts b/packages/shopify/src/utils/queries/get-customer-query.ts new file mode 100644 index 0000000..87e37e6 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-customer-query.ts @@ -0,0 +1,16 @@ +export const getCustomerQuery = /* GraphQL */ ` + query getCustomer($customerAccessToken: String!) { + customer(customerAccessToken: $customerAccessToken) { + id + firstName + lastName + displayName + email + phone + tags + acceptsMarketing + createdAt + } + } +` +export default getCustomerQuery diff --git a/packages/shopify/src/utils/queries/get-page-query.ts b/packages/shopify/src/utils/queries/get-page-query.ts new file mode 100644 index 0000000..7939f02 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-page-query.ts @@ -0,0 +1,14 @@ +export const getPageQuery = /* GraphQL */ ` + query getPage($id: ID!) { + node(id: $id) { + id + ... on Page { + title + handle + body + bodySummary + } + } + } +` +export default getPageQuery diff --git a/packages/shopify/src/utils/queries/get-product-query.ts b/packages/shopify/src/utils/queries/get-product-query.ts new file mode 100644 index 0000000..b2998a4 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-product-query.ts @@ -0,0 +1,72 @@ +const getProductQuery = /* GraphQL */ ` + query getProductBySlug($slug: String!) { + productByHandle(handle: $slug) { + id + handle + availableForSale + title + productType + vendor + description + descriptionHtml + options { + id + name + values + } + priceRange { + maxVariantPrice { + amount + currencyCode + } + minVariantPrice { + amount + currencyCode + } + } + variants(first: 250) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + id + title + sku + availableForSale + requiresShipping + selectedOptions { + name + value + } + priceV2 { + amount + currencyCode + } + compareAtPriceV2 { + amount + currencyCode + } + } + } + } + images(first: 250) { + pageInfo { + hasNextPage + hasPreviousPage + } + edges { + node { + originalSrc + altText + width + height + } + } + } + } + } +` + +export default getProductQuery diff --git a/packages/shopify/src/utils/queries/get-site-info-query.ts b/packages/shopify/src/utils/queries/get-site-info-query.ts new file mode 100644 index 0000000..7421557 --- /dev/null +++ b/packages/shopify/src/utils/queries/get-site-info-query.ts @@ -0,0 +1,8 @@ +const getSiteInfoQuery = /* GraphQL */ ` + query getSiteInfo { + shop { + name + } + } +` +export default getSiteInfoQuery diff --git a/packages/shopify/src/utils/queries/index.ts b/packages/shopify/src/utils/queries/index.ts new file mode 100644 index 0000000..9531134 --- /dev/null +++ b/packages/shopify/src/utils/queries/index.ts @@ -0,0 +1,11 @@ +export { default as getSiteCollectionsQuery } from './get-all-collections-query' +export { default as getProductQuery } from './get-product-query' +export { default as getAllProductsQuery } from './get-all-products-query' +export { default as getAllProductsPathtsQuery } from './get-all-products-paths-query' +export { default as getAllProductVendors } from './get-all-product-vendors-query' +export { default as getCollectionProductsQuery } from './get-collection-products-query' +export { default as getCheckoutQuery } from './get-checkout-query' +export { default as getAllPagesQuery } from './get-all-pages-query' +export { default as getPageQuery } from './get-page-query' +export { default as getCustomerQuery } from './get-customer-query' +export { default as getSiteInfoQuery } from './get-site-info-query' diff --git a/packages/shopify/src/utils/throw-user-errors.ts b/packages/shopify/src/utils/throw-user-errors.ts new file mode 100644 index 0000000..2173b2b --- /dev/null +++ b/packages/shopify/src/utils/throw-user-errors.ts @@ -0,0 +1,38 @@ +import { ValidationError } from '@vercel/commerce/utils/errors' + +import { + CheckoutErrorCode, + CheckoutUserError, + CustomerErrorCode, + CustomerUserError, +} from '../../schema' + +export type UserErrors = Array + +export type UserErrorCode = + | CustomerErrorCode + | CheckoutErrorCode + | null + | undefined + +const getCustomMessage = (code: UserErrorCode, message: string) => { + switch (code) { + case 'UNIDENTIFIED_CUSTOMER': + message = 'Cannot find an account that matches the provided credentials' + break + } + return message +} + +export const throwUserErrors = (errors?: UserErrors) => { + if (errors && errors.length) { + throw new ValidationError({ + errors: errors.map(({ code, message }) => ({ + code: code ?? 'validation_error', + message: getCustomMessage(code, message), + })), + }) + } +} + +export default throwUserErrors diff --git a/packages/shopify/src/wishlist/use-add-item.tsx b/packages/shopify/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/shopify/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/shopify/src/wishlist/use-remove-item.tsx b/packages/shopify/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/shopify/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/shopify/src/wishlist/use-wishlist.tsx b/packages/shopify/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..c951950 --- /dev/null +++ b/packages/shopify/src/wishlist/use-wishlist.tsx @@ -0,0 +1,46 @@ +// TODO: replace this hook and other wishlist hooks with a handler, or remove them if +// Shopify doesn't have a wishlist + +import { HookFetcher } from '@vercel/commerce/utils/types' +import { Product } from '../../schema' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/shopify/taskfile.js b/packages/shopify/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/shopify/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/shopify/tsconfig.json b/packages/shopify/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/shopify/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/spree/.env.template b/packages/spree/.env.template new file mode 100644 index 0000000..36aae07 --- /dev/null +++ b/packages/spree/.env.template @@ -0,0 +1,25 @@ +# Template to be used for creating .env* files (.env, .env.local etc.) in the project's root directory. + +COMMERCE_PROVIDER=@vercel/commerce-spree + +{# - NEXT_PUBLIC_* are exposed to the web browser and the server #} +NEXT_PUBLIC_SPREE_API_HOST=http://localhost:4000 +NEXT_PUBLIC_SPREE_DEFAULT_LOCALE=en-us +NEXT_PUBLIC_SPREE_CART_COOKIE_NAME=spree_cart_token +{# -- cookie expire in days #} +NEXT_PUBLIC_SPREE_CART_COOKIE_EXPIRE=7 +NEXT_PUBLIC_SPREE_USER_COOKIE_NAME=spree_user_token +NEXT_PUBLIC_SPREE_USER_COOKIE_EXPIRE=7 +NEXT_PUBLIC_SPREE_IMAGE_HOST=http://localhost:4000 +NEXT_PUBLIC_SPREE_ALLOWED_IMAGE_DOMAIN=localhost +NEXT_PUBLIC_SPREE_CATEGORIES_TAXONOMY_PERMALINK=categories +NEXT_PUBLIC_SPREE_BRANDS_TAXONOMY_PERMALINK=brands +NEXT_PUBLIC_SPREE_ALL_PRODUCTS_TAXONOMY_ID=false +NEXT_PUBLIC_SPREE_SHOW_SINGLE_VARIANT_OPTIONS=false +NEXT_PUBLIC_SPREE_LAST_UPDATED_PRODUCTS_PRERENDER_COUNT=10 +NEXT_PUBLIC_SPREE_PRODUCT_PLACEHOLDER_IMAGE_URL=/product-img-placeholder.svg +NEXT_PUBLIC_SPREE_LINE_ITEM_PLACEHOLDER_IMAGE_URL=/product-img-placeholder.svg +NEXT_PUBLIC_SPREE_IMAGES_OPTION_FILTER=false +NEXT_PUBLIC_SPREE_IMAGES_SIZE=1000x1000 +NEXT_PUBLIC_SPREE_IMAGES_QUALITY=100 +NEXT_PUBLIC_SPREE_LOGIN_AFTER_SIGNUP=true diff --git a/packages/spree/.prettierignore b/packages/spree/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/spree/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/spree/.prettierrc b/packages/spree/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/spree/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/spree/README-assets/screenshots.png b/packages/spree/README-assets/screenshots.png new file mode 100644 index 0000000000000000000000000000000000000000..93c133e06d4038d15d9a42ff0667328338085684 GIT binary patch literal 117099 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

6OhHIR@}zzq{xTSt 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 { + try { + const html = ` + + + + + + Checkout + + +

+ + + ` + + response.status(200) + response.setHeader('Content-Type', 'text/html') + response.write(html) + response.end() + } catch (error) { + console.error(error) + + const message = 'An unexpected error ocurred' + + response.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export default getCheckout diff --git a/packages/spree/src/api/endpoints/checkout/index.ts b/packages/spree/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..2be2a5d --- /dev/null +++ b/packages/spree/src/api/endpoints/checkout/index.ts @@ -0,0 +1,22 @@ +import { createEndpoint } from '@vercel/commerce/api' +import type { GetAPISchema, CommerceAPI } from '@vercel/commerce/api' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' +import type { CheckoutSchema } from '@vercel/commerce/types/checkout' +import getCheckout from './get-checkout' +import type { SpreeApiProvider } from '../..' + +export type CheckoutAPI = GetAPISchema< + CommerceAPI, + CheckoutSchema +> + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/spree/src/api/endpoints/customer/address.ts b/packages/spree/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/customer/card.ts b/packages/spree/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/customer/index.ts b/packages/spree/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/login/index.ts b/packages/spree/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/login/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/logout/index.ts b/packages/spree/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/signup/index.ts b/packages/spree/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/endpoints/wishlist/index.tsx b/packages/spree/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/spree/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/spree/src/api/index.ts b/packages/spree/src/api/index.ts new file mode 100644 index 0000000..3971ed5 --- /dev/null +++ b/packages/spree/src/api/index.ts @@ -0,0 +1,45 @@ +import type { CommerceAPI, CommerceAPIConfig } from '@vercel/commerce/api' +import { getCommerceApi as commerceApi } from '@vercel/commerce/api' +import createApiFetch from './utils/create-api-fetch' + +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface SpreeApiConfig extends CommerceAPIConfig {} + +const config: SpreeApiConfig = { + commerceUrl: '', + apiToken: '', + cartCookie: '', + customerCookie: '', + cartCookieMaxAge: 2592000, + fetch: createApiFetch(() => getCommerceApi().getConfig()), +} + +const operations = { + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type SpreeApiProvider = typeof provider + +export type SpreeApi

= + CommerceAPI

+ +export function getCommerceApi

( + customProvider: P = provider as any +): SpreeApi

{ + return commerceApi(customProvider) +} diff --git a/packages/spree/src/api/operations/get-all-pages.ts b/packages/spree/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..b5fae62 --- /dev/null +++ b/packages/spree/src/api/operations/get-all-pages.ts @@ -0,0 +1,82 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetAllPagesOperation, Page } from '@vercel/commerce/types/page' +import { requireConfigValue } from '../../isomorphic-config' +import normalizePage from '../../utils/normalizations/normalize-page' +import type { IPages } from '@spree/storefront-api-v2-sdk/types/interfaces/Page' +import type { SpreeSdkVariables } from '../../types' +import type { SpreeApiConfig, SpreeApiProvider } from '../index' + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(options?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllPages({ + config: userConfig, + preview, + query, + url, + }: { + url?: string + config?: Partial + preview?: boolean + query?: string + } = {}): Promise { + console.info( + 'getAllPages called. Configuration: ', + 'query: ', + query, + 'userConfig: ', + userConfig, + 'preview: ', + preview, + 'url: ', + url + ) + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config + + const variables: SpreeSdkVariables = { + methodPath: 'pages.list', + arguments: [ + { + per_page: 500, + filter: { + locale_eq: + config.locale || (requireConfigValue('defaultLocale') as string), + }, + }, + ], + } + + const { data: spreeSuccessResponse } = await apiFetch< + IPages, + SpreeSdkVariables + >('__UNUSED__', { + variables, + }) + + const normalizedPages: Page[] = spreeSuccessResponse.data.map( + (spreePage) => + normalizePage(spreeSuccessResponse, spreePage, config.locales || []) + ) + + return { pages: normalizedPages } + } + + return getAllPages +} diff --git a/packages/spree/src/api/operations/get-all-product-paths.ts b/packages/spree/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..424f46c --- /dev/null +++ b/packages/spree/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,97 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { Product } from '@vercel/commerce/types/product' +import type { GetAllProductPathsOperation } from '@vercel/commerce/types/product' +import { requireConfigValue } from '../../isomorphic-config' +import type { IProductsSlugs, SpreeSdkVariables } from '../../types' +import getProductPath from '../../utils/get-product-path' +import type { SpreeApiConfig, SpreeApiProvider } from '..' + +const imagesSize = requireConfigValue('imagesSize') as string +const imagesQuality = requireConfigValue('imagesQuality') as number + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: Partial + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: Partial + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + query, + variables: getAllProductPathsVariables = {}, + config: userConfig, + }: { + query?: string + variables?: T['variables'] + config?: Partial + } = {}): Promise { + console.info( + 'getAllProductPaths called. Configuration: ', + 'query: ', + query, + 'getAllProductPathsVariables: ', + getAllProductPathsVariables, + 'config: ', + userConfig + ) + + const productsCount = requireConfigValue( + 'lastUpdatedProductsPrerenderCount' + ) + + if (productsCount === 0) { + return { + products: [], + } + } + + const variables: SpreeSdkVariables = { + methodPath: 'products.list', + arguments: [ + {}, + { + fields: { + product: 'slug', + }, + per_page: productsCount, + image_transformation: { + quality: imagesQuality, + size: imagesSize, + }, + }, + ], + } + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config // TODO: Send config.locale to Spree. + + const { data: spreeSuccessResponse } = await apiFetch< + IProductsSlugs, + SpreeSdkVariables + >('__UNUSED__', { + variables, + }) + + const normalizedProductsPaths: Pick[] = + spreeSuccessResponse.data.map((spreeProduct) => ({ + path: getProductPath(spreeProduct), + })) + + return { products: normalizedProductsPaths } + } + + return getAllProductPaths +} diff --git a/packages/spree/src/api/operations/get-all-products.ts b/packages/spree/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..2b718d9 --- /dev/null +++ b/packages/spree/src/api/operations/get-all-products.ts @@ -0,0 +1,92 @@ +import type { Product } from '@vercel/commerce/types/product' +import type { GetAllProductsOperation } from '@vercel/commerce/types/product' +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { IProducts } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import type { SpreeApiConfig, SpreeApiProvider } from '../index' +import type { SpreeSdkVariables } from '../../types' +import normalizeProduct from '../../utils/normalizations/normalize-product' +import { requireConfigValue } from '../../isomorphic-config' + +const imagesSize = requireConfigValue('imagesSize') as string +const imagesQuality = requireConfigValue('imagesQuality') as number + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getAllProducts( + opts: { + variables?: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getAllProducts({ + variables: getAllProductsVariables = {}, + config: userConfig, + }: { + variables?: T['variables'] + config?: Partial + } = {}): Promise<{ products: Product[] }> { + console.info( + 'getAllProducts called. Configuration: ', + 'getAllProductsVariables: ', + getAllProductsVariables, + 'config: ', + userConfig + ) + + const defaultProductsTaxonomyId = requireConfigValue( + 'allProductsTaxonomyId' + ) as string | false + + const first = getAllProductsVariables.first + const filter = !defaultProductsTaxonomyId + ? {} + : { filter: { taxons: defaultProductsTaxonomyId }, sort: '-updated_at' } + + const variables: SpreeSdkVariables = { + methodPath: 'products.list', + arguments: [ + {}, + { + include: + 'primary_variant,variants,images,option_types,variants.option_values', + per_page: first, + ...filter, + image_transformation: { + quality: imagesQuality, + size: imagesSize, + }, + }, + ], + } + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config // TODO: Send config.locale to Spree. + + const { data: spreeSuccessResponse } = await apiFetch< + IProducts, + SpreeSdkVariables + >('__UNUSED__', { + variables, + }) + + const normalizedProducts: Product[] = spreeSuccessResponse.data.map( + (spreeProduct) => normalizeProduct(spreeSuccessResponse, spreeProduct) + ) + + return { products: normalizedProducts } + } + + return getAllProducts +} diff --git a/packages/spree/src/api/operations/get-customer-wishlist.ts b/packages/spree/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..8c34b9e --- /dev/null +++ b/packages/spree/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,6 @@ +export default function getCustomerWishlistOperation() { + function getCustomerWishlist(): any { + return { wishlist: {} } + } + return getCustomerWishlist +} diff --git a/packages/spree/src/api/operations/get-page.ts b/packages/spree/src/api/operations/get-page.ts new file mode 100644 index 0000000..711870e --- /dev/null +++ b/packages/spree/src/api/operations/get-page.ts @@ -0,0 +1,81 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetPageOperation } from '@vercel/commerce/types/page' +import type { SpreeSdkVariables } from '../../types' +import type { SpreeApiConfig, SpreeApiProvider } from '..' +import type { IPage } from '@spree/storefront-api-v2-sdk/types/interfaces/Page' +import normalizePage from '../../utils/normalizations/normalize-page' + +export type Page = any +export type GetPageResult = { page?: Page } + +export type PageVariables = { + id: number +} + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getPage( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getPage({ + url, + config: userConfig, + preview, + variables: getPageVariables, + }: { + url?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + console.info( + 'getPage called. Configuration: ', + 'userConfig: ', + userConfig, + 'preview: ', + preview, + 'url: ', + url + ) + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config + + const variables: SpreeSdkVariables = { + methodPath: 'pages.show', + arguments: [getPageVariables.id], + } + + const { data: spreeSuccessResponse } = await apiFetch< + IPage, + SpreeSdkVariables + >('__UNUSED__', { + variables, + }) + + const normalizedPage: Page = normalizePage( + spreeSuccessResponse, + spreeSuccessResponse.data, + config.locales || [] + ) + + return { page: normalizedPage } + } + + return getPage +} diff --git a/packages/spree/src/api/operations/get-product.ts b/packages/spree/src/api/operations/get-product.ts new file mode 100644 index 0000000..bd93791 --- /dev/null +++ b/packages/spree/src/api/operations/get-product.ts @@ -0,0 +1,90 @@ +import type { SpreeApiConfig, SpreeApiProvider } from '../index' +import type { GetProductOperation } from '@vercel/commerce/types/product' +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { IProduct } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import type { SpreeSdkVariables } from '../../types' +import MissingSlugVariableError from '../../errors/MissingSlugVariableError' +import normalizeProduct from '../../utils/normalizations/normalize-product' +import { requireConfigValue } from '../../isomorphic-config' + +const imagesSize = requireConfigValue('imagesSize') as string +const imagesQuality = requireConfigValue('imagesQuality') as number + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getProduct( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getProduct({ + query = '', + variables: getProductVariables, + config: userConfig, + }: { + query?: string + variables?: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + console.log( + 'getProduct called. Configuration: ', + 'getProductVariables: ', + getProductVariables, + 'config: ', + userConfig + ) + + if (!getProductVariables?.slug) { + throw new MissingSlugVariableError() + } + + const variables: SpreeSdkVariables = { + methodPath: 'products.show', + arguments: [ + getProductVariables.slug, + {}, + { + include: + 'primary_variant,variants,images,option_types,variants.option_values', + image_transformation: { + quality: imagesQuality, + size: imagesSize, + }, + }, + ], + } + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config // TODO: Send config.locale to Spree. + + const { data: spreeSuccessResponse } = await apiFetch< + IProduct, + SpreeSdkVariables + >('__UNUSED__', { + variables, + }) + + return { + product: normalizeProduct( + spreeSuccessResponse, + spreeSuccessResponse.data + ), + } + } + + return getProduct +} diff --git a/packages/spree/src/api/operations/get-site-info.ts b/packages/spree/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..13b11e4 --- /dev/null +++ b/packages/spree/src/api/operations/get-site-info.ts @@ -0,0 +1,138 @@ +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { + Category, + GetSiteInfoOperation, +} from '@vercel/commerce/types/site' +import type { + ITaxons, + TaxonAttr, +} from '@spree/storefront-api-v2-sdk/types/interfaces/Taxon' +import { requireConfigValue } from '../../isomorphic-config' +import type { SpreeSdkVariables } from '../../types' +import type { SpreeApiConfig, SpreeApiProvider } from '..' + +const taxonsSort = (spreeTaxon1: TaxonAttr, spreeTaxon2: TaxonAttr): number => { + const { left: left1, right: right1 } = spreeTaxon1.attributes + const { left: left2, right: right2 } = spreeTaxon2.attributes + + if (right1 < left2) { + return -1 + } + + if (right2 < left1) { + return 1 + } + + return 0 +} + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getSiteInfo( + opts: { + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getSiteInfo({ + query, + variables: getSiteInfoVariables = {}, + config: userConfig, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + console.info( + 'getSiteInfo called. Configuration: ', + 'query: ', + query, + 'getSiteInfoVariables ', + getSiteInfoVariables, + 'config: ', + userConfig + ) + + const createVariables = (parentPermalink: string): SpreeSdkVariables => ({ + methodPath: 'taxons.list', + arguments: [ + { + filter: { + parent_permalink: parentPermalink, + }, + }, + ], + }) + + const config = commerce.getConfig(userConfig) + const { fetch: apiFetch } = config // TODO: Send config.locale to Spree. + + const { data: spreeCategoriesSuccessResponse } = await apiFetch< + ITaxons, + SpreeSdkVariables + >('__UNUSED__', { + variables: createVariables( + requireConfigValue('categoriesTaxonomyPermalink') as string + ), + }) + + const { data: spreeBrandsSuccessResponse } = await apiFetch< + ITaxons, + SpreeSdkVariables + >('__UNUSED__', { + variables: createVariables( + requireConfigValue('brandsTaxonomyPermalink') as string + ), + }) + + const normalizedCategories: GetSiteInfoOperation['data']['categories'] = + spreeCategoriesSuccessResponse.data + .sort(taxonsSort) + .map((spreeTaxon: TaxonAttr) => { + return { + id: spreeTaxon.id, + name: spreeTaxon.attributes.name, + slug: spreeTaxon.id, + path: spreeTaxon.id, + } + }) + + const normalizedBrands: GetSiteInfoOperation['data']['brands'] = + spreeBrandsSuccessResponse.data + .sort(taxonsSort) + .map((spreeTaxon: TaxonAttr) => { + return { + node: { + entityId: spreeTaxon.id, + path: `brands/${spreeTaxon.id}`, + name: spreeTaxon.attributes.name, + }, + } + }) + + return { + categories: normalizedCategories, + brands: normalizedBrands, + } + } + + return getSiteInfo +} diff --git a/packages/spree/src/api/operations/index.ts b/packages/spree/src/api/operations/index.ts new file mode 100644 index 0000000..086fdf8 --- /dev/null +++ b/packages/spree/src/api/operations/index.ts @@ -0,0 +1,6 @@ +export { default as getPage } from './get-page' +export { default as getSiteInfo } from './get-site-info' +export { default as getAllPages } from './get-all-pages' +export { default as getProduct } from './get-product' +export { default as getAllProducts } from './get-all-products' +export { default as getAllProductPaths } from './get-all-product-paths' diff --git a/packages/spree/src/api/utils/create-api-fetch.ts b/packages/spree/src/api/utils/create-api-fetch.ts new file mode 100644 index 0000000..b26a2fb --- /dev/null +++ b/packages/spree/src/api/utils/create-api-fetch.ts @@ -0,0 +1,86 @@ +import { SpreeApiConfig } from '..' +import { errors, makeClient } from '@spree/storefront-api-v2-sdk' +import { requireConfigValue } from '../../isomorphic-config' +import convertSpreeErrorToGraphQlError from '../../utils/convert-spree-error-to-graph-ql-error' +import type { ResultResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/ResultResponse' +import getSpreeSdkMethodFromEndpointPath from '../../utils/get-spree-sdk-method-from-endpoint-path' +import SpreeSdkMethodFromEndpointPathError from '../../errors/SpreeSdkMethodFromEndpointPathError' +import { GraphQLFetcher, GraphQLFetcherResult } from '@vercel/commerce/api' +import createCustomizedFetchFetcher, { + fetchResponseKey, +} from '../../utils/create-customized-fetch-fetcher' +import fetch, { Request } from 'node-fetch' +import type { SpreeSdkResponseWithRawResponse } from '../../types' +import prettyPrintSpreeSdkErrors from '../../utils/pretty-print-spree-sdk-errors' + +export type CreateApiFetch = ( + getConfig: () => SpreeApiConfig +) => GraphQLFetcher, any> + +// TODO: GraphQLFetcher, any> should be GraphQLFetcher, SpreeSdkVariables>. +// But CommerceAPIConfig['fetch'] cannot be extended from Variables = any to SpreeSdkVariables. + +const createApiFetch: CreateApiFetch = (_getConfig) => { + const client = makeClient({ + host: requireConfigValue('apiHost') as string, + createFetcher: (fetcherOptions) => { + return createCustomizedFetchFetcher({ + fetch, + requestConstructor: Request, + ...fetcherOptions, + }) + }, + }) + + return async (url, queryData = {}, fetchOptions = {}) => { + console.log( + 'apiFetch called. query = ', + 'url = ', + url, + 'queryData = ', + queryData, + 'fetchOptions = ', + fetchOptions + ) + + const { variables } = queryData + + if (!variables) { + throw new SpreeSdkMethodFromEndpointPathError( + `Required SpreeSdkVariables not provided.` + ) + } + + const storeResponse: ResultResponse = + await getSpreeSdkMethodFromEndpointPath( + client, + variables.methodPath + )(...variables.arguments) + + if (storeResponse.isSuccess()) { + const data = storeResponse.success() + const rawFetchResponse = data[fetchResponseKey] + + return { + data, + res: rawFetchResponse, + } + } + + const storeResponseError = storeResponse.fail() + + if (storeResponseError instanceof errors.SpreeError) { + console.error( + `Request to spree resulted in an error:\n\n${prettyPrintSpreeSdkErrors( + storeResponse.fail() + )}` + ) + + throw convertSpreeErrorToGraphQlError(storeResponseError) + } + + throw storeResponseError + } +} + +export default createApiFetch diff --git a/packages/spree/src/api/utils/fetch.ts b/packages/spree/src/api/utils/fetch.ts new file mode 100644 index 0000000..26f9ab6 --- /dev/null +++ b/packages/spree/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import vercelFetch from '@vercel/fetch' + +export default vercelFetch() diff --git a/packages/spree/src/auth/index.ts b/packages/spree/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/spree/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/spree/src/auth/use-login.tsx b/packages/spree/src/auth/use-login.tsx new file mode 100644 index 0000000..b23b8a6 --- /dev/null +++ b/packages/spree/src/auth/use-login.tsx @@ -0,0 +1,86 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import type { LoginHook } from '@vercel/commerce/types/login' +import type { AuthTokenAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Authentication' +import { FetcherError, ValidationError } from '@vercel/commerce/utils/errors' +import useCustomer from '../customer/use-customer' +import useCart from '../cart/use-cart' +import useWishlist from '../wishlist/use-wishlist' +import login from '../utils/login' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'authentication', + query: 'getToken', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useLogin fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { email, password } = input + + if (!email || !password) { + throw new ValidationError({ + message: 'Email and password need to be provided.', + }) + } + + const getTokenParameters: AuthTokenAttr = { + username: email, + password, + } + + try { + await login(fetch, getTokenParameters, false) + + return null + } catch (getTokenError) { + if ( + getTokenError instanceof FetcherError && + getTokenError.status === 400 + ) { + // Change the error message to be more user friendly. + throw new FetcherError({ + status: getTokenError.status, + message: 'The email or password is invalid.', + code: getTokenError.code, + }) + } + + throw getTokenError + } + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const customer = useCustomer() + const cart = useCart() + const wishlist = useWishlist() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + + await customer.mutate() + await cart.mutate() + await wishlist.mutate() + + return data + }, + [customer, cart, wishlist] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/auth/use-logout.tsx b/packages/spree/src/auth/use-logout.tsx new file mode 100644 index 0000000..8b22021 --- /dev/null +++ b/packages/spree/src/auth/use-logout.tsx @@ -0,0 +1,81 @@ +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import type { LogoutHook } from '@vercel/commerce/types/logout' +import { useCallback } from 'react' +import useCustomer from '../customer/use-customer' +import useCart from '../cart/use-cart' +import useWishlist from '../wishlist/use-wishlist' +import { + ensureUserTokenResponse, + removeUserTokenResponse, +} from '../utils/tokens/user-token-response' +import revokeUserTokens from '../utils/tokens/revoke-user-tokens' +import TokensNotRejectedError from '../errors/TokensNotRejectedError' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'authentication', + query: 'revokeToken', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useLogout fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const userToken = ensureUserTokenResponse() + + if (userToken) { + try { + // Revoke any tokens associated with the logged in user. + await revokeUserTokens(fetch, { + accessToken: userToken.access_token, + refreshToken: userToken.refresh_token, + }) + } catch (revokeUserTokenError) { + // Squash token revocation errors and rethrow anything else. + if (!(revokeUserTokenError instanceof TokensNotRejectedError)) { + throw revokeUserTokenError + } + } + + // Whether token revocation succeeded or not, remove them from local storage. + removeUserTokenResponse() + } + + return null + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const customer = useCustomer({ + swrOptions: { isPaused: () => true }, + }) + const cart = useCart({ + swrOptions: { isPaused: () => true }, + }) + const wishlist = useWishlist({ + swrOptions: { isPaused: () => true }, + }) + + return useCallback(async () => { + const data = await fetch() + + await customer.mutate(null, false) + await cart.mutate(null, false) + await wishlist.mutate(null, false) + + return data + }, [customer, cart, wishlist]) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/auth/use-signup.tsx b/packages/spree/src/auth/use-signup.tsx new file mode 100644 index 0000000..7dd8879 --- /dev/null +++ b/packages/spree/src/auth/use-signup.tsx @@ -0,0 +1,96 @@ +import { useCallback } from 'react' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import type { SignupHook } from '@vercel/commerce/types/signup' +import { ValidationError } from '@vercel/commerce/utils/errors' +import type { IAccount } from '@spree/storefront-api-v2-sdk/types/interfaces/Account' +import type { AuthTokenAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Authentication' +import useCustomer from '../customer/use-customer' +import useCart from '../cart/use-cart' +import useWishlist from '../wishlist/use-wishlist' +import login from '../utils/login' +import { requireConfigValue } from '../isomorphic-config' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'account', + query: 'create', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useSignup fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { email, password } = input + + if (!email || !password) { + throw new ValidationError({ + message: 'Email and password need to be provided.', + }) + } + + // TODO: Replace any with specific type from Spree SDK + // once it's added to the SDK. + const createAccountParameters: any = { + user: { + email, + password, + // The stock NJC interface doesn't have a + // password confirmation field, so just copy password. + passwordConfirmation: password, + }, + } + + // Create the user account. + await fetch>({ + variables: { + methodPath: 'account.create', + arguments: [createAccountParameters], + }, + }) + + const getTokenParameters: AuthTokenAttr = { + username: email, + password, + } + + // Login immediately after the account is created. + if (requireConfigValue('loginAfterSignup')) { + await login(fetch, getTokenParameters, true) + } + + return null + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const customer = useCustomer() + const cart = useCart() + const wishlist = useWishlist() + + return useCallback( + async (input) => { + const data = await fetch({ input }) + + await customer.mutate() + await cart.mutate() + await wishlist.mutate() + + return data + }, + [customer, cart, wishlist] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/cart/index.ts b/packages/spree/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/spree/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/spree/src/cart/use-add-item.tsx b/packages/spree/src/cart/use-add-item.tsx new file mode 100644 index 0000000..5f7d1f4 --- /dev/null +++ b/packages/spree/src/cart/use-add-item.tsx @@ -0,0 +1,118 @@ +import useAddItem from '@vercel/commerce/cart/use-add-item' +import type { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { useCallback } from 'react' +import useCart from './use-cart' +import type { AddItemHook } from '@vercel/commerce/types/cart' +import normalizeCart from '../utils/normalizations/normalize-cart' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { AddItem } from '@spree/storefront-api-v2-sdk/types/interfaces/endpoints/CartClass' +import { setCartToken } from '../utils/tokens/cart-token' +import ensureIToken from '../utils/tokens/ensure-itoken' +import createEmptyCart from '../utils/create-empty-cart' +import { FetcherError } from '@vercel/commerce/utils/errors' +import isLoggedIn from '../utils/tokens/is-logged-in' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'cart', + query: 'addItem', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useAddItem fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { quantity, productId, variantId } = input + + const safeQuantity = quantity ?? 1 + + let token: IToken | undefined = ensureIToken() + + const addItemParameters: AddItem = { + variant_id: variantId, + quantity: safeQuantity, + include: [ + 'line_items', + 'line_items.variant', + 'line_items.variant.product', + 'line_items.variant.product.images', + 'line_items.variant.images', + 'line_items.variant.option_values', + 'line_items.variant.product.option_types', + ].join(','), + } + + if (!token) { + const { data: spreeCartCreateSuccessResponse } = await createEmptyCart( + fetch + ) + + setCartToken(spreeCartCreateSuccessResponse.data.attributes.token) + token = ensureIToken() + } + + try { + const { data: spreeSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'cart.addItem', + arguments: [token, addItemParameters], + }, + }) + + return normalizeCart(spreeSuccessResponse, spreeSuccessResponse.data) + } catch (addItemError) { + if (addItemError instanceof FetcherError && addItemError.status === 404) { + const { data: spreeRetroactiveCartCreateSuccessResponse } = + await createEmptyCart(fetch) + + if (!isLoggedIn()) { + setCartToken( + spreeRetroactiveCartCreateSuccessResponse.data.attributes.token + ) + } + + // Return an empty cart. The user has to add the item again. + // This is going to be a rare situation. + + return normalizeCart( + spreeRetroactiveCartCreateSuccessResponse, + spreeRetroactiveCartCreateSuccessResponse.data + ) + } + + throw addItemError + } + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const { mutate } = useCart() + + return useCallback( + async (input) => { + const data = await fetch({ input }) + + await mutate(data, false) + + return data + }, + [mutate] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/cart/use-cart.tsx b/packages/spree/src/cart/use-cart.tsx new file mode 100644 index 0000000..699a023 --- /dev/null +++ b/packages/spree/src/cart/use-cart.tsx @@ -0,0 +1,123 @@ +import { useMemo } from 'react' +import type { SWRHook } from '@vercel/commerce/utils/types' +import useCart from '@vercel/commerce/cart/use-cart' +import type { UseCart } from '@vercel/commerce/cart/use-cart' +import type { GetCartHook } from '@vercel/commerce/types/cart' +import normalizeCart from '../utils/normalizations/normalize-cart' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import { FetcherError } from '@vercel/commerce/utils/errors' +import { setCartToken } from '../utils/tokens/cart-token' +import ensureIToken from '../utils/tokens/ensure-itoken' +import isLoggedIn from '../utils/tokens/is-logged-in' +import createEmptyCart from '../utils/create-empty-cart' +import { requireConfigValue } from '../isomorphic-config' + +const imagesSize = requireConfigValue('imagesSize') as string +const imagesQuality = requireConfigValue('imagesQuality') as number + +export default useCart as UseCart + +// This handler avoids calling /api/cart. +// There doesn't seem to be a good reason to call it. +// So far, only bigcommerce uses it. +export const handler: SWRHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'cart', + query: 'show', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useCart fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + let spreeCartResponse: IOrder | null + + const token: IToken | undefined = ensureIToken() + + if (!token) { + spreeCartResponse = null + } else { + try { + const { data: spreeCartShowSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'cart.show', + arguments: [ + token, + { + include: [ + 'line_items', + 'line_items.variant', + 'line_items.variant.product', + 'line_items.variant.product.images', + 'line_items.variant.images', + 'line_items.variant.option_values', + 'line_items.variant.product.option_types', + ].join(','), + image_transformation: { + quality: imagesQuality, + size: imagesSize, + }, + }, + ], + }, + }) + + spreeCartResponse = spreeCartShowSuccessResponse + } catch (fetchCartError) { + if ( + !(fetchCartError instanceof FetcherError) || + fetchCartError.status !== 404 + ) { + throw fetchCartError + } + + spreeCartResponse = null + } + } + + if (!spreeCartResponse || spreeCartResponse?.data.attributes.completed_at) { + const { data: spreeCartCreateSuccessResponse } = await createEmptyCart( + fetch + ) + + spreeCartResponse = spreeCartCreateSuccessResponse + + if (!isLoggedIn()) { + setCartToken(spreeCartResponse.data.attributes.token) + } + } + + return normalizeCart(spreeCartResponse, spreeCartResponse.data) + }, + useHook: ({ useData }) => { + const useWrappedHook: ReturnType['useHook']> = ( + input + ) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo(() => { + return Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) === 0 + }, + enumerable: true, + }, + }) + }, [response]) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/cart/use-remove-item.tsx b/packages/spree/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..6bbecd3 --- /dev/null +++ b/packages/spree/src/cart/use-remove-item.tsx @@ -0,0 +1,119 @@ +import type { MutationHook } from '@vercel/commerce/utils/types' +import useRemoveItem from '@vercel/commerce/cart/use-remove-item' +import type { UseRemoveItem } from '@vercel/commerce/cart/use-remove-item' +import type { RemoveItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' +import { useCallback } from 'react' +import normalizeCart from '../utils/normalizations/normalize-cart' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { IQuery } from '@spree/storefront-api-v2-sdk/types/interfaces/Query' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import ensureIToken from '../utils/tokens/ensure-itoken' +import createEmptyCart from '../utils/create-empty-cart' +import { setCartToken } from '../utils/tokens/cart-token' +import { FetcherError } from '@vercel/commerce/utils/errors' +import isLoggedIn from '../utils/tokens/is-logged-in' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'cart', + query: 'removeItem', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useRemoveItem fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { itemId: lineItemId } = input + + let token: IToken | undefined = ensureIToken() + + if (!token) { + const { data: spreeCartCreateSuccessResponse } = await createEmptyCart( + fetch + ) + + setCartToken(spreeCartCreateSuccessResponse.data.attributes.token) + token = ensureIToken() + } + + const removeItemParameters: IQuery = { + include: [ + 'line_items', + 'line_items.variant', + 'line_items.variant.product', + 'line_items.variant.product.images', + 'line_items.variant.images', + 'line_items.variant.option_values', + 'line_items.variant.product.option_types', + ].join(','), + } + + try { + const { data: spreeSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'cart.removeItem', + arguments: [token, lineItemId, removeItemParameters], + }, + }) + + return normalizeCart(spreeSuccessResponse, spreeSuccessResponse.data) + } catch (removeItemError) { + if ( + removeItemError instanceof FetcherError && + removeItemError.status === 404 + ) { + const { data: spreeRetroactiveCartCreateSuccessResponse } = + await createEmptyCart(fetch) + + if (!isLoggedIn()) { + setCartToken( + spreeRetroactiveCartCreateSuccessResponse.data.attributes.token + ) + } + + // Return an empty cart. This is going to be a rare situation. + + return normalizeCart( + spreeRetroactiveCartCreateSuccessResponse, + spreeRetroactiveCartCreateSuccessResponse.data + ) + } + + throw removeItemError + } + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const { mutate } = useCart() + + return useCallback( + async (input) => { + const data = await fetch({ input: { itemId: input.id } }) + + // Upon calling cart.removeItem, Spree returns the old version of the cart, + // with the already removed line item. Invalidate the useCart mutation + // to fetch the cart again. + await mutate(data, true) + + return data + }, + [mutate] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/cart/use-update-item.tsx b/packages/spree/src/cart/use-update-item.tsx new file mode 100644 index 0000000..679d68a --- /dev/null +++ b/packages/spree/src/cart/use-update-item.tsx @@ -0,0 +1,148 @@ +import type { MutationHook } from '@vercel/commerce/utils/types' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' +import type { UpdateItemHook } from '@vercel/commerce/types/cart' +import useCart from './use-cart' +import { useMemo } from 'react' +import { FetcherError, ValidationError } from '@vercel/commerce/utils/errors' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { SetQuantity } from '@spree/storefront-api-v2-sdk/types/interfaces/endpoints/CartClass' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import normalizeCart from '../utils/normalizations/normalize-cart' +import debounce from 'lodash.debounce' +import ensureIToken from '../utils/tokens/ensure-itoken' +import createEmptyCart from '../utils/create-empty-cart' +import { setCartToken } from '../utils/tokens/cart-token' +import isLoggedIn from '../utils/tokens/is-logged-in' + +export default useUpdateItem as UseUpdateItem + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'cart', + query: 'setQuantity', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useRemoveItem fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { itemId, item } = input + + if (!item.quantity) { + throw new ValidationError({ + message: 'Line item quantity needs to be provided.', + }) + } + + let token: IToken | undefined = ensureIToken() + + if (!token) { + const { data: spreeCartCreateSuccessResponse } = await createEmptyCart( + fetch + ) + + setCartToken(spreeCartCreateSuccessResponse.data.attributes.token) + token = ensureIToken() + } + + try { + const setQuantityParameters: SetQuantity = { + line_item_id: itemId, + quantity: item.quantity, + include: [ + 'line_items', + 'line_items.variant', + 'line_items.variant.product', + 'line_items.variant.product.images', + 'line_items.variant.images', + 'line_items.variant.option_values', + 'line_items.variant.product.option_types', + ].join(','), + } + + const { data: spreeSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'cart.setQuantity', + arguments: [token, setQuantityParameters], + }, + }) + + return normalizeCart(spreeSuccessResponse, spreeSuccessResponse.data) + } catch (updateItemError) { + if ( + updateItemError instanceof FetcherError && + updateItemError.status === 404 + ) { + const { data: spreeRetroactiveCartCreateSuccessResponse } = + await createEmptyCart(fetch) + + if (!isLoggedIn()) { + setCartToken( + spreeRetroactiveCartCreateSuccessResponse.data.attributes.token + ) + } + + // Return an empty cart. The user has to update the item again. + // This is going to be a rare situation. + + return normalizeCart( + spreeRetroactiveCartCreateSuccessResponse, + spreeRetroactiveCartCreateSuccessResponse.data + ) + } + + throw updateItemError + } + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = (context) => { + const { mutate } = useCart() + + return useMemo( + () => + debounce(async (input: UpdateItemHook['actionInput']) => { + const itemId = context?.item?.id + const productId = input.productId ?? context?.item?.productId + const variantId = input.variantId ?? context?.item?.variantId + const quantity = input.quantity + + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + item: { + productId, + variantId, + quantity, + }, + itemId, + }, + }) + + await mutate(data, false) + + return data + }, context?.wait ?? 500), + [mutate, context] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/checkout/use-checkout.tsx b/packages/spree/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..bd8e3ac --- /dev/null +++ b/packages/spree/src/checkout/use-checkout.tsx @@ -0,0 +1,19 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + // TODO: Revise url and query + url: 'checkout', + query: 'show', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/spree/src/commerce.config.json b/packages/spree/src/commerce.config.json new file mode 100644 index 0000000..6f8399f --- /dev/null +++ b/packages/spree/src/commerce.config.json @@ -0,0 +1,10 @@ +{ + "provider": "spree", + "features": { + "wishlist": true, + "cart": true, + "search": true, + "customerAuth": true, + "customCheckout": false + } +} diff --git a/packages/spree/src/customer/address/use-add-item.tsx b/packages/spree/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..6329680 --- /dev/null +++ b/packages/spree/src/customer/address/use-add-item.tsx @@ -0,0 +1,18 @@ +import useAddItem from '@vercel/commerce/customer/address/use-add-item' +import type { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import type { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'account', + query: 'createAddress', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/spree/src/customer/card/use-add-item.tsx b/packages/spree/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..4028114 --- /dev/null +++ b/packages/spree/src/customer/card/use-add-item.tsx @@ -0,0 +1,19 @@ +import useAddItem from '@vercel/commerce/customer/address/use-add-item' +import type { UseAddItem } from '@vercel/commerce/customer/address/use-add-item' +import type { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + // TODO: Revise url and query + url: 'checkout', + query: 'addPayment', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/spree/src/customer/index.ts b/packages/spree/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/spree/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/spree/src/customer/use-customer.tsx b/packages/spree/src/customer/use-customer.tsx new file mode 100644 index 0000000..56f330d --- /dev/null +++ b/packages/spree/src/customer/use-customer.tsx @@ -0,0 +1,83 @@ +import type { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer from '@vercel/commerce/customer/use-customer' +import type { UseCustomer } from '@vercel/commerce/customer/use-customer' +import type { CustomerHook } from '@vercel/commerce/types/customer' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { IAccount } from '@spree/storefront-api-v2-sdk/types/interfaces/Account' +import { FetcherError } from '@vercel/commerce/utils/errors' +import normalizeUser from '../utils/normalizations/normalize-user' +import isLoggedIn from '../utils/tokens/is-logged-in' +import ensureIToken from '../utils/tokens/ensure-itoken' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'account', + query: 'get', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useCustomer fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + if (!isLoggedIn()) { + return null + } + + const token: IToken | undefined = ensureIToken() + + if (!token) { + return null + } + + try { + const { data: spreeAccountInfoSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'account.accountInfo', + arguments: [token], + }, + }) + + const spreeUser = spreeAccountInfoSuccessResponse.data + + const normalizedUser = normalizeUser( + spreeAccountInfoSuccessResponse, + spreeUser + ) + + return normalizedUser + } catch (fetchUserError) { + if ( + !(fetchUserError instanceof FetcherError) || + fetchUserError.status !== 404 + ) { + throw fetchUserError + } + + return null + } + }, + useHook: ({ useData }) => { + const useWrappedHook: ReturnType['useHook']> = ( + input + ) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/errors/AccessTokenError.ts b/packages/spree/src/errors/AccessTokenError.ts new file mode 100644 index 0000000..4c79c0b --- /dev/null +++ b/packages/spree/src/errors/AccessTokenError.ts @@ -0,0 +1 @@ +export default class AccessTokenError extends Error {} diff --git a/packages/spree/src/errors/MisconfigurationError.ts b/packages/spree/src/errors/MisconfigurationError.ts new file mode 100644 index 0000000..0717ae4 --- /dev/null +++ b/packages/spree/src/errors/MisconfigurationError.ts @@ -0,0 +1 @@ +export default class MisconfigurationError extends Error {} diff --git a/packages/spree/src/errors/MissingConfigurationValueError.ts b/packages/spree/src/errors/MissingConfigurationValueError.ts new file mode 100644 index 0000000..02b497b --- /dev/null +++ b/packages/spree/src/errors/MissingConfigurationValueError.ts @@ -0,0 +1 @@ +export default class MissingConfigurationValueError extends Error {} diff --git a/packages/spree/src/errors/MissingLineItemVariantError.ts b/packages/spree/src/errors/MissingLineItemVariantError.ts new file mode 100644 index 0000000..d9bee08 --- /dev/null +++ b/packages/spree/src/errors/MissingLineItemVariantError.ts @@ -0,0 +1 @@ +export default class MissingLineItemVariantError extends Error {} diff --git a/packages/spree/src/errors/MissingOptionValueError.ts b/packages/spree/src/errors/MissingOptionValueError.ts new file mode 100644 index 0000000..04457ac --- /dev/null +++ b/packages/spree/src/errors/MissingOptionValueError.ts @@ -0,0 +1 @@ +export default class MissingOptionValueError extends Error {} diff --git a/packages/spree/src/errors/MissingPrimaryVariantError.ts b/packages/spree/src/errors/MissingPrimaryVariantError.ts new file mode 100644 index 0000000..f9af41b --- /dev/null +++ b/packages/spree/src/errors/MissingPrimaryVariantError.ts @@ -0,0 +1 @@ +export default class MissingPrimaryVariantError extends Error {} diff --git a/packages/spree/src/errors/MissingProductError.ts b/packages/spree/src/errors/MissingProductError.ts new file mode 100644 index 0000000..3098be6 --- /dev/null +++ b/packages/spree/src/errors/MissingProductError.ts @@ -0,0 +1 @@ +export default class MissingProductError extends Error {} diff --git a/packages/spree/src/errors/MissingSlugVariableError.ts b/packages/spree/src/errors/MissingSlugVariableError.ts new file mode 100644 index 0000000..09b9d2e --- /dev/null +++ b/packages/spree/src/errors/MissingSlugVariableError.ts @@ -0,0 +1 @@ +export default class MissingSlugVariableError extends Error {} diff --git a/packages/spree/src/errors/MissingVariantError.ts b/packages/spree/src/errors/MissingVariantError.ts new file mode 100644 index 0000000..5ed9e0e --- /dev/null +++ b/packages/spree/src/errors/MissingVariantError.ts @@ -0,0 +1 @@ +export default class MissingVariantError extends Error {} diff --git a/packages/spree/src/errors/RefreshTokenError.ts b/packages/spree/src/errors/RefreshTokenError.ts new file mode 100644 index 0000000..a79365b --- /dev/null +++ b/packages/spree/src/errors/RefreshTokenError.ts @@ -0,0 +1 @@ +export default class RefreshTokenError extends Error {} diff --git a/packages/spree/src/errors/SpreeResponseContentError.ts b/packages/spree/src/errors/SpreeResponseContentError.ts new file mode 100644 index 0000000..19c10cf --- /dev/null +++ b/packages/spree/src/errors/SpreeResponseContentError.ts @@ -0,0 +1 @@ +export default class SpreeResponseContentError extends Error {} diff --git a/packages/spree/src/errors/SpreeSdkMethodFromEndpointPathError.ts b/packages/spree/src/errors/SpreeSdkMethodFromEndpointPathError.ts new file mode 100644 index 0000000..bf15aad --- /dev/null +++ b/packages/spree/src/errors/SpreeSdkMethodFromEndpointPathError.ts @@ -0,0 +1 @@ +export default class SpreeSdkMethodFromEndpointPathError extends Error {} diff --git a/packages/spree/src/errors/TokensNotRejectedError.ts b/packages/spree/src/errors/TokensNotRejectedError.ts new file mode 100644 index 0000000..245f664 --- /dev/null +++ b/packages/spree/src/errors/TokensNotRejectedError.ts @@ -0,0 +1 @@ +export default class TokensNotRejectedError extends Error {} diff --git a/packages/spree/src/errors/UserTokenResponseParseError.ts b/packages/spree/src/errors/UserTokenResponseParseError.ts new file mode 100644 index 0000000..9631971 --- /dev/null +++ b/packages/spree/src/errors/UserTokenResponseParseError.ts @@ -0,0 +1 @@ +export default class UserTokenResponseParseError extends Error {} diff --git a/packages/spree/src/fetcher.ts b/packages/spree/src/fetcher.ts new file mode 100644 index 0000000..cb14c1e --- /dev/null +++ b/packages/spree/src/fetcher.ts @@ -0,0 +1,123 @@ +import type { Fetcher } from '@vercel/commerce/utils/types' +import convertSpreeErrorToGraphQlError from './utils/convert-spree-error-to-graph-ql-error' +import { makeClient, errors } from '@spree/storefront-api-v2-sdk' +import type { ResultResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/ResultResponse' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import { requireConfigValue } from './isomorphic-config' +import getSpreeSdkMethodFromEndpointPath from './utils/get-spree-sdk-method-from-endpoint-path' +import SpreeSdkMethodFromEndpointPathError from './errors/SpreeSdkMethodFromEndpointPathError' +import type { + FetcherVariables, + SpreeSdkResponse, + SpreeSdkResponseWithRawResponse, +} from './types' +import createCustomizedFetchFetcher, { + fetchResponseKey, +} from './utils/create-customized-fetch-fetcher' +import ensureFreshUserAccessToken from './utils/tokens/ensure-fresh-user-access-token' +import RefreshTokenError from './errors/RefreshTokenError' +import prettyPrintSpreeSdkErrors from './utils/pretty-print-spree-sdk-errors' + +const client = makeClient({ + host: requireConfigValue('apiHost') as string, + createFetcher: (fetcherOptions) => { + return createCustomizedFetchFetcher({ + fetch: globalThis.fetch, + requestConstructor: globalThis.Request, + ...fetcherOptions, + }) + }, +}) + +const normalizeSpreeSuccessResponse = ( + storeResponse: ResultResponse +): GraphQLFetcherResult => { + const data = storeResponse.success() + const rawFetchResponse = data[fetchResponseKey] + + return { + data, + res: rawFetchResponse, + } +} + +const fetcher: Fetcher> = async ( + requestOptions +) => { + const { url, method, variables, query } = requestOptions + + console.log( + 'Fetcher called. Configuration: ', + 'url = ', + url, + 'requestOptions = ', + requestOptions + ) + + if (!variables) { + throw new SpreeSdkMethodFromEndpointPathError( + `Required FetcherVariables not provided.` + ) + } + + const { + methodPath, + arguments: args, + refreshExpiredAccessToken = true, + replayUnauthorizedRequest = true, + } = variables as FetcherVariables + + if (refreshExpiredAccessToken) { + await ensureFreshUserAccessToken(client) + } + + const spreeSdkMethod = getSpreeSdkMethodFromEndpointPath(client, methodPath) + + const storeResponse: ResultResponse = + await spreeSdkMethod(...args) + + if (storeResponse.isSuccess()) { + return normalizeSpreeSuccessResponse(storeResponse) + } + + const storeResponseError = storeResponse.fail() + + if ( + storeResponseError instanceof errors.SpreeError && + storeResponseError.serverResponse.status === 401 && + replayUnauthorizedRequest + ) { + console.info( + 'Request ended with 401. Replaying request after refreshing the user token.' + ) + + await ensureFreshUserAccessToken(client) + + const replayedStoreResponse: ResultResponse = + await spreeSdkMethod(...args) + + if (replayedStoreResponse.isSuccess()) { + return normalizeSpreeSuccessResponse(replayedStoreResponse) + } + + console.warn('Replaying the request failed', replayedStoreResponse.fail()) + + throw new RefreshTokenError( + 'Could not authorize request with current access token.' + ) + } + + if (storeResponseError instanceof errors.SpreeError) { + console.error( + `Request to spree resulted in an error:\n\n${prettyPrintSpreeSdkErrors( + storeResponse.fail() + )}` + ) + + throw convertSpreeErrorToGraphQlError(storeResponseError) + } + + throw storeResponseError +} + +export default fetcher diff --git a/packages/spree/src/index.tsx b/packages/spree/src/index.tsx new file mode 100644 index 0000000..9291e2b --- /dev/null +++ b/packages/spree/src/index.tsx @@ -0,0 +1,49 @@ +import type { ComponentType, FunctionComponent } from 'react' +import { + Provider, + CommerceProviderProps, + CoreCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { spreeProvider } from './provider' +import type { SpreeProvider } from './provider' +import { SWRConfig } from 'swr' +import handleTokenErrors from './utils/handle-token-errors' +import useLogout from '@vercel/commerce/auth/use-logout' + +export { spreeProvider } +export type { SpreeProvider } + +export const WithTokenErrorsHandling: FunctionComponent = ({ children }) => { + const logout = useLogout() + + return ( + { + handleTokenErrors(error, () => void logout()) + }, + }} + > + {children} + + ) +} + +export const getCommerceProvider =

(provider: P) => { + return function CommerceProvider({ + children, + ...props + }: CommerceProviderProps) { + return ( + + {children} + + ) + } +} + +export const CommerceProvider = + getCommerceProvider(spreeProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/spree/src/isomorphic-config.ts b/packages/spree/src/isomorphic-config.ts new file mode 100644 index 0000000..b824fd8 --- /dev/null +++ b/packages/spree/src/isomorphic-config.ts @@ -0,0 +1,81 @@ +import forceIsomorphicConfigValues from './utils/force-isomorphic-config-values' +import requireConfig from './utils/require-config' +import validateAllProductsTaxonomyId from './utils/validations/validate-all-products-taxonomy-id' +import validateCookieExpire from './utils/validations/validate-cookie-expire' +import validateImagesOptionFilter from './utils/validations/validate-images-option-filter' +import validatePlaceholderImageUrl from './utils/validations/validate-placeholder-image-url' +import validateProductsPrerenderCount from './utils/validations/validate-products-prerender-count' +import validateImagesSize from './utils/validations/validate-images-size' +import validateImagesQuality from './utils/validations/validate-images-quality' + +const isomorphicConfig = { + apiHost: process.env.NEXT_PUBLIC_SPREE_API_HOST, + defaultLocale: process.env.NEXT_PUBLIC_SPREE_DEFAULT_LOCALE, + cartCookieName: process.env.NEXT_PUBLIC_SPREE_CART_COOKIE_NAME, + cartCookieExpire: validateCookieExpire( + process.env.NEXT_PUBLIC_SPREE_CART_COOKIE_EXPIRE + ), + userCookieName: process.env.NEXT_PUBLIC_SPREE_USER_COOKIE_NAME, + userCookieExpire: validateCookieExpire( + process.env.NEXT_PUBLIC_SPREE_CART_COOKIE_EXPIRE + ), + imageHost: process.env.NEXT_PUBLIC_SPREE_IMAGE_HOST, + categoriesTaxonomyPermalink: + process.env.NEXT_PUBLIC_SPREE_CATEGORIES_TAXONOMY_PERMALINK, + brandsTaxonomyPermalink: + process.env.NEXT_PUBLIC_SPREE_BRANDS_TAXONOMY_PERMALINK, + allProductsTaxonomyId: validateAllProductsTaxonomyId( + process.env.NEXT_PUBLIC_SPREE_ALL_PRODUCTS_TAXONOMY_ID + ), + showSingleVariantOptions: + process.env.NEXT_PUBLIC_SPREE_SHOW_SINGLE_VARIANT_OPTIONS === 'true', + lastUpdatedProductsPrerenderCount: validateProductsPrerenderCount( + process.env.NEXT_PUBLIC_SPREE_LAST_UPDATED_PRODUCTS_PRERENDER_COUNT + ), + productPlaceholderImageUrl: validatePlaceholderImageUrl( + process.env.NEXT_PUBLIC_SPREE_PRODUCT_PLACEHOLDER_IMAGE_URL + ), + lineItemPlaceholderImageUrl: validatePlaceholderImageUrl( + process.env.NEXT_PUBLIC_SPREE_LINE_ITEM_PLACEHOLDER_IMAGE_URL + ), + imagesOptionFilter: validateImagesOptionFilter( + process.env.NEXT_PUBLIC_SPREE_IMAGES_OPTION_FILTER + ), + imagesSize: validateImagesSize(process.env.NEXT_PUBLIC_SPREE_IMAGES_SIZE), + imagesQuality: validateImagesQuality( + process.env.NEXT_PUBLIC_SPREE_IMAGES_QUALITY + ), + loginAfterSignup: process.env.NEXT_PUBLIC_SPREE_LOGIN_AFTER_SIGNUP === 'true', +} + +export default forceIsomorphicConfigValues( + isomorphicConfig, + [], + [ + 'apiHost', + 'defaultLocale', + 'cartCookieName', + 'cartCookieExpire', + 'userCookieName', + 'userCookieExpire', + 'imageHost', + 'categoriesTaxonomyPermalink', + 'brandsTaxonomyPermalink', + 'allProductsTaxonomyId', + 'showSingleVariantOptions', + 'lastUpdatedProductsPrerenderCount', + 'productPlaceholderImageUrl', + 'lineItemPlaceholderImageUrl', + 'imagesOptionFilter', + 'imagesSize', + 'imagesQuality', + 'loginAfterSignup', + ] +) + +type IsomorphicConfig = typeof isomorphicConfig + +const requireConfigValue = (key: keyof IsomorphicConfig) => + requireConfig(isomorphicConfig, key) + +export { requireConfigValue } diff --git a/packages/spree/src/next.config.cjs b/packages/spree/src/next.config.cjs new file mode 100644 index 0000000..0aaa87e --- /dev/null +++ b/packages/spree/src/next.config.cjs @@ -0,0 +1,16 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: [process.env.NEXT_PUBLIC_SPREE_ALLOWED_IMAGE_DOMAIN], + }, + rewrites() { + return [ + { + source: '/checkout', + destination: '/api/checkout', + }, + ] + }, +} diff --git a/packages/spree/src/product/index.ts b/packages/spree/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/spree/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/spree/src/product/use-price.tsx b/packages/spree/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/spree/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/spree/src/product/use-search.tsx b/packages/spree/src/product/use-search.tsx new file mode 100644 index 0000000..7de5d82 --- /dev/null +++ b/packages/spree/src/product/use-search.tsx @@ -0,0 +1,104 @@ +import type { SWRHook } from '@vercel/commerce/utils/types' +import useSearch from '@vercel/commerce/product/use-search' +import type { + Product, + SearchProductsHook, +} from '@vercel/commerce/types/product' +import type { UseSearch } from '@vercel/commerce/product/use-search' +import normalizeProduct from '../utils/normalizations/normalize-product' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import { IProducts } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import { requireConfigValue } from '../isomorphic-config' + +const imagesSize = requireConfigValue('imagesSize') as string +const imagesQuality = requireConfigValue('imagesQuality') as number + +const nextToSpreeSortMap: { [key: string]: string } = { + 'trending-desc': 'available_on', + 'latest-desc': 'updated_at', + 'price-asc': 'price', + 'price-desc': '-price', +} + +export const handler: SWRHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'products', + query: 'list', + }, + async fetcher({ input, options, fetch }) { + // This method is only needed if the options need to be modified before calling the generic fetcher (created in createFetcher). + + console.info( + 'useSearch fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const taxons = [input.categoryId, input.brandId].filter(Boolean) + + const filter = { + filter: { + ...(taxons.length > 0 ? { taxons: taxons.join(',') } : {}), + ...(input.search ? { name: input.search } : {}), + }, + } + + const sort = input.sort ? { sort: nextToSpreeSortMap[input.sort] } : {} + + const { data: spreeSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'products.list', + arguments: [ + {}, + { + include: + 'primary_variant,variants,images,option_types,variants.option_values', + per_page: 50, + ...filter, + ...sort, + image_transformation: { + quality: imagesQuality, + size: imagesSize, + }, + }, + ], + }, + }) + + const normalizedProducts: Product[] = spreeSuccessResponse.data.map( + (spreeProduct) => normalizeProduct(spreeSuccessResponse, spreeProduct) + ) + + const found = spreeSuccessResponse.data.length > 0 + + return { products: normalizedProducts, found } + }, + useHook: ({ useData }) => { + const useWrappedHook: ReturnType['useHook']> = ( + input = {} + ) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + // revalidateOnFocus: false means do not fetch products again when website is refocused in the web browser. + ...input.swrOptions, + }, + }) + } + + return useWrappedHook + }, +} + +export default useSearch as UseSearch diff --git a/packages/spree/src/provider.ts b/packages/spree/src/provider.ts new file mode 100644 index 0000000..de6ddb2 --- /dev/null +++ b/packages/spree/src/provider.ts @@ -0,0 +1,35 @@ +import fetcher from './fetcher' +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' +import { handler as useCheckout } from './checkout/use-checkout' +import { handler as useWishlist } from './wishlist/use-wishlist' +import { handler as useWishlistAddItem } from './wishlist/use-add-item' +import { handler as useWishlistRemoveItem } from './wishlist/use-remove-item' +import { requireConfigValue } from './isomorphic-config' + +const spreeProvider = { + locale: requireConfigValue('defaultLocale') as string, + cartCookie: requireConfigValue('cartCookieName') as string, + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, + checkout: { useCheckout }, + wishlist: { + useWishlist, + useAddItem: useWishlistAddItem, + useRemoveItem: useWishlistRemoveItem, + }, +} + +export { spreeProvider } + +export type SpreeProvider = typeof spreeProvider diff --git a/packages/spree/src/types/index.ts b/packages/spree/src/types/index.ts new file mode 100644 index 0000000..74ddeb5 --- /dev/null +++ b/packages/spree/src/types/index.ts @@ -0,0 +1,164 @@ +import type { fetchResponseKey } from '../utils/create-customized-fetch-fetcher' +import type { + JsonApiDocument, + JsonApiListResponse, + JsonApiSingleResponse, +} from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi' +import type { ResultResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/ResultResponse' +import type { Response } from '@vercel/fetch' +import type { ProductOption, Product } from '@vercel/commerce/types/product' +import type { + AddItemHook, + RemoveItemHook, + WishlistItemBody, + WishlistTypes, +} from '@vercel/commerce/types/wishlist' + +export type UnknownObjectValues = Record + +export type NonUndefined = T extends undefined ? never : T + +export type ValueOf = T[keyof T] + +export type SpreeSdkResponse = JsonApiSingleResponse | JsonApiListResponse + +export type SpreeSdkResponseWithRawResponse = SpreeSdkResponse & { + [fetchResponseKey]: Response +} + +export type SpreeSdkResultResponseSuccessType = SpreeSdkResponseWithRawResponse + +export type SpreeSdkMethodReturnType< + ResultResponseSuccessType extends SpreeSdkResultResponseSuccessType = SpreeSdkResultResponseSuccessType +> = Promise> + +export type SpreeSdkMethod< + ResultResponseSuccessType extends SpreeSdkResultResponseSuccessType = SpreeSdkResultResponseSuccessType +> = (...args: any[]) => SpreeSdkMethodReturnType + +export type SpreeSdkVariables = { + methodPath: string + arguments: any[] +} + +export type FetcherVariables = SpreeSdkVariables & { + refreshExpiredAccessToken: boolean + replayUnauthorizedRequest: boolean +} + +export interface ImageStyle { + url: string + width: string + height: string + size: string +} + +export interface SpreeProductImage extends JsonApiDocument { + attributes: { + position: number + alt: string + original_url: string + transformed_url: string | null + styles: ImageStyle[] + } +} + +export interface OptionTypeAttr extends JsonApiDocument { + attributes: { + name: string + presentation: string + position: number + created_at: string + updated_at: string + filterable: boolean + } +} + +export interface LineItemAttr extends JsonApiDocument { + attributes: { + name: string + quantity: number + slug: string + options_text: string + price: string + currency: string + display_price: string + total: string + display_total: string + adjustment_total: string + display_adjustment_total: string + additional_tax_total: string + display_additional_tax_total: string + discounted_amount: string + display_discounted_amount: string + pre_tax_amount: string + display_pre_tax_amount: string + promo_total: string + display_promo_total: string + included_tax_total: string + display_inluded_tax_total: string + } +} + +export interface VariantAttr extends JsonApiDocument { + attributes: { + sku: string + price: string + currency: string + display_price: string + weight: string + height: string + width: string + depth: string + is_master: boolean + options_text: string + purchasable: boolean + in_stock: boolean + backorderable: boolean + } +} + +export interface ProductSlugAttr extends JsonApiDocument { + attributes: { + slug: string + } +} +export interface IProductsSlugs extends JsonApiListResponse { + data: ProductSlugAttr[] +} + +export type ExpandedProductOption = ProductOption & { position: number } + +export type UserOAuthTokens = { + refreshToken: string + accessToken: string +} + +// TODO: ExplicitCommerceWishlist is a temporary type +// derived from tsx views. It will be removed once +// Wishlist in @vercel/commerce/types/wishlist is updated +// to a more specific type than `any`. +export type ExplicitCommerceWishlist = { + id: string + token: string + items: { + id: string + product_id: number + variant_id: number + product: Product + }[] +} + +export type ExplicitWishlistAddItemHook = AddItemHook< + WishlistTypes & { + wishlist: ExplicitCommerceWishlist + itemBody: WishlistItemBody & { + wishlistToken?: string + } + } +> + +export type ExplicitWishlistRemoveItemHook = RemoveItemHook & { + fetcherInput: { wishlistToken?: string } + body: { wishlistToken?: string } +} diff --git a/packages/spree/src/utils/convert-spree-error-to-graph-ql-error.ts b/packages/spree/src/utils/convert-spree-error-to-graph-ql-error.ts new file mode 100644 index 0000000..f35a00d --- /dev/null +++ b/packages/spree/src/utils/convert-spree-error-to-graph-ql-error.ts @@ -0,0 +1,52 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import { errors } from '@spree/storefront-api-v2-sdk' + +const convertSpreeErrorToGraphQlError = ( + error: errors.SpreeError +): FetcherError => { + if (error instanceof errors.ExpandedSpreeError) { + // Assuming error.errors[key] is a list of strings. + + if ('base' in error.errors) { + const baseErrorMessage = error.errors.base as unknown as string + + return new FetcherError({ + status: error.serverResponse.status, + message: baseErrorMessage, + }) + } + + const fetcherErrors = Object.keys(error.errors).map((sdkErrorKey) => { + const errors = error.errors[sdkErrorKey] as string[] + + // Naively assume sdkErrorKey is a label. Capitalize it for a better + // out-of-the-box experience. + const capitalizedSdkErrorKey = sdkErrorKey.replace(/^\w/, (firstChar) => + firstChar.toUpperCase() + ) + + return { + message: `${capitalizedSdkErrorKey} ${errors.join(', ')}`, + } + }) + + return new FetcherError({ + status: error.serverResponse.status, + errors: fetcherErrors, + }) + } + + if (error instanceof errors.BasicSpreeError) { + return new FetcherError({ + status: error.serverResponse.status, + message: error.summary, + }) + } + + return new FetcherError({ + status: error.serverResponse.status, + message: error.message, + }) +} + +export default convertSpreeErrorToGraphQlError diff --git a/packages/spree/src/utils/create-customized-fetch-fetcher.ts b/packages/spree/src/utils/create-customized-fetch-fetcher.ts new file mode 100644 index 0000000..f0821c1 --- /dev/null +++ b/packages/spree/src/utils/create-customized-fetch-fetcher.ts @@ -0,0 +1,109 @@ +import { + errors, + request as spreeSdkRequestHelpers, +} from '@spree/storefront-api-v2-sdk' +import type { CreateCustomizedFetchFetcher } from '@spree/storefront-api-v2-sdk/types/interfaces/CreateCustomizedFetchFetcher' +import isJsonContentType from './is-json-content-type' + +export const fetchResponseKey = Symbol('fetch-response-key') + +const createCustomizedFetchFetcher: CreateCustomizedFetchFetcher = ( + fetcherOptions +) => { + const { FetchError } = errors + const sharedHeaders = { + 'Content-Type': 'application/json', + } + + const { host, fetch, requestConstructor } = fetcherOptions + + return { + fetch: async (fetchOptions) => { + // This fetcher always returns request equal null, + // because @vercel/fetch doesn't accept a Request object as argument + // and it's not used by NJC anyway. + try { + const { url, params, method, headers, responseParsing } = fetchOptions + const absoluteUrl = new URL(url, host) + let payload + + switch (method.toUpperCase()) { + case 'PUT': + case 'POST': + case 'DELETE': + case 'PATCH': + payload = { body: JSON.stringify(params) } + break + default: + payload = null + absoluteUrl.search = + spreeSdkRequestHelpers.objectToQuerystring(params) + } + + const request: Request = new requestConstructor( + absoluteUrl.toString(), + { + method: method.toUpperCase(), + headers: { ...sharedHeaders, ...headers }, + ...payload, + } + ) + + try { + console.info( + `Calling the Spree API: ${request.method} ${request.url}` + ) + + const response: Response = await fetch(request) + const responseContentType = response.headers.get('content-type') + let data + + if (responseParsing === 'automatic') { + if (responseContentType && isJsonContentType(responseContentType)) { + data = await response.json() + } else { + data = await response.text() + } + } else if (responseParsing === 'text') { + data = await response.text() + } else if (responseParsing === 'json') { + data = await response.json() + } else if (responseParsing === 'stream') { + data = await response.body + } + + if (!response.ok) { + // Use the "traditional" approach and reject non 2xx responses. + throw new FetchError(response, request, data) + } + + data[fetchResponseKey] = response + + return { data } + } catch (error) { + if (error instanceof FetchError) { + throw error + } + + if (!(error instanceof Error)) { + throw error + } + + throw new FetchError(null, request, null, error.message) + } + } catch (error) { + if (error instanceof FetchError) { + throw error + } + + if (!(error instanceof Error)) { + throw error + } + + throw new FetchError(null, null, null, error.message) + } + }, + } +} + +export default createCustomizedFetchFetcher diff --git a/packages/spree/src/utils/create-empty-cart.ts b/packages/spree/src/utils/create-empty-cart.ts new file mode 100644 index 0000000..efbd687 --- /dev/null +++ b/packages/spree/src/utils/create-empty-cart.ts @@ -0,0 +1,22 @@ +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { HookFetcherContext } from '@vercel/commerce/utils/types' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import ensureIToken from './tokens/ensure-itoken' + +const createEmptyCart = ( + fetch: HookFetcherContext<{ + data: any + }>['fetch'] +): Promise> => { + const token: IToken | undefined = ensureIToken() + + return fetch>({ + variables: { + methodPath: 'cart.create', + arguments: [token], + }, + }) +} + +export default createEmptyCart diff --git a/packages/spree/src/utils/create-get-absolute-image-url.ts b/packages/spree/src/utils/create-get-absolute-image-url.ts new file mode 100644 index 0000000..6e9e326 --- /dev/null +++ b/packages/spree/src/utils/create-get-absolute-image-url.ts @@ -0,0 +1,26 @@ +import { SpreeProductImage } from '../types' +import getImageUrl from './get-image-url' + +const createGetAbsoluteImageUrl = + (host: string, useOriginalImageSize: boolean = true) => + ( + image: SpreeProductImage, + minWidth: number, + minHeight: number + ): string | null => { + let url + + if (useOriginalImageSize) { + url = image.attributes.transformed_url || null + } else { + url = getImageUrl(image, minWidth, minHeight) + } + + if (url === null) { + return null + } + + return `${host}${url}` + } + +export default createGetAbsoluteImageUrl diff --git a/packages/spree/src/utils/expand-options.ts b/packages/spree/src/utils/expand-options.ts new file mode 100644 index 0000000..382ea3b --- /dev/null +++ b/packages/spree/src/utils/expand-options.ts @@ -0,0 +1,103 @@ +import type { ProductOptionValues } from '@vercel/commerce/types/product' +import type { + JsonApiDocument, + JsonApiResponse, +} from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi' +import { jsonApi } from '@spree/storefront-api-v2-sdk' +import type { RelationType } from '@spree/storefront-api-v2-sdk/types/interfaces/Relationships' +import SpreeResponseContentError from '../errors/SpreeResponseContentError' +import type { OptionTypeAttr, ExpandedProductOption } from '../types' +import sortOptionsByPosition from '../utils/sort-option-types' + +const isColorProductOption = (productOption: ExpandedProductOption) => { + return productOption.displayName === 'Color' +} + +const expandOptions = ( + spreeSuccessResponse: JsonApiResponse, + spreeOptionValue: JsonApiDocument, + accumulatedOptions: ExpandedProductOption[] +): ExpandedProductOption[] => { + const spreeOptionTypeIdentifier = spreeOptionValue.relationships.option_type + .data as RelationType + + const existingOptionIndex = accumulatedOptions.findIndex( + (option) => option.id == spreeOptionTypeIdentifier.id + ) + + let option: ExpandedProductOption + + if (existingOptionIndex === -1) { + const spreeOptionType = jsonApi.findDocument( + spreeSuccessResponse, + spreeOptionTypeIdentifier + ) + + if (!spreeOptionType) { + throw new SpreeResponseContentError( + `Option type with id ${spreeOptionTypeIdentifier.id} not found.` + ) + } + + option = { + __typename: 'MultipleChoiceOption', + id: spreeOptionType.id, + displayName: spreeOptionType.attributes.presentation, + position: spreeOptionType.attributes.position, + values: [], + } + } else { + const existingOption = accumulatedOptions[existingOptionIndex] + + option = existingOption + } + + let optionValue: ProductOptionValues + + const label = isColorProductOption(option) + ? spreeOptionValue.attributes.name + : spreeOptionValue.attributes.presentation + + const productOptionValueExists = option.values.some( + (optionValue: ProductOptionValues) => optionValue.label === label + ) + + if (!productOptionValueExists) { + if (isColorProductOption(option)) { + optionValue = { + label, + hexColors: [spreeOptionValue.attributes.presentation], + } + } else { + optionValue = { + label, + } + } + + if (existingOptionIndex === -1) { + return [ + ...accumulatedOptions, + { + ...option, + values: [optionValue], + }, + ] + } + + const expandedOptionValues = [...option.values, optionValue] + const expandedOptions = [...accumulatedOptions] + + expandedOptions[existingOptionIndex] = { + ...option, + values: expandedOptionValues, + } + + const sortedOptions = sortOptionsByPosition(expandedOptions) + + return sortedOptions + } + + return accumulatedOptions +} + +export default expandOptions diff --git a/packages/spree/src/utils/force-isomorphic-config-values.ts b/packages/spree/src/utils/force-isomorphic-config-values.ts new file mode 100644 index 0000000..630b685 --- /dev/null +++ b/packages/spree/src/utils/force-isomorphic-config-values.ts @@ -0,0 +1,43 @@ +import type { NonUndefined, UnknownObjectValues } from '../types' +import MisconfigurationError from '../errors/MisconfigurationError' +import isServer from './is-server' + +const generateMisconfigurationErrorMessage = ( + keys: Array +) => `${keys.join(', ')} must have a value before running the Framework.` + +const forceIsomorphicConfigValues = < + X extends keyof T, + T extends UnknownObjectValues, + H extends Record> +>( + config: T, + requiredServerKeys: string[], + requiredPublicKeys: X[] +) => { + if (isServer) { + const missingServerConfigValues = requiredServerKeys.filter( + (requiredServerKey) => typeof config[requiredServerKey] === 'undefined' + ) + + if (missingServerConfigValues.length > 0) { + throw new MisconfigurationError( + generateMisconfigurationErrorMessage(missingServerConfigValues) + ) + } + } + + const missingPublicConfigValues = requiredPublicKeys.filter( + (requiredPublicKey) => typeof config[requiredPublicKey] === 'undefined' + ) + + if (missingPublicConfigValues.length > 0) { + throw new MisconfigurationError( + generateMisconfigurationErrorMessage(missingPublicConfigValues) + ) + } + + return config as T & H +} + +export default forceIsomorphicConfigValues diff --git a/packages/spree/src/utils/get-image-url.ts b/packages/spree/src/utils/get-image-url.ts new file mode 100644 index 0000000..8594f5c --- /dev/null +++ b/packages/spree/src/utils/get-image-url.ts @@ -0,0 +1,44 @@ +// Based on https://github.com/spark-solutions/spree2vuestorefront/blob/d88d85ae1bcd2ec99b13b81cd2e3c25600a0216e/src/utils/index.ts + +import type { ImageStyle, SpreeProductImage } from '../types' + +const getImageUrl = ( + image: SpreeProductImage, + minWidth: number, + _: number +): string | null => { + // every image is still resized in vue-storefront-api, no matter what getImageUrl returns + if (image) { + const { + attributes: { styles }, + } = image + const bestStyleIndex = styles.reduce( + (bSIndex: number | null, style: ImageStyle, styleIndex: number) => { + // assuming all images are the same dimensions, just scaled + if (bSIndex === null) { + return 0 + } + const bestStyle = styles[bSIndex] + const widthDiff = +bestStyle.width - minWidth + const minWidthDiff = +style.width - minWidth + if (widthDiff < 0 && minWidthDiff > 0) { + return styleIndex + } + if (widthDiff > 0 && minWidthDiff < 0) { + return bSIndex + } + return Math.abs(widthDiff) < Math.abs(minWidthDiff) + ? bSIndex + : styleIndex + }, + null + ) + + if (bestStyleIndex !== null) { + return styles[bestStyleIndex].url + } + } + return null +} + +export default getImageUrl diff --git a/packages/spree/src/utils/get-media-gallery.ts b/packages/spree/src/utils/get-media-gallery.ts new file mode 100644 index 0000000..dd2dacb --- /dev/null +++ b/packages/spree/src/utils/get-media-gallery.ts @@ -0,0 +1,25 @@ +// Based on https://github.com/spark-solutions/spree2vuestorefront/blob/d88d85ae1bcd2ec99b13b81cd2e3c25600a0216e/src/utils/index.ts + +import type { ProductImage } from '@vercel/commerce/types/product' +import type { SpreeProductImage } from '../types' + +const getMediaGallery = ( + images: SpreeProductImage[], + getImageUrl: ( + image: SpreeProductImage, + minWidth: number, + minHeight: number + ) => string | null +) => { + return images.reduce((productImages, _, imageIndex) => { + const url = getImageUrl(images[imageIndex], 800, 800) + + if (url) { + return [...productImages, { url }] + } + + return productImages + }, []) +} + +export default getMediaGallery diff --git a/packages/spree/src/utils/get-product-path.ts b/packages/spree/src/utils/get-product-path.ts new file mode 100644 index 0000000..6749a4a --- /dev/null +++ b/packages/spree/src/utils/get-product-path.ts @@ -0,0 +1,7 @@ +import type { ProductSlugAttr } from '../types' + +const getProductPath = (partialSpreeProduct: ProductSlugAttr) => { + return `/${partialSpreeProduct.attributes.slug}` +} + +export default getProductPath diff --git a/packages/spree/src/utils/get-spree-sdk-method-from-endpoint-path.ts b/packages/spree/src/utils/get-spree-sdk-method-from-endpoint-path.ts new file mode 100644 index 0000000..9b87daa --- /dev/null +++ b/packages/spree/src/utils/get-spree-sdk-method-from-endpoint-path.ts @@ -0,0 +1,61 @@ +import type { Client } from '@spree/storefront-api-v2-sdk' +import SpreeSdkMethodFromEndpointPathError from '../errors/SpreeSdkMethodFromEndpointPathError' +import type { + SpreeSdkMethod, + SpreeSdkResultResponseSuccessType, +} from '../types' + +const getSpreeSdkMethodFromEndpointPath = < + ExactSpreeSdkClientType extends Client, + ResultResponseSuccessType extends SpreeSdkResultResponseSuccessType = SpreeSdkResultResponseSuccessType +>( + client: ExactSpreeSdkClientType, + path: string +): SpreeSdkMethod => { + const pathParts = path.split('.') + const reachedPath: string[] = [] + let node = >client + + console.log(`Looking for ${path} in Spree Sdk.`) + + while (reachedPath.length < pathParts.length - 1) { + const checkedPathPart = pathParts[reachedPath.length] + const checkedNode = node[checkedPathPart] + + console.log(`Checking part ${checkedPathPart}.`) + + if (typeof checkedNode !== 'object') { + throw new SpreeSdkMethodFromEndpointPathError( + `Couldn't reach ${path}. Farthest path reached was: ${reachedPath.join( + '.' + )}.` + ) + } + + if (checkedNode === null) { + throw new SpreeSdkMethodFromEndpointPathError( + `Path ${path} doesn't exist.` + ) + } + + node = >checkedNode + reachedPath.push(checkedPathPart) + } + + const foundEndpointMethod = node[pathParts[reachedPath.length]] + + if ( + reachedPath.length !== pathParts.length - 1 || + typeof foundEndpointMethod !== 'function' + ) { + throw new SpreeSdkMethodFromEndpointPathError( + `Couldn't reach ${path}. Farthest path reached was: ${reachedPath.join( + '.' + )}.` + ) + } + + return foundEndpointMethod.bind(node) +} + +export default getSpreeSdkMethodFromEndpointPath diff --git a/packages/spree/src/utils/handle-token-errors.ts b/packages/spree/src/utils/handle-token-errors.ts new file mode 100644 index 0000000..a5d49fd --- /dev/null +++ b/packages/spree/src/utils/handle-token-errors.ts @@ -0,0 +1,14 @@ +import AccessTokenError from '../errors/AccessTokenError' +import RefreshTokenError from '../errors/RefreshTokenError' + +const handleTokenErrors = (error: unknown, action: () => void): boolean => { + if (error instanceof AccessTokenError || error instanceof RefreshTokenError) { + action() + + return true + } + + return false +} + +export default handleTokenErrors diff --git a/packages/spree/src/utils/is-json-content-type.ts b/packages/spree/src/utils/is-json-content-type.ts new file mode 100644 index 0000000..fd82d65 --- /dev/null +++ b/packages/spree/src/utils/is-json-content-type.ts @@ -0,0 +1,5 @@ +const isJsonContentType = (contentType: string): boolean => + contentType.includes('application/json') || + contentType.includes('application/vnd.api+json') + +export default isJsonContentType diff --git a/packages/spree/src/utils/is-server.ts b/packages/spree/src/utils/is-server.ts new file mode 100644 index 0000000..4544a48 --- /dev/null +++ b/packages/spree/src/utils/is-server.ts @@ -0,0 +1 @@ +export default typeof window === 'undefined' diff --git a/packages/spree/src/utils/login.ts b/packages/spree/src/utils/login.ts new file mode 100644 index 0000000..1355566 --- /dev/null +++ b/packages/spree/src/utils/login.ts @@ -0,0 +1,58 @@ +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { HookFetcherContext } from '@vercel/commerce/utils/types' +import type { AuthTokenAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Authentication' +import type { AssociateCart } from '@spree/storefront-api-v2-sdk/types/interfaces/endpoints/CartClass' +import type { IOrder } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { + IOAuthToken, + IToken, +} from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import { getCartToken, removeCartToken } from './tokens/cart-token' +import { setUserTokenResponse } from './tokens/user-token-response' + +const login = async ( + fetch: HookFetcherContext<{ + data: any + }>['fetch'], + getTokenParameters: AuthTokenAttr, + associateGuestCart: boolean +): Promise => { + const { data: spreeGetTokenSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'authentication.getToken', + arguments: [getTokenParameters], + }, + }) + + setUserTokenResponse(spreeGetTokenSuccessResponse) + + if (associateGuestCart) { + const cartToken = getCartToken() + + if (cartToken) { + // If the user had a cart as guest still use its contents + // after logging in. + const accessToken = spreeGetTokenSuccessResponse.access_token + const token: IToken = { bearerToken: accessToken } + + const associateGuestCartParameters: AssociateCart = { + guest_order_token: cartToken, + } + + await fetch>({ + variables: { + methodPath: 'cart.associateGuestCart', + arguments: [token, associateGuestCartParameters], + }, + }) + + // We no longer need the guest cart token, so let's remove it. + } + } + + removeCartToken() +} + +export default login diff --git a/packages/spree/src/utils/normalizations/normalize-cart.ts b/packages/spree/src/utils/normalizations/normalize-cart.ts new file mode 100644 index 0000000..c5597fd --- /dev/null +++ b/packages/spree/src/utils/normalizations/normalize-cart.ts @@ -0,0 +1,211 @@ +import type { + Cart, + LineItem, + ProductVariant, + SelectedOption, +} from '@vercel/commerce/types/cart' +import MissingLineItemVariantError from '../../errors/MissingLineItemVariantError' +import { requireConfigValue } from '../../isomorphic-config' +import type { OrderAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Order' +import type { ProductAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import type { Image } from '@vercel/commerce/types/common' +import { jsonApi } from '@spree/storefront-api-v2-sdk' +import createGetAbsoluteImageUrl from '../create-get-absolute-image-url' +import getMediaGallery from '../get-media-gallery' +import type { + LineItemAttr, + OptionTypeAttr, + SpreeProductImage, + SpreeSdkResponse, + VariantAttr, +} from '../../types' + +const placeholderImage = requireConfigValue('lineItemPlaceholderImageUrl') as + | string + | false + +const isColorProductOption = (productOptionType: OptionTypeAttr) => { + return productOptionType.attributes.presentation === 'Color' +} + +const normalizeVariant = ( + spreeSuccessResponse: SpreeSdkResponse, + spreeVariant: VariantAttr +): ProductVariant => { + const spreeProduct = jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeVariant, + 'product' + ) + + if (spreeProduct === null) { + throw new MissingLineItemVariantError( + `Couldn't find product for variant with id ${spreeVariant.id}.` + ) + } + + const spreeVariantImageRecords = + jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeVariant, + 'images' + ) + + let lineItemImage + + const variantImage = getMediaGallery( + spreeVariantImageRecords, + createGetAbsoluteImageUrl(requireConfigValue('imageHost') as string) + )[0] + + if (variantImage) { + lineItemImage = variantImage + } else { + const spreeProductImageRecords = + jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeProduct, + 'images' + ) + + const productImage = getMediaGallery( + spreeProductImageRecords, + createGetAbsoluteImageUrl(requireConfigValue('imageHost') as string) + )[0] + + lineItemImage = productImage + } + + const image: Image = + lineItemImage ?? + (placeholderImage === false ? undefined : { url: placeholderImage }) + + return { + id: spreeVariant.id, + sku: spreeVariant.attributes.sku, + name: spreeProduct.attributes.name, + requiresShipping: true, + price: parseFloat(spreeVariant.attributes.price), + listPrice: parseFloat(spreeVariant.attributes.price), + image, + isInStock: spreeVariant.attributes.in_stock, + availableForSale: spreeVariant.attributes.purchasable, + ...(spreeVariant.attributes.weight === '0.0' + ? {} + : { + weight: { + value: parseFloat(spreeVariant.attributes.weight), + unit: 'KILOGRAMS', + }, + }), + // TODO: Add height, width and depth when Measurement type allows distance measurements. + } +} + +const normalizeLineItem = ( + spreeSuccessResponse: SpreeSdkResponse, + spreeLineItem: LineItemAttr +): LineItem => { + const variant = jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeLineItem, + 'variant' + ) + + if (variant === null) { + throw new MissingLineItemVariantError( + `Couldn't find variant for line item with id ${spreeLineItem.id}.` + ) + } + + const product = jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + variant, + 'product' + ) + + if (product === null) { + throw new MissingLineItemVariantError( + `Couldn't find product for variant with id ${variant.id}.` + ) + } + + // CartItem.tsx expects path without a '/' prefix unlike pages/product/[slug].tsx and others. + const path = `${product.attributes.slug}` + + const spreeOptionValues = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + variant, + 'option_values' + ) + + const options: SelectedOption[] = spreeOptionValues.map( + (spreeOptionValue) => { + const spreeOptionType = + jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeOptionValue, + 'option_type' + ) + + if (spreeOptionType === null) { + throw new MissingLineItemVariantError( + `Couldn't find option type of option value with id ${spreeOptionValue.id}.` + ) + } + + const label = isColorProductOption(spreeOptionType) + ? spreeOptionValue.attributes.name + : spreeOptionValue.attributes.presentation + + return { + id: spreeOptionValue.id, + name: spreeOptionType.attributes.presentation, + value: label, + } + } + ) + + return { + id: spreeLineItem.id, + variantId: variant.id, + productId: product.id, + name: spreeLineItem.attributes.name, + quantity: spreeLineItem.attributes.quantity, + discounts: [], // TODO: Implement when the template starts displaying them. + path, + variant: normalizeVariant(spreeSuccessResponse, variant), + options, + } +} + +const normalizeCart = ( + spreeSuccessResponse: SpreeSdkResponse, + spreeCart: OrderAttr +): Cart => { + const lineItems = jsonApi + .findRelationshipDocuments( + spreeSuccessResponse, + spreeCart, + 'line_items' + ) + .map((lineItem) => normalizeLineItem(spreeSuccessResponse, lineItem)) + + return { + id: spreeCart.id, + createdAt: spreeCart.attributes.created_at.toString(), + currency: { code: spreeCart.attributes.currency }, + taxesIncluded: true, + lineItems, + lineItemsSubtotalPrice: parseFloat(spreeCart.attributes.item_total), + subtotalPrice: parseFloat(spreeCart.attributes.item_total), + totalPrice: parseFloat(spreeCart.attributes.total), + customerId: spreeCart.attributes.token, + email: spreeCart.attributes.email, + discounts: [], // TODO: Implement when the template starts displaying them. + } +} + +export { normalizeLineItem } + +export default normalizeCart diff --git a/packages/spree/src/utils/normalizations/normalize-page.ts b/packages/spree/src/utils/normalizations/normalize-page.ts new file mode 100644 index 0000000..a2464ff --- /dev/null +++ b/packages/spree/src/utils/normalizations/normalize-page.ts @@ -0,0 +1,42 @@ +import { Page } from '@vercel/commerce/types/page' +import type { PageAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Page' +import { SpreeSdkResponse } from '../../types' + +const normalizePage = ( + _spreeSuccessResponse: SpreeSdkResponse, + spreePage: PageAttr, + commerceLocales: string[] +): Page => { + // If the locale returned by Spree is not available, search + // for a similar one. + + const spreeLocale = spreePage.attributes.locale + let usedCommerceLocale: string + + if (commerceLocales.includes(spreeLocale)) { + usedCommerceLocale = spreeLocale + } else { + const genericSpreeLocale = spreeLocale.split('-')[0] + + const foundExactGenericLocale = commerceLocales.includes(genericSpreeLocale) + + if (foundExactGenericLocale) { + usedCommerceLocale = genericSpreeLocale + } else { + const foundSimilarLocale = commerceLocales.find((locale) => { + return locale.split('-')[0] === genericSpreeLocale + }) + + usedCommerceLocale = foundSimilarLocale || spreeLocale + } + } + + return { + id: spreePage.id, + name: spreePage.attributes.title, + url: `/${usedCommerceLocale}/${spreePage.attributes.slug}`, + body: spreePage.attributes.content, + } +} + +export default normalizePage diff --git a/packages/spree/src/utils/normalizations/normalize-product.ts b/packages/spree/src/utils/normalizations/normalize-product.ts new file mode 100644 index 0000000..6965f01 --- /dev/null +++ b/packages/spree/src/utils/normalizations/normalize-product.ts @@ -0,0 +1,240 @@ +import type { + Product, + ProductImage, + ProductPrice, + ProductVariant, +} from '@vercel/commerce/types/product' +import type { ProductAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import type { RelationType } from '@spree/storefront-api-v2-sdk/types/interfaces/Relationships' +import { jsonApi } from '@spree/storefront-api-v2-sdk' +import { JsonApiDocument } from '@spree/storefront-api-v2-sdk/types/interfaces/JsonApi' +import { requireConfigValue } from '../../isomorphic-config' +import createGetAbsoluteImageUrl from '../create-get-absolute-image-url' +import expandOptions from '../expand-options' +import getMediaGallery from '../get-media-gallery' +import getProductPath from '../get-product-path' +import MissingPrimaryVariantError from '../../errors/MissingPrimaryVariantError' +import MissingOptionValueError from '../../errors/MissingOptionValueError' +import type { + ExpandedProductOption, + SpreeSdkResponse, + VariantAttr, +} from '../../types' + +const placeholderImage = requireConfigValue('productPlaceholderImageUrl') as + | string + | false + +const imagesOptionFilter = requireConfigValue('imagesOptionFilter') as + | string + | false + +const normalizeProduct = ( + spreeSuccessResponse: SpreeSdkResponse, + spreeProduct: ProductAttr +): Product => { + const spreePrimaryVariant = + jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeProduct, + 'primary_variant' + ) + + if (spreePrimaryVariant === null) { + throw new MissingPrimaryVariantError( + `Couldn't find primary variant for product with id ${spreeProduct.id}.` + ) + } + + const sku = spreePrimaryVariant.attributes.sku + + const price: ProductPrice = { + value: parseFloat(spreeProduct.attributes.price), + currencyCode: spreeProduct.attributes.currency, + } + + const hasNonMasterVariants = + (spreeProduct.relationships.variants.data as RelationType[]).length > 1 + + const showOptions = + (requireConfigValue('showSingleVariantOptions') as boolean) || + hasNonMasterVariants + + let options: ExpandedProductOption[] = [] + + const spreeVariantRecords = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeProduct, + 'variants' + ) + + // Use variants with option values if available. Fall back to + // Spree primary_variant if no explicit variants are present. + const spreeOptionsVariantsOrPrimary = + spreeVariantRecords.length === 0 + ? [spreePrimaryVariant] + : spreeVariantRecords + + const variants: ProductVariant[] = spreeOptionsVariantsOrPrimary.map( + (spreeVariantRecord) => { + let variantOptions: ExpandedProductOption[] = [] + + if (showOptions) { + const spreeOptionValues = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeVariantRecord, + 'option_values' + ) + + // Only include options which are used by variants. + + spreeOptionValues.forEach((spreeOptionValue) => { + variantOptions = expandOptions( + spreeSuccessResponse, + spreeOptionValue, + variantOptions + ) + + options = expandOptions( + spreeSuccessResponse, + spreeOptionValue, + options + ) + }) + } + + return { + id: spreeVariantRecord.id, + options: variantOptions, + } + } + ) + + const spreePrimaryVariantImageRecords = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreePrimaryVariant, + 'images' + ) + + let spreeVariantImageRecords: JsonApiDocument[] + + if (imagesOptionFilter === false) { + spreeVariantImageRecords = spreeVariantRecords.reduce( + (accumulatedImageRecords, spreeVariantRecord) => { + return [ + ...accumulatedImageRecords, + ...jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeVariantRecord, + 'images' + ), + ] + }, + [] + ) + } else { + const spreeOptionTypes = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeProduct, + 'option_types' + ) + + const imagesFilterOptionType = spreeOptionTypes.find( + (spreeOptionType) => + spreeOptionType.attributes.name === imagesOptionFilter + ) + + if (!imagesFilterOptionType) { + console.warn( + `Couldn't find option type having name ${imagesOptionFilter} for product with id ${spreeProduct.id}.` + + ' Showing no images for this product.' + ) + + spreeVariantImageRecords = [] + } else { + const imagesOptionTypeFilterId = imagesFilterOptionType.id + const includedOptionValuesImagesIds: string[] = [] + + spreeVariantImageRecords = spreeVariantRecords.reduce( + (accumulatedImageRecords, spreeVariantRecord) => { + const spreeVariantOptionValuesIdentifiers: RelationType[] = + spreeVariantRecord.relationships.option_values.data + + const spreeOptionValueOfFilterTypeIdentifier = + spreeVariantOptionValuesIdentifiers.find( + (spreeVariantOptionValuesIdentifier: RelationType) => + imagesFilterOptionType.relationships.option_values.data.some( + (filterOptionTypeValueIdentifier: RelationType) => + filterOptionTypeValueIdentifier.id === + spreeVariantOptionValuesIdentifier.id + ) + ) + + if (!spreeOptionValueOfFilterTypeIdentifier) { + throw new MissingOptionValueError( + `Couldn't find option value related to option type with id ${imagesOptionTypeFilterId}.` + ) + } + + const optionValueImagesAlreadyIncluded = + includedOptionValuesImagesIds.includes( + spreeOptionValueOfFilterTypeIdentifier.id + ) + + if (optionValueImagesAlreadyIncluded) { + return accumulatedImageRecords + } + + includedOptionValuesImagesIds.push( + spreeOptionValueOfFilterTypeIdentifier.id + ) + + return [ + ...accumulatedImageRecords, + ...jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeVariantRecord, + 'images' + ), + ] + }, + [] + ) + } + } + + const spreeImageRecords = [ + ...spreePrimaryVariantImageRecords, + ...spreeVariantImageRecords, + ] + + const productImages = getMediaGallery( + spreeImageRecords, + createGetAbsoluteImageUrl(requireConfigValue('imageHost') as string) + ) + + const images: ProductImage[] = + productImages.length === 0 + ? placeholderImage === false + ? [] + : [{ url: placeholderImage }] + : productImages + + const slug = spreeProduct.attributes.slug + const path = getProductPath(spreeProduct) + + return { + id: spreeProduct.id, + name: spreeProduct.attributes.name, + description: spreeProduct.attributes.description, + images, + variants, + options, + price, + slug, + path, + sku, + } +} + +export default normalizeProduct diff --git a/packages/spree/src/utils/normalizations/normalize-user.ts b/packages/spree/src/utils/normalizations/normalize-user.ts new file mode 100644 index 0000000..8b738fb --- /dev/null +++ b/packages/spree/src/utils/normalizations/normalize-user.ts @@ -0,0 +1,16 @@ +import type { Customer } from '@vercel/commerce/types/customer' +import type { AccountAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Account' +import type { SpreeSdkResponse } from '../../types' + +const normalizeUser = ( + _spreeSuccessResponse: SpreeSdkResponse, + spreeUser: AccountAttr +): Customer => { + const email = spreeUser.attributes.email + + return { + email, + } +} + +export default normalizeUser diff --git a/packages/spree/src/utils/normalizations/normalize-wishlist.ts b/packages/spree/src/utils/normalizations/normalize-wishlist.ts new file mode 100644 index 0000000..c9cfee2 --- /dev/null +++ b/packages/spree/src/utils/normalizations/normalize-wishlist.ts @@ -0,0 +1,68 @@ +import MissingProductError from '../../errors/MissingProductError' +import MissingVariantError from '../../errors/MissingVariantError' +import { jsonApi } from '@spree/storefront-api-v2-sdk' +import type { ProductAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Product' +import type { WishedItemAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/WishedItem' +import type { WishlistAttr } from '@spree/storefront-api-v2-sdk/types/interfaces/Wishlist' +import type { + ExplicitCommerceWishlist, + SpreeSdkResponse, + VariantAttr, +} from '../../types' +import normalizeProduct from './normalize-product' + +const normalizeWishlist = ( + spreeSuccessResponse: SpreeSdkResponse, + spreeWishlist: WishlistAttr +): ExplicitCommerceWishlist => { + const spreeWishedItems = jsonApi.findRelationshipDocuments( + spreeSuccessResponse, + spreeWishlist, + 'wished_items' + ) + + const items: ExplicitCommerceWishlist['items'] = spreeWishedItems.map( + (spreeWishedItem) => { + const spreeWishedVariant = + jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeWishedItem, + 'variant' + ) + + if (spreeWishedVariant === null) { + throw new MissingVariantError( + `Couldn't find variant for wished item with id ${spreeWishedItem.id}.` + ) + } + + const spreeWishedProduct = + jsonApi.findSingleRelationshipDocument( + spreeSuccessResponse, + spreeWishedVariant, + 'product' + ) + + if (spreeWishedProduct === null) { + throw new MissingProductError( + `Couldn't find product for variant with id ${spreeWishedVariant.id}.` + ) + } + + return { + id: spreeWishedItem.id, + product_id: parseInt(spreeWishedProduct.id, 10), + variant_id: parseInt(spreeWishedVariant.id, 10), + product: normalizeProduct(spreeSuccessResponse, spreeWishedProduct), + } + } + ) + + return { + id: spreeWishlist.id, + token: spreeWishlist.attributes.token, + items, + } +} + +export default normalizeWishlist diff --git a/packages/spree/src/utils/pretty-print-spree-sdk-errors.ts b/packages/spree/src/utils/pretty-print-spree-sdk-errors.ts new file mode 100644 index 0000000..7917420 --- /dev/null +++ b/packages/spree/src/utils/pretty-print-spree-sdk-errors.ts @@ -0,0 +1,21 @@ +import { errors } from '@spree/storefront-api-v2-sdk' + +const prettyPrintSpreeSdkErrors = (error: errors.SpreeSDKError): string => { + let prettyOutput = `Name: ${error.name}\nMessage: ${error.message}` + + if (error instanceof errors.BasicSpreeError) { + prettyOutput += `\nSpree summary: ${error.summary}` + + if (error instanceof errors.ExpandedSpreeError) { + prettyOutput += `\nSpree validation errors:\n${JSON.stringify( + error.errors, + null, + 2 + )}` + } + } + + return prettyOutput +} + +export default prettyPrintSpreeSdkErrors diff --git a/packages/spree/src/utils/require-config.ts b/packages/spree/src/utils/require-config.ts new file mode 100644 index 0000000..92b7916 --- /dev/null +++ b/packages/spree/src/utils/require-config.ts @@ -0,0 +1,16 @@ +import MissingConfigurationValueError from '../errors/MissingConfigurationValueError' +import type { NonUndefined, ValueOf } from '../types' + +const requireConfig = (isomorphicConfig: T, key: keyof T) => { + const valueUnderKey = isomorphicConfig[key] + + if (typeof valueUnderKey === 'undefined') { + throw new MissingConfigurationValueError( + `Value for configuration key ${key} was undefined.` + ) + } + + return valueUnderKey as NonUndefined> +} + +export default requireConfig diff --git a/packages/spree/src/utils/sort-option-types.ts b/packages/spree/src/utils/sort-option-types.ts new file mode 100644 index 0000000..bac632e --- /dev/null +++ b/packages/spree/src/utils/sort-option-types.ts @@ -0,0 +1,11 @@ +import type { ExpandedProductOption } from '../types' + +const sortOptionsByPosition = ( + options: ExpandedProductOption[] +): ExpandedProductOption[] => { + return options.sort((firstOption, secondOption) => { + return firstOption.position - secondOption.position + }) +} + +export default sortOptionsByPosition diff --git a/packages/spree/src/utils/tokens/cart-token.ts b/packages/spree/src/utils/tokens/cart-token.ts new file mode 100644 index 0000000..8352f9a --- /dev/null +++ b/packages/spree/src/utils/tokens/cart-token.ts @@ -0,0 +1,21 @@ +import { requireConfigValue } from '../../isomorphic-config' +import Cookies from 'js-cookie' + +export const getCartToken = () => + Cookies.get(requireConfigValue('cartCookieName') as string) + +export const setCartToken = (cartToken: string) => { + const cookieOptions = { + expires: requireConfigValue('cartCookieExpire') as number, + } + + Cookies.set( + requireConfigValue('cartCookieName') as string, + cartToken, + cookieOptions + ) +} + +export const removeCartToken = () => { + Cookies.remove(requireConfigValue('cartCookieName') as string) +} diff --git a/packages/spree/src/utils/tokens/ensure-fresh-user-access-token.ts b/packages/spree/src/utils/tokens/ensure-fresh-user-access-token.ts new file mode 100644 index 0000000..de22634 --- /dev/null +++ b/packages/spree/src/utils/tokens/ensure-fresh-user-access-token.ts @@ -0,0 +1,51 @@ +import { SpreeSdkResponseWithRawResponse } from '../../types' +import type { Client } from '@spree/storefront-api-v2-sdk' +import type { IOAuthToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import getSpreeSdkMethodFromEndpointPath from '../get-spree-sdk-method-from-endpoint-path' +import { + ensureUserTokenResponse, + removeUserTokenResponse, + setUserTokenResponse, +} from './user-token-response' +import AccessTokenError from '../../errors/AccessTokenError' + +/** + * If the user has a saved access token, make sure it's not expired + * If it is expired, attempt to refresh it. + */ +const ensureFreshUserAccessToken = async (client: Client): Promise => { + const userTokenResponse = ensureUserTokenResponse() + + if (!userTokenResponse) { + // There's no user token or it has an invalid format. + return + } + + const isAccessTokenExpired = + (userTokenResponse.created_at + userTokenResponse.expires_in) * 1000 < + Date.now() + + if (!isAccessTokenExpired) { + return + } + + const spreeRefreshAccessTokenSdkMethod = getSpreeSdkMethodFromEndpointPath< + Client, + SpreeSdkResponseWithRawResponse & IOAuthToken + >(client, 'authentication.refreshToken') + + const spreeRefreshAccessTokenResponse = + await spreeRefreshAccessTokenSdkMethod({ + refresh_token: userTokenResponse.refresh_token, + }) + + if (spreeRefreshAccessTokenResponse.isFail()) { + removeUserTokenResponse() + + throw new AccessTokenError('Could not refresh access token.') + } + + setUserTokenResponse(spreeRefreshAccessTokenResponse.success()) +} + +export default ensureFreshUserAccessToken diff --git a/packages/spree/src/utils/tokens/ensure-itoken.ts b/packages/spree/src/utils/tokens/ensure-itoken.ts new file mode 100644 index 0000000..0d4e6f8 --- /dev/null +++ b/packages/spree/src/utils/tokens/ensure-itoken.ts @@ -0,0 +1,25 @@ +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import { getCartToken } from './cart-token' +import { ensureUserTokenResponse } from './user-token-response' + +const ensureIToken = (): IToken | undefined => { + const userTokenResponse = ensureUserTokenResponse() + + if (userTokenResponse) { + return { + bearerToken: userTokenResponse.access_token, + } + } + + const cartToken = getCartToken() + + if (cartToken) { + return { + orderToken: cartToken, + } + } + + return undefined +} + +export default ensureIToken diff --git a/packages/spree/src/utils/tokens/is-logged-in.ts b/packages/spree/src/utils/tokens/is-logged-in.ts new file mode 100644 index 0000000..218c25b --- /dev/null +++ b/packages/spree/src/utils/tokens/is-logged-in.ts @@ -0,0 +1,9 @@ +import { ensureUserTokenResponse } from './user-token-response' + +const isLoggedIn = (): boolean => { + const userTokenResponse = ensureUserTokenResponse() + + return !!userTokenResponse +} + +export default isLoggedIn diff --git a/packages/spree/src/utils/tokens/revoke-user-tokens.ts b/packages/spree/src/utils/tokens/revoke-user-tokens.ts new file mode 100644 index 0000000..8213354 --- /dev/null +++ b/packages/spree/src/utils/tokens/revoke-user-tokens.ts @@ -0,0 +1,49 @@ +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { HookFetcherContext } from '@vercel/commerce/utils/types' +import TokensNotRejectedError from '../../errors/TokensNotRejectedError' +import type { UserOAuthTokens } from '../../types' +import type { EmptyObjectResponse } from '@spree/storefront-api-v2-sdk/types/interfaces/EmptyObject' + +const revokeUserTokens = async ( + fetch: HookFetcherContext<{ + data: any + }>['fetch'], + userTokens: UserOAuthTokens +): Promise => { + const spreeRevokeTokensResponses = await Promise.allSettled([ + fetch>({ + variables: { + methodPath: 'authentication.revokeToken', + arguments: [ + { + token: userTokens.refreshToken, + }, + ], + }, + }), + fetch>({ + variables: { + methodPath: 'authentication.revokeToken', + arguments: [ + { + token: userTokens.accessToken, + }, + ], + }, + }), + ]) + + const anyRejected = spreeRevokeTokensResponses.some( + (response) => response.status === 'rejected' + ) + + if (anyRejected) { + throw new TokensNotRejectedError( + 'Some tokens could not be rejected in Spree.' + ) + } + + return undefined +} + +export default revokeUserTokens diff --git a/packages/spree/src/utils/tokens/user-token-response.ts b/packages/spree/src/utils/tokens/user-token-response.ts new file mode 100644 index 0000000..0c524ec --- /dev/null +++ b/packages/spree/src/utils/tokens/user-token-response.ts @@ -0,0 +1,58 @@ +import { requireConfigValue } from '../../isomorphic-config' +import Cookies from 'js-cookie' +import type { IOAuthToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import UserTokenResponseParseError from '../../errors/UserTokenResponseParseError' + +export const getUserTokenResponse = (): IOAuthToken | undefined => { + const stringifiedToken = Cookies.get( + requireConfigValue('userCookieName') as string + ) + + if (!stringifiedToken) { + return undefined + } + + try { + const token: IOAuthToken = JSON.parse(stringifiedToken) + + return token + } catch (parseError) { + throw new UserTokenResponseParseError( + 'Could not parse stored user token response.' + ) + } +} + +/** + * Retrieves the saved user token response. If the response fails json parsing, + * removes the saved token and returns @type {undefined} instead. + */ +export const ensureUserTokenResponse = (): IOAuthToken | undefined => { + try { + return getUserTokenResponse() + } catch (error) { + if (error instanceof UserTokenResponseParseError) { + removeUserTokenResponse() + + return undefined + } + + throw error + } +} + +export const setUserTokenResponse = (token: IOAuthToken) => { + const cookieOptions = { + expires: requireConfigValue('userCookieExpire') as number, + } + + Cookies.set( + requireConfigValue('userCookieName') as string, + JSON.stringify(token), + cookieOptions + ) +} + +export const removeUserTokenResponse = () => { + Cookies.remove(requireConfigValue('userCookieName') as string) +} diff --git a/packages/spree/src/utils/validations/validate-all-products-taxonomy-id.ts b/packages/spree/src/utils/validations/validate-all-products-taxonomy-id.ts new file mode 100644 index 0000000..5eaaa0b --- /dev/null +++ b/packages/spree/src/utils/validations/validate-all-products-taxonomy-id.ts @@ -0,0 +1,13 @@ +const validateAllProductsTaxonomyId = (taxonomyId: unknown): string | false => { + if (!taxonomyId || taxonomyId === 'false') { + return false + } + + if (typeof taxonomyId === 'string') { + return taxonomyId + } + + throw new TypeError('taxonomyId must be a string or falsy.') +} + +export default validateAllProductsTaxonomyId diff --git a/packages/spree/src/utils/validations/validate-cookie-expire.ts b/packages/spree/src/utils/validations/validate-cookie-expire.ts new file mode 100644 index 0000000..1bd9872 --- /dev/null +++ b/packages/spree/src/utils/validations/validate-cookie-expire.ts @@ -0,0 +1,21 @@ +const validateCookieExpire = (expire: unknown): number => { + let expireInteger: number + + if (typeof expire === 'string') { + expireInteger = parseFloat(expire) + } else if (typeof expire === 'number') { + expireInteger = expire + } else { + throw new TypeError( + 'expire must be a string containing a number or an integer.' + ) + } + + if (expireInteger < 0) { + throw new RangeError('expire must be non-negative.') + } + + return expireInteger +} + +export default validateCookieExpire diff --git a/packages/spree/src/utils/validations/validate-images-option-filter.ts b/packages/spree/src/utils/validations/validate-images-option-filter.ts new file mode 100644 index 0000000..8b6ef98 --- /dev/null +++ b/packages/spree/src/utils/validations/validate-images-option-filter.ts @@ -0,0 +1,15 @@ +const validateImagesOptionFilter = ( + optionTypeNameOrFalse: unknown +): string | false => { + if (!optionTypeNameOrFalse || optionTypeNameOrFalse === 'false') { + return false + } + + if (typeof optionTypeNameOrFalse === 'string') { + return optionTypeNameOrFalse + } + + throw new TypeError('optionTypeNameOrFalse must be a string or falsy.') +} + +export default validateImagesOptionFilter diff --git a/packages/spree/src/utils/validations/validate-images-quality.ts b/packages/spree/src/utils/validations/validate-images-quality.ts new file mode 100644 index 0000000..909caad --- /dev/null +++ b/packages/spree/src/utils/validations/validate-images-quality.ts @@ -0,0 +1,23 @@ +const validateImagesQuality = (quality: unknown): number => { + let quality_level: number + + if (typeof quality === 'string') { + quality_level = parseInt(quality) + } else if (typeof quality === 'number') { + quality_level = quality + } else { + throw new TypeError( + 'prerenderCount count must be a string containing a number or an integer.' + ) + } + + if (quality_level === NaN) { + throw new TypeError( + 'prerenderCount count must be a string containing a number or an integer.' + ) + } + + return quality_level +} + +export default validateImagesQuality diff --git a/packages/spree/src/utils/validations/validate-images-size.ts b/packages/spree/src/utils/validations/validate-images-size.ts new file mode 100644 index 0000000..e02036d --- /dev/null +++ b/packages/spree/src/utils/validations/validate-images-size.ts @@ -0,0 +1,13 @@ +const validateImagesSize = (size: unknown): string => { + if (typeof size !== 'string') { + throw new TypeError('size must be a string.') + } + + if (!size.includes('x') || size.split('x').length != 2) { + throw new Error("size must have two numbers separated with an 'x'") + } + + return size +} + +export default validateImagesSize diff --git a/packages/spree/src/utils/validations/validate-placeholder-image-url.ts b/packages/spree/src/utils/validations/validate-placeholder-image-url.ts new file mode 100644 index 0000000..cce2e27 --- /dev/null +++ b/packages/spree/src/utils/validations/validate-placeholder-image-url.ts @@ -0,0 +1,15 @@ +const validatePlaceholderImageUrl = ( + placeholderUrlOrFalse: unknown +): string | false => { + if (!placeholderUrlOrFalse || placeholderUrlOrFalse === 'false') { + return false + } + + if (typeof placeholderUrlOrFalse === 'string') { + return placeholderUrlOrFalse + } + + throw new TypeError('placeholderUrlOrFalse must be a string or falsy.') +} + +export default validatePlaceholderImageUrl diff --git a/packages/spree/src/utils/validations/validate-products-prerender-count.ts b/packages/spree/src/utils/validations/validate-products-prerender-count.ts new file mode 100644 index 0000000..024db1e --- /dev/null +++ b/packages/spree/src/utils/validations/validate-products-prerender-count.ts @@ -0,0 +1,21 @@ +const validateProductsPrerenderCount = (prerenderCount: unknown): number => { + let prerenderCountInteger: number + + if (typeof prerenderCount === 'string') { + prerenderCountInteger = parseInt(prerenderCount) + } else if (typeof prerenderCount === 'number') { + prerenderCountInteger = prerenderCount + } else { + throw new TypeError( + 'prerenderCount count must be a string containing a number or an integer.' + ) + } + + if (prerenderCountInteger < 0) { + throw new RangeError('prerenderCount must be non-negative.') + } + + return prerenderCountInteger +} + +export default validateProductsPrerenderCount diff --git a/packages/spree/src/wishlist/index.ts b/packages/spree/src/wishlist/index.ts new file mode 100644 index 0000000..241af3c --- /dev/null +++ b/packages/spree/src/wishlist/index.ts @@ -0,0 +1,3 @@ +export { default as useAddItem } from './use-add-item' +export { default as useWishlist } from './use-wishlist' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/spree/src/wishlist/use-add-item.tsx b/packages/spree/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..010a71e --- /dev/null +++ b/packages/spree/src/wishlist/use-add-item.tsx @@ -0,0 +1,88 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useAddItem from '@vercel/commerce/wishlist/use-add-item' +import type { UseAddItem } from '@vercel/commerce/wishlist/use-add-item' +import useWishlist from './use-wishlist' +import type { ExplicitWishlistAddItemHook } from '../types' +import type { + WishedItem, + WishlistsAddWishedItem, +} from '@spree/storefront-api-v2-sdk/types/interfaces/WishedItem' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import ensureIToken from '../utils/tokens/ensure-itoken' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { AddItemHook } from '@vercel/commerce/types/wishlist' +import isLoggedIn from '../utils/tokens/is-logged-in' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + url: 'wishlists', + query: 'addWishedItem', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useAddItem (wishlist) fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { + item: { productId, variantId, wishlistToken }, + } = input + + if (!isLoggedIn() || !wishlistToken) { + return null + } + + let token: IToken | undefined = ensureIToken() + + const addItemParameters: WishlistsAddWishedItem = { + variant_id: `${variantId}`, + quantity: 1, + } + + await fetch>({ + variables: { + methodPath: 'wishlists.addWishedItem', + arguments: [token, wishlistToken, addItemParameters], + }, + }) + + return null + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const wishlist = useWishlist() + + return useCallback( + async (item) => { + if (!wishlist.data) { + return null + } + + const data = await fetch({ + input: { + item: { + ...item, + wishlistToken: wishlist.data.token, + }, + }, + }) + + await wishlist.mutate() + + return data + }, + [wishlist] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/wishlist/use-remove-item.tsx b/packages/spree/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..d8481f5 --- /dev/null +++ b/packages/spree/src/wishlist/use-remove-item.tsx @@ -0,0 +1,75 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useRemoveItem from '@vercel/commerce/wishlist/use-remove-item' +import type { UseRemoveItem } from '@vercel/commerce/wishlist/use-remove-item' +import useWishlist from './use-wishlist' +import type { ExplicitWishlistRemoveItemHook } from '../types' +import isLoggedIn from '../utils/tokens/is-logged-in' +import ensureIToken from '../utils/tokens/ensure-itoken' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { WishedItem } from '@spree/storefront-api-v2-sdk/types/interfaces/WishedItem' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + url: 'wishlists', + query: 'removeWishedItem', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useRemoveItem (wishlist) fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + const { itemId, wishlistToken } = input + + if (!isLoggedIn() || !wishlistToken) { + return null + } + + let token: IToken | undefined = ensureIToken() + + await fetch>({ + variables: { + methodPath: 'wishlists.removeWishedItem', + arguments: [token, wishlistToken, itemId], + }, + }) + + return null + }, + useHook: ({ fetch }) => { + const useWrappedHook: ReturnType< + MutationHook['useHook'] + > = () => { + const wishlist = useWishlist() + + return useCallback( + async (input) => { + if (!wishlist.data) { + return null + } + + const data = await fetch({ + input: { + itemId: `${input.id}`, + wishlistToken: wishlist.data.token, + }, + }) + + await wishlist.mutate() + + return data + }, + [wishlist] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/src/wishlist/use-wishlist.tsx b/packages/spree/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..9f25862 --- /dev/null +++ b/packages/spree/src/wishlist/use-wishlist.tsx @@ -0,0 +1,93 @@ +import { useMemo } from 'react' +import type { SWRHook } from '@vercel/commerce/utils/types' +import useWishlist from '@vercel/commerce/wishlist/use-wishlist' +import type { UseWishlist } from '@vercel/commerce/wishlist/use-wishlist' +import type { GetWishlistHook } from '@vercel/commerce/types/wishlist' +import type { IToken } from '@spree/storefront-api-v2-sdk/types/interfaces/Token' +import type { GraphQLFetcherResult } from '@vercel/commerce/api' +import type { Wishlist } from '@spree/storefront-api-v2-sdk/types/interfaces/Wishlist' +import ensureIToken from '../utils/tokens/ensure-itoken' +import normalizeWishlist from '../utils/normalizations/normalize-wishlist' +import isLoggedIn from '../utils/tokens/is-logged-in' + +export default useWishlist as UseWishlist + +export const handler: SWRHook = { + // Provide fetchOptions for SWR cache key + fetchOptions: { + url: 'wishlists', + query: 'default', + }, + async fetcher({ input, options, fetch }) { + console.info( + 'useWishlist fetcher called. Configuration: ', + 'input: ', + input, + 'options: ', + options + ) + + if (!isLoggedIn()) { + return null + } + + // TODO: Optimize with includeProducts. + + const token: IToken | undefined = ensureIToken() + + const { data: spreeWishlistsDefaultSuccessResponse } = await fetch< + GraphQLFetcherResult + >({ + variables: { + methodPath: 'wishlists.default', + arguments: [ + token, + { + include: [ + 'wished_items', + 'wished_items.variant', + 'wished_items.variant.product', + 'wished_items.variant.product.primary_variant', + 'wished_items.variant.product.images', + 'wished_items.variant.product.option_types', + 'wished_items.variant.product.variants', + 'wished_items.variant.product.variants.option_values', + ].join(','), + }, + ], + }, + }) + + return normalizeWishlist( + spreeWishlistsDefaultSuccessResponse, + spreeWishlistsDefaultSuccessResponse.data + ) + }, + useHook: ({ useData }) => { + const useWrappedHook: ReturnType['useHook']> = ( + input + ) => { + const response = useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.items?.length || 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + } + + return useWrappedHook + }, +} diff --git a/packages/spree/taskfile.js b/packages/spree/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/spree/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/spree/tsconfig.json b/packages/spree/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/spree/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/swell/.env.template b/packages/swell/.env.template new file mode 100644 index 0000000..62bbcf5 --- /dev/null +++ b/packages/swell/.env.template @@ -0,0 +1,7 @@ +COMMERCE_PROVIDER=@vercel/commerce-swell + +SWELL_STORE_DOMAIN= +SWELL_STOREFRONT_ACCESS_TOKEN= + +NEXT_PUBLIC_SWELL_STORE_ID= +NEXT_PUBLIC_SWELL_PUBLIC_KEY= diff --git a/packages/swell/.prettierignore b/packages/swell/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/swell/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/swell/.prettierrc b/packages/swell/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/swell/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/swell/package.json b/packages/swell/package.json new file mode 100644 index 0000000..27a1798 --- /dev/null +++ b/packages/swell/package.json @@ -0,0 +1,83 @@ +{ + "name": "@vercel/commerce-swell", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write ." + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist", + "schema.d.ts" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1", + "swell-js": "^4.0.0-next.0", + "lodash.debounce": "^4.0.8" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/lodash.debounce": "^4.0.6", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/swell/schema.d.ts b/packages/swell/schema.d.ts new file mode 100644 index 0000000..0ec6250 --- /dev/null +++ b/packages/swell/schema.d.ts @@ -0,0 +1,5002 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & + { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & + { [SubKey in K]: Maybe } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** An ISO-8601 encoded UTC date time string. Example value: `"2019-07-03T20:47:55Z"`. */ + DateTime: any + /** A signed decimal number, which supports arbitrary precision and is serialized as a string. Example value: `"29.99"`. */ + Decimal: any + /** A string containing HTML code. Example value: `"

Grey cotton knit sweater.

"`. */ + HTML: any + /** A monetary value string. Example value: `"100.57"`. */ + Money: any + /** + * An RFC 3986 and RFC 3987 compliant URI string. + * + * Example value: `"https://johns-apparel.myshopify.com"`. + * + */ + URL: any +} + +/** A version of the API. */ +export type ApiVersion = { + __typename?: 'ApiVersion' + /** The human-readable name of the version. */ + displayName: Scalars['String'] + /** The unique identifier of an ApiVersion. All supported API versions have a date-based (YYYY-MM) or `unstable` handle. */ + handle: Scalars['String'] + /** Whether the version is supported by Shopify. */ + supported: Scalars['Boolean'] +} + +/** Details about the gift card used on the checkout. */ +export type AppliedGiftCard = Node & { + __typename?: 'AppliedGiftCard' + /** + * The amount that was taken from the gift card by applying it. + * @deprecated Use `amountUsedV2` instead + */ + amountUsed: Scalars['Money'] + /** The amount that was taken from the gift card by applying it. */ + amountUsedV2: MoneyV2 + /** + * The amount left on the gift card. + * @deprecated Use `balanceV2` instead + */ + balance: Scalars['Money'] + /** The amount left on the gift card. */ + balanceV2: MoneyV2 + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The last characters of the gift card. */ + lastCharacters: Scalars['String'] + /** The amount that was applied to the checkout in its currency. */ + presentmentAmountUsed: MoneyV2 +} + +/** An article in an online store blog. */ +export type Article = Node & { + __typename?: 'Article' + /** + * The article's author. + * @deprecated Use `authorV2` instead + */ + author: ArticleAuthor + /** The article's author. */ + authorV2?: Maybe + /** The blog that the article belongs to. */ + blog: Blog + /** List of comments posted on the article. */ + comments: CommentConnection + /** Stripped content of the article, single line with HTML tags removed. */ + content: Scalars['String'] + /** The content of the article, complete with HTML formatting. */ + contentHtml: Scalars['HTML'] + /** Stripped excerpt of the article, single line with HTML tags removed. */ + excerpt?: Maybe + /** The excerpt of the article, complete with HTML formatting. */ + excerptHtml?: Maybe + /** A human-friendly unique string for the Article automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The image associated with the article. */ + image?: Maybe + /** The date and time when the article was published. */ + publishedAt: Scalars['DateTime'] + /** The article’s SEO information. */ + seo?: Maybe + /** A categorization that a article can be tagged with. */ + tags: Array + /** The article’s name. */ + title: Scalars['String'] + /** The url pointing to the article accessible from the web. */ + url: Scalars['URL'] +} + +/** An article in an online store blog. */ +export type ArticleCommentsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleContentArgs = { + truncateAt?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleExcerptArgs = { + truncateAt?: Maybe +} + +/** An article in an online store blog. */ +export type ArticleImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** The author of an article. */ +export type ArticleAuthor = { + __typename?: 'ArticleAuthor' + /** The author's bio. */ + bio?: Maybe + /** The author’s email. */ + email: Scalars['String'] + /** The author's first name. */ + firstName: Scalars['String'] + /** The author's last name. */ + lastName: Scalars['String'] + /** The author's full name. */ + name: Scalars['String'] +} + +/** An auto-generated type for paginating through multiple Articles. */ +export type ArticleConnection = { + __typename?: 'ArticleConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Article and a cursor during pagination. */ +export type ArticleEdge = { + __typename?: 'ArticleEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ArticleEdge. */ + node: Article +} + +/** The set of valid sort keys for the Article query. */ +export enum ArticleSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `blog_title` value. */ + BlogTitle = 'BLOG_TITLE', + /** Sort by the `author` value. */ + Author = 'AUTHOR', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `published_at` value. */ + PublishedAt = 'PUBLISHED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Represents a generic custom attribute. */ +export type Attribute = { + __typename?: 'Attribute' + /** Key or name of the attribute. */ + key: Scalars['String'] + /** Value of the attribute. */ + value?: Maybe +} + +/** Specifies the input fields required for an attribute. */ +export type AttributeInput = { + /** Key or name of the attribute. */ + key: Scalars['String'] + /** Value of the attribute. */ + value: Scalars['String'] +} + +/** Automatic discount applications capture the intentions of a discount that was automatically applied. */ +export type AutomaticDiscountApplication = DiscountApplication & { + __typename?: 'AutomaticDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** A collection of available shipping rates for a checkout. */ +export type AvailableShippingRates = { + __typename?: 'AvailableShippingRates' + /** + * Whether or not the shipping rates are ready. + * The `shippingRates` field is `null` when this value is `false`. + * This field should be polled until its value becomes `true`. + */ + ready: Scalars['Boolean'] + /** The fetched shipping rates. `null` until the `ready` field is `true`. */ + shippingRates?: Maybe> +} + +/** An online store blog. */ +export type Blog = Node & { + __typename?: 'Blog' + /** Find an article by its handle. */ + articleByHandle?: Maybe
+ /** List of the blog's articles. */ + articles: ArticleConnection + /** The authors who have contributed to the blog. */ + authors: Array + /** A human-friendly unique string for the Blog automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The blog's SEO information. */ + seo?: Maybe + /** The blogs’s title. */ + title: Scalars['String'] + /** The url pointing to the blog accessible from the web. */ + url: Scalars['URL'] +} + +/** An online store blog. */ +export type BlogArticleByHandleArgs = { + handle: Scalars['String'] +} + +/** An online store blog. */ +export type BlogArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** An auto-generated type for paginating through multiple Blogs. */ +export type BlogConnection = { + __typename?: 'BlogConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Blog and a cursor during pagination. */ +export type BlogEdge = { + __typename?: 'BlogEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of BlogEdge. */ + node: Blog +} + +/** The set of valid sort keys for the Blog query. */ +export enum BlogSortKeys { + /** Sort by the `handle` value. */ + Handle = 'HANDLE', + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Card brand, such as Visa or Mastercard, which can be used for payments. */ +export enum CardBrand { + /** Visa */ + Visa = 'VISA', + /** Mastercard */ + Mastercard = 'MASTERCARD', + /** Discover */ + Discover = 'DISCOVER', + /** American Express */ + AmericanExpress = 'AMERICAN_EXPRESS', + /** Diners Club */ + DinersClub = 'DINERS_CLUB', + /** JCB */ + Jcb = 'JCB', +} + +/** A container for all the information required to checkout items and pay. */ +export type Checkout = { + name: string + currency: string + support_email: string + fields: any[] + scripts: any[] + accounts: string + email_optin: boolean + terms_policy?: string + refund_policy?: string + privacy_policy?: string + theme?: string + countries: any[] + currencies: any[] + payment_methods: any[] + coupons: boolean + giftcards: boolean + + // __typename?: 'Checkout' + // /** The gift cards used on the checkout. */ + // appliedGiftCards: Array + // /** + // * The available shipping rates for this Checkout. + // * Should only be used when checkout `requiresShipping` is `true` and + // * the shipping address is valid. + // */ + // availableShippingRates?: Maybe + // /** The date and time when the checkout was completed. */ + // completedAt?: Maybe + // /** The date and time when the checkout was created. */ + // createdAt: Scalars['DateTime'] + // /** The currency code for the Checkout. */ + // currencyCode: CurrencyCode + // /** A list of extra information that is added to the checkout. */ + // customAttributes: Array + // /** + // * The customer associated with the checkout. + // * @deprecated This field will always return null. If you have an authentication token for the customer, you can use the `customer` field on the query root to retrieve it. + // */ + // customer?: Maybe + // /** Discounts that have been applied on the checkout. */ + // discountApplications: DiscountApplicationConnection + // /** The email attached to this checkout. */ + // email?: Maybe + // /** Globally unique identifier. */ + // id: Scalars['ID'] + // /** A list of line item objects, each one containing information about an item in the checkout. */ + // lineItems: CheckoutLineItemConnection + // /** The sum of all the prices of all the items in the checkout. Duties, taxes, shipping and discounts excluded. */ + // lineItemsSubtotalPrice: MoneyV2 + // /** The note associated with the checkout. */ + // note?: Maybe + // /** The resulting order from a paid checkout. */ + // order?: Maybe + // /** The Order Status Page for this Checkout, null when checkout is not completed. */ + // orderStatusUrl?: Maybe + // /** + // * The amount left to be paid. This is equal to the cost of the line items, taxes and shipping minus discounts and gift cards. + // * @deprecated Use `paymentDueV2` instead + // */ + // paymentDue: Scalars['Money'] + // /** The amount left to be paid. This is equal to the cost of the line items, duties, taxes and shipping minus discounts and gift cards. */ + // paymentDueV2: MoneyV2 + // /** + // * Whether or not the Checkout is ready and can be completed. Checkouts may + // * have asynchronous operations that can take time to finish. If you want + // * to complete a checkout or ensure all the fields are populated and up to + // * date, polling is required until the value is true. + // */ + // ready: Scalars['Boolean'] + // /** States whether or not the fulfillment requires shipping. */ + // requiresShipping: Scalars['Boolean'] + // /** The shipping address to where the line items will be shipped. */ + // shippingAddress?: Maybe + // /** The discounts that have been allocated onto the shipping line by discount applications. */ + // shippingDiscountAllocations: Array + // /** Once a shipping rate is selected by the customer it is transitioned to a `shipping_line` object. */ + // shippingLine?: Maybe + // /** + // * Price of the checkout before shipping and taxes. + // * @deprecated Use `subtotalPriceV2` instead + // */ + // subtotalPrice: Scalars['Money'] + // /** Price of the checkout before duties, shipping and taxes. */ + // subtotalPriceV2: MoneyV2 + // /** Specifies if the Checkout is tax exempt. */ + // taxExempt: Scalars['Boolean'] + // /** Specifies if taxes are included in the line item and shipping line prices. */ + // taxesIncluded: Scalars['Boolean'] + // /** + // * The sum of all the prices of all the items in the checkout, taxes and discounts included. + // * @deprecated Use `totalPriceV2` instead + // */ + // totalPrice: Scalars['Money'] + // /** The sum of all the prices of all the items in the checkout, duties, taxes and discounts included. */ + // totalPriceV2: MoneyV2 + // /** + // * The sum of all the taxes applied to the line items and shipping lines in the checkout. + // * @deprecated Use `totalTaxV2` instead + // */ + // totalTax: Scalars['Money'] + // /** The sum of all the taxes applied to the line items and shipping lines in the checkout. */ + // totalTaxV2: MoneyV2 + // /** The date and time when the checkout was last updated. */ + // updatedAt: Scalars['DateTime'] + // /** The url pointing to the checkout accessible from the web. */ + // webUrl: Scalars['URL'] +} + +/** A container for all the information required to checkout items and pay. */ +export type CheckoutDiscountApplicationsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A container for all the information required to checkout items and pay. */ +export type CheckoutLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Specifies the fields required to update a checkout's attributes. */ +export type CheckoutAttributesUpdateInput = { + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of the addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe +} + +/** Return type for `checkoutAttributesUpdate` mutation. */ +export type CheckoutAttributesUpdatePayload = { + __typename?: 'CheckoutAttributesUpdatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to update a checkout's attributes. */ +export type CheckoutAttributesUpdateV2Input = { + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of the addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe +} + +/** Return type for `checkoutAttributesUpdateV2` mutation. */ +export type CheckoutAttributesUpdateV2Payload = { + __typename?: 'CheckoutAttributesUpdateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteFree` mutation. */ +export type CheckoutCompleteFreePayload = { + __typename?: 'CheckoutCompleteFreePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithCreditCard` mutation. */ +export type CheckoutCompleteWithCreditCardPayload = { + __typename?: 'CheckoutCompleteWithCreditCardPayload' + /** The checkout on which the payment was applied. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithCreditCardV2` mutation. */ +export type CheckoutCompleteWithCreditCardV2Payload = { + __typename?: 'CheckoutCompleteWithCreditCardV2Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPayment` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentPayload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentPayload' + /** The checkout on which the payment was applied. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPaymentV2` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentV2Payload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentV2Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCompleteWithTokenizedPaymentV3` mutation. */ +export type CheckoutCompleteWithTokenizedPaymentV3Payload = { + __typename?: 'CheckoutCompleteWithTokenizedPaymentV3Payload' + /** The checkout on which the payment was applied. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** A representation of the attempted payment. */ + payment?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to create a checkout. */ +export type CheckoutCreateInput = { + /** The email with which the customer wants to checkout. */ + email?: Maybe + /** A list of line item objects, each one containing information about an item in the checkout. */ + lineItems?: Maybe> + /** The shipping address to where the line items will be shipped. */ + shippingAddress?: Maybe + /** The text of an optional note that a shop owner can attach to the checkout. */ + note?: Maybe + /** A list of extra information that is added to the checkout. */ + customAttributes?: Maybe> + /** + * Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + * The required attributes are city, province, and country. + * Full validation of addresses is still done at complete time. + */ + allowPartialAddresses?: Maybe + /** + * The three-letter currency code of one of the shop's enabled presentment currencies. + * Including this field creates a checkout in the specified currency. By default, new + * checkouts are created in the shop's primary currency. + */ + presentmentCurrencyCode?: Maybe +} + +/** Return type for `checkoutCreate` mutation. */ +export type CheckoutCreatePayload = { + __typename?: 'CheckoutCreatePayload' + /** The new checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerAssociate` mutation. */ +export type CheckoutCustomerAssociatePayload = { + __typename?: 'CheckoutCustomerAssociatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** The associated customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `checkoutCustomerAssociateV2` mutation. */ +export type CheckoutCustomerAssociateV2Payload = { + __typename?: 'CheckoutCustomerAssociateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** The associated customer object. */ + customer?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerDisassociate` mutation. */ +export type CheckoutCustomerDisassociatePayload = { + __typename?: 'CheckoutCustomerDisassociatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutCustomerDisassociateV2` mutation. */ +export type CheckoutCustomerDisassociateV2Payload = { + __typename?: 'CheckoutCustomerDisassociateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeApply` mutation. */ +export type CheckoutDiscountCodeApplyPayload = { + __typename?: 'CheckoutDiscountCodeApplyPayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeApplyV2` mutation. */ +export type CheckoutDiscountCodeApplyV2Payload = { + __typename?: 'CheckoutDiscountCodeApplyV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutDiscountCodeRemove` mutation. */ +export type CheckoutDiscountCodeRemovePayload = { + __typename?: 'CheckoutDiscountCodeRemovePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutEmailUpdate` mutation. */ +export type CheckoutEmailUpdatePayload = { + __typename?: 'CheckoutEmailUpdatePayload' + /** The checkout object with the updated email. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutEmailUpdateV2` mutation. */ +export type CheckoutEmailUpdateV2Payload = { + __typename?: 'CheckoutEmailUpdateV2Payload' + /** The checkout object with the updated email. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Possible error codes that could be returned by CheckoutUserError. */ +export enum CheckoutErrorCode { + /** Input value is blank. */ + Blank = 'BLANK', + /** Input value is invalid. */ + Invalid = 'INVALID', + /** Input value is too long. */ + TooLong = 'TOO_LONG', + /** Input value is not present. */ + Present = 'PRESENT', + /** Input value should be less than maximum allowed value. */ + LessThan = 'LESS_THAN', + /** Input value should be greater than or equal to minimum allowed value. */ + GreaterThanOrEqualTo = 'GREATER_THAN_OR_EQUAL_TO', + /** Input value should be less or equal to maximum allowed value. */ + LessThanOrEqualTo = 'LESS_THAN_OR_EQUAL_TO', + /** Checkout is already completed. */ + AlreadyCompleted = 'ALREADY_COMPLETED', + /** Checkout is locked. */ + Locked = 'LOCKED', + /** Input value is not supported. */ + NotSupported = 'NOT_SUPPORTED', + /** Input email contains an invalid domain name. */ + BadDomain = 'BAD_DOMAIN', + /** Input Zip is invalid for country provided. */ + InvalidForCountry = 'INVALID_FOR_COUNTRY', + /** Input Zip is invalid for country and province provided. */ + InvalidForCountryAndProvince = 'INVALID_FOR_COUNTRY_AND_PROVINCE', + /** Invalid state in country. */ + InvalidStateInCountry = 'INVALID_STATE_IN_COUNTRY', + /** Invalid province in country. */ + InvalidProvinceInCountry = 'INVALID_PROVINCE_IN_COUNTRY', + /** Invalid region in country. */ + InvalidRegionInCountry = 'INVALID_REGION_IN_COUNTRY', + /** Shipping rate expired. */ + ShippingRateExpired = 'SHIPPING_RATE_EXPIRED', + /** Gift card cannot be applied to a checkout that contains a gift card. */ + GiftCardUnusable = 'GIFT_CARD_UNUSABLE', + /** Gift card is disabled. */ + GiftCardDisabled = 'GIFT_CARD_DISABLED', + /** Gift card code is invalid. */ + GiftCardCodeInvalid = 'GIFT_CARD_CODE_INVALID', + /** Gift card has already been applied. */ + GiftCardAlreadyApplied = 'GIFT_CARD_ALREADY_APPLIED', + /** Gift card currency does not match checkout currency. */ + GiftCardCurrencyMismatch = 'GIFT_CARD_CURRENCY_MISMATCH', + /** Gift card is expired. */ + GiftCardExpired = 'GIFT_CARD_EXPIRED', + /** Gift card has no funds left. */ + GiftCardDepleted = 'GIFT_CARD_DEPLETED', + /** Gift card was not found. */ + GiftCardNotFound = 'GIFT_CARD_NOT_FOUND', + /** Cart does not meet discount requirements notice. */ + CartDoesNotMeetDiscountRequirementsNotice = 'CART_DOES_NOT_MEET_DISCOUNT_REQUIREMENTS_NOTICE', + /** Discount expired. */ + DiscountExpired = 'DISCOUNT_EXPIRED', + /** Discount disabled. */ + DiscountDisabled = 'DISCOUNT_DISABLED', + /** Discount limit reached. */ + DiscountLimitReached = 'DISCOUNT_LIMIT_REACHED', + /** Discount not found. */ + DiscountNotFound = 'DISCOUNT_NOT_FOUND', + /** Customer already used once per customer discount notice. */ + CustomerAlreadyUsedOncePerCustomerDiscountNotice = 'CUSTOMER_ALREADY_USED_ONCE_PER_CUSTOMER_DISCOUNT_NOTICE', + /** Checkout is already completed. */ + Empty = 'EMPTY', + /** Not enough in stock. */ + NotEnoughInStock = 'NOT_ENOUGH_IN_STOCK', + /** Missing payment input. */ + MissingPaymentInput = 'MISSING_PAYMENT_INPUT', + /** The amount of the payment does not match the value to be paid. */ + TotalPriceMismatch = 'TOTAL_PRICE_MISMATCH', + /** Line item was not found in checkout. */ + LineItemNotFound = 'LINE_ITEM_NOT_FOUND', + /** Unable to apply discount. */ + UnableToApply = 'UNABLE_TO_APPLY', + /** Discount already applied. */ + DiscountAlreadyApplied = 'DISCOUNT_ALREADY_APPLIED', +} + +/** Return type for `checkoutGiftCardApply` mutation. */ +export type CheckoutGiftCardApplyPayload = { + __typename?: 'CheckoutGiftCardApplyPayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardRemove` mutation. */ +export type CheckoutGiftCardRemovePayload = { + __typename?: 'CheckoutGiftCardRemovePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardRemoveV2` mutation. */ +export type CheckoutGiftCardRemoveV2Payload = { + __typename?: 'CheckoutGiftCardRemoveV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutGiftCardsAppend` mutation. */ +export type CheckoutGiftCardsAppendPayload = { + __typename?: 'CheckoutGiftCardsAppendPayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** A single line item in the checkout, grouped by variant and attributes. */ +export type CheckoutLineItem = Node & { + __typename?: 'CheckoutLineItem' + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes: Array + /** The discounts that have been allocated onto the checkout line item by discount applications. */ + discountAllocations: Array + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The quantity of the line item. */ + quantity: Scalars['Int'] + /** Title of the line item. Defaults to the product's title. */ + title: Scalars['String'] + /** Unit price of the line item. */ + unitPrice?: Maybe + /** Product variant of the line item. */ + variant?: Maybe +} + +/** An auto-generated type for paginating through multiple CheckoutLineItems. */ +export type CheckoutLineItemConnection = { + __typename?: 'CheckoutLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one CheckoutLineItem and a cursor during pagination. */ +export type CheckoutLineItemEdge = { + __typename?: 'CheckoutLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CheckoutLineItemEdge. */ + node: CheckoutLineItem +} + +/** Specifies the input fields to create a line item on a checkout. */ +export type CheckoutLineItemInput = { + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes?: Maybe> + /** The quantity of the line item. */ + quantity: Scalars['Int'] + /** The identifier of the product variant for the line item. */ + variantId: Scalars['ID'] +} + +/** Specifies the input fields to update a line item on the checkout. */ +export type CheckoutLineItemUpdateInput = { + /** The identifier of the line item. */ + id?: Maybe + /** The variant identifier of the line item. */ + variantId?: Maybe + /** The quantity of the line item. */ + quantity?: Maybe + /** Extra information in the form of an array of Key-Value pairs about the line item. */ + customAttributes?: Maybe> +} + +/** Return type for `checkoutLineItemsAdd` mutation. */ +export type CheckoutLineItemsAddPayload = { + __typename?: 'CheckoutLineItemsAddPayload' + /** The updated checkout object. */ + items?: Maybe + /** List of errors that occurred executing the mutation. */ + // checkoutUserErrors: Array + // /** + // * List of errors that occurred executing the mutation. + // * @deprecated Use `checkoutUserErrors` instead + // */ + // userErrors: Array +} + +/** Return type for `checkoutLineItemsRemove` mutation. */ +export type CheckoutLineItemsRemovePayload = { + __typename?: 'CheckoutLineItemsRemovePayload' + /** The updated checkout object. */ + items?: Maybe + /** List of errors that occurred executing the mutation. */ + // checkoutUserErrors: Array + // /** + // * List of errors that occurred executing the mutation. + // * @deprecated Use `checkoutUserErrors` instead + // */ + // userErrors: Array +} + +/** Return type for `checkoutLineItemsReplace` mutation. */ +export type CheckoutLineItemsReplacePayload = { + __typename?: 'CheckoutLineItemsReplacePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `checkoutLineItemsUpdate` mutation. */ +export type CheckoutLineItemsUpdatePayload = { + __typename?: 'CheckoutLineItemsUpdatePayload' + /** The updated checkout object. */ + items?: Maybe + /** List of errors that occurred executing the mutation. */ + // checkoutUserErrors: Array + // /** + // * List of errors that occurred executing the mutation. + // * @deprecated Use `checkoutUserErrors` instead + // */ + // userErrors: Array +} + +/** Return type for `checkoutShippingAddressUpdate` mutation. */ +export type CheckoutShippingAddressUpdatePayload = { + __typename?: 'CheckoutShippingAddressUpdatePayload' + /** The updated checkout object. */ + checkout: Checkout + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutShippingAddressUpdateV2` mutation. */ +export type CheckoutShippingAddressUpdateV2Payload = { + __typename?: 'CheckoutShippingAddressUpdateV2Payload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `checkoutShippingLineUpdate` mutation. */ +export type CheckoutShippingLineUpdatePayload = { + __typename?: 'CheckoutShippingLineUpdatePayload' + /** The updated checkout object. */ + checkout?: Maybe + /** List of errors that occurred executing the mutation. */ + checkoutUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `checkoutUserErrors` instead + */ + userErrors: Array +} + +/** Represents an error that happens during execution of a checkout mutation. */ +export type CheckoutUserError = DisplayableError & { + __typename?: 'CheckoutUserError' + /** Error code to uniquely identify the error. */ + code?: Maybe + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type Collection = Node & { + __typename?: 'Collection' + /** Stripped description of the collection, single line with HTML tags removed. */ + description: Scalars['String'] + /** The description of the collection, complete with HTML formatting. */ + descriptionHtml: Scalars['HTML'] + /** + * A human-friendly unique string for the collection automatically generated from its title. + * Limit of 255 characters. + */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Image associated with the collection. */ + image?: Maybe + /** List of products in the collection. */ + products: ProductConnection + /** The collection’s name. Limit of 255 characters. */ + title: Scalars['String'] + /** The date and time when the collection was last modified. */ + updatedAt: Scalars['DateTime'] +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionDescriptionArgs = { + truncateAt?: Maybe +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. */ +export type CollectionProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** An auto-generated type for paginating through multiple Collections. */ +export type CollectionConnection = { + __typename?: 'CollectionConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Collection and a cursor during pagination. */ +export type CollectionEdge = { + __typename?: 'CollectionEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CollectionEdge. */ + node: Collection +} + +/** The set of valid sort keys for the Collection query. */ +export enum CollectionSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A comment on an article. */ +export type Comment = Node & { + __typename?: 'Comment' + /** The comment’s author. */ + author: CommentAuthor + /** Stripped content of the comment, single line with HTML tags removed. */ + content: Scalars['String'] + /** The content of the comment, complete with HTML formatting. */ + contentHtml: Scalars['HTML'] + /** Globally unique identifier. */ + id: Scalars['ID'] +} + +/** A comment on an article. */ +export type CommentContentArgs = { + truncateAt?: Maybe +} + +/** The author of a comment. */ +export type CommentAuthor = { + __typename?: 'CommentAuthor' + /** The author's email. */ + email: Scalars['String'] + /** The author’s name. */ + name: Scalars['String'] +} + +/** An auto-generated type for paginating through multiple Comments. */ +export type CommentConnection = { + __typename?: 'CommentConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Comment and a cursor during pagination. */ +export type CommentEdge = { + __typename?: 'CommentEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of CommentEdge. */ + node: Comment +} + +/** ISO 3166-1 alpha-2 country codes with some differences. */ +export enum CountryCode { + /** Afghanistan. */ + Af = 'AF', + /** Åland Islands. */ + Ax = 'AX', + /** Albania. */ + Al = 'AL', + /** Algeria. */ + Dz = 'DZ', + /** Andorra. */ + Ad = 'AD', + /** Angola. */ + Ao = 'AO', + /** Anguilla. */ + Ai = 'AI', + /** Antigua & Barbuda. */ + Ag = 'AG', + /** Argentina. */ + Ar = 'AR', + /** Armenia. */ + Am = 'AM', + /** Aruba. */ + Aw = 'AW', + /** Australia. */ + Au = 'AU', + /** Austria. */ + At = 'AT', + /** Azerbaijan. */ + Az = 'AZ', + /** Bahamas. */ + Bs = 'BS', + /** Bahrain. */ + Bh = 'BH', + /** Bangladesh. */ + Bd = 'BD', + /** Barbados. */ + Bb = 'BB', + /** Belarus. */ + By = 'BY', + /** Belgium. */ + Be = 'BE', + /** Belize. */ + Bz = 'BZ', + /** Benin. */ + Bj = 'BJ', + /** Bermuda. */ + Bm = 'BM', + /** Bhutan. */ + Bt = 'BT', + /** Bolivia. */ + Bo = 'BO', + /** Bosnia & Herzegovina. */ + Ba = 'BA', + /** Botswana. */ + Bw = 'BW', + /** Bouvet Island. */ + Bv = 'BV', + /** Brazil. */ + Br = 'BR', + /** British Indian Ocean Territory. */ + Io = 'IO', + /** Brunei. */ + Bn = 'BN', + /** Bulgaria. */ + Bg = 'BG', + /** Burkina Faso. */ + Bf = 'BF', + /** Burundi. */ + Bi = 'BI', + /** Cambodia. */ + Kh = 'KH', + /** Canada. */ + Ca = 'CA', + /** Cape Verde. */ + Cv = 'CV', + /** Caribbean Netherlands. */ + Bq = 'BQ', + /** Cayman Islands. */ + Ky = 'KY', + /** Central African Republic. */ + Cf = 'CF', + /** Chad. */ + Td = 'TD', + /** Chile. */ + Cl = 'CL', + /** China. */ + Cn = 'CN', + /** Christmas Island. */ + Cx = 'CX', + /** Cocos (Keeling) Islands. */ + Cc = 'CC', + /** Colombia. */ + Co = 'CO', + /** Comoros. */ + Km = 'KM', + /** Congo - Brazzaville. */ + Cg = 'CG', + /** Congo - Kinshasa. */ + Cd = 'CD', + /** Cook Islands. */ + Ck = 'CK', + /** Costa Rica. */ + Cr = 'CR', + /** Croatia. */ + Hr = 'HR', + /** Cuba. */ + Cu = 'CU', + /** Curaçao. */ + Cw = 'CW', + /** Cyprus. */ + Cy = 'CY', + /** Czechia. */ + Cz = 'CZ', + /** Côte d’Ivoire. */ + Ci = 'CI', + /** Denmark. */ + Dk = 'DK', + /** Djibouti. */ + Dj = 'DJ', + /** Dominica. */ + Dm = 'DM', + /** Dominican Republic. */ + Do = 'DO', + /** Ecuador. */ + Ec = 'EC', + /** Egypt. */ + Eg = 'EG', + /** El Salvador. */ + Sv = 'SV', + /** Equatorial Guinea. */ + Gq = 'GQ', + /** Eritrea. */ + Er = 'ER', + /** Estonia. */ + Ee = 'EE', + /** Eswatini. */ + Sz = 'SZ', + /** Ethiopia. */ + Et = 'ET', + /** Falkland Islands. */ + Fk = 'FK', + /** Faroe Islands. */ + Fo = 'FO', + /** Fiji. */ + Fj = 'FJ', + /** Finland. */ + Fi = 'FI', + /** France. */ + Fr = 'FR', + /** French Guiana. */ + Gf = 'GF', + /** French Polynesia. */ + Pf = 'PF', + /** French Southern Territories. */ + Tf = 'TF', + /** Gabon. */ + Ga = 'GA', + /** Gambia. */ + Gm = 'GM', + /** Georgia. */ + Ge = 'GE', + /** Germany. */ + De = 'DE', + /** Ghana. */ + Gh = 'GH', + /** Gibraltar. */ + Gi = 'GI', + /** Greece. */ + Gr = 'GR', + /** Greenland. */ + Gl = 'GL', + /** Grenada. */ + Gd = 'GD', + /** Guadeloupe. */ + Gp = 'GP', + /** Guatemala. */ + Gt = 'GT', + /** Guernsey. */ + Gg = 'GG', + /** Guinea. */ + Gn = 'GN', + /** Guinea-Bissau. */ + Gw = 'GW', + /** Guyana. */ + Gy = 'GY', + /** Haiti. */ + Ht = 'HT', + /** Heard & McDonald Islands. */ + Hm = 'HM', + /** Vatican City. */ + Va = 'VA', + /** Honduras. */ + Hn = 'HN', + /** Hong Kong SAR. */ + Hk = 'HK', + /** Hungary. */ + Hu = 'HU', + /** Iceland. */ + Is = 'IS', + /** India. */ + In = 'IN', + /** Indonesia. */ + Id = 'ID', + /** Iran. */ + Ir = 'IR', + /** Iraq. */ + Iq = 'IQ', + /** Ireland. */ + Ie = 'IE', + /** Isle of Man. */ + Im = 'IM', + /** Israel. */ + Il = 'IL', + /** Italy. */ + It = 'IT', + /** Jamaica. */ + Jm = 'JM', + /** Japan. */ + Jp = 'JP', + /** Jersey. */ + Je = 'JE', + /** Jordan. */ + Jo = 'JO', + /** Kazakhstan. */ + Kz = 'KZ', + /** Kenya. */ + Ke = 'KE', + /** Kiribati. */ + Ki = 'KI', + /** North Korea. */ + Kp = 'KP', + /** Kosovo. */ + Xk = 'XK', + /** Kuwait. */ + Kw = 'KW', + /** Kyrgyzstan. */ + Kg = 'KG', + /** Laos. */ + La = 'LA', + /** Latvia. */ + Lv = 'LV', + /** Lebanon. */ + Lb = 'LB', + /** Lesotho. */ + Ls = 'LS', + /** Liberia. */ + Lr = 'LR', + /** Libya. */ + Ly = 'LY', + /** Liechtenstein. */ + Li = 'LI', + /** Lithuania. */ + Lt = 'LT', + /** Luxembourg. */ + Lu = 'LU', + /** Macao SAR. */ + Mo = 'MO', + /** Madagascar. */ + Mg = 'MG', + /** Malawi. */ + Mw = 'MW', + /** Malaysia. */ + My = 'MY', + /** Maldives. */ + Mv = 'MV', + /** Mali. */ + Ml = 'ML', + /** Malta. */ + Mt = 'MT', + /** Martinique. */ + Mq = 'MQ', + /** Mauritania. */ + Mr = 'MR', + /** Mauritius. */ + Mu = 'MU', + /** Mayotte. */ + Yt = 'YT', + /** Mexico. */ + Mx = 'MX', + /** Moldova. */ + Md = 'MD', + /** Monaco. */ + Mc = 'MC', + /** Mongolia. */ + Mn = 'MN', + /** Montenegro. */ + Me = 'ME', + /** Montserrat. */ + Ms = 'MS', + /** Morocco. */ + Ma = 'MA', + /** Mozambique. */ + Mz = 'MZ', + /** Myanmar (Burma). */ + Mm = 'MM', + /** Namibia. */ + Na = 'NA', + /** Nauru. */ + Nr = 'NR', + /** Nepal. */ + Np = 'NP', + /** Netherlands. */ + Nl = 'NL', + /** Netherlands Antilles. */ + An = 'AN', + /** New Caledonia. */ + Nc = 'NC', + /** New Zealand. */ + Nz = 'NZ', + /** Nicaragua. */ + Ni = 'NI', + /** Niger. */ + Ne = 'NE', + /** Nigeria. */ + Ng = 'NG', + /** Niue. */ + Nu = 'NU', + /** Norfolk Island. */ + Nf = 'NF', + /** North Macedonia. */ + Mk = 'MK', + /** Norway. */ + No = 'NO', + /** Oman. */ + Om = 'OM', + /** Pakistan. */ + Pk = 'PK', + /** Palestinian Territories. */ + Ps = 'PS', + /** Panama. */ + Pa = 'PA', + /** Papua New Guinea. */ + Pg = 'PG', + /** Paraguay. */ + Py = 'PY', + /** Peru. */ + Pe = 'PE', + /** Philippines. */ + Ph = 'PH', + /** Pitcairn Islands. */ + Pn = 'PN', + /** Poland. */ + Pl = 'PL', + /** Portugal. */ + Pt = 'PT', + /** Qatar. */ + Qa = 'QA', + /** Cameroon. */ + Cm = 'CM', + /** Réunion. */ + Re = 'RE', + /** Romania. */ + Ro = 'RO', + /** Russia. */ + Ru = 'RU', + /** Rwanda. */ + Rw = 'RW', + /** St. Barthélemy. */ + Bl = 'BL', + /** St. Helena. */ + Sh = 'SH', + /** St. Kitts & Nevis. */ + Kn = 'KN', + /** St. Lucia. */ + Lc = 'LC', + /** St. Martin. */ + Mf = 'MF', + /** St. Pierre & Miquelon. */ + Pm = 'PM', + /** Samoa. */ + Ws = 'WS', + /** San Marino. */ + Sm = 'SM', + /** São Tomé & Príncipe. */ + St = 'ST', + /** Saudi Arabia. */ + Sa = 'SA', + /** Senegal. */ + Sn = 'SN', + /** Serbia. */ + Rs = 'RS', + /** Seychelles. */ + Sc = 'SC', + /** Sierra Leone. */ + Sl = 'SL', + /** Singapore. */ + Sg = 'SG', + /** Sint Maarten. */ + Sx = 'SX', + /** Slovakia. */ + Sk = 'SK', + /** Slovenia. */ + Si = 'SI', + /** Solomon Islands. */ + Sb = 'SB', + /** Somalia. */ + So = 'SO', + /** South Africa. */ + Za = 'ZA', + /** South Georgia & South Sandwich Islands. */ + Gs = 'GS', + /** South Korea. */ + Kr = 'KR', + /** South Sudan. */ + Ss = 'SS', + /** Spain. */ + Es = 'ES', + /** Sri Lanka. */ + Lk = 'LK', + /** St. Vincent & Grenadines. */ + Vc = 'VC', + /** Sudan. */ + Sd = 'SD', + /** Suriname. */ + Sr = 'SR', + /** Svalbard & Jan Mayen. */ + Sj = 'SJ', + /** Sweden. */ + Se = 'SE', + /** Switzerland. */ + Ch = 'CH', + /** Syria. */ + Sy = 'SY', + /** Taiwan. */ + Tw = 'TW', + /** Tajikistan. */ + Tj = 'TJ', + /** Tanzania. */ + Tz = 'TZ', + /** Thailand. */ + Th = 'TH', + /** Timor-Leste. */ + Tl = 'TL', + /** Togo. */ + Tg = 'TG', + /** Tokelau. */ + Tk = 'TK', + /** Tonga. */ + To = 'TO', + /** Trinidad & Tobago. */ + Tt = 'TT', + /** Tunisia. */ + Tn = 'TN', + /** Turkey. */ + Tr = 'TR', + /** Turkmenistan. */ + Tm = 'TM', + /** Turks & Caicos Islands. */ + Tc = 'TC', + /** Tuvalu. */ + Tv = 'TV', + /** Uganda. */ + Ug = 'UG', + /** Ukraine. */ + Ua = 'UA', + /** United Arab Emirates. */ + Ae = 'AE', + /** United Kingdom. */ + Gb = 'GB', + /** United States. */ + Us = 'US', + /** U.S. Outlying Islands. */ + Um = 'UM', + /** Uruguay. */ + Uy = 'UY', + /** Uzbekistan. */ + Uz = 'UZ', + /** Vanuatu. */ + Vu = 'VU', + /** Venezuela. */ + Ve = 'VE', + /** Vietnam. */ + Vn = 'VN', + /** British Virgin Islands. */ + Vg = 'VG', + /** Wallis & Futuna. */ + Wf = 'WF', + /** Western Sahara. */ + Eh = 'EH', + /** Yemen. */ + Ye = 'YE', + /** Zambia. */ + Zm = 'ZM', + /** Zimbabwe. */ + Zw = 'ZW', +} + +/** Credit card information used for a payment. */ +export type CreditCard = { + __typename?: 'CreditCard' + /** The brand of the credit card. */ + brand?: Maybe + /** The expiry month of the credit card. */ + expiryMonth?: Maybe + /** The expiry year of the credit card. */ + expiryYear?: Maybe + /** The credit card's BIN number. */ + firstDigits?: Maybe + /** The first name of the card holder. */ + firstName?: Maybe + /** The last 4 digits of the credit card. */ + lastDigits?: Maybe + /** The last name of the card holder. */ + lastName?: Maybe + /** The masked credit card number with only the last 4 digits displayed. */ + maskedNumber?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a Shopify vaulted credit card payment. + */ +export type CreditCardPaymentInput = { + /** The amount of the payment. */ + amount: Scalars['Money'] + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The ID returned by Shopify's Card Vault. */ + vaultId: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a Shopify vaulted credit card payment. + */ +export type CreditCardPaymentInputV2 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The ID returned by Shopify's Card Vault. */ + vaultId: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe +} + +/** The part of the image that should remain after cropping. */ +export enum CropRegion { + /** Keep the center of the image. */ + Center = 'CENTER', + /** Keep the top of the image. */ + Top = 'TOP', + /** Keep the bottom of the image. */ + Bottom = 'BOTTOM', + /** Keep the left of the image. */ + Left = 'LEFT', + /** Keep the right of the image. */ + Right = 'RIGHT', +} + +/** Currency codes. */ +export enum CurrencyCode { + /** United States Dollars (USD). */ + Usd = 'USD', + /** Euro (EUR). */ + Eur = 'EUR', + /** United Kingdom Pounds (GBP). */ + Gbp = 'GBP', + /** Canadian Dollars (CAD). */ + Cad = 'CAD', + /** Afghan Afghani (AFN). */ + Afn = 'AFN', + /** Albanian Lek (ALL). */ + All = 'ALL', + /** Algerian Dinar (DZD). */ + Dzd = 'DZD', + /** Angolan Kwanza (AOA). */ + Aoa = 'AOA', + /** Argentine Pesos (ARS). */ + Ars = 'ARS', + /** Armenian Dram (AMD). */ + Amd = 'AMD', + /** Aruban Florin (AWG). */ + Awg = 'AWG', + /** Australian Dollars (AUD). */ + Aud = 'AUD', + /** Barbadian Dollar (BBD). */ + Bbd = 'BBD', + /** Azerbaijani Manat (AZN). */ + Azn = 'AZN', + /** Bangladesh Taka (BDT). */ + Bdt = 'BDT', + /** Bahamian Dollar (BSD). */ + Bsd = 'BSD', + /** Bahraini Dinar (BHD). */ + Bhd = 'BHD', + /** Burundian Franc (BIF). */ + Bif = 'BIF', + /** Belarusian Ruble (BYN). */ + Byn = 'BYN', + /** Belarusian Ruble (BYR). */ + Byr = 'BYR', + /** Belize Dollar (BZD). */ + Bzd = 'BZD', + /** Bermudian Dollar (BMD). */ + Bmd = 'BMD', + /** Bhutanese Ngultrum (BTN). */ + Btn = 'BTN', + /** Bosnia and Herzegovina Convertible Mark (BAM). */ + Bam = 'BAM', + /** Brazilian Real (BRL). */ + Brl = 'BRL', + /** Bolivian Boliviano (BOB). */ + Bob = 'BOB', + /** Botswana Pula (BWP). */ + Bwp = 'BWP', + /** Brunei Dollar (BND). */ + Bnd = 'BND', + /** Bulgarian Lev (BGN). */ + Bgn = 'BGN', + /** Burmese Kyat (MMK). */ + Mmk = 'MMK', + /** Cambodian Riel. */ + Khr = 'KHR', + /** Cape Verdean escudo (CVE). */ + Cve = 'CVE', + /** Cayman Dollars (KYD). */ + Kyd = 'KYD', + /** Central African CFA Franc (XAF). */ + Xaf = 'XAF', + /** Chilean Peso (CLP). */ + Clp = 'CLP', + /** Chinese Yuan Renminbi (CNY). */ + Cny = 'CNY', + /** Colombian Peso (COP). */ + Cop = 'COP', + /** Comorian Franc (KMF). */ + Kmf = 'KMF', + /** Congolese franc (CDF). */ + Cdf = 'CDF', + /** Costa Rican Colones (CRC). */ + Crc = 'CRC', + /** Croatian Kuna (HRK). */ + Hrk = 'HRK', + /** Czech Koruny (CZK). */ + Czk = 'CZK', + /** Danish Kroner (DKK). */ + Dkk = 'DKK', + /** Djiboutian Franc (DJF). */ + Djf = 'DJF', + /** Dominican Peso (DOP). */ + Dop = 'DOP', + /** East Caribbean Dollar (XCD). */ + Xcd = 'XCD', + /** Egyptian Pound (EGP). */ + Egp = 'EGP', + /** Eritrean Nakfa (ERN). */ + Ern = 'ERN', + /** Ethiopian Birr (ETB). */ + Etb = 'ETB', + /** Falkland Islands Pounds (FKP). */ + Fkp = 'FKP', + /** CFP Franc (XPF). */ + Xpf = 'XPF', + /** Fijian Dollars (FJD). */ + Fjd = 'FJD', + /** Gibraltar Pounds (GIP). */ + Gip = 'GIP', + /** Gambian Dalasi (GMD). */ + Gmd = 'GMD', + /** Ghanaian Cedi (GHS). */ + Ghs = 'GHS', + /** Guatemalan Quetzal (GTQ). */ + Gtq = 'GTQ', + /** Guyanese Dollar (GYD). */ + Gyd = 'GYD', + /** Georgian Lari (GEL). */ + Gel = 'GEL', + /** Guinean Franc (GNF). */ + Gnf = 'GNF', + /** Haitian Gourde (HTG). */ + Htg = 'HTG', + /** Honduran Lempira (HNL). */ + Hnl = 'HNL', + /** Hong Kong Dollars (HKD). */ + Hkd = 'HKD', + /** Hungarian Forint (HUF). */ + Huf = 'HUF', + /** Icelandic Kronur (ISK). */ + Isk = 'ISK', + /** Indian Rupees (INR). */ + Inr = 'INR', + /** Indonesian Rupiah (IDR). */ + Idr = 'IDR', + /** Israeli New Shekel (NIS). */ + Ils = 'ILS', + /** Iranian Rial (IRR). */ + Irr = 'IRR', + /** Iraqi Dinar (IQD). */ + Iqd = 'IQD', + /** Jamaican Dollars (JMD). */ + Jmd = 'JMD', + /** Japanese Yen (JPY). */ + Jpy = 'JPY', + /** Jersey Pound. */ + Jep = 'JEP', + /** Jordanian Dinar (JOD). */ + Jod = 'JOD', + /** Kazakhstani Tenge (KZT). */ + Kzt = 'KZT', + /** Kenyan Shilling (KES). */ + Kes = 'KES', + /** Kiribati Dollar (KID). */ + Kid = 'KID', + /** Kuwaiti Dinar (KWD). */ + Kwd = 'KWD', + /** Kyrgyzstani Som (KGS). */ + Kgs = 'KGS', + /** Laotian Kip (LAK). */ + Lak = 'LAK', + /** Latvian Lati (LVL). */ + Lvl = 'LVL', + /** Lebanese Pounds (LBP). */ + Lbp = 'LBP', + /** Lesotho Loti (LSL). */ + Lsl = 'LSL', + /** Liberian Dollar (LRD). */ + Lrd = 'LRD', + /** Libyan Dinar (LYD). */ + Lyd = 'LYD', + /** Lithuanian Litai (LTL). */ + Ltl = 'LTL', + /** Malagasy Ariary (MGA). */ + Mga = 'MGA', + /** Macedonia Denar (MKD). */ + Mkd = 'MKD', + /** Macanese Pataca (MOP). */ + Mop = 'MOP', + /** Malawian Kwacha (MWK). */ + Mwk = 'MWK', + /** Maldivian Rufiyaa (MVR). */ + Mvr = 'MVR', + /** Mauritanian Ouguiya (MRU). */ + Mru = 'MRU', + /** Mexican Pesos (MXN). */ + Mxn = 'MXN', + /** Malaysian Ringgits (MYR). */ + Myr = 'MYR', + /** Mauritian Rupee (MUR). */ + Mur = 'MUR', + /** Moldovan Leu (MDL). */ + Mdl = 'MDL', + /** Moroccan Dirham. */ + Mad = 'MAD', + /** Mongolian Tugrik. */ + Mnt = 'MNT', + /** Mozambican Metical. */ + Mzn = 'MZN', + /** Namibian Dollar. */ + Nad = 'NAD', + /** Nepalese Rupee (NPR). */ + Npr = 'NPR', + /** Netherlands Antillean Guilder. */ + Ang = 'ANG', + /** New Zealand Dollars (NZD). */ + Nzd = 'NZD', + /** Nicaraguan Córdoba (NIO). */ + Nio = 'NIO', + /** Nigerian Naira (NGN). */ + Ngn = 'NGN', + /** Norwegian Kroner (NOK). */ + Nok = 'NOK', + /** Omani Rial (OMR). */ + Omr = 'OMR', + /** Panamian Balboa (PAB). */ + Pab = 'PAB', + /** Pakistani Rupee (PKR). */ + Pkr = 'PKR', + /** Papua New Guinean Kina (PGK). */ + Pgk = 'PGK', + /** Paraguayan Guarani (PYG). */ + Pyg = 'PYG', + /** Peruvian Nuevo Sol (PEN). */ + Pen = 'PEN', + /** Philippine Peso (PHP). */ + Php = 'PHP', + /** Polish Zlotych (PLN). */ + Pln = 'PLN', + /** Qatari Rial (QAR). */ + Qar = 'QAR', + /** Romanian Lei (RON). */ + Ron = 'RON', + /** Russian Rubles (RUB). */ + Rub = 'RUB', + /** Rwandan Franc (RWF). */ + Rwf = 'RWF', + /** Samoan Tala (WST). */ + Wst = 'WST', + /** Saint Helena Pounds (SHP). */ + Shp = 'SHP', + /** Saudi Riyal (SAR). */ + Sar = 'SAR', + /** Sao Tome And Principe Dobra (STD). */ + Std = 'STD', + /** Serbian dinar (RSD). */ + Rsd = 'RSD', + /** Seychellois Rupee (SCR). */ + Scr = 'SCR', + /** Sierra Leonean Leone (SLL). */ + Sll = 'SLL', + /** Singapore Dollars (SGD). */ + Sgd = 'SGD', + /** Sudanese Pound (SDG). */ + Sdg = 'SDG', + /** Somali Shilling (SOS). */ + Sos = 'SOS', + /** Syrian Pound (SYP). */ + Syp = 'SYP', + /** South African Rand (ZAR). */ + Zar = 'ZAR', + /** South Korean Won (KRW). */ + Krw = 'KRW', + /** South Sudanese Pound (SSP). */ + Ssp = 'SSP', + /** Solomon Islands Dollar (SBD). */ + Sbd = 'SBD', + /** Sri Lankan Rupees (LKR). */ + Lkr = 'LKR', + /** Surinamese Dollar (SRD). */ + Srd = 'SRD', + /** Swazi Lilangeni (SZL). */ + Szl = 'SZL', + /** Swedish Kronor (SEK). */ + Sek = 'SEK', + /** Swiss Francs (CHF). */ + Chf = 'CHF', + /** Taiwan Dollars (TWD). */ + Twd = 'TWD', + /** Thai baht (THB). */ + Thb = 'THB', + /** Tajikistani Somoni (TJS). */ + Tjs = 'TJS', + /** Tanzanian Shilling (TZS). */ + Tzs = 'TZS', + /** Tongan Pa'anga (TOP). */ + Top = 'TOP', + /** Trinidad and Tobago Dollars (TTD). */ + Ttd = 'TTD', + /** Tunisian Dinar (TND). */ + Tnd = 'TND', + /** Turkish Lira (TRY). */ + Try = 'TRY', + /** Turkmenistani Manat (TMT). */ + Tmt = 'TMT', + /** Ugandan Shilling (UGX). */ + Ugx = 'UGX', + /** Ukrainian Hryvnia (UAH). */ + Uah = 'UAH', + /** United Arab Emirates Dirham (AED). */ + Aed = 'AED', + /** Uruguayan Pesos (UYU). */ + Uyu = 'UYU', + /** Uzbekistan som (UZS). */ + Uzs = 'UZS', + /** Vanuatu Vatu (VUV). */ + Vuv = 'VUV', + /** Venezuelan Bolivares (VEF). */ + Vef = 'VEF', + /** Venezuelan Bolivares (VES). */ + Ves = 'VES', + /** Vietnamese đồng (VND). */ + Vnd = 'VND', + /** West African CFA franc (XOF). */ + Xof = 'XOF', + /** Yemeni Rial (YER). */ + Yer = 'YER', + /** Zambian Kwacha (ZMW). */ + Zmw = 'ZMW', +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type Customer = { + __typename?: 'Customer' + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing: Scalars['Boolean'] + /** A list of addresses for the customer. */ + addresses: MailingAddressConnection + /** The date and time when the customer was created. */ + createdAt: Scalars['DateTime'] + /** The customer’s default address. */ + defaultAddress?: Maybe + /** The customer’s name, email or phone number. */ + displayName: Scalars['String'] + /** The customer’s email address. */ + email?: Maybe + /** The customer’s first name. */ + firstName?: Maybe + /** A unique identifier for the customer. */ + id: Scalars['ID'] + /** The customer's most recently updated, incomplete checkout. */ + lastIncompleteCheckout?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The orders associated with the customer. */ + orders: OrderConnection + /** The customer’s phone number. */ + phone?: Maybe + /** + * A comma separated list of tags that have been added to the customer. + * Additional access scope required: unauthenticated_read_customer_tags. + */ + tags: Array + /** The date and time when the customer information was updated. */ + updatedAt: Scalars['DateTime'] +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type CustomerAddressesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. */ +export type CustomerOrdersArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** A CustomerAccessToken represents the unique token required to make modifications to the customer object. */ +export type CustomerAccessToken = { + __typename?: 'CustomerAccessToken' + /** The customer’s access token. */ + accessToken: Scalars['String'] + /** The date and time when the customer access token expires. */ + expiresAt: Scalars['DateTime'] +} + +/** Specifies the input fields required to create a customer access token. */ +export type CustomerAccessTokenCreateInput = { + /** The email associated to the customer. */ + email: Scalars['String'] + /** The login password to be used by the customer. */ + password: Scalars['String'] +} + +/** Return type for `customerAccessTokenCreate` mutation. */ +export type CustomerAccessTokenCreatePayload = { + __typename?: 'CustomerAccessTokenCreatePayload' + /** The newly created customer access token object. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAccessTokenCreateWithMultipass` mutation. */ +export type CustomerAccessTokenCreateWithMultipassPayload = { + __typename?: 'CustomerAccessTokenCreateWithMultipassPayload' + /** An access token object associated with the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array +} + +/** Return type for `customerAccessTokenDelete` mutation. */ +export type CustomerAccessTokenDeletePayload = { + __typename?: 'CustomerAccessTokenDeletePayload' + /** The destroyed access token. */ + deletedAccessToken?: Maybe + /** ID of the destroyed customer access token. */ + deletedCustomerAccessTokenId?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `customerAccessTokenRenew` mutation. */ +export type CustomerAccessTokenRenewPayload = { + __typename?: 'CustomerAccessTokenRenewPayload' + /** The renewed customer access token object. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + userErrors: Array +} + +/** Return type for `customerActivateByUrl` mutation. */ +export type CustomerActivateByUrlPayload = { + __typename?: 'CustomerActivateByUrlPayload' + /** The customer that was activated. */ + customer?: Maybe + /** A new customer access token for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array +} + +/** Specifies the input fields required to activate a customer. */ +export type CustomerActivateInput = { + /** The activation token required to activate the customer. */ + activationToken: Scalars['String'] + /** New password that will be set during activation. */ + password: Scalars['String'] +} + +/** Return type for `customerActivate` mutation. */ +export type CustomerActivatePayload = { + __typename?: 'CustomerActivatePayload' + /** The customer object. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressCreate` mutation. */ +export type CustomerAddressCreatePayload = { + __typename?: 'CustomerAddressCreatePayload' + /** The new customer address object. */ + customerAddress?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressDelete` mutation. */ +export type CustomerAddressDeletePayload = { + __typename?: 'CustomerAddressDeletePayload' + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** ID of the deleted customer address. */ + deletedCustomerAddressId?: Maybe + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerAddressUpdate` mutation. */ +export type CustomerAddressUpdatePayload = { + __typename?: 'CustomerAddressUpdatePayload' + /** The customer’s updated mailing address. */ + customerAddress?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to create a new customer. */ +export type CustomerCreateInput = { + /** The customer’s first name. */ + firstName?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The customer’s email. */ + email: Scalars['String'] + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The login password used by the customer. */ + password: Scalars['String'] + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing?: Maybe +} + +/** Return type for `customerCreate` mutation. */ +export type CustomerCreatePayload = { + __typename?: 'CustomerCreatePayload' + /** The created customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerDefaultAddressUpdate` mutation. */ +export type CustomerDefaultAddressUpdatePayload = { + __typename?: 'CustomerDefaultAddressUpdatePayload' + /** The updated customer object. */ + customer?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Possible error codes that could be returned by CustomerUserError. */ +export enum CustomerErrorCode { + /** Input value is blank. */ + Blank = 'BLANK', + /** Input value is invalid. */ + Invalid = 'INVALID', + /** Input value is already taken. */ + Taken = 'TAKEN', + /** Input value is too long. */ + TooLong = 'TOO_LONG', + /** Input value is too short. */ + TooShort = 'TOO_SHORT', + /** Unidentified customer. */ + UnidentifiedCustomer = 'UNIDENTIFIED_CUSTOMER', + /** Customer is disabled. */ + CustomerDisabled = 'CUSTOMER_DISABLED', + /** Input password starts or ends with whitespace. */ + PasswordStartsOrEndsWithWhitespace = 'PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE', + /** Input contains HTML tags. */ + ContainsHtmlTags = 'CONTAINS_HTML_TAGS', + /** Input contains URL. */ + ContainsUrl = 'CONTAINS_URL', + /** Invalid activation token. */ + TokenInvalid = 'TOKEN_INVALID', + /** Customer already enabled. */ + AlreadyEnabled = 'ALREADY_ENABLED', + /** Address does not exist. */ + NotFound = 'NOT_FOUND', + /** Input email contains an invalid domain name. */ + BadDomain = 'BAD_DOMAIN', + /** Multipass token is not valid. */ + InvalidMultipassRequest = 'INVALID_MULTIPASS_REQUEST', +} + +/** Return type for `customerRecover` mutation. */ +export type CustomerRecoverPayload = { + __typename?: 'CustomerRecoverPayload' + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Return type for `customerResetByUrl` mutation. */ +export type CustomerResetByUrlPayload = { + __typename?: 'CustomerResetByUrlPayload' + /** The customer object which was reset. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to reset a customer’s password. */ +export type CustomerResetInput = { + /** The reset token required to reset the customer’s password. */ + resetToken: Scalars['String'] + /** New password that will be set as part of the reset password process. */ + password: Scalars['String'] +} + +/** Return type for `customerReset` mutation. */ +export type CustomerResetPayload = { + __typename?: 'CustomerResetPayload' + /** The customer object which was reset. */ + customer?: Maybe + /** A newly created customer access token object for the customer. */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Specifies the fields required to update the Customer information. */ +export type CustomerUpdateInput = { + /** The customer’s first name. */ + firstName?: Maybe + /** The customer’s last name. */ + lastName?: Maybe + /** The customer’s email. */ + email?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. To remove the phone number, specify `null`. + */ + phone?: Maybe + /** The login password used by the customer. */ + password?: Maybe + /** Indicates whether the customer has consented to be sent marketing material via email. */ + acceptsMarketing?: Maybe +} + +/** Return type for `customerUpdate` mutation. */ +export type CustomerUpdatePayload = { + __typename?: 'CustomerUpdatePayload' + /** The updated customer object. */ + customer?: Maybe + /** + * The newly created customer access token. If the customer's password is updated, all previous access tokens + * (including the one used to perform this mutation) become invalid, and a new token is generated. + */ + customerAccessToken?: Maybe + /** List of errors that occurred executing the mutation. */ + customerUserErrors: Array + /** + * List of errors that occurred executing the mutation. + * @deprecated Use `customerUserErrors` instead + */ + userErrors: Array +} + +/** Represents an error that happens during execution of a customer mutation. */ +export type CustomerUserError = DisplayableError & { + __typename?: 'CustomerUserError' + /** Error code to uniquely identify the error. */ + code?: Maybe + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Digital wallet, such as Apple Pay, which can be used for accelerated checkouts. */ +export enum DigitalWallet { + /** Apple Pay. */ + ApplePay = 'APPLE_PAY', + /** Android Pay. */ + AndroidPay = 'ANDROID_PAY', + /** Google Pay. */ + GooglePay = 'GOOGLE_PAY', + /** Shopify Pay. */ + ShopifyPay = 'SHOPIFY_PAY', +} + +/** An amount discounting the line that has been allocated by a discount. */ +export type DiscountAllocation = { + __typename?: 'DiscountAllocation' + /** Amount of discount allocated. */ + allocatedAmount: MoneyV2 + /** The discount this allocated amount originated from. */ + discountApplication: DiscountApplication +} + +/** + * Discount applications capture the intentions of a discount source at + * the time of application. + */ +export type DiscountApplication = { + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The value of the discount application. */ + value: PricingValue +} + +/** The method by which the discount's value is allocated onto its entitled lines. */ +export enum DiscountApplicationAllocationMethod { + /** The value is spread across all entitled lines. */ + Across = 'ACROSS', + /** The value is applied onto every entitled line. */ + Each = 'EACH', + /** The value is specifically applied onto a particular line. */ + One = 'ONE', +} + +/** An auto-generated type for paginating through multiple DiscountApplications. */ +export type DiscountApplicationConnection = { + __typename?: 'DiscountApplicationConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one DiscountApplication and a cursor during pagination. */ +export type DiscountApplicationEdge = { + __typename?: 'DiscountApplicationEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of DiscountApplicationEdge. */ + node: DiscountApplication +} + +/** + * Which lines on the order that the discount is allocated over, of the type + * defined by the Discount Application's target_type. + */ +export enum DiscountApplicationTargetSelection { + /** The discount is allocated onto all the lines. */ + All = 'ALL', + /** The discount is allocated onto only the lines it is entitled for. */ + Entitled = 'ENTITLED', + /** The discount is allocated onto explicitly chosen lines. */ + Explicit = 'EXPLICIT', +} + +/** The type of line (i.e. line item or shipping line) on an order that the discount is applicable towards. */ +export enum DiscountApplicationTargetType { + /** The discount applies onto line items. */ + LineItem = 'LINE_ITEM', + /** The discount applies onto shipping lines. */ + ShippingLine = 'SHIPPING_LINE', +} + +/** + * Discount code applications capture the intentions of a discount code at + * the time that it is applied. + */ +export type DiscountCodeApplication = DiscountApplication & { + __typename?: 'DiscountCodeApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** Specifies whether the discount code was applied successfully. */ + applicable: Scalars['Boolean'] + /** The string identifying the discount code that was used at the time of application. */ + code: Scalars['String'] + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The value of the discount application. */ + value: PricingValue +} + +/** Represents an error in the input of a mutation. */ +export type DisplayableError = { + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Represents a web address. */ +export type Domain = { + __typename?: 'Domain' + /** The host name of the domain (eg: `example.com`). */ + host: Scalars['String'] + /** Whether SSL is enabled or not. */ + sslEnabled: Scalars['Boolean'] + /** The URL of the domain (eg: `https://example.com`). */ + url: Scalars['URL'] +} + +/** Represents a video hosted outside of Shopify. */ +export type ExternalVideo = Node & + Media & { + __typename?: 'ExternalVideo' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** The URL. */ + embeddedUrl: Scalars['URL'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + } + +/** Represents a single fulfillment in an order. */ +export type Fulfillment = { + __typename?: 'Fulfillment' + /** List of the fulfillment's line items. */ + fulfillmentLineItems: FulfillmentLineItemConnection + /** The name of the tracking company. */ + trackingCompany?: Maybe + /** + * Tracking information associated with the fulfillment, + * such as the tracking number and tracking URL. + */ + trackingInfo: Array +} + +/** Represents a single fulfillment in an order. */ +export type FulfillmentFulfillmentLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Represents a single fulfillment in an order. */ +export type FulfillmentTrackingInfoArgs = { + first?: Maybe +} + +/** Represents a single line item in a fulfillment. There is at most one fulfillment line item for each order line item. */ +export type FulfillmentLineItem = { + __typename?: 'FulfillmentLineItem' + /** The associated order's line item. */ + lineItem: OrderLineItem + /** The amount fulfilled in this fulfillment. */ + quantity: Scalars['Int'] +} + +/** An auto-generated type for paginating through multiple FulfillmentLineItems. */ +export type FulfillmentLineItemConnection = { + __typename?: 'FulfillmentLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one FulfillmentLineItem and a cursor during pagination. */ +export type FulfillmentLineItemEdge = { + __typename?: 'FulfillmentLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of FulfillmentLineItemEdge. */ + node: FulfillmentLineItem +} + +/** Tracking information associated with the fulfillment. */ +export type FulfillmentTrackingInfo = { + __typename?: 'FulfillmentTrackingInfo' + /** The tracking number of the fulfillment. */ + number?: Maybe + /** The URL to track the fulfillment. */ + url?: Maybe +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafields = { + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafieldsMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** Represents information about the metafields associated to the specified resource. */ +export type HasMetafieldsMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** Represents an image resource. */ +export type Image = { + __typename?: 'Image' + /** A word or phrase to share the nature or contents of an image. */ + altText?: Maybe + /** The original height of the image in pixels. Returns `null` if the image is not hosted by Shopify. */ + height?: Maybe + /** A unique identifier for the image. */ + id?: Maybe + /** + * The location of the original image as a URL. + * + * If there are any existing transformations in the original source URL, they will remain and not be stripped. + */ + originalSrc: Scalars['URL'] + /** + * The location of the image as a URL. + * @deprecated Previously an image had a single `src` field. This could either return the original image + * location or a URL that contained transformations such as sizing or scale. + * + * These transformations were specified by arguments on the parent field. + * + * Now an image has two distinct URL fields: `originalSrc` and `transformedSrc`. + * + * * `originalSrc` - the original unmodified image URL + * * `transformedSrc` - the image URL with the specified transformations included + * + * To migrate to the new fields, image transformations should be moved from the parent field to `transformedSrc`. + * + * Before: + * ```graphql + * { + * shop { + * productImages(maxWidth: 200, scale: 2) { + * edges { + * node { + * src + * } + * } + * } + * } + * } + * ``` + * + * After: + * ```graphql + * { + * shop { + * productImages { + * edges { + * node { + * transformedSrc(maxWidth: 200, scale: 2) + * } + * } + * } + * } + * } + * ``` + * + */ + src: Scalars['URL'] + /** + * The location of the transformed image as a URL. + * + * All transformation arguments are considered "best-effort". If they can be applied to an image, they will be. + * Otherwise any transformations which an image type does not support will be ignored. + */ + transformedSrc: Scalars['URL'] + /** The original width of the image in pixels. Returns `null` if the image is not hosted by Shopify. */ + width?: Maybe +} + +/** Represents an image resource. */ +export type ImageTransformedSrcArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe + preferredContentType?: Maybe +} + +/** An auto-generated type for paginating through multiple Images. */ +export type ImageConnection = { + __typename?: 'ImageConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** List of supported image content types. */ +export enum ImageContentType { + /** A PNG image. */ + Png = 'PNG', + /** A JPG image. */ + Jpg = 'JPG', + /** A WEBP image. */ + Webp = 'WEBP', +} + +/** An auto-generated type which holds one Image and a cursor during pagination. */ +export type ImageEdge = { + __typename?: 'ImageEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ImageEdge. */ + node: Image +} + +/** Represents a mailing address for customers and shipping. */ +export type MailingAddress = Node & { + __typename?: 'MailingAddress' + /** The first line of the address. Typically the street address or PO Box number. */ + address1?: Maybe + /** The second line of the address. Typically the number of the apartment, suite, or unit. */ + address2?: Maybe + /** The name of the city, district, village, or town. */ + city?: Maybe + /** The name of the customer's company or organization. */ + company?: Maybe + /** The name of the country. */ + country?: Maybe + /** + * The two-letter code for the country of the address. + * + * For example, US. + * @deprecated Use `countryCodeV2` instead + */ + countryCode?: Maybe + /** + * The two-letter code for the country of the address. + * + * For example, US. + */ + countryCodeV2?: Maybe + /** The first name of the customer. */ + firstName?: Maybe + /** A formatted version of the address, customized by the provided arguments. */ + formatted: Array + /** A comma-separated list of the values for city, province, and country. */ + formattedArea?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The last name of the customer. */ + lastName?: Maybe + /** The latitude coordinate of the customer address. */ + latitude?: Maybe + /** The longitude coordinate of the customer address. */ + longitude?: Maybe + /** The full name of the customer, based on firstName and lastName. */ + name?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The region of the address, such as the province, state, or district. */ + province?: Maybe + /** + * The two-letter code for the region. + * + * For example, ON. + */ + provinceCode?: Maybe + /** The zip or postal code of the address. */ + zip?: Maybe +} + +/** Represents a mailing address for customers and shipping. */ +export type MailingAddressFormattedArgs = { + withName?: Maybe + withCompany?: Maybe +} + +/** An auto-generated type for paginating through multiple MailingAddresses. */ +export type MailingAddressConnection = { + __typename?: 'MailingAddressConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one MailingAddress and a cursor during pagination. */ +export type MailingAddressEdge = { + __typename?: 'MailingAddressEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MailingAddressEdge. */ + node: MailingAddress +} + +/** Specifies the fields accepted to create or update a mailing address. */ +export type MailingAddressInput = { + /** The first line of the address. Typically the street address or PO Box number. */ + address1?: Maybe + /** The second line of the address. Typically the number of the apartment, suite, or unit. */ + address2?: Maybe + /** The name of the city, district, village, or town. */ + city?: Maybe + /** The name of the customer's company or organization. */ + company?: Maybe + /** The name of the country. */ + country?: Maybe + /** The first name of the customer. */ + firstName?: Maybe + /** The last name of the customer. */ + lastName?: Maybe + /** + * A unique phone number for the customer. + * + * Formatted using E.164 standard. For example, _+16135551111_. + */ + phone?: Maybe + /** The region of the address, such as the province, state, or district. */ + province?: Maybe + /** The zip or postal code of the address. */ + zip?: Maybe +} + +/** Manual discount applications capture the intentions of a discount that was manually created. */ +export type ManualDiscountApplication = DiscountApplication & { + __typename?: 'ManualDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** The description of the application. */ + description?: Maybe + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** Represents a media interface. */ +export type Media = { + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe +} + +/** An auto-generated type for paginating through multiple Media. */ +export type MediaConnection = { + __typename?: 'MediaConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** The possible content types for a media object. */ +export enum MediaContentType { + /** An externally hosted video. */ + ExternalVideo = 'EXTERNAL_VIDEO', + /** A Shopify hosted image. */ + Image = 'IMAGE', + /** A 3d model. */ + Model_3D = 'MODEL_3D', + /** A Shopify hosted video. */ + Video = 'VIDEO', +} + +/** An auto-generated type which holds one Media and a cursor during pagination. */ +export type MediaEdge = { + __typename?: 'MediaEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MediaEdge. */ + node: Media +} + +/** Represents a Shopify hosted image. */ +export type MediaImage = Node & + Media & { + __typename?: 'MediaImage' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The image for the media. */ + image?: Maybe + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + } + +/** + * Metafields represent custom metadata attached to a resource. Metafields can be sorted into namespaces and are + * comprised of keys, values, and value types. + */ +export type Metafield = Node & { + __typename?: 'Metafield' + /** The date and time when the storefront metafield was created. */ + createdAt: Scalars['DateTime'] + /** The description of a metafield. */ + description?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The key name for a metafield. */ + key: Scalars['String'] + /** The namespace for a metafield. */ + namespace: Scalars['String'] + /** The parent object that the metafield belongs to. */ + parentResource: MetafieldParentResource + /** The date and time when the storefront metafield was updated. */ + updatedAt: Scalars['DateTime'] + /** The value of a metafield. */ + value: Scalars['String'] + /** Represents the metafield value type. */ + valueType: MetafieldValueType +} + +/** An auto-generated type for paginating through multiple Metafields. */ +export type MetafieldConnection = { + __typename?: 'MetafieldConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Metafield and a cursor during pagination. */ +export type MetafieldEdge = { + __typename?: 'MetafieldEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MetafieldEdge. */ + node: Metafield +} + +/** A resource that the metafield belongs to. */ +export type MetafieldParentResource = Product | ProductVariant + +/** Metafield value types. */ +export enum MetafieldValueType { + /** A string metafield. */ + String = 'STRING', + /** An integer metafield. */ + Integer = 'INTEGER', + /** A json string metafield. */ + JsonString = 'JSON_STRING', +} + +/** Represents a Shopify hosted 3D model. */ +export type Model3d = Node & + Media & { + __typename?: 'Model3d' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + /** The sources for a 3d model. */ + sources: Array + } + +/** Represents a source for a Shopify hosted 3d model. */ +export type Model3dSource = { + __typename?: 'Model3dSource' + /** The filesize of the 3d model. */ + filesize: Scalars['Int'] + /** The format of the 3d model. */ + format: Scalars['String'] + /** The MIME type of the 3d model. */ + mimeType: Scalars['String'] + /** The URL of the 3d model. */ + url: Scalars['String'] +} + +/** Specifies the fields for a monetary value with currency. */ +export type MoneyInput = { + /** Decimal money amount. */ + amount: Scalars['Decimal'] + /** Currency of the money. */ + currencyCode: CurrencyCode +} + +/** + * A monetary value with currency. + * + * To format currencies, combine this type's amount and currencyCode fields with your client's locale. + * + * For example, in JavaScript you could use Intl.NumberFormat: + * + * ```js + * new Intl.NumberFormat(locale, { + * style: 'currency', + * currency: currencyCode + * }).format(amount); + * ``` + * + * Other formatting libraries include: + * + * * iOS - [NumberFormatter](https://developer.apple.com/documentation/foundation/numberformatter) + * * Android - [NumberFormat](https://developer.android.com/reference/java/text/NumberFormat.html) + * * PHP - [NumberFormatter](http://php.net/manual/en/class.numberformatter.php) + * + * For a more general solution, the [Unicode CLDR number formatting database] is available with many implementations + * (such as [TwitterCldr](https://github.com/twitter/twitter-cldr-rb)). + */ +export type MoneyV2 = { + __typename?: 'MoneyV2' + /** Decimal money amount. */ + amount: Scalars['Decimal'] + /** Currency of the money. */ + currencyCode: CurrencyCode +} + +/** An auto-generated type for paginating through multiple MoneyV2s. */ +export type MoneyV2Connection = { + __typename?: 'MoneyV2Connection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one MoneyV2 and a cursor during pagination. */ +export type MoneyV2Edge = { + __typename?: 'MoneyV2Edge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of MoneyV2Edge. */ + node: MoneyV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type Mutation = { + __typename?: 'Mutation' + /** + * Updates the attributes of a checkout. + * @deprecated Use `checkoutAttributesUpdateV2` instead + */ + checkoutAttributesUpdate?: Maybe + /** Updates the attributes of a checkout. */ + checkoutAttributesUpdateV2?: Maybe + /** Completes a checkout without providing payment information. You can use this mutation for free items or items whose purchase price is covered by a gift card. */ + checkoutCompleteFree?: Maybe + /** + * Completes a checkout using a credit card token from Shopify's Vault. + * @deprecated Use `checkoutCompleteWithCreditCardV2` instead + */ + checkoutCompleteWithCreditCard?: Maybe + /** Completes a checkout using a credit card token from Shopify's card vault. Before you can complete checkouts using CheckoutCompleteWithCreditCardV2, you need to [_request payment processing_](https://help.shopify.com/api/guides/sales-channel-sdk/getting-started#request-payment-processing). */ + checkoutCompleteWithCreditCardV2?: Maybe + /** + * Completes a checkout with a tokenized payment. + * @deprecated Use `checkoutCompleteWithTokenizedPaymentV2` instead + */ + checkoutCompleteWithTokenizedPayment?: Maybe + /** + * Completes a checkout with a tokenized payment. + * @deprecated Use `checkoutCompleteWithTokenizedPaymentV3` instead + */ + checkoutCompleteWithTokenizedPaymentV2?: Maybe + /** Completes a checkout with a tokenized payment. */ + checkoutCompleteWithTokenizedPaymentV3?: Maybe + /** Creates a new checkout. */ + checkoutCreate?: Maybe + /** + * Associates a customer to the checkout. + * @deprecated Use `checkoutCustomerAssociateV2` instead + */ + checkoutCustomerAssociate?: Maybe + /** Associates a customer to the checkout. */ + checkoutCustomerAssociateV2?: Maybe + /** + * Disassociates the current checkout customer from the checkout. + * @deprecated Use `checkoutCustomerDisassociateV2` instead + */ + checkoutCustomerDisassociate?: Maybe + /** Disassociates the current checkout customer from the checkout. */ + checkoutCustomerDisassociateV2?: Maybe + /** + * Applies a discount to an existing checkout using a discount code. + * @deprecated Use `checkoutDiscountCodeApplyV2` instead + */ + checkoutDiscountCodeApply?: Maybe + /** Applies a discount to an existing checkout using a discount code. */ + checkoutDiscountCodeApplyV2?: Maybe + /** Removes the applied discount from an existing checkout. */ + checkoutDiscountCodeRemove?: Maybe + /** + * Updates the email on an existing checkout. + * @deprecated Use `checkoutEmailUpdateV2` instead + */ + checkoutEmailUpdate?: Maybe + /** Updates the email on an existing checkout. */ + checkoutEmailUpdateV2?: Maybe + /** + * Applies a gift card to an existing checkout using a gift card code. This will replace all currently applied gift cards. + * @deprecated Use `checkoutGiftCardsAppend` instead + */ + checkoutGiftCardApply?: Maybe + /** + * Removes an applied gift card from the checkout. + * @deprecated Use `checkoutGiftCardRemoveV2` instead + */ + checkoutGiftCardRemove?: Maybe + /** Removes an applied gift card from the checkout. */ + checkoutGiftCardRemoveV2?: Maybe + /** Appends gift cards to an existing checkout. */ + checkoutGiftCardsAppend?: Maybe + /** Adds a list of line items to a checkout. */ + checkoutLineItemsAdd?: Maybe + /** Removes line items from an existing checkout. */ + checkoutLineItemsRemove?: Maybe + /** Sets a list of line items to a checkout. */ + checkoutLineItemsReplace?: Maybe + /** Updates line items on a checkout. */ + checkoutLineItemsUpdate?: Maybe + /** + * Updates the shipping address of an existing checkout. + * @deprecated Use `checkoutShippingAddressUpdateV2` instead + */ + checkoutShippingAddressUpdate?: Maybe + /** Updates the shipping address of an existing checkout. */ + checkoutShippingAddressUpdateV2?: Maybe + /** Updates the shipping lines on an existing checkout. */ + checkoutShippingLineUpdate?: Maybe + /** + * Creates a customer access token. + * The customer access token is required to modify the customer object in any way. + */ + customerAccessTokenCreate?: Maybe + /** + * Creates a customer access token using a multipass token instead of email and password. + * A customer record is created if customer does not exist. If a customer record already + * exists but the record is disabled, then it's enabled. + */ + customerAccessTokenCreateWithMultipass?: Maybe + /** Permanently destroys a customer access token. */ + customerAccessTokenDelete?: Maybe + /** + * Renews a customer access token. + * + * Access token renewal must happen *before* a token expires. + * If a token has already expired, a new one should be created instead via `customerAccessTokenCreate`. + */ + customerAccessTokenRenew?: Maybe + /** Activates a customer. */ + customerActivate?: Maybe + /** Activates a customer with the activation url received from `customerCreate`. */ + customerActivateByUrl?: Maybe + /** Creates a new address for a customer. */ + customerAddressCreate?: Maybe + /** Permanently deletes the address of an existing customer. */ + customerAddressDelete?: Maybe + /** Updates the address of an existing customer. */ + customerAddressUpdate?: Maybe + /** Creates a new customer. */ + customerCreate?: Maybe + /** Updates the default address of an existing customer. */ + customerDefaultAddressUpdate?: Maybe + /** Sends a reset password email to the customer, as the first step in the reset password process. */ + customerRecover?: Maybe + /** Resets a customer’s password with a token received from `CustomerRecover`. */ + customerReset?: Maybe + /** Resets a customer’s password with the reset password url received from `CustomerRecover`. */ + customerResetByUrl?: Maybe + /** Updates an existing customer. */ + customerUpdate?: Maybe +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutAttributesUpdateArgs = { + checkoutId: Scalars['ID'] + input: CheckoutAttributesUpdateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutAttributesUpdateV2Args = { + checkoutId: Scalars['ID'] + input: CheckoutAttributesUpdateV2Input +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteFreeArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithCreditCardArgs = { + checkoutId: Scalars['ID'] + payment: CreditCardPaymentInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithCreditCardV2Args = { + checkoutId: Scalars['ID'] + payment: CreditCardPaymentInputV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentArgs = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentV2Args = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInputV2 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCompleteWithTokenizedPaymentV3Args = { + checkoutId: Scalars['ID'] + payment: TokenizedPaymentInputV3 +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCreateArgs = { + input: CheckoutCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerAssociateArgs = { + checkoutId: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerAssociateV2Args = { + checkoutId: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerDisassociateArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutCustomerDisassociateV2Args = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeApplyArgs = { + discountCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeApplyV2Args = { + discountCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutDiscountCodeRemoveArgs = { + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutEmailUpdateArgs = { + checkoutId: Scalars['ID'] + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutEmailUpdateV2Args = { + checkoutId: Scalars['ID'] + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardApplyArgs = { + giftCardCode: Scalars['String'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardRemoveArgs = { + appliedGiftCardId: Scalars['ID'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardRemoveV2Args = { + appliedGiftCardId: Scalars['ID'] + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutGiftCardsAppendArgs = { + giftCardCodes: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsAddArgs = { + lineItems: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsRemoveArgs = { + checkoutId: Scalars['ID'] + lineItemIds: Array +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsReplaceArgs = { + lineItems: Array + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutLineItemsUpdateArgs = { + checkoutId: Scalars['ID'] + lineItems: Array +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingAddressUpdateArgs = { + shippingAddress: MailingAddressInput + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingAddressUpdateV2Args = { + shippingAddress: MailingAddressInput + checkoutId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCheckoutShippingLineUpdateArgs = { + checkoutId: Scalars['ID'] + shippingRateHandle: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenCreateArgs = { + input: CustomerAccessTokenCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenCreateWithMultipassArgs = { + multipassToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenDeleteArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAccessTokenRenewArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerActivateArgs = { + id: Scalars['ID'] + input: CustomerActivateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerActivateByUrlArgs = { + activationUrl: Scalars['URL'] + password: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressCreateArgs = { + customerAccessToken: Scalars['String'] + address: MailingAddressInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressDeleteArgs = { + id: Scalars['ID'] + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerAddressUpdateArgs = { + customerAccessToken: Scalars['String'] + id: Scalars['ID'] + address: MailingAddressInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerCreateArgs = { + input: CustomerCreateInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerDefaultAddressUpdateArgs = { + customerAccessToken: Scalars['String'] + addressId: Scalars['ID'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerRecoverArgs = { + email: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerResetArgs = { + id: Scalars['ID'] + input: CustomerResetInput +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerResetByUrlArgs = { + resetUrl: Scalars['URL'] + password: Scalars['String'] +} + +/** The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. */ +export type MutationCustomerUpdateArgs = { + customerAccessToken: Scalars['String'] + customer: CustomerUpdateInput +} + +/** An object with an ID to support global identification. */ +export type Node = { + /** Globally unique identifier. */ + id: Scalars['ID'] +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type Order = Node & { + __typename?: 'Order' + /** The reason for the order's cancellation. Returns `null` if the order wasn't canceled. */ + cancelReason?: Maybe + /** The date and time when the order was canceled. Returns null if the order wasn't canceled. */ + canceledAt?: Maybe + /** The code of the currency used for the payment. */ + currencyCode: CurrencyCode + /** The subtotal of line items and their discounts, excluding line items that have been removed. Does not contain order-level discounts, duties, shipping costs, or shipping discounts. Taxes are not included unless the order is a taxes-included order. */ + currentSubtotalPrice: MoneyV2 + /** The total amount of the order, including duties, taxes and discounts, minus amounts for line items that have been removed. */ + currentTotalPrice: MoneyV2 + /** The total of all taxes applied to the order, excluding taxes for returned line items. */ + currentTotalTax: MoneyV2 + /** The locale code in which this specific order happened. */ + customerLocale?: Maybe + /** The unique URL that the customer can use to access the order. */ + customerUrl?: Maybe + /** Discounts that have been applied on the order. */ + discountApplications: DiscountApplicationConnection + /** Whether the order has had any edits applied or not. */ + edited: Scalars['Boolean'] + /** The customer's email address. */ + email?: Maybe + /** The financial status of the order. */ + financialStatus?: Maybe + /** The fulfillment status for the order. */ + fulfillmentStatus: OrderFulfillmentStatus + /** Globally unique identifier. */ + id: Scalars['ID'] + /** List of the order’s line items. */ + lineItems: OrderLineItemConnection + /** + * Unique identifier for the order that appears on the order. + * For example, _#1000_ or _Store1001. + */ + name: Scalars['String'] + /** A unique numeric identifier for the order for use by shop owner and customer. */ + orderNumber: Scalars['Int'] + /** The total price of the order before any applied edits. */ + originalTotalPrice: MoneyV2 + /** The customer's phone number for receiving SMS notifications. */ + phone?: Maybe + /** + * The date and time when the order was imported. + * This value can be set to dates in the past when importing from other systems. + * If no value is provided, it will be auto-generated based on current date and time. + */ + processedAt: Scalars['DateTime'] + /** The address to where the order will be shipped. */ + shippingAddress?: Maybe + /** The discounts that have been allocated onto the shipping line by discount applications. */ + shippingDiscountAllocations: Array + /** The unique URL for the order's status page. */ + statusUrl: Scalars['URL'] + /** + * Price of the order before shipping and taxes. + * @deprecated Use `subtotalPriceV2` instead + */ + subtotalPrice?: Maybe + /** Price of the order before duties, shipping and taxes. */ + subtotalPriceV2?: Maybe + /** List of the order’s successful fulfillments. */ + successfulFulfillments?: Maybe> + /** + * The sum of all the prices of all the items in the order, taxes and discounts included (must be positive). + * @deprecated Use `totalPriceV2` instead + */ + totalPrice: Scalars['Money'] + /** The sum of all the prices of all the items in the order, duties, taxes and discounts included (must be positive). */ + totalPriceV2: MoneyV2 + /** + * The total amount that has been refunded. + * @deprecated Use `totalRefundedV2` instead + */ + totalRefunded: Scalars['Money'] + /** The total amount that has been refunded. */ + totalRefundedV2: MoneyV2 + /** + * The total cost of shipping. + * @deprecated Use `totalShippingPriceV2` instead + */ + totalShippingPrice: Scalars['Money'] + /** The total cost of shipping. */ + totalShippingPriceV2: MoneyV2 + /** + * The total cost of taxes. + * @deprecated Use `totalTaxV2` instead + */ + totalTax?: Maybe + /** The total cost of taxes. */ + totalTaxV2?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderDiscountApplicationsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderLineItemsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. */ +export type OrderSuccessfulFulfillmentsArgs = { + first?: Maybe +} + +/** Represents the reason for the order's cancellation. */ +export enum OrderCancelReason { + /** The customer wanted to cancel the order. */ + Customer = 'CUSTOMER', + /** The order was fraudulent. */ + Fraud = 'FRAUD', + /** There was insufficient inventory. */ + Inventory = 'INVENTORY', + /** Payment was declined. */ + Declined = 'DECLINED', + /** The order was canceled for an unlisted reason. */ + Other = 'OTHER', +} + +/** An auto-generated type for paginating through multiple Orders. */ +export type OrderConnection = { + __typename?: 'OrderConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Order and a cursor during pagination. */ +export type OrderEdge = { + __typename?: 'OrderEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of OrderEdge. */ + node: Order +} + +/** Represents the order's current financial status. */ +export enum OrderFinancialStatus { + /** Displayed as **Pending**. */ + Pending = 'PENDING', + /** Displayed as **Authorized**. */ + Authorized = 'AUTHORIZED', + /** Displayed as **Partially paid**. */ + PartiallyPaid = 'PARTIALLY_PAID', + /** Displayed as **Partially refunded**. */ + PartiallyRefunded = 'PARTIALLY_REFUNDED', + /** Displayed as **Voided**. */ + Voided = 'VOIDED', + /** Displayed as **Paid**. */ + Paid = 'PAID', + /** Displayed as **Refunded**. */ + Refunded = 'REFUNDED', +} + +/** Represents the order's current fulfillment status. */ +export enum OrderFulfillmentStatus { + /** Displayed as **Unfulfilled**. */ + Unfulfilled = 'UNFULFILLED', + /** Displayed as **Partially fulfilled**. */ + PartiallyFulfilled = 'PARTIALLY_FULFILLED', + /** Displayed as **Fulfilled**. */ + Fulfilled = 'FULFILLED', + /** Displayed as **Restocked**. */ + Restocked = 'RESTOCKED', + /** Displayed as **Pending fulfillment**. */ + PendingFulfillment = 'PENDING_FULFILLMENT', + /** Displayed as **Open**. */ + Open = 'OPEN', + /** Displayed as **In progress**. */ + InProgress = 'IN_PROGRESS', + /** Displayed as **Scheduled**. */ + Scheduled = 'SCHEDULED', +} + +/** Represents a single line in an order. There is one line item for each distinct product variant. */ +export type OrderLineItem = { + __typename?: 'OrderLineItem' + /** The number of entries associated to the line item minus the items that have been removed. */ + currentQuantity: Scalars['Int'] + /** List of custom attributes associated to the line item. */ + customAttributes: Array + /** The discounts that have been allocated onto the order line item by discount applications. */ + discountAllocations: Array + /** The total price of the line item, including discounts, and displayed in the presentment currency. */ + discountedTotalPrice: MoneyV2 + /** The total price of the line item, not including any discounts. The total price is calculated using the original unit price multiplied by the quantity, and it is displayed in the presentment currency. */ + originalTotalPrice: MoneyV2 + /** The number of products variants associated to the line item. */ + quantity: Scalars['Int'] + /** The title of the product combined with title of the variant. */ + title: Scalars['String'] + /** The product variant object associated to the line item. */ + variant?: Maybe +} + +/** An auto-generated type for paginating through multiple OrderLineItems. */ +export type OrderLineItemConnection = { + __typename?: 'OrderLineItemConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one OrderLineItem and a cursor during pagination. */ +export type OrderLineItemEdge = { + __typename?: 'OrderLineItemEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of OrderLineItemEdge. */ + node: OrderLineItem +} + +/** The set of valid sort keys for the Order query. */ +export enum OrderSortKeys { + /** Sort by the `processed_at` value. */ + ProcessedAt = 'PROCESSED_AT', + /** Sort by the `total_price` value. */ + TotalPrice = 'TOTAL_PRICE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** Shopify merchants can create pages to hold static HTML content. Each Page object represents a custom page on the online store. */ +export type Page = Node & { + __typename?: 'Page' + /** The description of the page, complete with HTML formatting. */ + body: Scalars['HTML'] + /** Summary of the page body. */ + bodySummary: Scalars['String'] + /** The timestamp of the page creation. */ + createdAt: Scalars['DateTime'] + /** A human-friendly unique string for the page automatically generated from its title. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The page's SEO information. */ + seo?: Maybe + /** The title of the page. */ + title: Scalars['String'] + /** The timestamp of the latest page update. */ + updatedAt: Scalars['DateTime'] + /** The url pointing to the page accessible from the web. */ + url: Scalars['URL'] +} + +/** An auto-generated type for paginating through multiple Pages. */ +export type PageConnection = { + __typename?: 'PageConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Page and a cursor during pagination. */ +export type PageEdge = { + __typename?: 'PageEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of PageEdge. */ + node: Page +} + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: 'PageInfo' + /** Indicates if there are more pages to fetch. */ + hasNextPage: Scalars['Boolean'] + /** Indicates if there are any pages prior to the current page. */ + hasPreviousPage: Scalars['Boolean'] +} + +/** The set of valid sort keys for the Page query. */ +export enum PageSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A payment applied to a checkout. */ +export type Payment = Node & { + __typename?: 'Payment' + /** + * The amount of the payment. + * @deprecated Use `amountV2` instead + */ + amount: Scalars['Money'] + /** The amount of the payment. */ + amountV2: MoneyV2 + /** The billing address for the payment. */ + billingAddress?: Maybe + /** The checkout to which the payment belongs. */ + checkout: Checkout + /** The credit card used for the payment in the case of direct payments. */ + creditCard?: Maybe + /** A message describing a processing error during asynchronous processing. */ + errorMessage?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** A client-side generated token to identify a payment and perform idempotent operations. */ + idempotencyKey?: Maybe + /** The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. */ + nextActionUrl?: Maybe + /** Whether or not the payment is still processing asynchronously. */ + ready: Scalars['Boolean'] + /** A flag to indicate if the payment is to be done in test mode for gateways that support it. */ + test: Scalars['Boolean'] + /** The actual transaction recorded by Shopify after having processed the payment with the gateway. */ + transaction?: Maybe +} + +/** Settings related to payments. */ +export type PaymentSettings = { + __typename?: 'PaymentSettings' + /** List of the card brands which the shop accepts. */ + acceptedCardBrands: Array + /** The url pointing to the endpoint to vault credit cards. */ + cardVaultUrl: Scalars['URL'] + /** The country where the shop is located. */ + countryCode: CountryCode + /** The three-letter code for the shop's primary currency. */ + currencyCode: CurrencyCode + /** A list of enabled currencies (ISO 4217 format) that the shop accepts. Merchants can enable currencies from their Shopify Payments settings in the Shopify admin. */ + enabledPresentmentCurrencies: Array + /** The shop’s Shopify Payments account id. */ + shopifyPaymentsAccountId?: Maybe + /** List of the digital wallets which the shop supports. */ + supportedDigitalWallets: Array +} + +/** The valid values for the types of payment token. */ +export enum PaymentTokenType { + /** Apple Pay token type. */ + ApplePay = 'APPLE_PAY', + /** Vault payment token type. */ + Vault = 'VAULT', + /** Shopify Pay token type. */ + ShopifyPay = 'SHOPIFY_PAY', + /** Google Pay token type. */ + GooglePay = 'GOOGLE_PAY', +} + +/** The value of the percentage pricing object. */ +export type PricingPercentageValue = { + __typename?: 'PricingPercentageValue' + /** The percentage value of the object. */ + percentage: Scalars['Float'] +} + +/** The price value (fixed or percentage) for a discount application. */ +export type PricingValue = MoneyV2 | PricingPercentageValue + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type Product = Node & + HasMetafields & { + __typename?: 'Product' + /** Indicates if at least one product variant is available for sale. */ + availableForSale: Scalars['Boolean'] + /** List of collections a product belongs to. */ + collections: CollectionConnection + /** The compare at price of the product across all variants. */ + compareAtPriceRange: ProductPriceRange + /** The date and time when the product was created. */ + createdAt: Scalars['DateTime'] + /** Stripped description of the product, single line with HTML tags removed. */ + description: Scalars['String'] + /** The description of the product, complete with HTML formatting. */ + descriptionHtml: Scalars['HTML'] + /** + * A human-friendly unique string for the Product automatically generated from its title. + * They are used by the Liquid templating language to refer to objects. + */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** List of images associated with the product. */ + images: ImageConnection + /** The media associated with the product. */ + media: MediaConnection + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection + /** + * The online store URL for the product. + * A value of `null` indicates that the product is not published to the Online Store sales channel. + */ + onlineStoreUrl?: Maybe + /** List of product options. */ + options: Array + /** List of price ranges in the presentment currencies for this shop. */ + presentmentPriceRanges: ProductPriceRangeConnection + /** The price range. */ + priceRange: ProductPriceRange + /** A categorization that a product can be tagged with, commonly used for filtering and searching. */ + productType: Scalars['String'] + /** The date and time when the product was published to the channel. */ + publishedAt: Scalars['DateTime'] + /** The product's SEO information. */ + seo: Seo + /** + * A comma separated list of tags that have been added to the product. + * Additional access scope required for private apps: unauthenticated_read_product_tags. + */ + tags: Array + /** The product’s title. */ + title: Scalars['String'] + /** The total quantity of inventory in stock for this Product. */ + totalInventory?: Maybe + /** + * The date and time when the product was last modified. + * A product's `updatedAt` value can change for different reasons. For example, if an order + * is placed for a product that has inventory tracking set up, then the inventory adjustment + * is counted as an update. + */ + updatedAt: Scalars['DateTime'] + /** + * Find a product’s variant based on its selected options. + * This is useful for converting a user’s selection of product options into a single matching variant. + * If there is not a variant for the selected options, `null` will be returned. + */ + variantBySelectedOptions?: Maybe + /** List of the product’s variants. */ + variants: ProductVariantConnection + /** The product’s vendor name. */ + vendor: Scalars['String'] + } + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductDescriptionArgs = { + truncateAt?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductImagesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMediaArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductOptionsArgs = { + first?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductPresentmentPriceRangesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductVariantBySelectedOptionsArgs = { + selectedOptions: Array +} + +/** + * A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. + * For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). + */ +export type ProductVariantsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe +} + +/** The set of valid sort keys for the ProductCollection query. */ +export enum ProductCollectionSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `price` value. */ + Price = 'PRICE', + /** Sort by the `best-selling` value. */ + BestSelling = 'BEST_SELLING', + /** Sort by the `created` value. */ + Created = 'CREATED', + /** Sort by the `id` value. */ + Id = 'ID', + /** Sort by the `manual` value. */ + Manual = 'MANUAL', + /** Sort by the `collection-default` value. */ + CollectionDefault = 'COLLECTION_DEFAULT', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** An auto-generated type for paginating through multiple Products. */ +export type ProductConnection = { + __typename?: 'ProductConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one Product and a cursor during pagination. */ +export type ProductEdge = { + __typename?: 'ProductEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductEdge. */ + node: Product +} + +/** The set of valid sort keys for the ProductImage query. */ +export enum ProductImageSortKeys { + /** Sort by the `created_at` value. */ + CreatedAt = 'CREATED_AT', + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** The set of valid sort keys for the ProductMedia query. */ +export enum ProductMediaSortKeys { + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** + * Product property names like "Size", "Color", and "Material" that the customers can select. + * Variants are selected based on permutations of these options. + * 255 characters limit each. + */ +export type ProductOption = Node & { + __typename?: 'ProductOption' + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The product option’s name. */ + name: Scalars['String'] + /** The corresponding value to the product option name. */ + values: Array +} + +/** The price range of the product. */ +export type ProductPriceRange = { + __typename?: 'ProductPriceRange' + /** The highest variant's price. */ + maxVariantPrice: MoneyV2 + /** The lowest variant's price. */ + minVariantPrice: MoneyV2 +} + +/** An auto-generated type for paginating through multiple ProductPriceRanges. */ +export type ProductPriceRangeConnection = { + __typename?: 'ProductPriceRangeConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductPriceRange and a cursor during pagination. */ +export type ProductPriceRangeEdge = { + __typename?: 'ProductPriceRangeEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductPriceRangeEdge. */ + node: ProductPriceRange +} + +/** The set of valid sort keys for the Product query. */ +export enum ProductSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `product_type` value. */ + ProductType = 'PRODUCT_TYPE', + /** Sort by the `vendor` value. */ + Vendor = 'VENDOR', + /** Sort by the `updated_at` value. */ + UpdatedAt = 'UPDATED_AT', + /** Sort by the `created_at` value. */ + CreatedAt = 'CREATED_AT', + /** Sort by the `best_selling` value. */ + BestSelling = 'BEST_SELLING', + /** Sort by the `price` value. */ + Price = 'PRICE', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariant = Node & + HasMetafields & { + __typename?: 'ProductVariant' + /** + * Indicates if the product variant is in stock. + * @deprecated Use `availableForSale` instead + */ + available?: Maybe + /** Indicates if the product variant is available for sale. */ + availableForSale: Scalars['Boolean'] + /** + * The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPrice` is higher than `price`. + * @deprecated Use `compareAtPriceV2` instead + */ + compareAtPrice?: Maybe + /** The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPriceV2` is higher than `priceV2`. */ + compareAtPriceV2?: Maybe + /** Whether a product is out of stock but still available for purchase (used for backorders). */ + currentlyNotInStock: Scalars['Boolean'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Image associated with the product variant. This field falls back to the product image if no image is available. */ + image?: Maybe + /** The metafield associated with the resource. */ + metafield?: Maybe + /** A paginated list of metafields associated with the resource. */ + metafields: MetafieldConnection + /** List of prices and compare-at prices in the presentment currencies for this shop. */ + presentmentPrices: ProductVariantPricePairConnection + /** List of unit prices in the presentment currencies for this shop. */ + presentmentUnitPrices: MoneyV2Connection + /** + * The product variant’s price. + * @deprecated Use `priceV2` instead + */ + price: Scalars['Money'] + /** The product variant’s price. */ + priceV2: MoneyV2 + /** The product object that the product variant belongs to. */ + product: Product + /** The total sellable quantity of the variant for online sales channels. */ + quantityAvailable?: Maybe + /** Whether a customer needs to provide a shipping address when placing an order for the product variant. */ + requiresShipping: Scalars['Boolean'] + /** List of product options applied to the variant. */ + selectedOptions: Array + /** The SKU (stock keeping unit) associated with the variant. */ + sku?: Maybe + /** The product variant’s title. */ + title: Scalars['String'] + /** The unit price value for the variant based on the variant's measurement. */ + unitPrice?: Maybe + /** The unit price measurement for the variant. */ + unitPriceMeasurement?: Maybe + /** The weight of the product variant in the unit system specified with `weight_unit`. */ + weight?: Maybe + /** Unit of measurement for weight. */ + weightUnit: WeightUnit + } + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantImageArgs = { + maxWidth?: Maybe + maxHeight?: Maybe + crop?: Maybe + scale?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantMetafieldArgs = { + namespace: Scalars['String'] + key: Scalars['String'] +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantMetafieldsArgs = { + namespace?: Maybe + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantPresentmentPricesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** A product variant represents a different version of a product, such as differing sizes or differing colors. */ +export type ProductVariantPresentmentUnitPricesArgs = { + presentmentCurrencies?: Maybe> + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe +} + +/** An auto-generated type for paginating through multiple ProductVariants. */ +export type ProductVariantConnection = { + __typename?: 'ProductVariantConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductVariant and a cursor during pagination. */ +export type ProductVariantEdge = { + __typename?: 'ProductVariantEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductVariantEdge. */ + node: ProductVariant +} + +/** The compare-at price and price of a variant sharing a currency. */ +export type ProductVariantPricePair = { + __typename?: 'ProductVariantPricePair' + /** The compare-at price of the variant with associated currency. */ + compareAtPrice?: Maybe + /** The price of the variant with associated currency. */ + price: MoneyV2 +} + +/** An auto-generated type for paginating through multiple ProductVariantPricePairs. */ +export type ProductVariantPricePairConnection = { + __typename?: 'ProductVariantPricePairConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one ProductVariantPricePair and a cursor during pagination. */ +export type ProductVariantPricePairEdge = { + __typename?: 'ProductVariantPricePairEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of ProductVariantPricePairEdge. */ + node: ProductVariantPricePair +} + +/** The set of valid sort keys for the ProductVariant query. */ +export enum ProductVariantSortKeys { + /** Sort by the `title` value. */ + Title = 'TITLE', + /** Sort by the `sku` value. */ + Sku = 'SKU', + /** Sort by the `position` value. */ + Position = 'POSITION', + /** Sort by the `id` value. */ + Id = 'ID', + /** + * During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + * results by relevance to the search term(s). When no search query is specified, this sort key is not + * deterministic and should not be used. + */ + Relevance = 'RELEVANCE', +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRoot = { + __typename?: 'QueryRoot' + /** List of the shop's articles. */ + articles: ArticleConnection + /** Find a blog by its handle. */ + blogByHandle?: Maybe + /** List of the shop's blogs. */ + blogs: BlogConnection + /** Find a collection by its handle. */ + collectionByHandle?: Maybe + /** List of the shop’s collections. */ + collections: CollectionConnection + /** Find a customer by its access token. */ + customer?: Maybe + node?: Maybe + nodes: Array> + /** Find a page by its handle. */ + pageByHandle?: Maybe + /** List of the shop's pages. */ + pages: PageConnection + /** Find a product by its handle. */ + productByHandle?: Maybe + /** + * Find recommended products related to a given `product_id`. + * To learn more about how recommendations are generated, see + * [*Showing product recommendations on product pages*](https://help.shopify.com/themes/development/recommended-products). + */ + productRecommendations?: Maybe> + /** + * Tags added to products. + * Additional access scope required: unauthenticated_read_product_tags. + */ + productTags: StringConnection + /** List of product types for the shop's products that are published to your app. */ + productTypes: StringConnection + /** List of the shop’s products. */ + products: ProductConnection + /** The list of public Storefront API versions, including supported, release candidate and unstable versions. */ + publicApiVersions: Array + /** The shop associated with the storefront access token. */ + shop: Shop +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootBlogByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootBlogsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCollectionByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootCustomerArgs = { + customerAccessToken: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootNodeArgs = { + id: Scalars['ID'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootNodesArgs = { + ids: Array +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootPageByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootPagesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductByHandleArgs = { + handle: Scalars['String'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductRecommendationsArgs = { + productId: Scalars['ID'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductTagsArgs = { + first: Scalars['Int'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductTypesArgs = { + first: Scalars['Int'] +} + +/** The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. */ +export type QueryRootProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** SEO information. */ +export type Seo = { + __typename?: 'SEO' + /** The meta description. */ + description?: Maybe + /** The SEO title. */ + title?: Maybe +} + +/** + * Script discount applications capture the intentions of a discount that + * was created by a Shopify Script. + */ +export type ScriptDiscountApplication = DiscountApplication & { + __typename?: 'ScriptDiscountApplication' + /** The method by which the discount's value is allocated to its entitled items. */ + allocationMethod: DiscountApplicationAllocationMethod + /** + * The description of the application as defined by the Script. + * @deprecated Use `title` instead + */ + description: Scalars['String'] + /** Which lines of targetType that the discount is allocated over. */ + targetSelection: DiscountApplicationTargetSelection + /** The type of line that the discount is applicable towards. */ + targetType: DiscountApplicationTargetType + /** The title of the application as defined by the Script. */ + title: Scalars['String'] + /** The value of the discount application. */ + value: PricingValue +} + +/** + * Properties used by customers to select a product variant. + * Products can have multiple options, like different sizes or colors. + */ +export type SelectedOption = { + __typename?: 'SelectedOption' + /** The product option’s name. */ + name: Scalars['String'] + /** The product option’s value. */ + value: Scalars['String'] +} + +/** Specifies the input fields required for a selected option. */ +export type SelectedOptionInput = { + /** The product option’s name. */ + name: Scalars['String'] + /** The product option’s value. */ + value: Scalars['String'] +} + +/** A shipping rate to be applied to a checkout. */ +export type ShippingRate = { + __typename?: 'ShippingRate' + /** Human-readable unique identifier for this shipping rate. */ + handle: Scalars['String'] + /** + * Price of this shipping rate. + * @deprecated Use `priceV2` instead + */ + price: Scalars['Money'] + /** Price of this shipping rate. */ + priceV2: MoneyV2 + /** Title of this shipping rate. */ + title: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type Shop = { + __typename?: 'Shop' + /** + * List of the shop' articles. + * @deprecated Use `QueryRoot.articles` instead. + */ + articles: ArticleConnection + /** + * List of the shop' blogs. + * @deprecated Use `QueryRoot.blogs` instead. + */ + blogs: BlogConnection + /** + * Find a collection by its handle. + * @deprecated Use `QueryRoot.collectionByHandle` instead. + */ + collectionByHandle?: Maybe + /** + * List of the shop’s collections. + * @deprecated Use `QueryRoot.collections` instead. + */ + collections: CollectionConnection + /** + * The three-letter code for the currency that the shop accepts. + * @deprecated Use `paymentSettings` instead + */ + currencyCode: CurrencyCode + /** A description of the shop. */ + description?: Maybe + /** A string representing the way currency is formatted when the currency isn’t specified. */ + moneyFormat: Scalars['String'] + /** The shop’s name. */ + name: Scalars['String'] + /** Settings related to payments. */ + paymentSettings: PaymentSettings + /** The shop’s primary domain. */ + primaryDomain: Domain + /** The shop’s privacy policy. */ + privacyPolicy?: Maybe + /** + * Find a product by its handle. + * @deprecated Use `QueryRoot.productByHandle` instead. + */ + productByHandle?: Maybe + /** + * A list of tags that have been added to products. + * Additional access scope required: unauthenticated_read_product_tags. + * @deprecated Use `QueryRoot.productTags` instead. + */ + productTags: StringConnection + /** + * List of the shop’s product types. + * @deprecated Use `QueryRoot.productTypes` instead. + */ + productTypes: StringConnection + /** + * List of the shop’s products. + * @deprecated Use `QueryRoot.products` instead. + */ + products: ProductConnection + /** The shop’s refund policy. */ + refundPolicy?: Maybe + /** The shop’s shipping policy. */ + shippingPolicy?: Maybe + /** Countries that the shop ships to. */ + shipsToCountries: Array + /** + * The shop’s Shopify Payments account id. + * @deprecated Use `paymentSettings` instead + */ + shopifyPaymentsAccountId?: Maybe + /** The shop’s terms of service. */ + termsOfService?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopArticlesArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopBlogsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopCollectionByHandleArgs = { + handle: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopCollectionsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductByHandleArgs = { + handle: Scalars['String'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductTagsArgs = { + first: Scalars['Int'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductTypesArgs = { + first: Scalars['Int'] +} + +/** Shop represents a collection of the general settings and information about the shop. */ +export type ShopProductsArgs = { + first?: Maybe + after?: Maybe + last?: Maybe + before?: Maybe + reverse?: Maybe + sortKey?: Maybe + query?: Maybe +} + +/** Policy that a merchant has configured for their store, such as their refund or privacy policy. */ +export type ShopPolicy = Node & { + __typename?: 'ShopPolicy' + /** Policy text, maximum size of 64kb. */ + body: Scalars['String'] + /** Policy’s handle. */ + handle: Scalars['String'] + /** Globally unique identifier. */ + id: Scalars['ID'] + /** Policy’s title. */ + title: Scalars['String'] + /** Public URL to the policy. */ + url: Scalars['URL'] +} + +/** An auto-generated type for paginating through multiple Strings. */ +export type StringConnection = { + __typename?: 'StringConnection' + /** A list of edges. */ + edges: Array + /** Information to aid in pagination. */ + pageInfo: PageInfo +} + +/** An auto-generated type which holds one String and a cursor during pagination. */ +export type StringEdge = { + __typename?: 'StringEdge' + /** A cursor for use in pagination. */ + cursor: Scalars['String'] + /** The item at the end of StringEdge. */ + node: Scalars['String'] +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInput = { + /** The amount of the payment. */ + amount: Scalars['Money'] + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** The type of payment token. */ + type: Scalars['String'] + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Executes the payment in test mode if possible. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInputV2 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe + /** The type of payment token. */ + type: Scalars['String'] +} + +/** + * Specifies the fields required to complete a checkout with + * a tokenized payment. + */ +export type TokenizedPaymentInputV3 = { + /** The amount and currency of the payment. */ + paymentAmount: MoneyInput + /** A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. */ + idempotencyKey: Scalars['String'] + /** The billing address for the payment. */ + billingAddress: MailingAddressInput + /** A simple string or JSON containing the required payment data for the tokenized payment. */ + paymentData: Scalars['String'] + /** Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. */ + test?: Maybe + /** Public Hash Key used for AndroidPay payments only. */ + identifier?: Maybe + /** The type of payment token. */ + type: PaymentTokenType +} + +/** An object representing exchange of money for a product or service. */ +export type Transaction = { + __typename?: 'Transaction' + /** + * The amount of money that the transaction was for. + * @deprecated Use `amountV2` instead + */ + amount: Scalars['Money'] + /** The amount of money that the transaction was for. */ + amountV2: MoneyV2 + /** The kind of the transaction. */ + kind: TransactionKind + /** + * The status of the transaction. + * @deprecated Use `statusV2` instead + */ + status: TransactionStatus + /** The status of the transaction. */ + statusV2?: Maybe + /** Whether the transaction was done in test mode or not. */ + test: Scalars['Boolean'] +} + +export enum TransactionKind { + Sale = 'SALE', + Capture = 'CAPTURE', + Authorization = 'AUTHORIZATION', + EmvAuthorization = 'EMV_AUTHORIZATION', + Change = 'CHANGE', +} + +export enum TransactionStatus { + Pending = 'PENDING', + Success = 'SUCCESS', + Failure = 'FAILURE', + Error = 'ERROR', +} + +/** The measurement used to calculate a unit price for a product variant (e.g. $9.99 / 100ml). */ +export type UnitPriceMeasurement = { + __typename?: 'UnitPriceMeasurement' + /** The type of unit of measurement for the unit price measurement. */ + measuredType?: Maybe + /** The quantity unit for the unit price measurement. */ + quantityUnit?: Maybe + /** The quantity value for the unit price measurement. */ + quantityValue: Scalars['Float'] + /** The reference unit for the unit price measurement. */ + referenceUnit?: Maybe + /** The reference value for the unit price measurement. */ + referenceValue: Scalars['Int'] +} + +/** The accepted types of unit of measurement. */ +export enum UnitPriceMeasurementMeasuredType { + /** Unit of measurements representing volumes. */ + Volume = 'VOLUME', + /** Unit of measurements representing weights. */ + Weight = 'WEIGHT', + /** Unit of measurements representing lengths. */ + Length = 'LENGTH', + /** Unit of measurements representing areas. */ + Area = 'AREA', +} + +/** The valid units of measurement for a unit price measurement. */ +export enum UnitPriceMeasurementMeasuredUnit { + /** 1000 milliliters equals 1 liter. */ + Ml = 'ML', + /** 100 centiliters equals 1 liter. */ + Cl = 'CL', + /** Metric system unit of volume. */ + L = 'L', + /** 1 cubic meter equals 1000 liters. */ + M3 = 'M3', + /** 1000 milligrams equals 1 gram. */ + Mg = 'MG', + /** Metric system unit of weight. */ + G = 'G', + /** 1 kilogram equals 1000 grams. */ + Kg = 'KG', + /** 1000 millimeters equals 1 meter. */ + Mm = 'MM', + /** 100 centimeters equals 1 meter. */ + Cm = 'CM', + /** Metric system unit of length. */ + M = 'M', + /** Metric system unit of area. */ + M2 = 'M2', +} + +/** Represents an error in the input of a mutation. */ +export type UserError = DisplayableError & { + __typename?: 'UserError' + /** Path to the input field which caused the error. */ + field?: Maybe> + /** The error message. */ + message: Scalars['String'] +} + +/** Represents a Shopify hosted video. */ +export type Video = Node & + Media & { + __typename?: 'Video' + /** A word or phrase to share the nature or contents of a media. */ + alt?: Maybe + /** Globally unique identifier. */ + id: Scalars['ID'] + /** The media content type. */ + mediaContentType: MediaContentType + /** The preview image for the media. */ + previewImage?: Maybe + /** The sources for a video. */ + sources: Array + } + +/** Represents a source for a Shopify hosted video. */ +export type VideoSource = { + __typename?: 'VideoSource' + /** The format of the video source. */ + format: Scalars['String'] + /** The height of the video. */ + height: Scalars['Int'] + /** The video MIME type. */ + mimeType: Scalars['String'] + /** The URL of the video. */ + url: Scalars['String'] + /** The width of the video. */ + width: Scalars['Int'] +} + +/** Units of measurement for weight. */ +export enum WeightUnit { + /** 1 kilogram equals 1000 grams. */ + Kilograms = 'KILOGRAMS', + /** Metric system unit of mass. */ + Grams = 'GRAMS', + /** 1 pound equals 16 ounces. */ + Pounds = 'POUNDS', + /** Imperial system unit of mass. */ + Ounces = 'OUNCES', +} + +export type Unnamed_1_QueryVariables = Exact<{ + first: Scalars['Int'] +}> + +export type Unnamed_1_Query = { __typename?: 'QueryRoot' } & { + pages: { __typename?: 'PageConnection' } & { + edges: Array< + { __typename?: 'PageEdge' } & { + node: { __typename?: 'Page' } & Pick< + Page, + 'id' | 'title' | 'handle' | 'body' | 'bodySummary' | 'url' + > + } + > + } +} diff --git a/packages/swell/schema.graphql b/packages/swell/schema.graphql new file mode 100644 index 0000000..822e600 --- /dev/null +++ b/packages/swell/schema.graphql @@ -0,0 +1,9631 @@ +schema { + query: QueryRoot + mutation: Mutation +} + +""" +Marks an element of a GraphQL schema as having restricted access. +""" +directive @accessRestricted( + """ + Explains the reason around this restriction + """ + reason: String = null +) on FIELD_DEFINITION | OBJECT + +""" +A version of the API. +""" +type ApiVersion { + """ + The human-readable name of the version. + """ + displayName: String! + + """ + The unique identifier of an ApiVersion. All supported API versions have a date-based (YYYY-MM) or `unstable` handle. + """ + handle: String! + + """ + Whether the version is supported by Shopify. + """ + supported: Boolean! +} + +""" +Details about the gift card used on the checkout. +""" +type AppliedGiftCard implements Node { + """ + The amount that was taken from the gift card by applying it. + """ + amountUsed: Money! @deprecated(reason: "Use `amountUsedV2` instead") + + """ + The amount that was taken from the gift card by applying it. + """ + amountUsedV2: MoneyV2! + + """ + The amount left on the gift card. + """ + balance: Money! @deprecated(reason: "Use `balanceV2` instead") + + """ + The amount left on the gift card. + """ + balanceV2: MoneyV2! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The last characters of the gift card. + """ + lastCharacters: String! + + """ + The amount that was applied to the checkout in its currency. + """ + presentmentAmountUsed: MoneyV2! +} + +""" +An article in an online store blog. +""" +type Article implements Node { + """ + The article's author. + """ + author: ArticleAuthor! @deprecated(reason: "Use `authorV2` instead") + + """ + The article's author. + """ + authorV2: ArticleAuthor + + """ + The blog that the article belongs to. + """ + blog: Blog! + + """ + List of comments posted on the article. + """ + comments( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CommentConnection! + + """ + Stripped content of the article, single line with HTML tags removed. + """ + content( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The content of the article, complete with HTML formatting. + """ + contentHtml: HTML! + + """ + Stripped excerpt of the article, single line with HTML tags removed. + """ + excerpt( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String + + """ + The excerpt of the article, complete with HTML formatting. + """ + excerptHtml: HTML + + """ + A human-friendly unique string for the Article automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The image associated with the article. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + The date and time when the article was published. + """ + publishedAt: DateTime! + + """ + The article’s SEO information. + """ + seo: SEO + + """ + A categorization that a article can be tagged with. + """ + tags: [String!]! + + """ + The article’s name. + """ + title: String! + + """ + The url pointing to the article accessible from the web. + """ + url: URL! +} + +""" +The author of an article. +""" +type ArticleAuthor { + """ + The author's bio. + """ + bio: String + + """ + The author’s email. + """ + email: String! + + """ + The author's first name. + """ + firstName: String! + + """ + The author's last name. + """ + lastName: String! + + """ + The author's full name. + """ + name: String! +} + +""" +An auto-generated type for paginating through multiple Articles. +""" +type ArticleConnection { + """ + A list of edges. + """ + edges: [ArticleEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Article and a cursor during pagination. +""" +type ArticleEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ArticleEdge. + """ + node: Article! +} + +""" +The set of valid sort keys for the Article query. +""" +enum ArticleSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `blog_title` value. + """ + BLOG_TITLE + + """ + Sort by the `author` value. + """ + AUTHOR + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `published_at` value. + """ + PUBLISHED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Represents a generic custom attribute. +""" +type Attribute { + """ + Key or name of the attribute. + """ + key: String! + + """ + Value of the attribute. + """ + value: String +} + +""" +Specifies the input fields required for an attribute. +""" +input AttributeInput { + """ + Key or name of the attribute. + """ + key: String! + + """ + Value of the attribute. + """ + value: String! +} + +""" +Automatic discount applications capture the intentions of a discount that was automatically applied. +""" +type AutomaticDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +A collection of available shipping rates for a checkout. +""" +type AvailableShippingRates { + """ + Whether or not the shipping rates are ready. + The `shippingRates` field is `null` when this value is `false`. + This field should be polled until its value becomes `true`. + """ + ready: Boolean! + + """ + The fetched shipping rates. `null` until the `ready` field is `true`. + """ + shippingRates: [ShippingRate!] +} + +""" +An online store blog. +""" +type Blog implements Node { + """ + Find an article by its handle. + """ + articleByHandle( + """ + The handle of the article. + """ + handle: String! + ): Article + + """ + List of the blog's articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! + + """ + The authors who have contributed to the blog. + """ + authors: [ArticleAuthor!]! + + """ + A human-friendly unique string for the Blog automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The blog's SEO information. + """ + seo: SEO + + """ + The blogs’s title. + """ + title: String! + + """ + The url pointing to the blog accessible from the web. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Blogs. +""" +type BlogConnection { + """ + A list of edges. + """ + edges: [BlogEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Blog and a cursor during pagination. +""" +type BlogEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of BlogEdge. + """ + node: Blog! +} + +""" +The set of valid sort keys for the Blog query. +""" +enum BlogSortKeys { + """ + Sort by the `handle` value. + """ + HANDLE + + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Card brand, such as Visa or Mastercard, which can be used for payments. +""" +enum CardBrand { + """ + Visa + """ + VISA + + """ + Mastercard + """ + MASTERCARD + + """ + Discover + """ + DISCOVER + + """ + American Express + """ + AMERICAN_EXPRESS + + """ + Diners Club + """ + DINERS_CLUB + + """ + JCB + """ + JCB +} + +""" +A container for all the information required to checkout items and pay. +""" +type Checkout implements Node { + """ + The gift cards used on the checkout. + """ + appliedGiftCards: [AppliedGiftCard!]! + + """ + The available shipping rates for this Checkout. + Should only be used when checkout `requiresShipping` is `true` and + the shipping address is valid. + """ + availableShippingRates: AvailableShippingRates + + """ + The date and time when the checkout was completed. + """ + completedAt: DateTime + + """ + The date and time when the checkout was created. + """ + createdAt: DateTime! + + """ + The currency code for the Checkout. + """ + currencyCode: CurrencyCode! + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [Attribute!]! + + """ + The customer associated with the checkout. + """ + customer: Customer + @deprecated( + reason: "This field will always return null. If you have an authentication token for the customer, you can use the `customer` field on the query root to retrieve it." + ) + + """ + Discounts that have been applied on the checkout. + """ + discountApplications( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): DiscountApplicationConnection! + + """ + The email attached to this checkout. + """ + email: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + A list of line item objects, each one containing information about an item in the checkout. + """ + lineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CheckoutLineItemConnection! + + """ + The sum of all the prices of all the items in the checkout. Duties, taxes, shipping and discounts excluded. + """ + lineItemsSubtotalPrice: MoneyV2! + + """ + The note associated with the checkout. + """ + note: String + + """ + The resulting order from a paid checkout. + """ + order: Order + + """ + The Order Status Page for this Checkout, null when checkout is not completed. + """ + orderStatusUrl: URL + + """ + The amount left to be paid. This is equal to the cost of the line items, taxes and shipping minus discounts and gift cards. + """ + paymentDue: Money! @deprecated(reason: "Use `paymentDueV2` instead") + + """ + The amount left to be paid. This is equal to the cost of the line items, duties, taxes and shipping minus discounts and gift cards. + """ + paymentDueV2: MoneyV2! + + """ + Whether or not the Checkout is ready and can be completed. Checkouts may + have asynchronous operations that can take time to finish. If you want + to complete a checkout or ensure all the fields are populated and up to + date, polling is required until the value is true. + """ + ready: Boolean! + + """ + States whether or not the fulfillment requires shipping. + """ + requiresShipping: Boolean! + + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddress + + """ + The discounts that have been allocated onto the shipping line by discount applications. + """ + shippingDiscountAllocations: [DiscountAllocation!]! + + """ + Once a shipping rate is selected by the customer it is transitioned to a `shipping_line` object. + """ + shippingLine: ShippingRate + + """ + Price of the checkout before shipping and taxes. + """ + subtotalPrice: Money! @deprecated(reason: "Use `subtotalPriceV2` instead") + + """ + Price of the checkout before duties, shipping and taxes. + """ + subtotalPriceV2: MoneyV2! + + """ + Specifies if the Checkout is tax exempt. + """ + taxExempt: Boolean! + + """ + Specifies if taxes are included in the line item and shipping line prices. + """ + taxesIncluded: Boolean! + + """ + The sum of all the prices of all the items in the checkout, taxes and discounts included. + """ + totalPrice: Money! @deprecated(reason: "Use `totalPriceV2` instead") + + """ + The sum of all the prices of all the items in the checkout, duties, taxes and discounts included. + """ + totalPriceV2: MoneyV2! + + """ + The sum of all the taxes applied to the line items and shipping lines in the checkout. + """ + totalTax: Money! @deprecated(reason: "Use `totalTaxV2` instead") + + """ + The sum of all the taxes applied to the line items and shipping lines in the checkout. + """ + totalTaxV2: MoneyV2! + + """ + The date and time when the checkout was last updated. + """ + updatedAt: DateTime! + + """ + The url pointing to the checkout accessible from the web. + """ + webUrl: URL! +} + +""" +Specifies the fields required to update a checkout's attributes. +""" +input CheckoutAttributesUpdateInput { + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of the addresses is still done at complete time. + """ + allowPartialAddresses: Boolean +} + +""" +Return type for `checkoutAttributesUpdate` mutation. +""" +type CheckoutAttributesUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Specifies the fields required to update a checkout's attributes. +""" +input CheckoutAttributesUpdateV2Input { + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of the addresses is still done at complete time. + """ + allowPartialAddresses: Boolean +} + +""" +Return type for `checkoutAttributesUpdateV2` mutation. +""" +type CheckoutAttributesUpdateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteFree` mutation. +""" +type CheckoutCompleteFreePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithCreditCard` mutation. +""" +type CheckoutCompleteWithCreditCardPayload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithCreditCardV2` mutation. +""" +type CheckoutCompleteWithCreditCardV2Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPayment` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentPayload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPaymentV2` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentV2Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCompleteWithTokenizedPaymentV3` mutation. +""" +type CheckoutCompleteWithTokenizedPaymentV3Payload { + """ + The checkout on which the payment was applied. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + A representation of the attempted payment. + """ + payment: Payment + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Specifies the fields required to create a checkout. +""" +input CheckoutCreateInput { + """ + The email with which the customer wants to checkout. + """ + email: String + + """ + A list of line item objects, each one containing information about an item in the checkout. + """ + lineItems: [CheckoutLineItemInput!] + + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput + + """ + The text of an optional note that a shop owner can attach to the checkout. + """ + note: String + + """ + A list of extra information that is added to the checkout. + """ + customAttributes: [AttributeInput!] + + """ + Allows setting partial addresses on a Checkout, skipping the full validation of attributes. + The required attributes are city, province, and country. + Full validation of addresses is still done at complete time. + """ + allowPartialAddresses: Boolean + + """ + The three-letter currency code of one of the shop's enabled presentment currencies. + Including this field creates a checkout in the specified currency. By default, new + checkouts are created in the shop's primary currency. + """ + presentmentCurrencyCode: CurrencyCode +} + +""" +Return type for `checkoutCreate` mutation. +""" +type CheckoutCreatePayload { + """ + The new checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerAssociate` mutation. +""" +type CheckoutCustomerAssociatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + The associated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `checkoutCustomerAssociateV2` mutation. +""" +type CheckoutCustomerAssociateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + The associated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerDisassociate` mutation. +""" +type CheckoutCustomerDisassociatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutCustomerDisassociateV2` mutation. +""" +type CheckoutCustomerDisassociateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeApply` mutation. +""" +type CheckoutDiscountCodeApplyPayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeApplyV2` mutation. +""" +type CheckoutDiscountCodeApplyV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutDiscountCodeRemove` mutation. +""" +type CheckoutDiscountCodeRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutEmailUpdate` mutation. +""" +type CheckoutEmailUpdatePayload { + """ + The checkout object with the updated email. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutEmailUpdateV2` mutation. +""" +type CheckoutEmailUpdateV2Payload { + """ + The checkout object with the updated email. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Possible error codes that could be returned by CheckoutUserError. +""" +enum CheckoutErrorCode { + """ + Input value is blank. + """ + BLANK + + """ + Input value is invalid. + """ + INVALID + + """ + Input value is too long. + """ + TOO_LONG + + """ + Input value is not present. + """ + PRESENT + + """ + Input value should be less than maximum allowed value. + """ + LESS_THAN + + """ + Input value should be greater than or equal to minimum allowed value. + """ + GREATER_THAN_OR_EQUAL_TO + + """ + Input value should be less or equal to maximum allowed value. + """ + LESS_THAN_OR_EQUAL_TO + + """ + Checkout is already completed. + """ + ALREADY_COMPLETED + + """ + Checkout is locked. + """ + LOCKED + + """ + Input value is not supported. + """ + NOT_SUPPORTED + + """ + Input email contains an invalid domain name. + """ + BAD_DOMAIN + + """ + Input Zip is invalid for country provided. + """ + INVALID_FOR_COUNTRY + + """ + Input Zip is invalid for country and province provided. + """ + INVALID_FOR_COUNTRY_AND_PROVINCE + + """ + Invalid state in country. + """ + INVALID_STATE_IN_COUNTRY + + """ + Invalid province in country. + """ + INVALID_PROVINCE_IN_COUNTRY + + """ + Invalid region in country. + """ + INVALID_REGION_IN_COUNTRY + + """ + Shipping rate expired. + """ + SHIPPING_RATE_EXPIRED + + """ + Gift card cannot be applied to a checkout that contains a gift card. + """ + GIFT_CARD_UNUSABLE + + """ + Gift card is disabled. + """ + GIFT_CARD_DISABLED + + """ + Gift card code is invalid. + """ + GIFT_CARD_CODE_INVALID + + """ + Gift card has already been applied. + """ + GIFT_CARD_ALREADY_APPLIED + + """ + Gift card currency does not match checkout currency. + """ + GIFT_CARD_CURRENCY_MISMATCH + + """ + Gift card is expired. + """ + GIFT_CARD_EXPIRED + + """ + Gift card has no funds left. + """ + GIFT_CARD_DEPLETED + + """ + Gift card was not found. + """ + GIFT_CARD_NOT_FOUND + + """ + Cart does not meet discount requirements notice. + """ + CART_DOES_NOT_MEET_DISCOUNT_REQUIREMENTS_NOTICE + + """ + Discount expired. + """ + DISCOUNT_EXPIRED + + """ + Discount disabled. + """ + DISCOUNT_DISABLED + + """ + Discount limit reached. + """ + DISCOUNT_LIMIT_REACHED + + """ + Discount not found. + """ + DISCOUNT_NOT_FOUND + + """ + Customer already used once per customer discount notice. + """ + CUSTOMER_ALREADY_USED_ONCE_PER_CUSTOMER_DISCOUNT_NOTICE + + """ + Checkout is already completed. + """ + EMPTY + + """ + Not enough in stock. + """ + NOT_ENOUGH_IN_STOCK + + """ + Missing payment input. + """ + MISSING_PAYMENT_INPUT + + """ + The amount of the payment does not match the value to be paid. + """ + TOTAL_PRICE_MISMATCH + + """ + Line item was not found in checkout. + """ + LINE_ITEM_NOT_FOUND + + """ + Unable to apply discount. + """ + UNABLE_TO_APPLY + + """ + Discount already applied. + """ + DISCOUNT_ALREADY_APPLIED +} + +""" +Return type for `checkoutGiftCardApply` mutation. +""" +type CheckoutGiftCardApplyPayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardRemove` mutation. +""" +type CheckoutGiftCardRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardRemoveV2` mutation. +""" +type CheckoutGiftCardRemoveV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutGiftCardsAppend` mutation. +""" +type CheckoutGiftCardsAppendPayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +A single line item in the checkout, grouped by variant and attributes. +""" +type CheckoutLineItem implements Node { + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [Attribute!]! + + """ + The discounts that have been allocated onto the checkout line item by discount applications. + """ + discountAllocations: [DiscountAllocation!]! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The quantity of the line item. + """ + quantity: Int! + + """ + Title of the line item. Defaults to the product's title. + """ + title: String! + + """ + Unit price of the line item. + """ + unitPrice: MoneyV2 + + """ + Product variant of the line item. + """ + variant: ProductVariant +} + +""" +An auto-generated type for paginating through multiple CheckoutLineItems. +""" +type CheckoutLineItemConnection { + """ + A list of edges. + """ + edges: [CheckoutLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one CheckoutLineItem and a cursor during pagination. +""" +type CheckoutLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CheckoutLineItemEdge. + """ + node: CheckoutLineItem! +} + +""" +Specifies the input fields to create a line item on a checkout. +""" +input CheckoutLineItemInput { + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [AttributeInput!] + + """ + The quantity of the line item. + """ + quantity: Int! + + """ + The identifier of the product variant for the line item. + """ + variantId: ID! +} + +""" +Specifies the input fields to update a line item on the checkout. +""" +input CheckoutLineItemUpdateInput { + """ + The identifier of the line item. + """ + id: ID + + """ + The variant identifier of the line item. + """ + variantId: ID + + """ + The quantity of the line item. + """ + quantity: Int + + """ + Extra information in the form of an array of Key-Value pairs about the line item. + """ + customAttributes: [AttributeInput!] +} + +""" +Return type for `checkoutLineItemsAdd` mutation. +""" +type CheckoutLineItemsAddPayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutLineItemsRemove` mutation. +""" +type CheckoutLineItemsRemovePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutLineItemsReplace` mutation. +""" +type CheckoutLineItemsReplacePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [CheckoutUserError!]! +} + +""" +Return type for `checkoutLineItemsUpdate` mutation. +""" +type CheckoutLineItemsUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingAddressUpdate` mutation. +""" +type CheckoutShippingAddressUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout! + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingAddressUpdateV2` mutation. +""" +type CheckoutShippingAddressUpdateV2Payload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Return type for `checkoutShippingLineUpdate` mutation. +""" +type CheckoutShippingLineUpdatePayload { + """ + The updated checkout object. + """ + checkout: Checkout + + """ + List of errors that occurred executing the mutation. + """ + checkoutUserErrors: [CheckoutUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `checkoutUserErrors` instead") +} + +""" +Represents an error that happens during execution of a checkout mutation. +""" +type CheckoutUserError implements DisplayableError { + """ + Error code to uniquely identify the error. + """ + code: CheckoutErrorCode + + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +A collection represents a grouping of products that a shop owner can create to organize them or make their shops easier to browse. +""" +type Collection implements Node { + """ + Stripped description of the collection, single line with HTML tags removed. + """ + description( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The description of the collection, complete with HTML formatting. + """ + descriptionHtml: HTML! + + """ + A human-friendly unique string for the collection automatically generated from its title. + Limit of 255 characters. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Image associated with the collection. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + List of products in the collection. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductCollectionSortKeys = COLLECTION_DEFAULT + ): ProductConnection! + + """ + The collection’s name. Limit of 255 characters. + """ + title: String! + + """ + The date and time when the collection was last modified. + """ + updatedAt: DateTime! +} + +""" +An auto-generated type for paginating through multiple Collections. +""" +type CollectionConnection { + """ + A list of edges. + """ + edges: [CollectionEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Collection and a cursor during pagination. +""" +type CollectionEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CollectionEdge. + """ + node: Collection! +} + +""" +The set of valid sort keys for the Collection query. +""" +enum CollectionSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A comment on an article. +""" +type Comment implements Node { + """ + The comment’s author. + """ + author: CommentAuthor! + + """ + Stripped content of the comment, single line with HTML tags removed. + """ + content( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The content of the comment, complete with HTML formatting. + """ + contentHtml: HTML! + + """ + Globally unique identifier. + """ + id: ID! +} + +""" +The author of a comment. +""" +type CommentAuthor { + """ + The author's email. + """ + email: String! + + """ + The author’s name. + """ + name: String! +} + +""" +An auto-generated type for paginating through multiple Comments. +""" +type CommentConnection { + """ + A list of edges. + """ + edges: [CommentEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Comment and a cursor during pagination. +""" +type CommentEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of CommentEdge. + """ + node: Comment! +} + +""" +ISO 3166-1 alpha-2 country codes with some differences. +""" +enum CountryCode { + """ + Afghanistan. + """ + AF + + """ + Åland Islands. + """ + AX + + """ + Albania. + """ + AL + + """ + Algeria. + """ + DZ + + """ + Andorra. + """ + AD + + """ + Angola. + """ + AO + + """ + Anguilla. + """ + AI + + """ + Antigua & Barbuda. + """ + AG + + """ + Argentina. + """ + AR + + """ + Armenia. + """ + AM + + """ + Aruba. + """ + AW + + """ + Australia. + """ + AU + + """ + Austria. + """ + AT + + """ + Azerbaijan. + """ + AZ + + """ + Bahamas. + """ + BS + + """ + Bahrain. + """ + BH + + """ + Bangladesh. + """ + BD + + """ + Barbados. + """ + BB + + """ + Belarus. + """ + BY + + """ + Belgium. + """ + BE + + """ + Belize. + """ + BZ + + """ + Benin. + """ + BJ + + """ + Bermuda. + """ + BM + + """ + Bhutan. + """ + BT + + """ + Bolivia. + """ + BO + + """ + Bosnia & Herzegovina. + """ + BA + + """ + Botswana. + """ + BW + + """ + Bouvet Island. + """ + BV + + """ + Brazil. + """ + BR + + """ + British Indian Ocean Territory. + """ + IO + + """ + Brunei. + """ + BN + + """ + Bulgaria. + """ + BG + + """ + Burkina Faso. + """ + BF + + """ + Burundi. + """ + BI + + """ + Cambodia. + """ + KH + + """ + Canada. + """ + CA + + """ + Cape Verde. + """ + CV + + """ + Caribbean Netherlands. + """ + BQ + + """ + Cayman Islands. + """ + KY + + """ + Central African Republic. + """ + CF + + """ + Chad. + """ + TD + + """ + Chile. + """ + CL + + """ + China. + """ + CN + + """ + Christmas Island. + """ + CX + + """ + Cocos (Keeling) Islands. + """ + CC + + """ + Colombia. + """ + CO + + """ + Comoros. + """ + KM + + """ + Congo - Brazzaville. + """ + CG + + """ + Congo - Kinshasa. + """ + CD + + """ + Cook Islands. + """ + CK + + """ + Costa Rica. + """ + CR + + """ + Croatia. + """ + HR + + """ + Cuba. + """ + CU + + """ + Curaçao. + """ + CW + + """ + Cyprus. + """ + CY + + """ + Czechia. + """ + CZ + + """ + Côte d’Ivoire. + """ + CI + + """ + Denmark. + """ + DK + + """ + Djibouti. + """ + DJ + + """ + Dominica. + """ + DM + + """ + Dominican Republic. + """ + DO + + """ + Ecuador. + """ + EC + + """ + Egypt. + """ + EG + + """ + El Salvador. + """ + SV + + """ + Equatorial Guinea. + """ + GQ + + """ + Eritrea. + """ + ER + + """ + Estonia. + """ + EE + + """ + Eswatini. + """ + SZ + + """ + Ethiopia. + """ + ET + + """ + Falkland Islands. + """ + FK + + """ + Faroe Islands. + """ + FO + + """ + Fiji. + """ + FJ + + """ + Finland. + """ + FI + + """ + France. + """ + FR + + """ + French Guiana. + """ + GF + + """ + French Polynesia. + """ + PF + + """ + French Southern Territories. + """ + TF + + """ + Gabon. + """ + GA + + """ + Gambia. + """ + GM + + """ + Georgia. + """ + GE + + """ + Germany. + """ + DE + + """ + Ghana. + """ + GH + + """ + Gibraltar. + """ + GI + + """ + Greece. + """ + GR + + """ + Greenland. + """ + GL + + """ + Grenada. + """ + GD + + """ + Guadeloupe. + """ + GP + + """ + Guatemala. + """ + GT + + """ + Guernsey. + """ + GG + + """ + Guinea. + """ + GN + + """ + Guinea-Bissau. + """ + GW + + """ + Guyana. + """ + GY + + """ + Haiti. + """ + HT + + """ + Heard & McDonald Islands. + """ + HM + + """ + Vatican City. + """ + VA + + """ + Honduras. + """ + HN + + """ + Hong Kong SAR. + """ + HK + + """ + Hungary. + """ + HU + + """ + Iceland. + """ + IS + + """ + India. + """ + IN + + """ + Indonesia. + """ + ID + + """ + Iran. + """ + IR + + """ + Iraq. + """ + IQ + + """ + Ireland. + """ + IE + + """ + Isle of Man. + """ + IM + + """ + Israel. + """ + IL + + """ + Italy. + """ + IT + + """ + Jamaica. + """ + JM + + """ + Japan. + """ + JP + + """ + Jersey. + """ + JE + + """ + Jordan. + """ + JO + + """ + Kazakhstan. + """ + KZ + + """ + Kenya. + """ + KE + + """ + Kiribati. + """ + KI + + """ + North Korea. + """ + KP + + """ + Kosovo. + """ + XK + + """ + Kuwait. + """ + KW + + """ + Kyrgyzstan. + """ + KG + + """ + Laos. + """ + LA + + """ + Latvia. + """ + LV + + """ + Lebanon. + """ + LB + + """ + Lesotho. + """ + LS + + """ + Liberia. + """ + LR + + """ + Libya. + """ + LY + + """ + Liechtenstein. + """ + LI + + """ + Lithuania. + """ + LT + + """ + Luxembourg. + """ + LU + + """ + Macao SAR. + """ + MO + + """ + Madagascar. + """ + MG + + """ + Malawi. + """ + MW + + """ + Malaysia. + """ + MY + + """ + Maldives. + """ + MV + + """ + Mali. + """ + ML + + """ + Malta. + """ + MT + + """ + Martinique. + """ + MQ + + """ + Mauritania. + """ + MR + + """ + Mauritius. + """ + MU + + """ + Mayotte. + """ + YT + + """ + Mexico. + """ + MX + + """ + Moldova. + """ + MD + + """ + Monaco. + """ + MC + + """ + Mongolia. + """ + MN + + """ + Montenegro. + """ + ME + + """ + Montserrat. + """ + MS + + """ + Morocco. + """ + MA + + """ + Mozambique. + """ + MZ + + """ + Myanmar (Burma). + """ + MM + + """ + Namibia. + """ + NA + + """ + Nauru. + """ + NR + + """ + Nepal. + """ + NP + + """ + Netherlands. + """ + NL + + """ + Netherlands Antilles. + """ + AN + + """ + New Caledonia. + """ + NC + + """ + New Zealand. + """ + NZ + + """ + Nicaragua. + """ + NI + + """ + Niger. + """ + NE + + """ + Nigeria. + """ + NG + + """ + Niue. + """ + NU + + """ + Norfolk Island. + """ + NF + + """ + North Macedonia. + """ + MK + + """ + Norway. + """ + NO + + """ + Oman. + """ + OM + + """ + Pakistan. + """ + PK + + """ + Palestinian Territories. + """ + PS + + """ + Panama. + """ + PA + + """ + Papua New Guinea. + """ + PG + + """ + Paraguay. + """ + PY + + """ + Peru. + """ + PE + + """ + Philippines. + """ + PH + + """ + Pitcairn Islands. + """ + PN + + """ + Poland. + """ + PL + + """ + Portugal. + """ + PT + + """ + Qatar. + """ + QA + + """ + Cameroon. + """ + CM + + """ + Réunion. + """ + RE + + """ + Romania. + """ + RO + + """ + Russia. + """ + RU + + """ + Rwanda. + """ + RW + + """ + St. Barthélemy. + """ + BL + + """ + St. Helena. + """ + SH + + """ + St. Kitts & Nevis. + """ + KN + + """ + St. Lucia. + """ + LC + + """ + St. Martin. + """ + MF + + """ + St. Pierre & Miquelon. + """ + PM + + """ + Samoa. + """ + WS + + """ + San Marino. + """ + SM + + """ + São Tomé & Príncipe. + """ + ST + + """ + Saudi Arabia. + """ + SA + + """ + Senegal. + """ + SN + + """ + Serbia. + """ + RS + + """ + Seychelles. + """ + SC + + """ + Sierra Leone. + """ + SL + + """ + Singapore. + """ + SG + + """ + Sint Maarten. + """ + SX + + """ + Slovakia. + """ + SK + + """ + Slovenia. + """ + SI + + """ + Solomon Islands. + """ + SB + + """ + Somalia. + """ + SO + + """ + South Africa. + """ + ZA + + """ + South Georgia & South Sandwich Islands. + """ + GS + + """ + South Korea. + """ + KR + + """ + South Sudan. + """ + SS + + """ + Spain. + """ + ES + + """ + Sri Lanka. + """ + LK + + """ + St. Vincent & Grenadines. + """ + VC + + """ + Sudan. + """ + SD + + """ + Suriname. + """ + SR + + """ + Svalbard & Jan Mayen. + """ + SJ + + """ + Sweden. + """ + SE + + """ + Switzerland. + """ + CH + + """ + Syria. + """ + SY + + """ + Taiwan. + """ + TW + + """ + Tajikistan. + """ + TJ + + """ + Tanzania. + """ + TZ + + """ + Thailand. + """ + TH + + """ + Timor-Leste. + """ + TL + + """ + Togo. + """ + TG + + """ + Tokelau. + """ + TK + + """ + Tonga. + """ + TO + + """ + Trinidad & Tobago. + """ + TT + + """ + Tunisia. + """ + TN + + """ + Turkey. + """ + TR + + """ + Turkmenistan. + """ + TM + + """ + Turks & Caicos Islands. + """ + TC + + """ + Tuvalu. + """ + TV + + """ + Uganda. + """ + UG + + """ + Ukraine. + """ + UA + + """ + United Arab Emirates. + """ + AE + + """ + United Kingdom. + """ + GB + + """ + United States. + """ + US + + """ + U.S. Outlying Islands. + """ + UM + + """ + Uruguay. + """ + UY + + """ + Uzbekistan. + """ + UZ + + """ + Vanuatu. + """ + VU + + """ + Venezuela. + """ + VE + + """ + Vietnam. + """ + VN + + """ + British Virgin Islands. + """ + VG + + """ + Wallis & Futuna. + """ + WF + + """ + Western Sahara. + """ + EH + + """ + Yemen. + """ + YE + + """ + Zambia. + """ + ZM + + """ + Zimbabwe. + """ + ZW +} + +""" +Credit card information used for a payment. +""" +type CreditCard { + """ + The brand of the credit card. + """ + brand: String + + """ + The expiry month of the credit card. + """ + expiryMonth: Int + + """ + The expiry year of the credit card. + """ + expiryYear: Int + + """ + The credit card's BIN number. + """ + firstDigits: String + + """ + The first name of the card holder. + """ + firstName: String + + """ + The last 4 digits of the credit card. + """ + lastDigits: String + + """ + The last name of the card holder. + """ + lastName: String + + """ + The masked credit card number with only the last 4 digits displayed. + """ + maskedNumber: String +} + +""" +Specifies the fields required to complete a checkout with +a Shopify vaulted credit card payment. +""" +input CreditCardPaymentInput { + """ + The amount of the payment. + """ + amount: Money! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The ID returned by Shopify's Card Vault. + """ + vaultId: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean +} + +""" +Specifies the fields required to complete a checkout with +a Shopify vaulted credit card payment. +""" +input CreditCardPaymentInputV2 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The ID returned by Shopify's Card Vault. + """ + vaultId: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean +} + +""" +The part of the image that should remain after cropping. +""" +enum CropRegion { + """ + Keep the center of the image. + """ + CENTER + + """ + Keep the top of the image. + """ + TOP + + """ + Keep the bottom of the image. + """ + BOTTOM + + """ + Keep the left of the image. + """ + LEFT + + """ + Keep the right of the image. + """ + RIGHT +} + +""" +Currency codes. +""" +enum CurrencyCode { + """ + United States Dollars (USD). + """ + USD + + """ + Euro (EUR). + """ + EUR + + """ + United Kingdom Pounds (GBP). + """ + GBP + + """ + Canadian Dollars (CAD). + """ + CAD + + """ + Afghan Afghani (AFN). + """ + AFN + + """ + Albanian Lek (ALL). + """ + ALL + + """ + Algerian Dinar (DZD). + """ + DZD + + """ + Angolan Kwanza (AOA). + """ + AOA + + """ + Argentine Pesos (ARS). + """ + ARS + + """ + Armenian Dram (AMD). + """ + AMD + + """ + Aruban Florin (AWG). + """ + AWG + + """ + Australian Dollars (AUD). + """ + AUD + + """ + Barbadian Dollar (BBD). + """ + BBD + + """ + Azerbaijani Manat (AZN). + """ + AZN + + """ + Bangladesh Taka (BDT). + """ + BDT + + """ + Bahamian Dollar (BSD). + """ + BSD + + """ + Bahraini Dinar (BHD). + """ + BHD + + """ + Burundian Franc (BIF). + """ + BIF + + """ + Belarusian Ruble (BYN). + """ + BYN + + """ + Belarusian Ruble (BYR). + """ + BYR + + """ + Belize Dollar (BZD). + """ + BZD + + """ + Bermudian Dollar (BMD). + """ + BMD + + """ + Bhutanese Ngultrum (BTN). + """ + BTN + + """ + Bosnia and Herzegovina Convertible Mark (BAM). + """ + BAM + + """ + Brazilian Real (BRL). + """ + BRL + + """ + Bolivian Boliviano (BOB). + """ + BOB + + """ + Botswana Pula (BWP). + """ + BWP + + """ + Brunei Dollar (BND). + """ + BND + + """ + Bulgarian Lev (BGN). + """ + BGN + + """ + Burmese Kyat (MMK). + """ + MMK + + """ + Cambodian Riel. + """ + KHR + + """ + Cape Verdean escudo (CVE). + """ + CVE + + """ + Cayman Dollars (KYD). + """ + KYD + + """ + Central African CFA Franc (XAF). + """ + XAF + + """ + Chilean Peso (CLP). + """ + CLP + + """ + Chinese Yuan Renminbi (CNY). + """ + CNY + + """ + Colombian Peso (COP). + """ + COP + + """ + Comorian Franc (KMF). + """ + KMF + + """ + Congolese franc (CDF). + """ + CDF + + """ + Costa Rican Colones (CRC). + """ + CRC + + """ + Croatian Kuna (HRK). + """ + HRK + + """ + Czech Koruny (CZK). + """ + CZK + + """ + Danish Kroner (DKK). + """ + DKK + + """ + Djiboutian Franc (DJF). + """ + DJF + + """ + Dominican Peso (DOP). + """ + DOP + + """ + East Caribbean Dollar (XCD). + """ + XCD + + """ + Egyptian Pound (EGP). + """ + EGP + + """ + Eritrean Nakfa (ERN). + """ + ERN + + """ + Ethiopian Birr (ETB). + """ + ETB + + """ + Falkland Islands Pounds (FKP). + """ + FKP + + """ + CFP Franc (XPF). + """ + XPF + + """ + Fijian Dollars (FJD). + """ + FJD + + """ + Gibraltar Pounds (GIP). + """ + GIP + + """ + Gambian Dalasi (GMD). + """ + GMD + + """ + Ghanaian Cedi (GHS). + """ + GHS + + """ + Guatemalan Quetzal (GTQ). + """ + GTQ + + """ + Guyanese Dollar (GYD). + """ + GYD + + """ + Georgian Lari (GEL). + """ + GEL + + """ + Guinean Franc (GNF). + """ + GNF + + """ + Haitian Gourde (HTG). + """ + HTG + + """ + Honduran Lempira (HNL). + """ + HNL + + """ + Hong Kong Dollars (HKD). + """ + HKD + + """ + Hungarian Forint (HUF). + """ + HUF + + """ + Icelandic Kronur (ISK). + """ + ISK + + """ + Indian Rupees (INR). + """ + INR + + """ + Indonesian Rupiah (IDR). + """ + IDR + + """ + Israeli New Shekel (NIS). + """ + ILS + + """ + Iranian Rial (IRR). + """ + IRR + + """ + Iraqi Dinar (IQD). + """ + IQD + + """ + Jamaican Dollars (JMD). + """ + JMD + + """ + Japanese Yen (JPY). + """ + JPY + + """ + Jersey Pound. + """ + JEP + + """ + Jordanian Dinar (JOD). + """ + JOD + + """ + Kazakhstani Tenge (KZT). + """ + KZT + + """ + Kenyan Shilling (KES). + """ + KES + + """ + Kiribati Dollar (KID). + """ + KID + + """ + Kuwaiti Dinar (KWD). + """ + KWD + + """ + Kyrgyzstani Som (KGS). + """ + KGS + + """ + Laotian Kip (LAK). + """ + LAK + + """ + Latvian Lati (LVL). + """ + LVL + + """ + Lebanese Pounds (LBP). + """ + LBP + + """ + Lesotho Loti (LSL). + """ + LSL + + """ + Liberian Dollar (LRD). + """ + LRD + + """ + Libyan Dinar (LYD). + """ + LYD + + """ + Lithuanian Litai (LTL). + """ + LTL + + """ + Malagasy Ariary (MGA). + """ + MGA + + """ + Macedonia Denar (MKD). + """ + MKD + + """ + Macanese Pataca (MOP). + """ + MOP + + """ + Malawian Kwacha (MWK). + """ + MWK + + """ + Maldivian Rufiyaa (MVR). + """ + MVR + + """ + Mauritanian Ouguiya (MRU). + """ + MRU + + """ + Mexican Pesos (MXN). + """ + MXN + + """ + Malaysian Ringgits (MYR). + """ + MYR + + """ + Mauritian Rupee (MUR). + """ + MUR + + """ + Moldovan Leu (MDL). + """ + MDL + + """ + Moroccan Dirham. + """ + MAD + + """ + Mongolian Tugrik. + """ + MNT + + """ + Mozambican Metical. + """ + MZN + + """ + Namibian Dollar. + """ + NAD + + """ + Nepalese Rupee (NPR). + """ + NPR + + """ + Netherlands Antillean Guilder. + """ + ANG + + """ + New Zealand Dollars (NZD). + """ + NZD + + """ + Nicaraguan Córdoba (NIO). + """ + NIO + + """ + Nigerian Naira (NGN). + """ + NGN + + """ + Norwegian Kroner (NOK). + """ + NOK + + """ + Omani Rial (OMR). + """ + OMR + + """ + Panamian Balboa (PAB). + """ + PAB + + """ + Pakistani Rupee (PKR). + """ + PKR + + """ + Papua New Guinean Kina (PGK). + """ + PGK + + """ + Paraguayan Guarani (PYG). + """ + PYG + + """ + Peruvian Nuevo Sol (PEN). + """ + PEN + + """ + Philippine Peso (PHP). + """ + PHP + + """ + Polish Zlotych (PLN). + """ + PLN + + """ + Qatari Rial (QAR). + """ + QAR + + """ + Romanian Lei (RON). + """ + RON + + """ + Russian Rubles (RUB). + """ + RUB + + """ + Rwandan Franc (RWF). + """ + RWF + + """ + Samoan Tala (WST). + """ + WST + + """ + Saint Helena Pounds (SHP). + """ + SHP + + """ + Saudi Riyal (SAR). + """ + SAR + + """ + Sao Tome And Principe Dobra (STD). + """ + STD + + """ + Serbian dinar (RSD). + """ + RSD + + """ + Seychellois Rupee (SCR). + """ + SCR + + """ + Sierra Leonean Leone (SLL). + """ + SLL + + """ + Singapore Dollars (SGD). + """ + SGD + + """ + Sudanese Pound (SDG). + """ + SDG + + """ + Somali Shilling (SOS). + """ + SOS + + """ + Syrian Pound (SYP). + """ + SYP + + """ + South African Rand (ZAR). + """ + ZAR + + """ + South Korean Won (KRW). + """ + KRW + + """ + South Sudanese Pound (SSP). + """ + SSP + + """ + Solomon Islands Dollar (SBD). + """ + SBD + + """ + Sri Lankan Rupees (LKR). + """ + LKR + + """ + Surinamese Dollar (SRD). + """ + SRD + + """ + Swazi Lilangeni (SZL). + """ + SZL + + """ + Swedish Kronor (SEK). + """ + SEK + + """ + Swiss Francs (CHF). + """ + CHF + + """ + Taiwan Dollars (TWD). + """ + TWD + + """ + Thai baht (THB). + """ + THB + + """ + Tajikistani Somoni (TJS). + """ + TJS + + """ + Tanzanian Shilling (TZS). + """ + TZS + + """ + Tongan Pa'anga (TOP). + """ + TOP + + """ + Trinidad and Tobago Dollars (TTD). + """ + TTD + + """ + Tunisian Dinar (TND). + """ + TND + + """ + Turkish Lira (TRY). + """ + TRY + + """ + Turkmenistani Manat (TMT). + """ + TMT + + """ + Ugandan Shilling (UGX). + """ + UGX + + """ + Ukrainian Hryvnia (UAH). + """ + UAH + + """ + United Arab Emirates Dirham (AED). + """ + AED + + """ + Uruguayan Pesos (UYU). + """ + UYU + + """ + Uzbekistan som (UZS). + """ + UZS + + """ + Vanuatu Vatu (VUV). + """ + VUV + + """ + Venezuelan Bolivares (VEF). + """ + VEF + + """ + Venezuelan Bolivares (VES). + """ + VES + + """ + Vietnamese đồng (VND). + """ + VND + + """ + West African CFA franc (XOF). + """ + XOF + + """ + Yemeni Rial (YER). + """ + YER + + """ + Zambian Kwacha (ZMW). + """ + ZMW +} + +""" +A customer represents a customer account with the shop. Customer accounts store contact information for the customer, saving logged-in customers the trouble of having to provide it at every checkout. +""" +type Customer { + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean! + + """ + A list of addresses for the customer. + """ + addresses( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MailingAddressConnection! + + """ + The date and time when the customer was created. + """ + createdAt: DateTime! + + """ + The customer’s default address. + """ + defaultAddress: MailingAddress + + """ + The customer’s name, email or phone number. + """ + displayName: String! + + """ + The customer’s email address. + """ + email: String + + """ + The customer’s first name. + """ + firstName: String + + """ + A unique identifier for the customer. + """ + id: ID! + + """ + The customer's most recently updated, incomplete checkout. + """ + lastIncompleteCheckout: Checkout + + """ + The customer’s last name. + """ + lastName: String + + """ + The orders associated with the customer. + """ + orders( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: OrderSortKeys = ID + + """ + Supported filter parameters: + - `processed_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): OrderConnection! + + """ + The customer’s phone number. + """ + phone: String + + """ + A comma separated list of tags that have been added to the customer. + Additional access scope required: unauthenticated_read_customer_tags. + """ + tags: [String!]! + + """ + The date and time when the customer information was updated. + """ + updatedAt: DateTime! +} + +""" +A CustomerAccessToken represents the unique token required to make modifications to the customer object. +""" +type CustomerAccessToken { + """ + The customer’s access token. + """ + accessToken: String! + + """ + The date and time when the customer access token expires. + """ + expiresAt: DateTime! +} + +""" +Specifies the input fields required to create a customer access token. +""" +input CustomerAccessTokenCreateInput { + """ + The email associated to the customer. + """ + email: String! + + """ + The login password to be used by the customer. + """ + password: String! +} + +""" +Return type for `customerAccessTokenCreate` mutation. +""" +type CustomerAccessTokenCreatePayload { + """ + The newly created customer access token object. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAccessTokenCreateWithMultipass` mutation. +""" +type CustomerAccessTokenCreateWithMultipassPayload { + """ + An access token object associated with the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! +} + +""" +Return type for `customerAccessTokenDelete` mutation. +""" +type CustomerAccessTokenDeletePayload { + """ + The destroyed access token. + """ + deletedAccessToken: String + + """ + ID of the destroyed customer access token. + """ + deletedCustomerAccessTokenId: String + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `customerAccessTokenRenew` mutation. +""" +type CustomerAccessTokenRenewPayload { + """ + The renewed customer access token object. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! +} + +""" +Return type for `customerActivateByUrl` mutation. +""" +type CustomerActivateByUrlPayload { + """ + The customer that was activated. + """ + customer: Customer + + """ + A new customer access token for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! +} + +""" +Specifies the input fields required to activate a customer. +""" +input CustomerActivateInput { + """ + The activation token required to activate the customer. + """ + activationToken: String! + + """ + New password that will be set during activation. + """ + password: String! +} + +""" +Return type for `customerActivate` mutation. +""" +type CustomerActivatePayload { + """ + The customer object. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressCreate` mutation. +""" +type CustomerAddressCreatePayload { + """ + The new customer address object. + """ + customerAddress: MailingAddress + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressDelete` mutation. +""" +type CustomerAddressDeletePayload { + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + ID of the deleted customer address. + """ + deletedCustomerAddressId: String + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerAddressUpdate` mutation. +""" +type CustomerAddressUpdatePayload { + """ + The customer’s updated mailing address. + """ + customerAddress: MailingAddress + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to create a new customer. +""" +input CustomerCreateInput { + """ + The customer’s first name. + """ + firstName: String + + """ + The customer’s last name. + """ + lastName: String + + """ + The customer’s email. + """ + email: String! + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The login password used by the customer. + """ + password: String! + + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean +} + +""" +Return type for `customerCreate` mutation. +""" +type CustomerCreatePayload { + """ + The created customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerDefaultAddressUpdate` mutation. +""" +type CustomerDefaultAddressUpdatePayload { + """ + The updated customer object. + """ + customer: Customer + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Possible error codes that could be returned by CustomerUserError. +""" +enum CustomerErrorCode { + """ + Input value is blank. + """ + BLANK + + """ + Input value is invalid. + """ + INVALID + + """ + Input value is already taken. + """ + TAKEN + + """ + Input value is too long. + """ + TOO_LONG + + """ + Input value is too short. + """ + TOO_SHORT + + """ + Unidentified customer. + """ + UNIDENTIFIED_CUSTOMER + + """ + Customer is disabled. + """ + CUSTOMER_DISABLED + + """ + Input password starts or ends with whitespace. + """ + PASSWORD_STARTS_OR_ENDS_WITH_WHITESPACE + + """ + Input contains HTML tags. + """ + CONTAINS_HTML_TAGS + + """ + Input contains URL. + """ + CONTAINS_URL + + """ + Invalid activation token. + """ + TOKEN_INVALID + + """ + Customer already enabled. + """ + ALREADY_ENABLED + + """ + Address does not exist. + """ + NOT_FOUND + + """ + Input email contains an invalid domain name. + """ + BAD_DOMAIN + + """ + Multipass token is not valid. + """ + INVALID_MULTIPASS_REQUEST +} + +""" +Return type for `customerRecover` mutation. +""" +type CustomerRecoverPayload { + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Return type for `customerResetByUrl` mutation. +""" +type CustomerResetByUrlPayload { + """ + The customer object which was reset. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to reset a customer’s password. +""" +input CustomerResetInput { + """ + The reset token required to reset the customer’s password. + """ + resetToken: String! + + """ + New password that will be set as part of the reset password process. + """ + password: String! +} + +""" +Return type for `customerReset` mutation. +""" +type CustomerResetPayload { + """ + The customer object which was reset. + """ + customer: Customer + + """ + A newly created customer access token object for the customer. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Specifies the fields required to update the Customer information. +""" +input CustomerUpdateInput { + """ + The customer’s first name. + """ + firstName: String + + """ + The customer’s last name. + """ + lastName: String + + """ + The customer’s email. + """ + email: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. To remove the phone number, specify `null`. + """ + phone: String + + """ + The login password used by the customer. + """ + password: String + + """ + Indicates whether the customer has consented to be sent marketing material via email. + """ + acceptsMarketing: Boolean +} + +""" +Return type for `customerUpdate` mutation. +""" +type CustomerUpdatePayload { + """ + The updated customer object. + """ + customer: Customer + + """ + The newly created customer access token. If the customer's password is updated, all previous access tokens + (including the one used to perform this mutation) become invalid, and a new token is generated. + """ + customerAccessToken: CustomerAccessToken + + """ + List of errors that occurred executing the mutation. + """ + customerUserErrors: [CustomerUserError!]! + + """ + List of errors that occurred executing the mutation. + """ + userErrors: [UserError!]! + @deprecated(reason: "Use `customerUserErrors` instead") +} + +""" +Represents an error that happens during execution of a customer mutation. +""" +type CustomerUserError implements DisplayableError { + """ + Error code to uniquely identify the error. + """ + code: CustomerErrorCode + + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +An ISO-8601 encoded UTC date time string. Example value: `"2019-07-03T20:47:55Z"`. +""" +scalar DateTime + +""" +A signed decimal number, which supports arbitrary precision and is serialized as a string. Example value: `"29.99"`. +""" +scalar Decimal + +""" +Digital wallet, such as Apple Pay, which can be used for accelerated checkouts. +""" +enum DigitalWallet { + """ + Apple Pay. + """ + APPLE_PAY + + """ + Android Pay. + """ + ANDROID_PAY + + """ + Google Pay. + """ + GOOGLE_PAY + + """ + Shopify Pay. + """ + SHOPIFY_PAY +} + +""" +An amount discounting the line that has been allocated by a discount. +""" +type DiscountAllocation { + """ + Amount of discount allocated. + """ + allocatedAmount: MoneyV2! + + """ + The discount this allocated amount originated from. + """ + discountApplication: DiscountApplication! +} + +""" +Discount applications capture the intentions of a discount source at +the time of application. +""" +interface DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +The method by which the discount's value is allocated onto its entitled lines. +""" +enum DiscountApplicationAllocationMethod { + """ + The value is spread across all entitled lines. + """ + ACROSS + + """ + The value is applied onto every entitled line. + """ + EACH + + """ + The value is specifically applied onto a particular line. + """ + ONE +} + +""" +An auto-generated type for paginating through multiple DiscountApplications. +""" +type DiscountApplicationConnection { + """ + A list of edges. + """ + edges: [DiscountApplicationEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one DiscountApplication and a cursor during pagination. +""" +type DiscountApplicationEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of DiscountApplicationEdge. + """ + node: DiscountApplication! +} + +""" +Which lines on the order that the discount is allocated over, of the type +defined by the Discount Application's target_type. +""" +enum DiscountApplicationTargetSelection { + """ + The discount is allocated onto all the lines. + """ + ALL + + """ + The discount is allocated onto only the lines it is entitled for. + """ + ENTITLED + + """ + The discount is allocated onto explicitly chosen lines. + """ + EXPLICIT +} + +""" +The type of line (i.e. line item or shipping line) on an order that the discount is applicable towards. +""" +enum DiscountApplicationTargetType { + """ + The discount applies onto line items. + """ + LINE_ITEM + + """ + The discount applies onto shipping lines. + """ + SHIPPING_LINE +} + +""" +Discount code applications capture the intentions of a discount code at +the time that it is applied. +""" +type DiscountCodeApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + Specifies whether the discount code was applied successfully. + """ + applicable: Boolean! + + """ + The string identifying the discount code that was used at the time of application. + """ + code: String! + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Represents an error in the input of a mutation. +""" +interface DisplayableError { + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +Represents a web address. +""" +type Domain { + """ + The host name of the domain (eg: `example.com`). + """ + host: String! + + """ + Whether SSL is enabled or not. + """ + sslEnabled: Boolean! + + """ + The URL of the domain (eg: `https://example.com`). + """ + url: URL! +} + +""" +Represents a video hosted outside of Shopify. +""" +type ExternalVideo implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + The URL. + """ + embeddedUrl: URL! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +Represents a single fulfillment in an order. +""" +type Fulfillment { + """ + List of the fulfillment's line items. + """ + fulfillmentLineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): FulfillmentLineItemConnection! + + """ + The name of the tracking company. + """ + trackingCompany: String + + """ + Tracking information associated with the fulfillment, + such as the tracking number and tracking URL. + """ + trackingInfo( + """ + Truncate the array result to this size. + """ + first: Int + ): [FulfillmentTrackingInfo!]! +} + +""" +Represents a single line item in a fulfillment. There is at most one fulfillment line item for each order line item. +""" +type FulfillmentLineItem { + """ + The associated order's line item. + """ + lineItem: OrderLineItem! + + """ + The amount fulfilled in this fulfillment. + """ + quantity: Int! +} + +""" +An auto-generated type for paginating through multiple FulfillmentLineItems. +""" +type FulfillmentLineItemConnection { + """ + A list of edges. + """ + edges: [FulfillmentLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one FulfillmentLineItem and a cursor during pagination. +""" +type FulfillmentLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of FulfillmentLineItemEdge. + """ + node: FulfillmentLineItem! +} + +""" +Tracking information associated with the fulfillment. +""" +type FulfillmentTrackingInfo { + """ + The tracking number of the fulfillment. + """ + number: String + + """ + The URL to track the fulfillment. + """ + url: URL +} + +""" +A string containing HTML code. Example value: `"

Grey cotton knit sweater.

"`. +""" +scalar HTML + +""" +Represents information about the metafields associated to the specified resource. +""" +interface HasMetafields { + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! +} + +""" +Represents an image resource. +""" +type Image { + """ + A word or phrase to share the nature or contents of an image. + """ + altText: String + + """ + The original height of the image in pixels. Returns `null` if the image is not hosted by Shopify. + """ + height: Int + + """ + A unique identifier for the image. + """ + id: ID + + """ + The location of the original image as a URL. + + If there are any existing transformations in the original source URL, they will remain and not be stripped. + """ + originalSrc: URL! + + """ + The location of the image as a URL. + """ + src: URL! + @deprecated( + reason: "Previously an image had a single `src` field. This could either return the original image\nlocation or a URL that contained transformations such as sizing or scale.\n\nThese transformations were specified by arguments on the parent field.\n\nNow an image has two distinct URL fields: `originalSrc` and `transformedSrc`.\n\n* `originalSrc` - the original unmodified image URL\n* `transformedSrc` - the image URL with the specified transformations included\n\nTo migrate to the new fields, image transformations should be moved from the parent field to `transformedSrc`.\n\nBefore:\n```graphql\n{\n shop {\n productImages(maxWidth: 200, scale: 2) {\n edges {\n node {\n src\n }\n }\n }\n }\n}\n```\n\nAfter:\n```graphql\n{\n shop {\n productImages {\n edges {\n node {\n transformedSrc(maxWidth: 200, scale: 2)\n }\n }\n }\n }\n}\n```\n" + ) + + """ + The location of the transformed image as a URL. + + All transformation arguments are considered "best-effort". If they can be applied to an image, they will be. + Otherwise any transformations which an image type does not support will be ignored. + """ + transformedSrc( + """ + Image width in pixels between 1 and 5760. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 5760. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. + """ + scale: Int = 1 + + """ + Best effort conversion of image into content type (SVG -> PNG, Anything -> JGP, Anything -> WEBP are supported). + """ + preferredContentType: ImageContentType + ): URL! + + """ + The original width of the image in pixels. Returns `null` if the image is not hosted by Shopify. + """ + width: Int +} + +""" +An auto-generated type for paginating through multiple Images. +""" +type ImageConnection { + """ + A list of edges. + """ + edges: [ImageEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +List of supported image content types. +""" +enum ImageContentType { + """ + A PNG image. + """ + PNG + + """ + A JPG image. + """ + JPG + + """ + A WEBP image. + """ + WEBP +} + +""" +An auto-generated type which holds one Image and a cursor during pagination. +""" +type ImageEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ImageEdge. + """ + node: Image! +} + +""" +Represents a mailing address for customers and shipping. +""" +type MailingAddress implements Node { + """ + The first line of the address. Typically the street address or PO Box number. + """ + address1: String + + """ + The second line of the address. Typically the number of the apartment, suite, or unit. + """ + address2: String + + """ + The name of the city, district, village, or town. + """ + city: String + + """ + The name of the customer's company or organization. + """ + company: String + + """ + The name of the country. + """ + country: String + + """ + The two-letter code for the country of the address. + + For example, US. + """ + countryCode: String @deprecated(reason: "Use `countryCodeV2` instead") + + """ + The two-letter code for the country of the address. + + For example, US. + """ + countryCodeV2: CountryCode + + """ + The first name of the customer. + """ + firstName: String + + """ + A formatted version of the address, customized by the provided arguments. + """ + formatted( + """ + Whether to include the customer's name in the formatted address. + """ + withName: Boolean = false + + """ + Whether to include the customer's company in the formatted address. + """ + withCompany: Boolean = true + ): [String!]! + + """ + A comma-separated list of the values for city, province, and country. + """ + formattedArea: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The last name of the customer. + """ + lastName: String + + """ + The latitude coordinate of the customer address. + """ + latitude: Float + + """ + The longitude coordinate of the customer address. + """ + longitude: Float + + """ + The full name of the customer, based on firstName and lastName. + """ + name: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The region of the address, such as the province, state, or district. + """ + province: String + + """ + The two-letter code for the region. + + For example, ON. + """ + provinceCode: String + + """ + The zip or postal code of the address. + """ + zip: String +} + +""" +An auto-generated type for paginating through multiple MailingAddresses. +""" +type MailingAddressConnection { + """ + A list of edges. + """ + edges: [MailingAddressEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one MailingAddress and a cursor during pagination. +""" +type MailingAddressEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MailingAddressEdge. + """ + node: MailingAddress! +} + +""" +Specifies the fields accepted to create or update a mailing address. +""" +input MailingAddressInput { + """ + The first line of the address. Typically the street address or PO Box number. + """ + address1: String + + """ + The second line of the address. Typically the number of the apartment, suite, or unit. + """ + address2: String + + """ + The name of the city, district, village, or town. + """ + city: String + + """ + The name of the customer's company or organization. + """ + company: String + + """ + The name of the country. + """ + country: String + + """ + The first name of the customer. + """ + firstName: String + + """ + The last name of the customer. + """ + lastName: String + + """ + A unique phone number for the customer. + + Formatted using E.164 standard. For example, _+16135551111_. + """ + phone: String + + """ + The region of the address, such as the province, state, or district. + """ + province: String + + """ + The zip or postal code of the address. + """ + zip: String +} + +""" +Manual discount applications capture the intentions of a discount that was manually created. +""" +type ManualDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + The description of the application. + """ + description: String + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Represents a media interface. +""" +interface Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +An auto-generated type for paginating through multiple Media. +""" +type MediaConnection { + """ + A list of edges. + """ + edges: [MediaEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +The possible content types for a media object. +""" +enum MediaContentType { + """ + An externally hosted video. + """ + EXTERNAL_VIDEO + + """ + A Shopify hosted image. + """ + IMAGE + + """ + A 3d model. + """ + MODEL_3D + + """ + A Shopify hosted video. + """ + VIDEO +} + +""" +An auto-generated type which holds one Media and a cursor during pagination. +""" +type MediaEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MediaEdge. + """ + node: Media! +} + +""" +Represents a Shopify hosted image. +""" +type MediaImage implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The image for the media. + """ + image: Image + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image +} + +""" +Metafields represent custom metadata attached to a resource. Metafields can be sorted into namespaces and are +comprised of keys, values, and value types. +""" +type Metafield implements Node { + """ + The date and time when the storefront metafield was created. + """ + createdAt: DateTime! + + """ + The description of a metafield. + """ + description: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The key name for a metafield. + """ + key: String! + + """ + The namespace for a metafield. + """ + namespace: String! + + """ + The parent object that the metafield belongs to. + """ + parentResource: MetafieldParentResource! + + """ + The date and time when the storefront metafield was updated. + """ + updatedAt: DateTime! + + """ + The value of a metafield. + """ + value: String! + + """ + Represents the metafield value type. + """ + valueType: MetafieldValueType! +} + +""" +An auto-generated type for paginating through multiple Metafields. +""" +type MetafieldConnection { + """ + A list of edges. + """ + edges: [MetafieldEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Metafield and a cursor during pagination. +""" +type MetafieldEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MetafieldEdge. + """ + node: Metafield! +} + +""" +A resource that the metafield belongs to. +""" +union MetafieldParentResource = Product | ProductVariant + +""" +Metafield value types. +""" +enum MetafieldValueType { + """ + A string metafield. + """ + STRING + + """ + An integer metafield. + """ + INTEGER + + """ + A json string metafield. + """ + JSON_STRING +} + +""" +Represents a Shopify hosted 3D model. +""" +type Model3d implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image + + """ + The sources for a 3d model. + """ + sources: [Model3dSource!]! +} + +""" +Represents a source for a Shopify hosted 3d model. +""" +type Model3dSource { + """ + The filesize of the 3d model. + """ + filesize: Int! + + """ + The format of the 3d model. + """ + format: String! + + """ + The MIME type of the 3d model. + """ + mimeType: String! + + """ + The URL of the 3d model. + """ + url: String! +} + +""" +A monetary value string. Example value: `"100.57"`. +""" +scalar Money + +""" +Specifies the fields for a monetary value with currency. +""" +input MoneyInput { + """ + Decimal money amount. + """ + amount: Decimal! + + """ + Currency of the money. + """ + currencyCode: CurrencyCode! +} + +""" +A monetary value with currency. + +To format currencies, combine this type's amount and currencyCode fields with your client's locale. + +For example, in JavaScript you could use Intl.NumberFormat: + +```js +new Intl.NumberFormat(locale, { + style: 'currency', + currency: currencyCode +}).format(amount); +``` + +Other formatting libraries include: + +* iOS - [NumberFormatter](https://developer.apple.com/documentation/foundation/numberformatter) +* Android - [NumberFormat](https://developer.android.com/reference/java/text/NumberFormat.html) +* PHP - [NumberFormatter](http://php.net/manual/en/class.numberformatter.php) + +For a more general solution, the [Unicode CLDR number formatting database] is available with many implementations +(such as [TwitterCldr](https://github.com/twitter/twitter-cldr-rb)). +""" +type MoneyV2 { + """ + Decimal money amount. + """ + amount: Decimal! + + """ + Currency of the money. + """ + currencyCode: CurrencyCode! +} + +""" +An auto-generated type for paginating through multiple MoneyV2s. +""" +type MoneyV2Connection { + """ + A list of edges. + """ + edges: [MoneyV2Edge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one MoneyV2 and a cursor during pagination. +""" +type MoneyV2Edge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of MoneyV2Edge. + """ + node: MoneyV2! +} + +""" +The schema’s entry-point for mutations. This acts as the public, top-level API from which all mutation queries must start. +""" +type Mutation { + """ + Updates the attributes of a checkout. + """ + checkoutAttributesUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The fields used to update a checkout's attributes. + """ + input: CheckoutAttributesUpdateInput! + ): CheckoutAttributesUpdatePayload + @deprecated(reason: "Use `checkoutAttributesUpdateV2` instead") + + """ + Updates the attributes of a checkout. + """ + checkoutAttributesUpdateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The checkout attributes to update. + """ + input: CheckoutAttributesUpdateV2Input! + ): CheckoutAttributesUpdateV2Payload + + """ + Completes a checkout without providing payment information. You can use this mutation for free items or items whose purchase price is covered by a gift card. + """ + checkoutCompleteFree( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCompleteFreePayload + + """ + Completes a checkout using a credit card token from Shopify's Vault. + """ + checkoutCompleteWithCreditCard( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The credit card info to apply as a payment. + """ + payment: CreditCardPaymentInput! + ): CheckoutCompleteWithCreditCardPayload + @deprecated(reason: "Use `checkoutCompleteWithCreditCardV2` instead") + + """ + Completes a checkout using a credit card token from Shopify's card vault. Before you can complete checkouts using CheckoutCompleteWithCreditCardV2, you need to [_request payment processing_](https://help.shopify.com/api/guides/sales-channel-sdk/getting-started#request-payment-processing). + """ + checkoutCompleteWithCreditCardV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The credit card info to apply as a payment. + """ + payment: CreditCardPaymentInputV2! + ): CheckoutCompleteWithCreditCardV2Payload + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPayment( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInput! + ): CheckoutCompleteWithTokenizedPaymentPayload + @deprecated(reason: "Use `checkoutCompleteWithTokenizedPaymentV2` instead") + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPaymentV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInputV2! + ): CheckoutCompleteWithTokenizedPaymentV2Payload + @deprecated(reason: "Use `checkoutCompleteWithTokenizedPaymentV3` instead") + + """ + Completes a checkout with a tokenized payment. + """ + checkoutCompleteWithTokenizedPaymentV3( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The info to apply as a tokenized payment. + """ + payment: TokenizedPaymentInputV3! + ): CheckoutCompleteWithTokenizedPaymentV3Payload + + """ + Creates a new checkout. + """ + checkoutCreate( + """ + The fields used to create a checkout. + """ + input: CheckoutCreateInput! + ): CheckoutCreatePayload + + """ + Associates a customer to the checkout. + """ + checkoutCustomerAssociate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The customer access token of the customer to associate. + """ + customerAccessToken: String! + ): CheckoutCustomerAssociatePayload + @deprecated(reason: "Use `checkoutCustomerAssociateV2` instead") + + """ + Associates a customer to the checkout. + """ + checkoutCustomerAssociateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The customer access token of the customer to associate. + """ + customerAccessToken: String! + ): CheckoutCustomerAssociateV2Payload + + """ + Disassociates the current checkout customer from the checkout. + """ + checkoutCustomerDisassociate( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCustomerDisassociatePayload + @deprecated(reason: "Use `checkoutCustomerDisassociateV2` instead") + + """ + Disassociates the current checkout customer from the checkout. + """ + checkoutCustomerDisassociateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutCustomerDisassociateV2Payload + + """ + Applies a discount to an existing checkout using a discount code. + """ + checkoutDiscountCodeApply( + """ + The discount code to apply to the checkout. + """ + discountCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeApplyPayload + @deprecated(reason: "Use `checkoutDiscountCodeApplyV2` instead") + + """ + Applies a discount to an existing checkout using a discount code. + """ + checkoutDiscountCodeApplyV2( + """ + The discount code to apply to the checkout. + """ + discountCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeApplyV2Payload + + """ + Removes the applied discount from an existing checkout. + """ + checkoutDiscountCodeRemove( + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutDiscountCodeRemovePayload + + """ + Updates the email on an existing checkout. + """ + checkoutEmailUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The email to update the checkout with. + """ + email: String! + ): CheckoutEmailUpdatePayload + @deprecated(reason: "Use `checkoutEmailUpdateV2` instead") + + """ + Updates the email on an existing checkout. + """ + checkoutEmailUpdateV2( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + The email to update the checkout with. + """ + email: String! + ): CheckoutEmailUpdateV2Payload + + """ + Applies a gift card to an existing checkout using a gift card code. This will replace all currently applied gift cards. + """ + checkoutGiftCardApply( + """ + The code of the gift card to apply on the checkout. + """ + giftCardCode: String! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardApplyPayload + @deprecated(reason: "Use `checkoutGiftCardsAppend` instead") + + """ + Removes an applied gift card from the checkout. + """ + checkoutGiftCardRemove( + """ + The ID of the Applied Gift Card to remove from the Checkout. + """ + appliedGiftCardId: ID! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardRemovePayload + @deprecated(reason: "Use `checkoutGiftCardRemoveV2` instead") + + """ + Removes an applied gift card from the checkout. + """ + checkoutGiftCardRemoveV2( + """ + The ID of the Applied Gift Card to remove from the Checkout. + """ + appliedGiftCardId: ID! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardRemoveV2Payload + + """ + Appends gift cards to an existing checkout. + """ + checkoutGiftCardsAppend( + """ + A list of gift card codes to append to the checkout. + """ + giftCardCodes: [String!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutGiftCardsAppendPayload + + """ + Adds a list of line items to a checkout. + """ + checkoutLineItemsAdd( + """ + A list of line item objects to add to the checkout. + """ + lineItems: [CheckoutLineItemInput!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutLineItemsAddPayload + + """ + Removes line items from an existing checkout. + """ + checkoutLineItemsRemove( + """ + The checkout on which to remove line items. + """ + checkoutId: ID! + + """ + Line item ids to remove. + """ + lineItemIds: [ID!]! + ): CheckoutLineItemsRemovePayload + + """ + Sets a list of line items to a checkout. + """ + checkoutLineItemsReplace( + """ + A list of line item objects to set on the checkout. + """ + lineItems: [CheckoutLineItemInput!]! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutLineItemsReplacePayload + + """ + Updates line items on a checkout. + """ + checkoutLineItemsUpdate( + """ + The checkout on which to update line items. + """ + checkoutId: ID! + + """ + Line items to update. + """ + lineItems: [CheckoutLineItemUpdateInput!]! + ): CheckoutLineItemsUpdatePayload + + """ + Updates the shipping address of an existing checkout. + """ + checkoutShippingAddressUpdate( + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutShippingAddressUpdatePayload + @deprecated(reason: "Use `checkoutShippingAddressUpdateV2` instead") + + """ + Updates the shipping address of an existing checkout. + """ + checkoutShippingAddressUpdateV2( + """ + The shipping address to where the line items will be shipped. + """ + shippingAddress: MailingAddressInput! + + """ + The ID of the checkout. + """ + checkoutId: ID! + ): CheckoutShippingAddressUpdateV2Payload + + """ + Updates the shipping lines on an existing checkout. + """ + checkoutShippingLineUpdate( + """ + The ID of the checkout. + """ + checkoutId: ID! + + """ + A unique identifier to a Checkout’s shipping provider, price, and title combination, enabling the customer to select the availableShippingRates. + """ + shippingRateHandle: String! + ): CheckoutShippingLineUpdatePayload + + """ + Creates a customer access token. + The customer access token is required to modify the customer object in any way. + """ + customerAccessTokenCreate( + """ + The fields used to create a customer access token. + """ + input: CustomerAccessTokenCreateInput! + ): CustomerAccessTokenCreatePayload + + """ + Creates a customer access token using a multipass token instead of email and password. + A customer record is created if customer does not exist. If a customer record already + exists but the record is disabled, then it's enabled. + """ + customerAccessTokenCreateWithMultipass( + """ + A valid multipass token to be authenticated. + """ + multipassToken: String! + ): CustomerAccessTokenCreateWithMultipassPayload + + """ + Permanently destroys a customer access token. + """ + customerAccessTokenDelete( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAccessTokenDeletePayload + + """ + Renews a customer access token. + + Access token renewal must happen *before* a token expires. + If a token has already expired, a new one should be created instead via `customerAccessTokenCreate`. + """ + customerAccessTokenRenew( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAccessTokenRenewPayload + + """ + Activates a customer. + """ + customerActivate( + """ + Specifies the customer to activate. + """ + id: ID! + + """ + The fields used to activate a customer. + """ + input: CustomerActivateInput! + ): CustomerActivatePayload + + """ + Activates a customer with the activation url received from `customerCreate`. + """ + customerActivateByUrl( + """ + The customer activation URL. + """ + activationUrl: URL! + + """ + A new password set during activation. + """ + password: String! + ): CustomerActivateByUrlPayload + + """ + Creates a new address for a customer. + """ + customerAddressCreate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + The customer mailing address to create. + """ + address: MailingAddressInput! + ): CustomerAddressCreatePayload + + """ + Permanently deletes the address of an existing customer. + """ + customerAddressDelete( + """ + Specifies the address to delete. + """ + id: ID! + + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + ): CustomerAddressDeletePayload + + """ + Updates the address of an existing customer. + """ + customerAddressUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + Specifies the customer address to update. + """ + id: ID! + + """ + The customer’s mailing address. + """ + address: MailingAddressInput! + ): CustomerAddressUpdatePayload + + """ + Creates a new customer. + """ + customerCreate( + """ + The fields used to create a new customer. + """ + input: CustomerCreateInput! + ): CustomerCreatePayload + + """ + Updates the default address of an existing customer. + """ + customerDefaultAddressUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + ID of the address to set as the new default for the customer. + """ + addressId: ID! + ): CustomerDefaultAddressUpdatePayload + + """ + Sends a reset password email to the customer, as the first step in the reset password process. + """ + customerRecover( + """ + The email address of the customer to recover. + """ + email: String! + ): CustomerRecoverPayload + + """ + Resets a customer’s password with a token received from `CustomerRecover`. + """ + customerReset( + """ + Specifies the customer to reset. + """ + id: ID! + + """ + The fields used to reset a customer’s password. + """ + input: CustomerResetInput! + ): CustomerResetPayload + + """ + Resets a customer’s password with the reset password url received from `CustomerRecover`. + """ + customerResetByUrl( + """ + The customer's reset password url. + """ + resetUrl: URL! + + """ + New password that will be set as part of the reset password process. + """ + password: String! + ): CustomerResetByUrlPayload + + """ + Updates an existing customer. + """ + customerUpdate( + """ + The access token used to identify the customer. + """ + customerAccessToken: String! + + """ + The customer object input. + """ + customer: CustomerUpdateInput! + ): CustomerUpdatePayload +} + +""" +An object with an ID to support global identification. +""" +interface Node { + """ + Globally unique identifier. + """ + id: ID! +} + +""" +An order is a customer’s completed request to purchase one or more products from a shop. An order is created when a customer completes the checkout process, during which time they provides an email address, billing address and payment information. +""" +type Order implements Node { + """ + The reason for the order's cancellation. Returns `null` if the order wasn't canceled. + """ + cancelReason: OrderCancelReason + + """ + The date and time when the order was canceled. Returns null if the order wasn't canceled. + """ + canceledAt: DateTime + + """ + The code of the currency used for the payment. + """ + currencyCode: CurrencyCode! + + """ + The subtotal of line items and their discounts, excluding line items that have been removed. Does not contain order-level discounts, duties, shipping costs, or shipping discounts. Taxes are not included unless the order is a taxes-included order. + """ + currentSubtotalPrice: MoneyV2! + + """ + The total amount of the order, including duties, taxes and discounts, minus amounts for line items that have been removed. + """ + currentTotalPrice: MoneyV2! + + """ + The total of all taxes applied to the order, excluding taxes for returned line items. + """ + currentTotalTax: MoneyV2! + + """ + The locale code in which this specific order happened. + """ + customerLocale: String + + """ + The unique URL that the customer can use to access the order. + """ + customerUrl: URL + + """ + Discounts that have been applied on the order. + """ + discountApplications( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): DiscountApplicationConnection! + + """ + Whether the order has had any edits applied or not. + """ + edited: Boolean! + + """ + The customer's email address. + """ + email: String + + """ + The financial status of the order. + """ + financialStatus: OrderFinancialStatus + + """ + The fulfillment status for the order. + """ + fulfillmentStatus: OrderFulfillmentStatus! + + """ + Globally unique identifier. + """ + id: ID! + + """ + List of the order’s line items. + """ + lineItems( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): OrderLineItemConnection! + + """ + Unique identifier for the order that appears on the order. + For example, _#1000_ or _Store1001. + """ + name: String! + + """ + A unique numeric identifier for the order for use by shop owner and customer. + """ + orderNumber: Int! + + """ + The total price of the order before any applied edits. + """ + originalTotalPrice: MoneyV2! + + """ + The customer's phone number for receiving SMS notifications. + """ + phone: String + + """ + The date and time when the order was imported. + This value can be set to dates in the past when importing from other systems. + If no value is provided, it will be auto-generated based on current date and time. + """ + processedAt: DateTime! + + """ + The address to where the order will be shipped. + """ + shippingAddress: MailingAddress + + """ + The discounts that have been allocated onto the shipping line by discount applications. + """ + shippingDiscountAllocations: [DiscountAllocation!]! + + """ + The unique URL for the order's status page. + """ + statusUrl: URL! + + """ + Price of the order before shipping and taxes. + """ + subtotalPrice: Money @deprecated(reason: "Use `subtotalPriceV2` instead") + + """ + Price of the order before duties, shipping and taxes. + """ + subtotalPriceV2: MoneyV2 + + """ + List of the order’s successful fulfillments. + """ + successfulFulfillments( + """ + Truncate the array result to this size. + """ + first: Int + ): [Fulfillment!] + + """ + The sum of all the prices of all the items in the order, taxes and discounts included (must be positive). + """ + totalPrice: Money! @deprecated(reason: "Use `totalPriceV2` instead") + + """ + The sum of all the prices of all the items in the order, duties, taxes and discounts included (must be positive). + """ + totalPriceV2: MoneyV2! + + """ + The total amount that has been refunded. + """ + totalRefunded: Money! @deprecated(reason: "Use `totalRefundedV2` instead") + + """ + The total amount that has been refunded. + """ + totalRefundedV2: MoneyV2! + + """ + The total cost of shipping. + """ + totalShippingPrice: Money! + @deprecated(reason: "Use `totalShippingPriceV2` instead") + + """ + The total cost of shipping. + """ + totalShippingPriceV2: MoneyV2! + + """ + The total cost of taxes. + """ + totalTax: Money @deprecated(reason: "Use `totalTaxV2` instead") + + """ + The total cost of taxes. + """ + totalTaxV2: MoneyV2 +} + +""" +Represents the reason for the order's cancellation. +""" +enum OrderCancelReason { + """ + The customer wanted to cancel the order. + """ + CUSTOMER + + """ + The order was fraudulent. + """ + FRAUD + + """ + There was insufficient inventory. + """ + INVENTORY + + """ + Payment was declined. + """ + DECLINED + + """ + The order was canceled for an unlisted reason. + """ + OTHER +} + +""" +An auto-generated type for paginating through multiple Orders. +""" +type OrderConnection { + """ + A list of edges. + """ + edges: [OrderEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Order and a cursor during pagination. +""" +type OrderEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of OrderEdge. + """ + node: Order! +} + +""" +Represents the order's current financial status. +""" +enum OrderFinancialStatus { + """ + Displayed as **Pending**. + """ + PENDING + + """ + Displayed as **Authorized**. + """ + AUTHORIZED + + """ + Displayed as **Partially paid**. + """ + PARTIALLY_PAID + + """ + Displayed as **Partially refunded**. + """ + PARTIALLY_REFUNDED + + """ + Displayed as **Voided**. + """ + VOIDED + + """ + Displayed as **Paid**. + """ + PAID + + """ + Displayed as **Refunded**. + """ + REFUNDED +} + +""" +Represents the order's current fulfillment status. +""" +enum OrderFulfillmentStatus { + """ + Displayed as **Unfulfilled**. + """ + UNFULFILLED + + """ + Displayed as **Partially fulfilled**. + """ + PARTIALLY_FULFILLED + + """ + Displayed as **Fulfilled**. + """ + FULFILLED + + """ + Displayed as **Restocked**. + """ + RESTOCKED + + """ + Displayed as **Pending fulfillment**. + """ + PENDING_FULFILLMENT + + """ + Displayed as **Open**. + """ + OPEN + + """ + Displayed as **In progress**. + """ + IN_PROGRESS + + """ + Displayed as **Scheduled**. + """ + SCHEDULED +} + +""" +Represents a single line in an order. There is one line item for each distinct product variant. +""" +type OrderLineItem { + """ + The number of entries associated to the line item minus the items that have been removed. + """ + currentQuantity: Int! + + """ + List of custom attributes associated to the line item. + """ + customAttributes: [Attribute!]! + + """ + The discounts that have been allocated onto the order line item by discount applications. + """ + discountAllocations: [DiscountAllocation!]! + + """ + The total price of the line item, including discounts, and displayed in the presentment currency. + """ + discountedTotalPrice: MoneyV2! + + """ + The total price of the line item, not including any discounts. The total price is calculated using the original unit price multiplied by the quantity, and it is displayed in the presentment currency. + """ + originalTotalPrice: MoneyV2! + + """ + The number of products variants associated to the line item. + """ + quantity: Int! + + """ + The title of the product combined with title of the variant. + """ + title: String! + + """ + The product variant object associated to the line item. + """ + variant: ProductVariant +} + +""" +An auto-generated type for paginating through multiple OrderLineItems. +""" +type OrderLineItemConnection { + """ + A list of edges. + """ + edges: [OrderLineItemEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one OrderLineItem and a cursor during pagination. +""" +type OrderLineItemEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of OrderLineItemEdge. + """ + node: OrderLineItem! +} + +""" +The set of valid sort keys for the Order query. +""" +enum OrderSortKeys { + """ + Sort by the `processed_at` value. + """ + PROCESSED_AT + + """ + Sort by the `total_price` value. + """ + TOTAL_PRICE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Shopify merchants can create pages to hold static HTML content. Each Page object represents a custom page on the online store. +""" +type Page implements Node { + """ + The description of the page, complete with HTML formatting. + """ + body: HTML! + + """ + Summary of the page body. + """ + bodySummary: String! + + """ + The timestamp of the page creation. + """ + createdAt: DateTime! + + """ + A human-friendly unique string for the page automatically generated from its title. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + The page's SEO information. + """ + seo: SEO + + """ + The title of the page. + """ + title: String! + + """ + The timestamp of the latest page update. + """ + updatedAt: DateTime! + + """ + The url pointing to the page accessible from the web. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Pages. +""" +type PageConnection { + """ + A list of edges. + """ + edges: [PageEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Page and a cursor during pagination. +""" +type PageEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of PageEdge. + """ + node: Page! +} + +""" +Information about pagination in a connection. +""" +type PageInfo { + """ + Indicates if there are more pages to fetch. + """ + hasNextPage: Boolean! + + """ + Indicates if there are any pages prior to the current page. + """ + hasPreviousPage: Boolean! +} + +""" +The set of valid sort keys for the Page query. +""" +enum PageSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A payment applied to a checkout. +""" +type Payment implements Node { + """ + The amount of the payment. + """ + amount: Money! @deprecated(reason: "Use `amountV2` instead") + + """ + The amount of the payment. + """ + amountV2: MoneyV2! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddress + + """ + The checkout to which the payment belongs. + """ + checkout: Checkout! + + """ + The credit card used for the payment in the case of direct payments. + """ + creditCard: CreditCard + + """ + A message describing a processing error during asynchronous processing. + """ + errorMessage: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + A client-side generated token to identify a payment and perform idempotent operations. + """ + idempotencyKey: String + + """ + The URL where the customer needs to be redirected so they can complete the 3D Secure payment flow. + """ + nextActionUrl: URL + + """ + Whether or not the payment is still processing asynchronously. + """ + ready: Boolean! + + """ + A flag to indicate if the payment is to be done in test mode for gateways that support it. + """ + test: Boolean! + + """ + The actual transaction recorded by Shopify after having processed the payment with the gateway. + """ + transaction: Transaction +} + +""" +Settings related to payments. +""" +type PaymentSettings { + """ + List of the card brands which the shop accepts. + """ + acceptedCardBrands: [CardBrand!]! + + """ + The url pointing to the endpoint to vault credit cards. + """ + cardVaultUrl: URL! + + """ + The country where the shop is located. + """ + countryCode: CountryCode! + + """ + The three-letter code for the shop's primary currency. + """ + currencyCode: CurrencyCode! + + """ + A list of enabled currencies (ISO 4217 format) that the shop accepts. Merchants can enable currencies from their Shopify Payments settings in the Shopify admin. + """ + enabledPresentmentCurrencies: [CurrencyCode!]! + + """ + The shop’s Shopify Payments account id. + """ + shopifyPaymentsAccountId: String + + """ + List of the digital wallets which the shop supports. + """ + supportedDigitalWallets: [DigitalWallet!]! +} + +""" +The valid values for the types of payment token. +""" +enum PaymentTokenType { + """ + Apple Pay token type. + """ + APPLE_PAY + + """ + Vault payment token type. + """ + VAULT + + """ + Shopify Pay token type. + """ + SHOPIFY_PAY + + """ + Google Pay token type. + """ + GOOGLE_PAY +} + +""" +The value of the percentage pricing object. +""" +type PricingPercentageValue { + """ + The percentage value of the object. + """ + percentage: Float! +} + +""" +The price value (fixed or percentage) for a discount application. +""" +union PricingValue = MoneyV2 | PricingPercentageValue + +""" +A product represents an individual item for sale in a Shopify store. Products are often physical, but they don't have to be. +For example, a digital download (such as a movie, music or ebook file) also qualifies as a product, as do services (such as equipment rental, work for hire, customization of another product or an extended warranty). +""" +type Product implements Node & HasMetafields { + """ + Indicates if at least one product variant is available for sale. + """ + availableForSale: Boolean! + + """ + List of collections a product belongs to. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): CollectionConnection! + + """ + The compare at price of the product across all variants. + """ + compareAtPriceRange: ProductPriceRange! + + """ + The date and time when the product was created. + """ + createdAt: DateTime! + + """ + Stripped description of the product, single line with HTML tags removed. + """ + description( + """ + Truncates string after the given length. + """ + truncateAt: Int + ): String! + + """ + The description of the product, complete with HTML formatting. + """ + descriptionHtml: HTML! + + """ + A human-friendly unique string for the Product automatically generated from its title. + They are used by the Liquid templating language to refer to objects. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + List of images associated with the product. + """ + images( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductImageSortKeys = POSITION + + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): ImageConnection! + + """ + The media associated with the product. + """ + media( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductMediaSortKeys = POSITION + ): MediaConnection! + + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! + + """ + The online store URL for the product. + A value of `null` indicates that the product is not published to the Online Store sales channel. + """ + onlineStoreUrl: URL + + """ + List of product options. + """ + options( + """ + Truncate the array result to this size. + """ + first: Int + ): [ProductOption!]! + + """ + List of price ranges in the presentment currencies for this shop. + """ + presentmentPriceRanges( + """ + Specifies the presentment currencies to return a price range in. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): ProductPriceRangeConnection! + + """ + The price range. + """ + priceRange: ProductPriceRange! + + """ + A categorization that a product can be tagged with, commonly used for filtering and searching. + """ + productType: String! + + """ + The date and time when the product was published to the channel. + """ + publishedAt: DateTime! + + """ + The product's SEO information. + """ + seo: SEO! + + """ + A comma separated list of tags that have been added to the product. + Additional access scope required for private apps: unauthenticated_read_product_tags. + """ + tags: [String!]! + + """ + The product’s title. + """ + title: String! + + """ + The total quantity of inventory in stock for this Product. + """ + totalInventory: Int + + """ + The date and time when the product was last modified. + A product's `updatedAt` value can change for different reasons. For example, if an order + is placed for a product that has inventory tracking set up, then the inventory adjustment + is counted as an update. + """ + updatedAt: DateTime! + + """ + Find a product’s variant based on its selected options. + This is useful for converting a user’s selection of product options into a single matching variant. + If there is not a variant for the selected options, `null` will be returned. + """ + variantBySelectedOptions( + """ + The input fields used for a selected option. + """ + selectedOptions: [SelectedOptionInput!]! + ): ProductVariant + + """ + List of the product’s variants. + """ + variants( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductVariantSortKeys = POSITION + ): ProductVariantConnection! + + """ + The product’s vendor name. + """ + vendor: String! +} + +""" +The set of valid sort keys for the ProductCollection query. +""" +enum ProductCollectionSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `price` value. + """ + PRICE + + """ + Sort by the `best-selling` value. + """ + BEST_SELLING + + """ + Sort by the `created` value. + """ + CREATED + + """ + Sort by the `id` value. + """ + ID + + """ + Sort by the `manual` value. + """ + MANUAL + + """ + Sort by the `collection-default` value. + """ + COLLECTION_DEFAULT + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +An auto-generated type for paginating through multiple Products. +""" +type ProductConnection { + """ + A list of edges. + """ + edges: [ProductEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one Product and a cursor during pagination. +""" +type ProductEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductEdge. + """ + node: Product! +} + +""" +The set of valid sort keys for the ProductImage query. +""" +enum ProductImageSortKeys { + """ + Sort by the `created_at` value. + """ + CREATED_AT + + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +The set of valid sort keys for the ProductMedia query. +""" +enum ProductMediaSortKeys { + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +Product property names like "Size", "Color", and "Material" that the customers can select. +Variants are selected based on permutations of these options. +255 characters limit each. +""" +type ProductOption implements Node { + """ + Globally unique identifier. + """ + id: ID! + + """ + The product option’s name. + """ + name: String! + + """ + The corresponding value to the product option name. + """ + values: [String!]! +} + +""" +The price range of the product. +""" +type ProductPriceRange { + """ + The highest variant's price. + """ + maxVariantPrice: MoneyV2! + + """ + The lowest variant's price. + """ + minVariantPrice: MoneyV2! +} + +""" +An auto-generated type for paginating through multiple ProductPriceRanges. +""" +type ProductPriceRangeConnection { + """ + A list of edges. + """ + edges: [ProductPriceRangeEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductPriceRange and a cursor during pagination. +""" +type ProductPriceRangeEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductPriceRangeEdge. + """ + node: ProductPriceRange! +} + +""" +The set of valid sort keys for the Product query. +""" +enum ProductSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `product_type` value. + """ + PRODUCT_TYPE + + """ + Sort by the `vendor` value. + """ + VENDOR + + """ + Sort by the `updated_at` value. + """ + UPDATED_AT + + """ + Sort by the `created_at` value. + """ + CREATED_AT + + """ + Sort by the `best_selling` value. + """ + BEST_SELLING + + """ + Sort by the `price` value. + """ + PRICE + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +A product variant represents a different version of a product, such as differing sizes or differing colors. +""" +type ProductVariant implements Node & HasMetafields { + """ + Indicates if the product variant is in stock. + """ + available: Boolean @deprecated(reason: "Use `availableForSale` instead") + + """ + Indicates if the product variant is available for sale. + """ + availableForSale: Boolean! + + """ + The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPrice` is higher than `price`. + """ + compareAtPrice: Money @deprecated(reason: "Use `compareAtPriceV2` instead") + + """ + The compare at price of the variant. This can be used to mark a variant as on sale, when `compareAtPriceV2` is higher than `priceV2`. + """ + compareAtPriceV2: MoneyV2 + + """ + Whether a product is out of stock but still available for purchase (used for backorders). + """ + currentlyNotInStock: Boolean! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Image associated with the product variant. This field falls back to the product image if no image is available. + """ + image( + """ + Image width in pixels between 1 and 2048. This argument is deprecated: Use `maxWidth` on `Image.transformedSrc` instead. + """ + maxWidth: Int + + """ + Image height in pixels between 1 and 2048. This argument is deprecated: Use `maxHeight` on `Image.transformedSrc` instead. + """ + maxHeight: Int + + """ + Crops the image according to the specified region. This argument is deprecated: Use `crop` on `Image.transformedSrc` instead. + """ + crop: CropRegion + + """ + Image size multiplier for high-resolution retina displays. Must be between 1 and 3. This argument is deprecated: Use `scale` on `Image.transformedSrc` instead. + """ + scale: Int = 1 + ): Image + + """ + The metafield associated with the resource. + """ + metafield( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String! + + """ + Identifier for the metafield (maximum of 30 characters). + """ + key: String! + ): Metafield + + """ + A paginated list of metafields associated with the resource. + """ + metafields( + """ + Container for a set of metafields (maximum of 20 characters). + """ + namespace: String + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MetafieldConnection! + + """ + List of prices and compare-at prices in the presentment currencies for this shop. + """ + presentmentPrices( + """ + The presentment currencies prices should return in. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): ProductVariantPricePairConnection! + + """ + List of unit prices in the presentment currencies for this shop. + """ + presentmentUnitPrices( + """ + Specify the currencies in which to return presentment unit prices. + """ + presentmentCurrencies: [CurrencyCode!] + + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + ): MoneyV2Connection! + + """ + The product variant’s price. + """ + price: Money! @deprecated(reason: "Use `priceV2` instead") + + """ + The product variant’s price. + """ + priceV2: MoneyV2! + + """ + The product object that the product variant belongs to. + """ + product: Product! + + """ + The total sellable quantity of the variant for online sales channels. + """ + quantityAvailable: Int + + """ + Whether a customer needs to provide a shipping address when placing an order for the product variant. + """ + requiresShipping: Boolean! + + """ + List of product options applied to the variant. + """ + selectedOptions: [SelectedOption!]! + + """ + The SKU (stock keeping unit) associated with the variant. + """ + sku: String + + """ + The product variant’s title. + """ + title: String! + + """ + The unit price value for the variant based on the variant's measurement. + """ + unitPrice: MoneyV2 + + """ + The unit price measurement for the variant. + """ + unitPriceMeasurement: UnitPriceMeasurement + + """ + The weight of the product variant in the unit system specified with `weight_unit`. + """ + weight: Float + + """ + Unit of measurement for weight. + """ + weightUnit: WeightUnit! +} + +""" +An auto-generated type for paginating through multiple ProductVariants. +""" +type ProductVariantConnection { + """ + A list of edges. + """ + edges: [ProductVariantEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductVariant and a cursor during pagination. +""" +type ProductVariantEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductVariantEdge. + """ + node: ProductVariant! +} + +""" +The compare-at price and price of a variant sharing a currency. +""" +type ProductVariantPricePair { + """ + The compare-at price of the variant with associated currency. + """ + compareAtPrice: MoneyV2 + + """ + The price of the variant with associated currency. + """ + price: MoneyV2! +} + +""" +An auto-generated type for paginating through multiple ProductVariantPricePairs. +""" +type ProductVariantPricePairConnection { + """ + A list of edges. + """ + edges: [ProductVariantPricePairEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one ProductVariantPricePair and a cursor during pagination. +""" +type ProductVariantPricePairEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of ProductVariantPricePairEdge. + """ + node: ProductVariantPricePair! +} + +""" +The set of valid sort keys for the ProductVariant query. +""" +enum ProductVariantSortKeys { + """ + Sort by the `title` value. + """ + TITLE + + """ + Sort by the `sku` value. + """ + SKU + + """ + Sort by the `position` value. + """ + POSITION + + """ + Sort by the `id` value. + """ + ID + + """ + During a search (i.e. when the `query` parameter has been specified on the connection) this sorts the + results by relevance to the search term(s). When no search query is specified, this sort key is not + deterministic and should not be used. + """ + RELEVANCE +} + +""" +The schema’s entry-point for queries. This acts as the public, top-level API from which all queries must start. +""" +type QueryRoot { + """ + List of the shop's articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! + + """ + Find a blog by its handle. + """ + blogByHandle( + """ + The handle of the blog. + """ + handle: String! + ): Blog + + """ + List of the shop's blogs. + """ + blogs( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: BlogSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): BlogConnection! + + """ + Find a collection by its handle. + """ + collectionByHandle( + """ + The handle of the collection. + """ + handle: String! + ): Collection + + """ + List of the shop’s collections. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: CollectionSortKeys = ID + + """ + Supported filter parameters: + - `collection_type` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): CollectionConnection! + + """ + Find a customer by its access token. + """ + customer( + """ + The customer access token. + """ + customerAccessToken: String! + ): Customer + node( + """ + The ID of the Node to return. + """ + id: ID! + ): Node + nodes( + """ + The IDs of the Nodes to return. + """ + ids: [ID!]! + ): [Node]! + + """ + Find a page by its handle. + """ + pageByHandle( + """ + The handle of the page. + """ + handle: String! + ): Page + + """ + List of the shop's pages. + """ + pages( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: PageSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): PageConnection! + + """ + Find a product by its handle. + """ + productByHandle( + """ + The handle of the product. + """ + handle: String! + ): Product + + """ + Find recommended products related to a given `product_id`. + To learn more about how recommendations are generated, see + [*Showing product recommendations on product pages*](https://help.shopify.com/themes/development/recommended-products). + """ + productRecommendations( + """ + The id of the product. + """ + productId: ID! + ): [Product!] + + """ + Tags added to products. + Additional access scope required: unauthenticated_read_product_tags. + """ + productTags( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + + """ + List of product types for the shop's products that are published to your app. + """ + productTypes( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + + """ + List of the shop’s products. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductSortKeys = ID + + """ + Supported filter parameters: + - `available_for_sale` + - `created_at` + - `product_type` + - `tag` + - `title` + - `updated_at` + - `variants.price` + - `vendor` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ProductConnection! + + """ + The list of public Storefront API versions, including supported, release candidate and unstable versions. + """ + publicApiVersions: [ApiVersion!]! + + """ + The shop associated with the storefront access token. + """ + shop: Shop! +} + +""" +SEO information. +""" +type SEO { + """ + The meta description. + """ + description: String + + """ + The SEO title. + """ + title: String +} + +""" +Script discount applications capture the intentions of a discount that +was created by a Shopify Script. +""" +type ScriptDiscountApplication implements DiscountApplication { + """ + The method by which the discount's value is allocated to its entitled items. + """ + allocationMethod: DiscountApplicationAllocationMethod! + + """ + The description of the application as defined by the Script. + """ + description: String! @deprecated(reason: "Use `title` instead") + + """ + Which lines of targetType that the discount is allocated over. + """ + targetSelection: DiscountApplicationTargetSelection! + + """ + The type of line that the discount is applicable towards. + """ + targetType: DiscountApplicationTargetType! + + """ + The title of the application as defined by the Script. + """ + title: String! + + """ + The value of the discount application. + """ + value: PricingValue! +} + +""" +Properties used by customers to select a product variant. +Products can have multiple options, like different sizes or colors. +""" +type SelectedOption { + """ + The product option’s name. + """ + name: String! + + """ + The product option’s value. + """ + value: String! +} + +""" +Specifies the input fields required for a selected option. +""" +input SelectedOptionInput { + """ + The product option’s name. + """ + name: String! + + """ + The product option’s value. + """ + value: String! +} + +""" +A shipping rate to be applied to a checkout. +""" +type ShippingRate { + """ + Human-readable unique identifier for this shipping rate. + """ + handle: String! + + """ + Price of this shipping rate. + """ + price: Money! @deprecated(reason: "Use `priceV2` instead") + + """ + Price of this shipping rate. + """ + priceV2: MoneyV2! + + """ + Title of this shipping rate. + """ + title: String! +} + +""" +Shop represents a collection of the general settings and information about the shop. +""" +type Shop { + """ + List of the shop' articles. + """ + articles( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ArticleSortKeys = ID + + """ + Supported filter parameters: + - `author` + - `blog_title` + - `created_at` + - `tag` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ArticleConnection! @deprecated(reason: "Use `QueryRoot.articles` instead.") + + """ + List of the shop' blogs. + """ + blogs( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: BlogSortKeys = ID + + """ + Supported filter parameters: + - `created_at` + - `handle` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): BlogConnection! @deprecated(reason: "Use `QueryRoot.blogs` instead.") + + """ + Find a collection by its handle. + """ + collectionByHandle( + """ + The handle of the collection. + """ + handle: String! + ): Collection + @deprecated(reason: "Use `QueryRoot.collectionByHandle` instead.") + + """ + List of the shop’s collections. + """ + collections( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: CollectionSortKeys = ID + + """ + Supported filter parameters: + - `collection_type` + - `title` + - `updated_at` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): CollectionConnection! + @deprecated(reason: "Use `QueryRoot.collections` instead.") + + """ + The three-letter code for the currency that the shop accepts. + """ + currencyCode: CurrencyCode! + @deprecated(reason: "Use `paymentSettings` instead") + + """ + A description of the shop. + """ + description: String + + """ + A string representing the way currency is formatted when the currency isn’t specified. + """ + moneyFormat: String! + + """ + The shop’s name. + """ + name: String! + + """ + Settings related to payments. + """ + paymentSettings: PaymentSettings! + + """ + The shop’s primary domain. + """ + primaryDomain: Domain! + + """ + The shop’s privacy policy. + """ + privacyPolicy: ShopPolicy + + """ + Find a product by its handle. + """ + productByHandle( + """ + The handle of the product. + """ + handle: String! + ): Product @deprecated(reason: "Use `QueryRoot.productByHandle` instead.") + + """ + A list of tags that have been added to products. + Additional access scope required: unauthenticated_read_product_tags. + """ + productTags( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + @deprecated(reason: "Use `QueryRoot.productTags` instead.") + + """ + List of the shop’s product types. + """ + productTypes( + """ + Returns up to the first `n` elements from the list. + """ + first: Int! + ): StringConnection! + @deprecated(reason: "Use `QueryRoot.productTypes` instead.") + + """ + List of the shop’s products. + """ + products( + """ + Returns up to the first `n` elements from the list. + """ + first: Int + + """ + Returns the elements that come after the specified cursor. + """ + after: String + + """ + Returns up to the last `n` elements from the list. + """ + last: Int + + """ + Returns the elements that come before the specified cursor. + """ + before: String + + """ + Reverse the order of the underlying list. + """ + reverse: Boolean = false + + """ + Sort the underlying list by the given key. + """ + sortKey: ProductSortKeys = ID + + """ + Supported filter parameters: + - `available_for_sale` + - `created_at` + - `product_type` + - `tag` + - `title` + - `updated_at` + - `variants.price` + - `vendor` + + See the detailed [search syntax](https://help.shopify.com/api/getting-started/search-syntax) + for more information about using filters. + """ + query: String + ): ProductConnection! @deprecated(reason: "Use `QueryRoot.products` instead.") + + """ + The shop’s refund policy. + """ + refundPolicy: ShopPolicy + + """ + The shop’s shipping policy. + """ + shippingPolicy: ShopPolicy + + """ + Countries that the shop ships to. + """ + shipsToCountries: [CountryCode!]! + + """ + The shop’s Shopify Payments account id. + """ + shopifyPaymentsAccountId: String + @deprecated(reason: "Use `paymentSettings` instead") + + """ + The shop’s terms of service. + """ + termsOfService: ShopPolicy +} + +""" +Policy that a merchant has configured for their store, such as their refund or privacy policy. +""" +type ShopPolicy implements Node { + """ + Policy text, maximum size of 64kb. + """ + body: String! + + """ + Policy’s handle. + """ + handle: String! + + """ + Globally unique identifier. + """ + id: ID! + + """ + Policy’s title. + """ + title: String! + + """ + Public URL to the policy. + """ + url: URL! +} + +""" +An auto-generated type for paginating through multiple Strings. +""" +type StringConnection { + """ + A list of edges. + """ + edges: [StringEdge!]! + + """ + Information to aid in pagination. + """ + pageInfo: PageInfo! +} + +""" +An auto-generated type which holds one String and a cursor during pagination. +""" +type StringEdge { + """ + A cursor for use in pagination. + """ + cursor: String! + + """ + The item at the end of StringEdge. + """ + node: String! +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInput { + """ + The amount of the payment. + """ + amount: Money! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + The type of payment token. + """ + type: String! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Executes the payment in test mode if possible. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInputV2 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String + + """ + The type of payment token. + """ + type: String! +} + +""" +Specifies the fields required to complete a checkout with +a tokenized payment. +""" +input TokenizedPaymentInputV3 { + """ + The amount and currency of the payment. + """ + paymentAmount: MoneyInput! + + """ + A unique client generated key used to avoid duplicate charges. When a duplicate payment is found, the original is returned instead of creating a new one. + """ + idempotencyKey: String! + + """ + The billing address for the payment. + """ + billingAddress: MailingAddressInput! + + """ + A simple string or JSON containing the required payment data for the tokenized payment. + """ + paymentData: String! + + """ + Whether to execute the payment in test mode, if possible. Test mode is not supported in production stores. Defaults to `false`. + """ + test: Boolean + + """ + Public Hash Key used for AndroidPay payments only. + """ + identifier: String + + """ + The type of payment token. + """ + type: PaymentTokenType! +} + +""" +An object representing exchange of money for a product or service. +""" +type Transaction { + """ + The amount of money that the transaction was for. + """ + amount: Money! @deprecated(reason: "Use `amountV2` instead") + + """ + The amount of money that the transaction was for. + """ + amountV2: MoneyV2! + + """ + The kind of the transaction. + """ + kind: TransactionKind! + + """ + The status of the transaction. + """ + status: TransactionStatus! @deprecated(reason: "Use `statusV2` instead") + + """ + The status of the transaction. + """ + statusV2: TransactionStatus + + """ + Whether the transaction was done in test mode or not. + """ + test: Boolean! +} + +enum TransactionKind { + SALE + CAPTURE + AUTHORIZATION + EMV_AUTHORIZATION + CHANGE +} + +enum TransactionStatus { + PENDING + SUCCESS + FAILURE + ERROR +} + +""" +An RFC 3986 and RFC 3987 compliant URI string. + +Example value: `"https://johns-apparel.myshopify.com"`. +""" +scalar URL + +""" +The measurement used to calculate a unit price for a product variant (e.g. $9.99 / 100ml). +""" +type UnitPriceMeasurement { + """ + The type of unit of measurement for the unit price measurement. + """ + measuredType: UnitPriceMeasurementMeasuredType + + """ + The quantity unit for the unit price measurement. + """ + quantityUnit: UnitPriceMeasurementMeasuredUnit + + """ + The quantity value for the unit price measurement. + """ + quantityValue: Float! + + """ + The reference unit for the unit price measurement. + """ + referenceUnit: UnitPriceMeasurementMeasuredUnit + + """ + The reference value for the unit price measurement. + """ + referenceValue: Int! +} + +""" +The accepted types of unit of measurement. +""" +enum UnitPriceMeasurementMeasuredType { + """ + Unit of measurements representing volumes. + """ + VOLUME + + """ + Unit of measurements representing weights. + """ + WEIGHT + + """ + Unit of measurements representing lengths. + """ + LENGTH + + """ + Unit of measurements representing areas. + """ + AREA +} + +""" +The valid units of measurement for a unit price measurement. +""" +enum UnitPriceMeasurementMeasuredUnit { + """ + 1000 milliliters equals 1 liter. + """ + ML + + """ + 100 centiliters equals 1 liter. + """ + CL + + """ + Metric system unit of volume. + """ + L + + """ + 1 cubic meter equals 1000 liters. + """ + M3 + + """ + 1000 milligrams equals 1 gram. + """ + MG + + """ + Metric system unit of weight. + """ + G + + """ + 1 kilogram equals 1000 grams. + """ + KG + + """ + 1000 millimeters equals 1 meter. + """ + MM + + """ + 100 centimeters equals 1 meter. + """ + CM + + """ + Metric system unit of length. + """ + M + + """ + Metric system unit of area. + """ + M2 +} + +""" +Represents an error in the input of a mutation. +""" +type UserError implements DisplayableError { + """ + Path to the input field which caused the error. + """ + field: [String!] + + """ + The error message. + """ + message: String! +} + +""" +Represents a Shopify hosted video. +""" +type Video implements Node & Media { + """ + A word or phrase to share the nature or contents of a media. + """ + alt: String + + """ + Globally unique identifier. + """ + id: ID! + + """ + The media content type. + """ + mediaContentType: MediaContentType! + + """ + The preview image for the media. + """ + previewImage: Image + + """ + The sources for a video. + """ + sources: [VideoSource!]! +} + +""" +Represents a source for a Shopify hosted video. +""" +type VideoSource { + """ + The format of the video source. + """ + format: String! + + """ + The height of the video. + """ + height: Int! + + """ + The video MIME type. + """ + mimeType: String! + + """ + The URL of the video. + """ + url: String! + + """ + The width of the video. + """ + width: Int! +} + +""" +Units of measurement for weight. +""" +enum WeightUnit { + """ + 1 kilogram equals 1000 grams. + """ + KILOGRAMS + + """ + Metric system unit of mass. + """ + GRAMS + + """ + 1 pound equals 16 ounces. + """ + POUNDS + + """ + Imperial system unit of mass. + """ + OUNCES +} diff --git a/packages/swell/src/api/cart/index.ts b/packages/swell/src/api/cart/index.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/cart/index.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/catalog/index.ts b/packages/swell/src/api/catalog/index.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/catalog/index.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/catalog/products.ts b/packages/swell/src/api/catalog/products.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/catalog/products.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/customer.ts b/packages/swell/src/api/customer.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/customer.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/customers/index.ts b/packages/swell/src/api/customers/index.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/customers/index.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/customers/logout.ts b/packages/swell/src/api/customers/logout.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/customers/logout.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/customers/signup.ts b/packages/swell/src/api/customers/signup.ts new file mode 100644 index 0000000..ea9b101 --- /dev/null +++ b/packages/swell/src/api/customers/signup.ts @@ -0,0 +1 @@ +export default function () {} diff --git a/packages/swell/src/api/endpoints/cart.ts b/packages/swell/src/api/endpoints/cart.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/cart.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/catalog/products.ts b/packages/swell/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/checkout/index.ts b/packages/swell/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..2695ea3 --- /dev/null +++ b/packages/swell/src/api/endpoints/checkout/index.ts @@ -0,0 +1,30 @@ +import { CommerceAPI, createEndpoint, GetAPISchema } from '@vercel/commerce/api' +import { CheckoutSchema } from '@vercel/commerce/types/checkout' +import { SWELL_CHECKOUT_URL_COOKIE } from '../../../const' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ + req, + res, + config, +}) => { + const { cookies } = req + const checkoutUrl = cookies[SWELL_CHECKOUT_URL_COOKIE] + + if (checkoutUrl) { + res.redirect(checkoutUrl) + } else { + res.redirect('/cart') + } +} +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +export type CheckoutAPI = GetAPISchema +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/swell/src/api/endpoints/customer/address.ts b/packages/swell/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/swell/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/customer/card.ts b/packages/swell/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/swell/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/customer/index.ts b/packages/swell/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/swell/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/swell/src/api/endpoints/login.ts b/packages/swell/src/api/endpoints/login.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/login.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/logout.ts b/packages/swell/src/api/endpoints/logout.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/logout.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/signup.ts b/packages/swell/src/api/endpoints/signup.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/signup.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/endpoints/wishlist.ts b/packages/swell/src/api/endpoints/wishlist.ts new file mode 100644 index 0000000..d09c976 --- /dev/null +++ b/packages/swell/src/api/endpoints/wishlist.ts @@ -0,0 +1 @@ +export default function (_commerce: any) {} diff --git a/packages/swell/src/api/index.ts b/packages/swell/src/api/index.ts new file mode 100644 index 0000000..589acae --- /dev/null +++ b/packages/swell/src/api/index.ts @@ -0,0 +1,53 @@ +import { + CommerceAPI, + CommerceAPIConfig, + getCommerceApi as commerceApi, +} from '@vercel/commerce/api' +import { + SWELL_CHECKOUT_ID_COOKIE, + SWELL_CUSTOMER_TOKEN_COOKIE, + SWELL_COOKIE_EXPIRE, +} from '../const' + +import fetchApi from './utils/fetch-swell-api' +import login from './operations/login' +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface SwellConfig extends CommerceAPIConfig { + fetch: any +} + +const config: SwellConfig = { + locale: 'en-US', + commerceUrl: '', + apiToken: ''!, + cartCookie: SWELL_CHECKOUT_ID_COOKIE, + cartCookieMaxAge: SWELL_COOKIE_EXPIRE, + fetch: fetchApi, + customerCookie: SWELL_CUSTOMER_TOKEN_COOKIE, +} + +const operations = { + login, + getAllPages, + getPage, + getSiteInfo, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider + +export function getCommerceApi

( + customProvider: P = provider as any +): CommerceAPI

{ + return commerceApi(customProvider) +} diff --git a/packages/swell/src/api/operations/get-all-pages.ts b/packages/swell/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..7097d68 --- /dev/null +++ b/packages/swell/src/api/operations/get-all-pages.ts @@ -0,0 +1,44 @@ +import { Provider, SwellConfig } from '..' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Page } from '../../types/page' + +export type GetAllPagesResult = + T + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages(opts: { + url: string + config?: Partial + preview?: boolean + }): Promise> + + async function getAllPages({ + config: cfg, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + const { locale, fetch } = config + const data = await fetch('content', 'list', ['pages']) + const pages = + data?.results?.map(({ slug, ...rest }: { slug: string }) => ({ + url: `/${locale}/${slug}`, + ...rest, + })) ?? [] + return { + pages, + } + } + + return getAllPages +} diff --git a/packages/swell/src/api/operations/get-all-product-paths.ts b/packages/swell/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..1e50886 --- /dev/null +++ b/packages/swell/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,51 @@ +import { SwellProduct } from '../../types' +import { SwellConfig, Provider } from '..' +import { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetAllProductPathsOperation } from '@vercel/commerce/types/product' + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: SwellConfig + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: SwellConfig + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + variables, + config: cfg, + }: { + query?: string + variables?: T['variables'] + config?: SwellConfig + } = {}): Promise { + const config = commerce.getConfig(cfg) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { results } = await config.fetch('products', 'list', [ + { + limit: variables?.first, + }, + ]) + + return { + products: results?.map(({ slug: handle }: SwellProduct) => ({ + path: `/${handle}`, + })), + } + } + + return getAllProductPaths +} diff --git a/packages/swell/src/api/operations/get-all-products.ts b/packages/swell/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..6527fb9 --- /dev/null +++ b/packages/swell/src/api/operations/get-all-products.ts @@ -0,0 +1,43 @@ +import { normalizeProduct } from '../../utils/normalize' +import { SwellProduct } from '../../types' +import { Product } from '@vercel/commerce/types/product' +import { Provider, SwellConfig } from '../' +import { OperationContext } from '@vercel/commerce/api/operations' + +export type ProductVariables = { first?: number } + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: ProductVariables + config?: Partial + preview?: boolean + }): Promise<{ products: Product[] }> + + async function getAllProducts({ + config: cfg, + variables = { first: 250 }, + }: { + query?: string + variables?: ProductVariables + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + const config = commerce.getConfig(cfg) + const { results } = await config.fetch('products', 'list', [ + { + limit: variables.first, + }, + ]) + const products = results.map((product: SwellProduct) => + normalizeProduct(product) + ) + + return { + products, + } + } + + return getAllProducts +} diff --git a/packages/swell/src/api/operations/get-page.ts b/packages/swell/src/api/operations/get-page.ts new file mode 100644 index 0000000..7e71f75 --- /dev/null +++ b/packages/swell/src/api/operations/get-page.ts @@ -0,0 +1,57 @@ +import { Page } from '../../../schema' +import { SwellConfig, Provider } from '..' +import { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { GetPageOperation } from '../../types/page' + +export type GetPageResult = T + +export type PageVariables = { + id: number +} + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise + + async function getPage( + opts: { + variables: T['variables'] + config?: Partial + preview?: boolean + } & OperationOptions + ): Promise + + async function getPage({ + variables, + config, + }: { + query?: string + variables: T['variables'] + config?: Partial + preview?: boolean + }): Promise { + const { fetch, locale = 'en-US' } = commerce.getConfig(config) + const id = variables.id + const result = await fetch('content', 'get', ['pages', id]) + const page = result + + return { + page: page + ? { + ...page, + url: `/${locale}/${page.slug}`, + } + : null, + } + } + + return getPage +} diff --git a/packages/swell/src/api/operations/get-product.ts b/packages/swell/src/api/operations/get-product.ts new file mode 100644 index 0000000..fff6257 --- /dev/null +++ b/packages/swell/src/api/operations/get-product.ts @@ -0,0 +1,33 @@ +import { normalizeProduct } from '../../utils' + +import { Product } from '@vercel/commerce/types/product' +import { OperationContext } from '@vercel/commerce/api/operations' +import { Provider, SwellConfig } from '../' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + variables, + config: cfg, + }: { + query?: string + variables: { slug: string } + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + + const product = await config.fetch('products', 'get', [variables.slug]) + + if (product && product.variants) { + product.variants = product.variants?.results + } + + return { + product: product ? normalizeProduct(product) : null, + } + } + + return getProduct +} diff --git a/packages/swell/src/api/operations/get-site-info.ts b/packages/swell/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..88386ad --- /dev/null +++ b/packages/swell/src/api/operations/get-site-info.ts @@ -0,0 +1,37 @@ +import getCategories from '../../utils/get-categories' +import getVendors, { Brands } from '../../utils/get-vendors' +import { Provider, SwellConfig } from '../' +import type { OperationContext } from '@vercel/commerce/api/operations' +import type { Category } from '@vercel/commerce/types/site' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: Brands + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo({ + variables, + config: cfg, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + const categories = await getCategories(config) + const brands = await getVendors(config) + + return { + categories, + brands, + } + } + + return getSiteInfo +} diff --git a/packages/swell/src/api/operations/login.ts b/packages/swell/src/api/operations/login.ts new file mode 100644 index 0000000..44ff37a --- /dev/null +++ b/packages/swell/src/api/operations/login.ts @@ -0,0 +1,46 @@ +import type { ServerResponse } from 'http' +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { LoginOperation } from '../../types/login' +import { Provider, SwellConfig } from '..' + +export default function loginOperation({ + commerce, +}: OperationContext) { + async function login(opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + }): Promise + + async function login( + opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + } & OperationOptions + ): Promise + + async function login({ + variables, + res: response, + config: cfg, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: Partial + }): Promise { + const config = commerce.getConfig(cfg) + + const { data } = await config.fetch('account', 'login', [variables]) + + return { + result: data, + } + } + + return login +} diff --git a/packages/swell/src/api/utils/fetch-swell-api.ts b/packages/swell/src/api/utils/fetch-swell-api.ts new file mode 100644 index 0000000..83055c5 --- /dev/null +++ b/packages/swell/src/api/utils/fetch-swell-api.ts @@ -0,0 +1,7 @@ +import swell from '../../swell' + +const fetchApi = async (query: string, method: string, variables: [] = []) => { + return swell[query][method](...variables) +} + +export default fetchApi diff --git a/packages/swell/src/api/utils/fetch.ts b/packages/swell/src/api/utils/fetch.ts new file mode 100644 index 0000000..0b83671 --- /dev/null +++ b/packages/swell/src/api/utils/fetch.ts @@ -0,0 +1,2 @@ +import zeitFetch from '@vercel/fetch' +export default zeitFetch() diff --git a/packages/swell/src/api/utils/is-allowed-method.ts b/packages/swell/src/api/utils/is-allowed-method.ts new file mode 100644 index 0000000..78bbba5 --- /dev/null +++ b/packages/swell/src/api/utils/is-allowed-method.ts @@ -0,0 +1,28 @@ +import type { NextApiRequest, NextApiResponse } from 'next' + +export default function isAllowedMethod( + req: NextApiRequest, + res: NextApiResponse, + allowedMethods: string[] +) { + const methods = allowedMethods.includes('OPTIONS') + ? allowedMethods + : [...allowedMethods, 'OPTIONS'] + + if (!req.method || !methods.includes(req.method)) { + res.status(405) + res.setHeader('Allow', methods.join(', ')) + res.end() + return false + } + + if (req.method === 'OPTIONS') { + res.status(200) + res.setHeader('Allow', methods.join(', ')) + res.setHeader('Content-Length', '0') + res.end() + return false + } + + return true +} diff --git a/packages/swell/src/api/wishlist/index.tsx b/packages/swell/src/api/wishlist/index.tsx new file mode 100644 index 0000000..a728566 --- /dev/null +++ b/packages/swell/src/api/wishlist/index.tsx @@ -0,0 +1,2 @@ +export type WishlistItem = { product: any; id: number } +export default function () {} diff --git a/packages/swell/src/auth/use-login.tsx b/packages/swell/src/auth/use-login.tsx new file mode 100644 index 0000000..b3fe9f5 --- /dev/null +++ b/packages/swell/src/auth/use-login.tsx @@ -0,0 +1,76 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError, ValidationError } from '@vercel/commerce/utils/errors' +import useCustomer from '../customer/use-customer' +import { + CustomerUserError, + Mutation, + MutationCheckoutCreateArgs, +} from '../../schema' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import { LoginHook } from '../types/login' +import { setCustomerToken } from '../utils' + +export default useLogin as UseLogin + +const getErrorMessage = ({ code, message }: CustomerUserError) => { + switch (code) { + case 'UNIDENTIFIED_CUSTOMER': + message = 'Cannot find an account that matches the provided credentials' + break + } + return message +} + +export const handler: MutationHook = { + fetchOptions: { + query: 'account', + method: 'login', + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to login', + }) + } + + const { customerAccessTokenCreate } = await fetch< + Mutation, + MutationCheckoutCreateArgs + >({ + ...options, + variables: [email, password], + }) + + const errors = customerAccessTokenCreate?.customerUserErrors + + if (errors && errors.length) { + throw new ValidationError({ + message: getErrorMessage(errors[0]), + }) + } + const customerAccessToken = customerAccessTokenCreate?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/auth/use-logout.tsx b/packages/swell/src/auth/use-logout.tsx new file mode 100644 index 0000000..08eec0b --- /dev/null +++ b/packages/swell/src/auth/use-logout.tsx @@ -0,0 +1,39 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import useCustomer from '../customer/use-customer' +import { getCustomerToken, setCustomerToken } from '../utils/customer-token' +import { LogoutHook } from '../types/logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: 'account', + method: 'logout', + }, + async fetcher({ options, fetch }) { + await fetch({ + ...options, + variables: { + customerAccessToken: getCustomerToken(), + }, + }) + setCustomerToken(null) + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/auth/use-signup.tsx b/packages/swell/src/auth/use-signup.tsx new file mode 100644 index 0000000..581312d --- /dev/null +++ b/packages/swell/src/auth/use-signup.tsx @@ -0,0 +1,61 @@ +import { useCallback } from 'react' +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import useCustomer from '../customer/use-customer' +import { SignupHook } from '../types/signup' +import handleLogin from '../utils/handle-login' + +export default useSignup as UseSignup + +export const handler: MutationHook = { + fetchOptions: { + query: 'account', + method: 'create', + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } + const data = await fetch({ + ...options, + variables: { + first_name: firstName, + last_name: lastName, + email, + password, + }, + }) + + try { + const loginData = await fetch({ + query: 'account', + method: 'login', + variables: [email, password], + }) + handleLogin(loginData) + } catch (error) {} + return data + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/cart/index.ts b/packages/swell/src/cart/index.ts new file mode 100644 index 0000000..3d288b1 --- /dev/null +++ b/packages/swell/src/cart/index.ts @@ -0,0 +1,3 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' diff --git a/packages/swell/src/cart/use-add-item.tsx b/packages/swell/src/cart/use-add-item.tsx new file mode 100644 index 0000000..048a1f4 --- /dev/null +++ b/packages/swell/src/cart/use-add-item.tsx @@ -0,0 +1,61 @@ +import type { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import useCart from './use-cart' +import { checkoutToCart } from './utils' +import { getCheckoutId } from '../utils' +import { useCallback } from 'react' +import { AddItemHook } from '../types/cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: 'cart', + method: 'addItem', + }, + async fetcher({ input: item, options, fetch }) { + if ( + item.quantity && + (!Number.isInteger(item.quantity) || item.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + const variables: { + product_id: string | undefined + variant_id?: string + checkoutId?: string + quantity?: number + } = { + checkoutId: getCheckoutId(), + product_id: item.productId, + quantity: item.quantity, + } + if (item.productId !== item.variantId) { + variables.variant_id = item.variantId + } + + const response = await fetch({ + ...options, + variables, + }) + + return checkoutToCart(response) as any + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/cart/use-cart.tsx b/packages/swell/src/cart/use-cart.tsx new file mode 100644 index 0000000..5842d1e --- /dev/null +++ b/packages/swell/src/cart/use-cart.tsx @@ -0,0 +1,39 @@ +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' +import { SWRHook } from '@vercel/commerce/utils/types' +import { useMemo } from 'react' +import { normalizeCart } from '../utils/normalize' +import { checkoutCreate, checkoutToCart } from './utils' +import type { GetCartHook } from '@vercel/commerce/types/cart' + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: 'cart', + method: 'get', + }, + async fetcher({ fetch }) { + const cart = await checkoutCreate(fetch) + + return cart ? normalizeCart(cart) : null + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/swell/src/cart/use-remove-item.tsx b/packages/swell/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..6e51165 --- /dev/null +++ b/packages/swell/src/cart/use-remove-item.tsx @@ -0,0 +1,57 @@ +import { useCallback } from 'react' +import type { + MutationHookContext, + HookFetcherContext, +} from '@vercel/commerce/utils/types' + +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' +import type { + Cart, + LineItem, + RemoveItemHook, +} from '@vercel/commerce/types/cart' +import useCart from './use-cart' +import { checkoutToCart } from './utils' + +export type RemoveItemFn = T extends LineItem + ? (input?: RemoveItemActionInput) => Promise + : (input: RemoveItemActionInput) => Promise + +export type RemoveItemActionInput = T extends LineItem + ? Partial + : RemoveItemHook['actionInput'] + +export default useRemoveItem as UseRemoveItem + +export const handler = { + fetchOptions: { + query: 'cart', + method: 'removeItem', + }, + async fetcher({ + input: { itemId }, + options, + fetch, + }: HookFetcherContext) { + const response = await fetch({ ...options, variables: [itemId] }) + + return checkoutToCart(response) + }, + useHook: + ({ fetch }: MutationHookContext) => + () => { + const { mutate } = useCart() + + return useCallback( + async function removeItem(input) { + const data = await fetch({ input: { itemId: input.id } }) + await mutate(data, false) + + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/cart/use-update-item.tsx b/packages/swell/src/cart/use-update-item.tsx new file mode 100644 index 0000000..c741250 --- /dev/null +++ b/packages/swell/src/cart/use-update-item.tsx @@ -0,0 +1,101 @@ +import { useCallback } from 'react' +import debounce from 'lodash.debounce' +import type { + HookFetcherContext, + MutationHook, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import { ValidationError } from '@vercel/commerce/utils/errors' +// import useUpdateItem, { +// UpdateItemInput as UpdateItemInputBase, +// UseUpdateItem, +// } from '@vercel/commerce/cart/use-update-item' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' +import useCart from './use-cart' +import { handler as removeItemHandler } from './use-remove-item' +import { CartItemBody, LineItem } from '@vercel/commerce/types/cart' +import { checkoutToCart } from './utils' +import { UpdateItemHook } from '../types/cart' +// export type UpdateItemInput = T extends LineItem +// ? Partial> +// : UpdateItemInputBase + +export default useUpdateItem as UseUpdateItem + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export const handler = { + fetchOptions: { + query: 'cart', + method: 'updateItem', + }, + async fetcher({ + input: { itemId, item }, + options, + fetch, + }: HookFetcherContext) { + if (Number.isInteger(item.quantity)) { + // Also allow the update hook to remove an item if the quantity is lower than 1 + if (item.quantity! < 1) { + return removeItemHandler.fetcher({ + options: removeItemHandler.fetchOptions, + input: { itemId }, + fetch, + }) + } + } else if (item.quantity) { + throw new ValidationError({ + message: 'The item quantity has to be a valid integer', + }) + } + const response = await fetch({ + ...options, + variables: [itemId, { quantity: item.quantity }], + }) + + return checkoutToCart(response) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: T + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate, data: cartData } = useCart() as any + + return useCallback( + debounce(async (input: UpdateItemActionInput) => { + const firstLineItem = cartData.lineItems[0] + const itemId = item?.id || firstLineItem.id + const productId = item?.productId || firstLineItem.productId + const variantId = item?.variant.id || firstLineItem.variant.id + if (!itemId || !productId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + + const data = await fetch({ + input: { + item: { + productId, + variantId, + quantity: input.quantity, + }, + itemId, + }, + }) + await mutate(data, false) + return data + }, ctx.wait ?? 500), + [fetch, mutate] + ) + }, +} diff --git a/packages/swell/src/cart/utils/checkout-create.ts b/packages/swell/src/cart/utils/checkout-create.ts new file mode 100644 index 0000000..a4b82d8 --- /dev/null +++ b/packages/swell/src/cart/utils/checkout-create.ts @@ -0,0 +1,28 @@ +import { SWELL_CHECKOUT_URL_COOKIE } from '../../const' + +import Cookies from 'js-cookie' + +export const checkoutCreate = async (fetch: any) => { + const cart = await fetch({ + query: 'cart', + method: 'get', + }) + + if (!cart) { + await fetch({ + query: 'cart', + method: 'setItems', + variables: [[]], + }) + } + + const checkoutUrl = cart?.checkout_url + + if (checkoutUrl) { + Cookies.set(SWELL_CHECKOUT_URL_COOKIE, checkoutUrl) + } + + return cart +} + +export default checkoutCreate diff --git a/packages/swell/src/cart/utils/checkout-to-cart.ts b/packages/swell/src/cart/utils/checkout-to-cart.ts new file mode 100644 index 0000000..c9becb1 --- /dev/null +++ b/packages/swell/src/cart/utils/checkout-to-cart.ts @@ -0,0 +1,26 @@ +import { Cart } from '../../types' +import { CommerceError } from '@vercel/commerce/utils/errors' + +import { + CheckoutLineItemsAddPayload, + CheckoutLineItemsRemovePayload, + CheckoutLineItemsUpdatePayload, + Maybe, +} from '../../../schema' +import { normalizeCart } from '../../utils' + +export type CheckoutPayload = + | CheckoutLineItemsAddPayload + | CheckoutLineItemsUpdatePayload + | CheckoutLineItemsRemovePayload + +const checkoutToCart = (checkoutPayload?: Maybe): Cart => { + if (!checkoutPayload) { + throw new CommerceError({ + message: 'Invalid response from Swell', + }) + } + return normalizeCart(checkoutPayload as any) +} + +export default checkoutToCart diff --git a/packages/swell/src/cart/utils/index.ts b/packages/swell/src/cart/utils/index.ts new file mode 100644 index 0000000..20d0495 --- /dev/null +++ b/packages/swell/src/cart/utils/index.ts @@ -0,0 +1,2 @@ +export { default as checkoutToCart } from './checkout-to-cart' +export { default as checkoutCreate } from './checkout-create' diff --git a/packages/swell/src/checkout/use-checkout.tsx b/packages/swell/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..76997be --- /dev/null +++ b/packages/swell/src/checkout/use-checkout.tsx @@ -0,0 +1,16 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/swell/src/commerce.config.json b/packages/swell/src/commerce.config.json new file mode 100644 index 0000000..01c9bf9 --- /dev/null +++ b/packages/swell/src/commerce.config.json @@ -0,0 +1,6 @@ +{ + "provider": "swell", + "features": { + "wishlist": false + } +} diff --git a/packages/swell/src/const.ts b/packages/swell/src/const.ts new file mode 100644 index 0000000..16d4938 --- /dev/null +++ b/packages/swell/src/const.ts @@ -0,0 +1,11 @@ +export const SWELL_CHECKOUT_ID_COOKIE = 'SWELL_checkoutId' + +export const SWELL_CHECKOUT_URL_COOKIE = 'swell_checkoutUrl' + +export const SWELL_CUSTOMER_TOKEN_COOKIE = 'swell_customerToken' + +export const SWELL_COOKIE_EXPIRE = 30 + +export const SWELL_STORE_ID = process.env.NEXT_PUBLIC_SWELL_STORE_ID + +export const SWELL_PUBLIC_KEY = process.env.NEXT_PUBLIC_SWELL_PUBLIC_KEY diff --git a/packages/swell/src/customer/address/use-add-item.tsx b/packages/swell/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..4f85c84 --- /dev/null +++ b/packages/swell/src/customer/address/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/swell/src/customer/card/use-add-item.tsx b/packages/swell/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..77d149e --- /dev/null +++ b/packages/swell/src/customer/card/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/swell/src/customer/index.ts b/packages/swell/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/swell/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/swell/src/customer/use-customer.tsx b/packages/swell/src/customer/use-customer.tsx new file mode 100644 index 0000000..0875310 --- /dev/null +++ b/packages/swell/src/customer/use-customer.tsx @@ -0,0 +1,31 @@ +import useCustomer, { + UseCustomer, +} from '@vercel/commerce/customer/use-customer' +import { SWRHook } from '@vercel/commerce/utils/types' +import { normalizeCustomer } from '../utils/normalize' +import type { CustomerHook } from '../types/customer' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + query: 'account', + method: 'get', + }, + async fetcher({ options, fetch }) { + const data = await fetch({ + ...options, + }) + return data ? normalizeCustomer(data) : null + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/swell/src/fetcher.ts b/packages/swell/src/fetcher.ts new file mode 100644 index 0000000..1d50bf5 --- /dev/null +++ b/packages/swell/src/fetcher.ts @@ -0,0 +1,26 @@ +import { Fetcher } from '@vercel/commerce/utils/types' +import { CommerceError } from '@vercel/commerce/utils/errors' +import { handleFetchResponse } from './utils' +import swell from './swell' + +const fetcher: Fetcher = async ({ method = 'get', variables, query }) => { + async function callSwell() { + if (Array.isArray(variables)) { + const arg1 = variables[0] + const arg2 = variables[1] + const response = await swell[query!][method](arg1, arg2) + return handleFetchResponse(response) + } else { + const response = await swell[query!][method](variables) + return handleFetchResponse(response) + } + } + + if (query && query in swell) { + return await callSwell() + } else { + throw new CommerceError({ message: 'Invalid query argument!' }) + } +} + +export default fetcher diff --git a/packages/swell/src/index.tsx b/packages/swell/src/index.tsx new file mode 100644 index 0000000..d88d75c --- /dev/null +++ b/packages/swell/src/index.tsx @@ -0,0 +1,12 @@ +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { swellProvider, SwellProvider } from './provider' + +export { swellProvider } +export type { SwellProvider } + +export const CommerceProvider = getCommerceProvider(swellProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/swell/src/next.config.cjs b/packages/swell/src/next.config.cjs new file mode 100644 index 0000000..f6ac383 --- /dev/null +++ b/packages/swell/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['cdn.schema.io'], + }, +} diff --git a/packages/swell/src/product/index.ts b/packages/swell/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/swell/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/swell/src/product/use-price.tsx b/packages/swell/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/swell/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/swell/src/product/use-search.tsx b/packages/swell/src/product/use-search.tsx new file mode 100644 index 0000000..b996099 --- /dev/null +++ b/packages/swell/src/product/use-search.tsx @@ -0,0 +1,61 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import { normalizeProduct } from '../utils' +import { SwellProduct } from '../types' +import type { SearchProductsHook } from '../types/product' + +export default useSearch as UseSearch + +export type SearchProductsInput = { + search?: string + categoryId?: string + brandId?: string + sort?: string +} + +export const handler: SWRHook = { + fetchOptions: { + query: 'products', + method: 'list', + }, + async fetcher({ input, options, fetch }) { + const sortMap = new Map([ + ['latest-desc', ''], + ['price-asc', 'price_asc'], + ['price-desc', 'price_desc'], + ['trending-desc', 'popularity'], + ]) + const { categoryId, search, sort = 'latest-desc' } = input + const mappedSort = sortMap.get(sort) + const { results, count: found } = await fetch({ + query: 'products', + method: 'list', + variables: { category: categoryId, search, sort: mappedSort }, + }) + + const products = results.map((product: SwellProduct) => + normalizeProduct(product) + ) + + return { + products, + found, + } + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/swell/src/provider.ts b/packages/swell/src/provider.ts new file mode 100644 index 0000000..afe07dc --- /dev/null +++ b/packages/swell/src/provider.ts @@ -0,0 +1,30 @@ +import { Provider } from '@vercel/commerce' +import { SWELL_CHECKOUT_ID_COOKIE } from './const' + +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' + +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' + +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' + +import fetcher from './fetcher' +import swell from './swell' + +export const swellProvider: Provider & { swell: any } = { + locale: 'en-us', + cartCookie: SWELL_CHECKOUT_ID_COOKIE, + swell, + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type SwellProvider = typeof swellProvider diff --git a/packages/swell/src/swell.ts b/packages/swell/src/swell.ts new file mode 100644 index 0000000..eb49ce5 --- /dev/null +++ b/packages/swell/src/swell.ts @@ -0,0 +1,7 @@ +// @ts-ignore +import swell from 'swell-js' +import { SWELL_STORE_ID, SWELL_PUBLIC_KEY } from './const' + +swell.init(SWELL_STORE_ID, SWELL_PUBLIC_KEY) + +export default swell diff --git a/packages/swell/src/types.ts b/packages/swell/src/types.ts new file mode 100644 index 0000000..b02bbd8 --- /dev/null +++ b/packages/swell/src/types.ts @@ -0,0 +1,112 @@ +import * as Core from '@vercel/commerce/types/cart' +import { Customer } from '@vercel/commerce/types' +import { CheckoutLineItem } from '../schema' + +export type SwellImage = { + file: { + url: String + height: Number + width: Number + } + id: string +} + +export type CartLineItem = { + id: string + product: SwellProduct + price: number + variant: { + name: string | null + sku: string | null + id: string + } + quantity: number +} + +export type SwellCart = { + id: string + account_id: number + currency: string + tax_included_total: number + sub_total: number + grand_total: number + discount_total: number + quantity: number + items: CartLineItem[] + date_created: string + discounts?: { id: number; amount: number }[] | null + // TODO: add missing fields +} + +export type SwellVariant = { + id: string + option_value_ids: string[] + name: string + price?: number + stock_status?: string + __type?: 'MultipleChoiceOption' | undefined +} + +export interface SwellProductOptionValue { + id: string + label: string + hexColors?: string[] +} + +export interface ProductOptionValue { + label: string + hexColors?: string[] +} + +export type ProductOptions = { + id: string + name: string + variant: boolean + values: ProductOptionValue[] + required: boolean + active: boolean + attribute_id: string +} + +export interface SwellProduct { + id: string + description: string + name: string + slug: string + currency: string + price: number + images: any[] + options: any[] + variants: any[] +} + +export type SwellCustomer = any + +export type SwellCheckout = { + id: string + webUrl: string + lineItems: CheckoutLineItem[] +} + +export interface Cart extends Core.Cart { + id: string + lineItems: LineItem[] +} + +export interface LineItem extends Core.LineItem { + options?: any[] +} + +/** + * Cart mutations + */ + +export type OptionSelections = { + option_id: number + option_value: number | string +} + +export type CartItemBody = Core.CartItemBody & { + productId: string // The product id is always required for BC + optionSelections?: OptionSelections +} diff --git a/packages/swell/src/types/cart.ts b/packages/swell/src/types/cart.ts new file mode 100644 index 0000000..e6838fb --- /dev/null +++ b/packages/swell/src/types/cart.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/cart' diff --git a/packages/swell/src/types/checkout.ts b/packages/swell/src/types/checkout.ts new file mode 100644 index 0000000..d139db6 --- /dev/null +++ b/packages/swell/src/types/checkout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/checkout' diff --git a/packages/swell/src/types/common.ts b/packages/swell/src/types/common.ts new file mode 100644 index 0000000..23b8daa --- /dev/null +++ b/packages/swell/src/types/common.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/common' diff --git a/packages/swell/src/types/customer.ts b/packages/swell/src/types/customer.ts new file mode 100644 index 0000000..c637055 --- /dev/null +++ b/packages/swell/src/types/customer.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/customer' diff --git a/packages/swell/src/types/index.ts b/packages/swell/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/swell/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/swell/src/types/login.ts b/packages/swell/src/types/login.ts new file mode 100644 index 0000000..44b017d --- /dev/null +++ b/packages/swell/src/types/login.ts @@ -0,0 +1,11 @@ +import * as Core from '@vercel/commerce/types/login' +import { LoginBody, LoginTypes } from '@vercel/commerce/types/login' + +export * from '@vercel/commerce/types/login' + +export type LoginHook = { + data: null + actionInput: LoginBody + fetcherInput: LoginBody + body: T['body'] +} diff --git a/packages/swell/src/types/logout.ts b/packages/swell/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/swell/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/swell/src/types/page.ts b/packages/swell/src/types/page.ts new file mode 100644 index 0000000..12f6b02 --- /dev/null +++ b/packages/swell/src/types/page.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/page' diff --git a/packages/swell/src/types/product.ts b/packages/swell/src/types/product.ts new file mode 100644 index 0000000..72ca02f --- /dev/null +++ b/packages/swell/src/types/product.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/product' diff --git a/packages/swell/src/types/signup.ts b/packages/swell/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/swell/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/swell/src/types/site.ts b/packages/swell/src/types/site.ts new file mode 100644 index 0000000..96a2e47 --- /dev/null +++ b/packages/swell/src/types/site.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/site' diff --git a/packages/swell/src/types/wishlist.ts b/packages/swell/src/types/wishlist.ts new file mode 100644 index 0000000..af92d9f --- /dev/null +++ b/packages/swell/src/types/wishlist.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/wishlist' diff --git a/packages/swell/src/utils/customer-token.ts b/packages/swell/src/utils/customer-token.ts new file mode 100644 index 0000000..63bd51b --- /dev/null +++ b/packages/swell/src/utils/customer-token.ts @@ -0,0 +1,21 @@ +import Cookies, { CookieAttributes } from 'js-cookie' +import { SWELL_COOKIE_EXPIRE, SWELL_CUSTOMER_TOKEN_COOKIE } from '../const' + +export const getCustomerToken = () => Cookies.get(SWELL_CUSTOMER_TOKEN_COOKIE) + +export const setCustomerToken = ( + token: string | null, + options?: CookieAttributes +) => { + if (!token) { + Cookies.remove(SWELL_CUSTOMER_TOKEN_COOKIE) + } else { + Cookies.set( + SWELL_CUSTOMER_TOKEN_COOKIE, + token, + options ?? { + expires: SWELL_COOKIE_EXPIRE, + } + ) + } +} diff --git a/packages/swell/src/utils/get-categories.ts b/packages/swell/src/utils/get-categories.ts new file mode 100644 index 0000000..ab38bae --- /dev/null +++ b/packages/swell/src/utils/get-categories.ts @@ -0,0 +1,16 @@ +import { SwellConfig } from '../api' +import { Category } from '../types/site' + +const getCategories = async (config: SwellConfig): Promise => { + const data = await config.fetch('categories', 'get') + return ( + data.results.map(({ id, name, slug }: any) => ({ + id, + name, + slug, + path: `/${slug}`, + })) ?? [] + ) +} + +export default getCategories diff --git a/packages/swell/src/utils/get-checkout-id.ts b/packages/swell/src/utils/get-checkout-id.ts new file mode 100644 index 0000000..07643f4 --- /dev/null +++ b/packages/swell/src/utils/get-checkout-id.ts @@ -0,0 +1,8 @@ +import Cookies from 'js-cookie' +import { SWELL_CHECKOUT_ID_COOKIE } from '../const' + +const getCheckoutId = (id?: string) => { + return id ?? Cookies.get(SWELL_CHECKOUT_ID_COOKIE) +} + +export default getCheckoutId diff --git a/packages/swell/src/utils/get-search-variables.ts b/packages/swell/src/utils/get-search-variables.ts new file mode 100644 index 0000000..c1b40ae --- /dev/null +++ b/packages/swell/src/utils/get-search-variables.ts @@ -0,0 +1,27 @@ +import getSortVariables from './get-sort-variables' +import type { SearchProductsInput } from '../product/use-search' + +export const getSearchVariables = ({ + brandId, + search, + categoryId, + sort, +}: SearchProductsInput) => { + let query = '' + + if (search) { + query += `product_type:${search} OR title:${search} OR tag:${search}` + } + + if (brandId) { + query += `${search ? ' AND ' : ''}vendor:${brandId}` + } + + return { + categoryId, + query, + ...getSortVariables(sort, !!categoryId), + } +} + +export default getSearchVariables diff --git a/packages/swell/src/utils/get-sort-variables.ts b/packages/swell/src/utils/get-sort-variables.ts new file mode 100644 index 0000000..b8cdeec --- /dev/null +++ b/packages/swell/src/utils/get-sort-variables.ts @@ -0,0 +1,32 @@ +const getSortVariables = (sort?: string, isCategory = false) => { + let output = {} + switch (sort) { + case 'price-asc': + output = { + sortKey: 'PRICE', + reverse: false, + } + break + case 'price-desc': + output = { + sortKey: 'PRICE', + reverse: true, + } + break + case 'trending-desc': + output = { + sortKey: 'BEST_SELLING', + reverse: false, + } + break + case 'latest-desc': + output = { + sortKey: isCategory ? 'CREATED' : 'CREATED_AT', + reverse: true, + } + break + } + return output +} + +export default getSortVariables diff --git a/packages/swell/src/utils/get-vendors.ts b/packages/swell/src/utils/get-vendors.ts new file mode 100644 index 0000000..1ede688 --- /dev/null +++ b/packages/swell/src/utils/get-vendors.ts @@ -0,0 +1,27 @@ +import { SwellConfig } from '../api' + +export type BrandNode = { + name: string + path: string +} + +export type BrandEdge = { + node: BrandNode +} + +export type Brands = BrandEdge[] + +const getVendors = async (config: SwellConfig) => { + const vendors: [string] = + (await config.fetch('attributes', 'get', ['brand']))?.values ?? [] + + return [...new Set(vendors)].map((v) => ({ + node: { + entityId: v, + name: v, + path: `brands/${v}`, + }, + })) +} + +export default getVendors diff --git a/packages/swell/src/utils/handle-fetch-response.ts b/packages/swell/src/utils/handle-fetch-response.ts new file mode 100644 index 0000000..d120cab --- /dev/null +++ b/packages/swell/src/utils/handle-fetch-response.ts @@ -0,0 +1,19 @@ +import { CommerceError } from '@vercel/commerce/utils/errors' + +type SwellFetchResponse = { + error: { + message: string + code?: string + } +} + +const handleFetchResponse = async (res: SwellFetchResponse) => { + if (res) { + if (res.error) { + throw new CommerceError(res.error) + } + return res + } +} + +export default handleFetchResponse diff --git a/packages/swell/src/utils/handle-login.ts b/packages/swell/src/utils/handle-login.ts new file mode 100644 index 0000000..8628262 --- /dev/null +++ b/packages/swell/src/utils/handle-login.ts @@ -0,0 +1,39 @@ +import { ValidationError } from '@vercel/commerce/utils/errors' +import { setCustomerToken } from './customer-token' + +const getErrorMessage = ({ + code, + message, +}: { + code: string + message: string +}) => { + switch (code) { + case 'UNIDENTIFIED_CUSTOMER': + message = 'Cannot find an account that matches the provided credentials' + break + } + return message +} + +const handleLogin = (data: any) => { + const response = data.customerAccessTokenCreate + const errors = response?.customerUserErrors + + if (errors && errors.length) { + throw new ValidationError({ + message: getErrorMessage(errors[0]), + }) + } + + const customerAccessToken = response?.customerAccessToken + const accessToken = customerAccessToken?.accessToken + + if (accessToken) { + setCustomerToken(accessToken) + } + + return customerAccessToken +} + +export default handleLogin diff --git a/packages/swell/src/utils/index.ts b/packages/swell/src/utils/index.ts new file mode 100644 index 0000000..9ec81bf --- /dev/null +++ b/packages/swell/src/utils/index.ts @@ -0,0 +1,9 @@ +export { default as handleFetchResponse } from './handle-fetch-response' +export { default as getSearchVariables } from './get-search-variables' +export { default as getSortVariables } from './get-sort-variables' +export { default as getVendors } from './get-vendors' +export { default as getCategories } from './get-categories' +export { default as getCheckoutId } from './get-checkout-id' + +export * from './normalize' +export * from './customer-token' diff --git a/packages/swell/src/utils/normalize.ts b/packages/swell/src/utils/normalize.ts new file mode 100644 index 0000000..9bbad59 --- /dev/null +++ b/packages/swell/src/utils/normalize.ts @@ -0,0 +1,226 @@ +import { Customer } from '../types/customer' +import { Product, ProductOption } from '../types/product' +import { MoneyV2 } from '../../schema' + +import type { + Cart, + CartLineItem, + SwellCustomer, + SwellProduct, + SwellImage, + SwellVariant, + ProductOptionValue, + SwellProductOptionValue, + SwellCart, + LineItem, +} from '../types' + +const money = ({ amount, currencyCode }: MoneyV2) => { + return { + value: +amount, + currencyCode, + } +} + +type swellProductOption = { + id: string + name: string + values: any[] +} + +type normalizedProductOption = { + id: string + displayName: string + values: ProductOptionValue[] +} + +const normalizeProductOption = ({ + id, + name: displayName = '', + values = [], +}: swellProductOption): ProductOption => { + let returnValues = values.map((value) => { + let output: any = { + label: value.name, + // id: value?.id || id, + } + if (displayName.match(/colou?r/gi)) { + output = { + ...output, + hexColors: [value.name], + } + } + return output + }) + return { + __typename: 'MultipleChoiceOption', + id, + displayName, + values: returnValues, + } +} + +const normalizeProductImages = (images: SwellImage[]) => { + if (!images || images.length < 1) { + return [{ url: '/' }] + } + return images?.map(({ file, ...rest }: SwellImage) => ({ + url: file?.url + '', + height: Number(file?.height), + width: Number(file?.width), + ...rest, + })) +} + +const normalizeProductVariants = ( + variants: SwellVariant[], + productOptions: swellProductOption[] +) => { + return variants?.map( + ({ id, name, price, option_value_ids: optionValueIds = [] }) => { + const values = name + .split(',') + .map((i) => ({ name: i.trim(), label: i.trim() })) + + const options = optionValueIds.map((id) => { + const matchingOption = productOptions.find((option) => { + return option.values.find( + (value: SwellProductOptionValue) => value.id == id + ) + }) + return normalizeProductOption({ + id, + name: matchingOption?.name ?? '', + values, + }) + }) + + return { + id, + // name, + // sku: sku ?? id, + // price: price ?? null, + // listPrice: price ?? null, + // requiresShipping: true, + options, + } + } + ) +} + +export function normalizeProduct(swellProduct: SwellProduct): Product { + const { + id, + name, + description, + images, + options, + slug, + variants, + price: value, + currency: currencyCode, + } = swellProduct + // ProductView accesses variants for each product + const emptyVariants = [{ options: [], id, name }] + + const productOptions = options + ? options.map((o) => normalizeProductOption(o)) + : [] + const productVariants = variants + ? normalizeProductVariants(variants, options) + : [] + + const productImages = normalizeProductImages(images) + const product = { + ...swellProduct, + description, + id, + vendor: '', + path: `/${slug}`, + images: productImages, + variants: + productVariants && productVariants.length + ? productVariants + : emptyVariants, + options: productOptions, + price: { + value, + currencyCode, + }, + } + return product +} + +export function normalizeCart({ + id, + account_id, + date_created, + currency, + tax_included_total, + items, + sub_total, + grand_total, + discounts, +}: SwellCart) { + const cart: Cart = { + id: id, + customerId: account_id + '', + email: '', + createdAt: date_created, + currency: { code: currency }, + taxesIncluded: tax_included_total > 0, + lineItems: items?.map(normalizeLineItem) ?? [], + lineItemsSubtotalPrice: +sub_total, + subtotalPrice: +sub_total, + totalPrice: grand_total, + discounts: discounts?.map((discount) => ({ value: discount.amount })), + } + return cart +} + +export function normalizeCustomer(customer: SwellCustomer): Customer { + const { first_name: firstName, last_name: lastName } = customer + return { + ...customer, + firstName, + lastName, + } +} + +function normalizeLineItem({ + id, + product, + price, + variant, + quantity, +}: CartLineItem): LineItem { + const item = { + id, + variantId: variant?.id, + productId: product.id ?? '', + name: product?.name ?? '', + quantity, + variant: { + id: variant?.id ?? '', + sku: variant?.sku ?? '', + name: variant?.name!, + image: { + url: + product?.images && product.images.length > 0 + ? product?.images[0].file.url + : '/', + }, + requiresShipping: false, + price: price, + listPrice: price, + }, + path: '', + discounts: [], + options: [ + { + value: variant?.name, + }, + ], + } + return item +} diff --git a/packages/swell/src/utils/storage.ts b/packages/swell/src/utils/storage.ts new file mode 100644 index 0000000..d46dadb --- /dev/null +++ b/packages/swell/src/utils/storage.ts @@ -0,0 +1,13 @@ +export const getCheckoutIdFromStorage = (token: string) => { + if (window && window.sessionStorage) { + return window.sessionStorage.getItem(token) + } + + return null +} + +export const setCheckoutIdInStorage = (token: string, id: string | number) => { + if (window && window.sessionStorage) { + return window.sessionStorage.setItem(token, id + '') + } +} diff --git a/packages/swell/src/wishlist/use-add-item.tsx b/packages/swell/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/swell/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/swell/src/wishlist/use-remove-item.tsx b/packages/swell/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/swell/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/swell/src/wishlist/use-wishlist.tsx b/packages/swell/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..0506ae9 --- /dev/null +++ b/packages/swell/src/wishlist/use-wishlist.tsx @@ -0,0 +1,46 @@ +// TODO: replace this hook and other wishlist hooks with a handler, or remove them if +// Swell doesn't have a wishlist + +import { HookFetcher } from '@vercel/commerce/utils/types' +import { Product } from '../../schema' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/swell/taskfile.js b/packages/swell/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/swell/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/swell/tsconfig.json b/packages/swell/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/swell/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/packages/taskr-swc/.prettierrc b/packages/taskr-swc/.prettierrc new file mode 100644 index 0000000..a4fb43a --- /dev/null +++ b/packages/taskr-swc/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/taskr-swc/package.json b/packages/taskr-swc/package.json new file mode 100644 index 0000000..1a91b5b --- /dev/null +++ b/packages/taskr-swc/package.json @@ -0,0 +1,16 @@ +{ + "name": "taskr-swc", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "prettier-fix": "prettier --write ." + }, + "main": "taskfile-swc.js", + "files": [ + "taskfile-swc.js" + ], + "devDependencies": { + "@swc/core": "^1.2.138", + "prettier": "^2.5.1" + } +} diff --git a/packages/taskr-swc/taskfile-swc.js b/packages/taskr-swc/taskfile-swc.js new file mode 100644 index 0000000..26fcad5 --- /dev/null +++ b/packages/taskr-swc/taskfile-swc.js @@ -0,0 +1,123 @@ +// Based on +// https://github.com/vercel/next.js/blob/canary/packages/next/taskfile-swc.js + +// taskr babel plugin with Babel 7 support +// https://github.com/lukeed/taskr/pull/305 + +const path = require('path') +const transform = require('@swc/core').transform + +module.exports = function (task) { + task.plugin( + 'swc', + {}, + function* ( + file, + { server = true, stripExtension, dev, outDir = 'dist', baseUrl = '' } = {} + ) { + // Don't compile .d.ts + if (file.base.endsWith('.d.ts')) return + + const swcClientOptions = { + module: { + type: 'es6', + ignoreDynamic: true, + }, + jsc: { + loose: true, + target: 'es2016', + parser: { + syntax: 'typescript', + dynamicImport: true, + tsx: file.base.endsWith('.tsx'), + }, + transform: { + react: { + runtime: 'automatic', + pragma: 'React.createElement', + pragmaFrag: 'React.Fragment', + throwIfNamespace: true, + development: false, + useBuiltins: true, + }, + }, + }, + } + const swcServerOptions = { + module: { + type: 'es6', + ignoreDynamic: true, + }, + env: { + targets: { + node: '14.0.0', + }, + }, + jsc: { + loose: true, + parser: { + syntax: 'typescript', + dynamicImport: true, + tsx: file.base.endsWith('.tsx'), + }, + transform: { + react: { + runtime: 'automatic', + pragma: 'React.createElement', + pragmaFrag: 'React.Fragment', + throwIfNamespace: true, + development: false, + useBuiltins: true, + }, + }, + }, + } + + const swcOptions = server ? swcServerOptions : swcClientOptions + const filePath = path.join(file.dir, file.base) + const options = { + filename: filePath, + sourceMaps: false, + ...swcOptions, + } + + if (options.sourceMaps && !options.sourceFileName) { + // Using `outDir` and `baseUrl` build a relative path from `outDir` to + // the `baseUrl` path for source maps + const basePath = path.join(__dirname, baseUrl) + const relativeFilePath = path.relative(basePath, filePath) + const fullFilePath = path.join(__dirname, filePath) + const distFilePath = path.dirname( + path.join(__dirname, outDir, relativeFilePath) + ) + + options.sourceFileName = path.relative(distFilePath, fullFilePath) + } + + const output = yield transform(file.data.toString('utf-8'), options) + const ext = path.extname(file.base) + + // Replace `.ts|.tsx` with `.js` in files with an extension + if (ext) { + const extRegex = new RegExp(ext.replace('.', '\\.') + '$', 'i') + // Remove the extension if stripExtension is enabled or replace it with `.js` + file.base = file.base.replace(extRegex, stripExtension ? '' : '.js') + } + + if (output.map) { + const map = `${file.base}.map` + + output.code += Buffer.from(`\n//# sourceMappingURL=${map}`) + + // add sourcemap to `files` array + this._.files.push({ + base: map, + dir: file.dir, + data: Buffer.from(output.map), + }) + } + + file.data = Buffer.from(output.code) + } + ) +} diff --git a/packages/vendure/.env.template b/packages/vendure/.env.template new file mode 100644 index 0000000..0935d8b --- /dev/null +++ b/packages/vendure/.env.template @@ -0,0 +1,4 @@ +COMMERCE_PROVIDER=@vercel/commerce-vendure + +NEXT_PUBLIC_VENDURE_SHOP_API_URL=http://localhost:3000/shop-api +NEXT_PUBLIC_VENDURE_LOCAL_URL=/vendure-shop-api diff --git a/packages/vendure/.prettierignore b/packages/vendure/.prettierignore new file mode 100644 index 0000000..f06235c --- /dev/null +++ b/packages/vendure/.prettierignore @@ -0,0 +1,2 @@ +node_modules +dist diff --git a/packages/vendure/.prettierrc b/packages/vendure/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/packages/vendure/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/packages/vendure/README.md b/packages/vendure/README.md new file mode 100644 index 0000000..485125c --- /dev/null +++ b/packages/vendure/README.md @@ -0,0 +1,37 @@ +# Vendure Storefront Data Hooks + +UI hooks and data fetching methods built from the ground up for e-commerce applications written in React, that use [Vendure](http://vendure.io/) as a headless e-commerce platform. + +## Usage + +1. Clone this repo and install its dependencies with `yarn install` or `npm install` +2. Set the Vendure provider and API URL in your `.env.local` file: + ``` + COMMERCE_PROVIDER=vendure + NEXT_PUBLIC_VENDURE_SHOP_API_URL=https://demo.vendure.io/shop-api + NEXT_PUBLIC_VENDURE_LOCAL_URL=/vendure-shop-api + ``` +3. With the Vendure server running, start this project using `yarn dev` or `npm run dev`. + +**Note:** The Vendure server needs to be configured to use the "cookie" tokenMethod rather than "bearer" to work with this provider. For more information see the [Managing Sessions docs](https://www.vendure.io/docs/storefront/managing-sessions/). + +## Known Limitations + +1. Vendure does not ship with built-in wishlist functionality. +2. Nor does it come with any kind of blog/page-building feature. Both of these can be created as Vendure plugins, however. +3. The entire Vendure customer flow is carried out via its GraphQL API. This means that there is no external, pre-existing checkout flow. The checkout flow must be created as part of the Next.js app. See https://github.com/vercel/commerce/issues/64 for further discusion. +4. By default, the sign-up flow in Vendure uses email verification. This means that using the existing "sign up" flow from this project will not grant a new user the ability to authenticate, since the new account must first be verified. Again, the necessary parts to support this flow can be created as part of the Next.js app. + +## Code generation + +This provider makes use of GraphQL code generation. The [schema.graphql](./schema.graphql) and [schema.d.ts](./schema.d.ts) files contain the generated types & schema introspection results. + +When developing the provider, changes to any GraphQL operations should be followed by re-generation of the types and schema files: + +From the package dir, run + +```sh +yarn generate +# or +npm run generate +``` diff --git a/packages/vendure/codegen.json b/packages/vendure/codegen.json new file mode 100644 index 0000000..8c84d29 --- /dev/null +++ b/packages/vendure/codegen.json @@ -0,0 +1,28 @@ +{ + "schema": { + "http://localhost:3001/shop-api": {} + }, + "documents": [ + { + "./src/**/*.{ts,tsx}": { + "noRequire": true + } + } + ], + "generates": { + "./schema.d.ts": { + "plugins": ["typescript", "typescript-operations"], + "config": { + "scalars": { + "ID": "string" + } + } + }, + "./schema.graphql": { + "plugins": ["schema-ast"] + } + }, + "hooks": { + "afterAllFileWrite": ["prettier --write"] + } +} diff --git a/packages/vendure/package.json b/packages/vendure/package.json new file mode 100644 index 0000000..484a527 --- /dev/null +++ b/packages/vendure/package.json @@ -0,0 +1,85 @@ +{ + "name": "@vercel/commerce-vendure", + "version": "0.0.1", + "license": "MIT", + "scripts": { + "release": "taskr release", + "build": "taskr build", + "dev": "taskr", + "types": "tsc --emitDeclarationOnly", + "prettier-fix": "prettier --write .", + "generate": "graphql-codegen" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": "./dist/index.js", + "./*": [ + "./dist/*.js", + "./dist/*/index.js" + ], + "./next.config": "./dist/next.config.cjs" + }, + "typesVersions": { + "*": { + "*": [ + "src/*", + "src/*/index" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + }, + "files": [ + "dist", + "schema.d.ts" + ], + "publishConfig": { + "typesVersions": { + "*": { + "*": [ + "dist/*.d.ts", + "dist/*/index.d.ts" + ], + "next.config": [ + "dist/next.config.d.cts" + ] + } + } + }, + "dependencies": { + "@vercel/commerce": "^0.0.1", + "@vercel/fetch": "^6.1.1" + }, + "peerDependencies": { + "next": "^12", + "react": "^17", + "react-dom": "^17" + }, + "devDependencies": { + "@graphql-codegen/cli": "^2.3.1", + "@graphql-codegen/schema-ast": "^2.4.1", + "@graphql-codegen/typescript": "^2.4.2", + "@graphql-codegen/typescript-operations": "^2.2.2", + "@taskr/clear": "^1.1.0", + "@taskr/esnext": "^1.1.0", + "@taskr/watch": "^1.1.0", + "@types/node": "^17.0.8", + "@types/react": "^17.0.38", + "lint-staged": "^12.1.7", + "next": "^12.0.8", + "prettier": "^2.5.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "taskr": "^1.1.0", + "taskr-swc": "^0.0.1", + "typescript": "^4.5.4" + }, + "lint-staged": { + "**/*.{js,jsx,ts,tsx,json}": [ + "prettier --write", + "git add" + ] + } +} diff --git a/packages/vendure/schema.d.ts b/packages/vendure/schema.d.ts new file mode 100644 index 0000000..9d6b53c --- /dev/null +++ b/packages/vendure/schema.d.ts @@ -0,0 +1,3257 @@ +export type Maybe = T | null +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & + { [SubKey in K]?: Maybe } +export type MakeMaybe = Omit & + { [SubKey in K]: Maybe } +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number + /** The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). */ + JSON: any + /** A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. */ + DateTime: any + /** The `Upload` scalar type represents a file upload. */ + Upload: any +} + +export type Query = { + __typename?: 'Query' + /** The active Channel */ + activeChannel: Channel + /** The active Customer */ + activeCustomer?: Maybe + /** + * The active Order. Will be `null` until an Order is created via `addItemToOrder`. Once an Order reaches the + * state of `PaymentApproved` or `PaymentSettled`, then that Order is no longer considered "active" and this + * query will once again return `null`. + */ + activeOrder?: Maybe + /** An array of supported Countries */ + availableCountries: Array + /** A list of Collections available to the shop */ + collections: CollectionList + /** Returns a Collection either by its id or slug. If neither 'id' nor 'slug' is speicified, an error will result. */ + collection?: Maybe + /** Returns a list of eligible shipping methods based on the current active Order */ + eligibleShippingMethods: Array + /** Returns a list of payment methods and their eligibility based on the current active Order */ + eligiblePaymentMethods: Array + /** Returns information about the current authenticated User */ + me?: Maybe + /** Returns the possible next states that the activeOrder can transition to */ + nextOrderStates: Array + /** + * Returns an Order based on the id. Note that in the Shop API, only orders belonging to the + * currently-authenticated User may be queried. + */ + order?: Maybe + /** + * Returns an Order based on the order `code`. For guest Orders (i.e. Orders placed by non-authenticated Customers) + * this query will only return the Order within 2 hours of the Order being placed. This allows an Order confirmation + * screen to be shown immediately after completion of a guest checkout, yet prevents security risks of allowing + * general anonymous access to Order data. + */ + orderByCode?: Maybe + /** Get a Product either by id or slug. If neither 'id' nor 'slug' is speicified, an error will result. */ + product?: Maybe + /** Get a list of Products */ + products: ProductList + /** Search Products based on the criteria set by the `SearchInput` */ + search: SearchResponse +} + +export type QueryCollectionsArgs = { + options?: Maybe +} + +export type QueryCollectionArgs = { + id?: Maybe + slug?: Maybe +} + +export type QueryOrderArgs = { + id: Scalars['ID'] +} + +export type QueryOrderByCodeArgs = { + code: Scalars['String'] +} + +export type QueryProductArgs = { + id?: Maybe + slug?: Maybe +} + +export type QueryProductsArgs = { + options?: Maybe +} + +export type QuerySearchArgs = { + input: SearchInput +} + +export type Mutation = { + __typename?: 'Mutation' + /** Adds an item to the order. If custom fields are defined on the OrderLine entity, a third argument 'customFields' will be available. */ + addItemToOrder: UpdateOrderItemsResult + /** Remove an OrderLine from the Order */ + removeOrderLine: RemoveOrderItemsResult + /** Remove all OrderLine from the Order */ + removeAllOrderLines: RemoveOrderItemsResult + /** Adjusts an OrderLine. If custom fields are defined on the OrderLine entity, a third argument 'customFields' of type `OrderLineCustomFieldsInput` will be available. */ + adjustOrderLine: UpdateOrderItemsResult + /** Applies the given coupon code to the active Order */ + applyCouponCode: ApplyCouponCodeResult + /** Removes the given coupon code from the active Order */ + removeCouponCode?: Maybe + /** Transitions an Order to a new state. Valid next states can be found by querying `nextOrderStates` */ + transitionOrderToState?: Maybe + /** Sets the shipping address for this order */ + setOrderShippingAddress: ActiveOrderResult + /** Sets the billing address for this order */ + setOrderBillingAddress: ActiveOrderResult + /** Allows any custom fields to be set for the active order */ + setOrderCustomFields: ActiveOrderResult + /** Sets the shipping method by id, which can be obtained with the `eligibleShippingMethods` query */ + setOrderShippingMethod: SetOrderShippingMethodResult + /** Add a Payment to the Order */ + addPaymentToOrder: AddPaymentToOrderResult + /** Set the Customer for the Order. Required only if the Customer is not currently logged in */ + setCustomerForOrder: SetCustomerForOrderResult + /** Authenticates the user using the native authentication strategy. This mutation is an alias for `authenticate({ native: { ... }})` */ + login: NativeAuthenticationResult + /** Authenticates the user using a named authentication strategy */ + authenticate: AuthenticationResult + /** End the current authenticated session */ + logout: Success + /** + * Register a Customer account with the given credentials. There are three possible registration flows: + * + * _If `authOptions.requireVerification` is set to `true`:_ + * + * 1. **The Customer is registered _with_ a password**. A verificationToken will be created (and typically emailed to the Customer). That + * verificationToken would then be passed to the `verifyCustomerAccount` mutation _without_ a password. The Customer is then + * verified and authenticated in one step. + * 2. **The Customer is registered _without_ a password**. A verificationToken will be created (and typically emailed to the Customer). That + * verificationToken would then be passed to the `verifyCustomerAccount` mutation _with_ the chosed password of the Customer. The Customer is then + * verified and authenticated in one step. + * + * _If `authOptions.requireVerification` is set to `false`:_ + * + * 3. The Customer _must_ be registered _with_ a password. No further action is needed - the Customer is able to authenticate immediately. + */ + registerCustomerAccount: RegisterCustomerAccountResult + /** Regenerate and send a verification token for a new Customer registration. Only applicable if `authOptions.requireVerification` is set to true. */ + refreshCustomerVerification: RefreshCustomerVerificationResult + /** Update an existing Customer */ + updateCustomer: Customer + /** Create a new Customer Address */ + createCustomerAddress: Address + /** Update an existing Address */ + updateCustomerAddress: Address + /** Delete an existing Address */ + deleteCustomerAddress: Success + /** + * Verify a Customer email address with the token sent to that address. Only applicable if `authOptions.requireVerification` is set to true. + * + * If the Customer was not registered with a password in the `registerCustomerAccount` mutation, the a password _must_ be + * provided here. + */ + verifyCustomerAccount: VerifyCustomerAccountResult + /** Update the password of the active Customer */ + updateCustomerPassword: UpdateCustomerPasswordResult + /** + * Request to update the emailAddress of the active Customer. If `authOptions.requireVerification` is enabled + * (as is the default), then the `identifierChangeToken` will be assigned to the current User and + * a IdentifierChangeRequestEvent will be raised. This can then be used e.g. by the EmailPlugin to email + * that verification token to the Customer, which is then used to verify the change of email address. + */ + requestUpdateCustomerEmailAddress: RequestUpdateCustomerEmailAddressResult + /** + * Confirm the update of the emailAddress with the provided token, which has been generated by the + * `requestUpdateCustomerEmailAddress` mutation. + */ + updateCustomerEmailAddress: UpdateCustomerEmailAddressResult + /** Requests a password reset email to be sent */ + requestPasswordReset?: Maybe + /** Resets a Customer's password based on the provided token */ + resetPassword: ResetPasswordResult +} + +export type MutationAddItemToOrderArgs = { + productVariantId: Scalars['ID'] + quantity: Scalars['Int'] +} + +export type MutationRemoveOrderLineArgs = { + orderLineId: Scalars['ID'] +} + +export type MutationAdjustOrderLineArgs = { + orderLineId: Scalars['ID'] + quantity: Scalars['Int'] +} + +export type MutationApplyCouponCodeArgs = { + couponCode: Scalars['String'] +} + +export type MutationRemoveCouponCodeArgs = { + couponCode: Scalars['String'] +} + +export type MutationTransitionOrderToStateArgs = { + state: Scalars['String'] +} + +export type MutationSetOrderShippingAddressArgs = { + input: CreateAddressInput +} + +export type MutationSetOrderBillingAddressArgs = { + input: CreateAddressInput +} + +export type MutationSetOrderCustomFieldsArgs = { + input: UpdateOrderInput +} + +export type MutationSetOrderShippingMethodArgs = { + shippingMethodId: Scalars['ID'] +} + +export type MutationAddPaymentToOrderArgs = { + input: PaymentInput +} + +export type MutationSetCustomerForOrderArgs = { + input: CreateCustomerInput +} + +export type MutationLoginArgs = { + username: Scalars['String'] + password: Scalars['String'] + rememberMe?: Maybe +} + +export type MutationAuthenticateArgs = { + input: AuthenticationInput + rememberMe?: Maybe +} + +export type MutationRegisterCustomerAccountArgs = { + input: RegisterCustomerInput +} + +export type MutationRefreshCustomerVerificationArgs = { + emailAddress: Scalars['String'] +} + +export type MutationUpdateCustomerArgs = { + input: UpdateCustomerInput +} + +export type MutationCreateCustomerAddressArgs = { + input: CreateAddressInput +} + +export type MutationUpdateCustomerAddressArgs = { + input: UpdateAddressInput +} + +export type MutationDeleteCustomerAddressArgs = { + id: Scalars['ID'] +} + +export type MutationVerifyCustomerAccountArgs = { + token: Scalars['String'] + password?: Maybe +} + +export type MutationUpdateCustomerPasswordArgs = { + currentPassword: Scalars['String'] + newPassword: Scalars['String'] +} + +export type MutationRequestUpdateCustomerEmailAddressArgs = { + password: Scalars['String'] + newEmailAddress: Scalars['String'] +} + +export type MutationUpdateCustomerEmailAddressArgs = { + token: Scalars['String'] +} + +export type MutationRequestPasswordResetArgs = { + emailAddress: Scalars['String'] +} + +export type MutationResetPasswordArgs = { + token: Scalars['String'] + password: Scalars['String'] +} + +export type Address = Node & { + __typename?: 'Address' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + fullName?: Maybe + company?: Maybe + streetLine1: Scalars['String'] + streetLine2?: Maybe + city?: Maybe + province?: Maybe + postalCode?: Maybe + country: Country + phoneNumber?: Maybe + defaultShippingAddress?: Maybe + defaultBillingAddress?: Maybe + customFields?: Maybe +} + +export type Asset = Node & { + __typename?: 'Asset' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + name: Scalars['String'] + type: AssetType + fileSize: Scalars['Int'] + mimeType: Scalars['String'] + width: Scalars['Int'] + height: Scalars['Int'] + source: Scalars['String'] + preview: Scalars['String'] + focalPoint?: Maybe + customFields?: Maybe +} + +export type Coordinate = { + __typename?: 'Coordinate' + x: Scalars['Float'] + y: Scalars['Float'] +} + +export type AssetList = PaginatedList & { + __typename?: 'AssetList' + items: Array + totalItems: Scalars['Int'] +} + +export enum AssetType { + Image = 'IMAGE', + Video = 'VIDEO', + Binary = 'BINARY', +} + +export type CurrentUser = { + __typename?: 'CurrentUser' + id: Scalars['ID'] + identifier: Scalars['String'] + channels: Array +} + +export type CurrentUserChannel = { + __typename?: 'CurrentUserChannel' + id: Scalars['ID'] + token: Scalars['String'] + code: Scalars['String'] + permissions: Array +} + +export type Channel = Node & { + __typename?: 'Channel' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + code: Scalars['String'] + token: Scalars['String'] + defaultTaxZone?: Maybe + defaultShippingZone?: Maybe + defaultLanguageCode: LanguageCode + currencyCode: CurrencyCode + pricesIncludeTax: Scalars['Boolean'] + customFields?: Maybe +} + +export type Collection = Node & { + __typename?: 'Collection' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode?: Maybe + name: Scalars['String'] + slug: Scalars['String'] + breadcrumbs: Array + position: Scalars['Int'] + description: Scalars['String'] + featuredAsset?: Maybe + assets: Array + parent?: Maybe + children?: Maybe> + filters: Array + translations: Array + productVariants: ProductVariantList + customFields?: Maybe +} + +export type CollectionProductVariantsArgs = { + options?: Maybe +} + +export type CollectionBreadcrumb = { + __typename?: 'CollectionBreadcrumb' + id: Scalars['ID'] + name: Scalars['String'] + slug: Scalars['String'] +} + +export type CollectionTranslation = { + __typename?: 'CollectionTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] + slug: Scalars['String'] + description: Scalars['String'] +} + +export type CollectionList = PaginatedList & { + __typename?: 'CollectionList' + items: Array + totalItems: Scalars['Int'] +} + +export type ProductVariantList = PaginatedList & { + __typename?: 'ProductVariantList' + items: Array + totalItems: Scalars['Int'] +} + +export type ProductVariantListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +export enum GlobalFlag { + True = 'TRUE', + False = 'FALSE', + Inherit = 'INHERIT', +} + +export enum AdjustmentType { + Promotion = 'PROMOTION', + DistributedOrderPromotion = 'DISTRIBUTED_ORDER_PROMOTION', +} + +export enum DeletionResult { + /** The entity was successfully deleted */ + Deleted = 'DELETED', + /** Deletion did not take place, reason given in message */ + NotDeleted = 'NOT_DELETED', +} + +/** + * @description + * Permissions for administrators and customers. Used to control access to + * GraphQL resolvers via the {@link Allow} decorator. + * + * @docsCategory common + */ +export enum Permission { + Placeholder = 'Placeholder', + /** Authenticated means simply that the user is logged in */ + Authenticated = 'Authenticated', + /** SuperAdmin has unrestricted access to all operations */ + SuperAdmin = 'SuperAdmin', + /** Owner means the user owns this entity, e.g. a Customer's own Order */ + Owner = 'Owner', + /** Public means any unauthenticated user may perform the operation */ + Public = 'Public', + /** Grants permission to update GlobalSettings */ + UpdateGlobalSettings = 'UpdateGlobalSettings', + /** Grants permission to create Products, Facets, Assets, Collections */ + CreateCatalog = 'CreateCatalog', + /** Grants permission to read Products, Facets, Assets, Collections */ + ReadCatalog = 'ReadCatalog', + /** Grants permission to update Products, Facets, Assets, Collections */ + UpdateCatalog = 'UpdateCatalog', + /** Grants permission to delete Products, Facets, Assets, Collections */ + DeleteCatalog = 'DeleteCatalog', + /** Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */ + CreateSettings = 'CreateSettings', + /** Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */ + ReadSettings = 'ReadSettings', + /** Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */ + UpdateSettings = 'UpdateSettings', + /** Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings */ + DeleteSettings = 'DeleteSettings', + /** Grants permission to create Administrator */ + CreateAdministrator = 'CreateAdministrator', + /** Grants permission to read Administrator */ + ReadAdministrator = 'ReadAdministrator', + /** Grants permission to update Administrator */ + UpdateAdministrator = 'UpdateAdministrator', + /** Grants permission to delete Administrator */ + DeleteAdministrator = 'DeleteAdministrator', + /** Grants permission to create Asset */ + CreateAsset = 'CreateAsset', + /** Grants permission to read Asset */ + ReadAsset = 'ReadAsset', + /** Grants permission to update Asset */ + UpdateAsset = 'UpdateAsset', + /** Grants permission to delete Asset */ + DeleteAsset = 'DeleteAsset', + /** Grants permission to create Channel */ + CreateChannel = 'CreateChannel', + /** Grants permission to read Channel */ + ReadChannel = 'ReadChannel', + /** Grants permission to update Channel */ + UpdateChannel = 'UpdateChannel', + /** Grants permission to delete Channel */ + DeleteChannel = 'DeleteChannel', + /** Grants permission to create Collection */ + CreateCollection = 'CreateCollection', + /** Grants permission to read Collection */ + ReadCollection = 'ReadCollection', + /** Grants permission to update Collection */ + UpdateCollection = 'UpdateCollection', + /** Grants permission to delete Collection */ + DeleteCollection = 'DeleteCollection', + /** Grants permission to create Country */ + CreateCountry = 'CreateCountry', + /** Grants permission to read Country */ + ReadCountry = 'ReadCountry', + /** Grants permission to update Country */ + UpdateCountry = 'UpdateCountry', + /** Grants permission to delete Country */ + DeleteCountry = 'DeleteCountry', + /** Grants permission to create Customer */ + CreateCustomer = 'CreateCustomer', + /** Grants permission to read Customer */ + ReadCustomer = 'ReadCustomer', + /** Grants permission to update Customer */ + UpdateCustomer = 'UpdateCustomer', + /** Grants permission to delete Customer */ + DeleteCustomer = 'DeleteCustomer', + /** Grants permission to create CustomerGroup */ + CreateCustomerGroup = 'CreateCustomerGroup', + /** Grants permission to read CustomerGroup */ + ReadCustomerGroup = 'ReadCustomerGroup', + /** Grants permission to update CustomerGroup */ + UpdateCustomerGroup = 'UpdateCustomerGroup', + /** Grants permission to delete CustomerGroup */ + DeleteCustomerGroup = 'DeleteCustomerGroup', + /** Grants permission to create Facet */ + CreateFacet = 'CreateFacet', + /** Grants permission to read Facet */ + ReadFacet = 'ReadFacet', + /** Grants permission to update Facet */ + UpdateFacet = 'UpdateFacet', + /** Grants permission to delete Facet */ + DeleteFacet = 'DeleteFacet', + /** Grants permission to create Order */ + CreateOrder = 'CreateOrder', + /** Grants permission to read Order */ + ReadOrder = 'ReadOrder', + /** Grants permission to update Order */ + UpdateOrder = 'UpdateOrder', + /** Grants permission to delete Order */ + DeleteOrder = 'DeleteOrder', + /** Grants permission to create PaymentMethod */ + CreatePaymentMethod = 'CreatePaymentMethod', + /** Grants permission to read PaymentMethod */ + ReadPaymentMethod = 'ReadPaymentMethod', + /** Grants permission to update PaymentMethod */ + UpdatePaymentMethod = 'UpdatePaymentMethod', + /** Grants permission to delete PaymentMethod */ + DeletePaymentMethod = 'DeletePaymentMethod', + /** Grants permission to create Product */ + CreateProduct = 'CreateProduct', + /** Grants permission to read Product */ + ReadProduct = 'ReadProduct', + /** Grants permission to update Product */ + UpdateProduct = 'UpdateProduct', + /** Grants permission to delete Product */ + DeleteProduct = 'DeleteProduct', + /** Grants permission to create Promotion */ + CreatePromotion = 'CreatePromotion', + /** Grants permission to read Promotion */ + ReadPromotion = 'ReadPromotion', + /** Grants permission to update Promotion */ + UpdatePromotion = 'UpdatePromotion', + /** Grants permission to delete Promotion */ + DeletePromotion = 'DeletePromotion', + /** Grants permission to create ShippingMethod */ + CreateShippingMethod = 'CreateShippingMethod', + /** Grants permission to read ShippingMethod */ + ReadShippingMethod = 'ReadShippingMethod', + /** Grants permission to update ShippingMethod */ + UpdateShippingMethod = 'UpdateShippingMethod', + /** Grants permission to delete ShippingMethod */ + DeleteShippingMethod = 'DeleteShippingMethod', + /** Grants permission to create Tag */ + CreateTag = 'CreateTag', + /** Grants permission to read Tag */ + ReadTag = 'ReadTag', + /** Grants permission to update Tag */ + UpdateTag = 'UpdateTag', + /** Grants permission to delete Tag */ + DeleteTag = 'DeleteTag', + /** Grants permission to create TaxCategory */ + CreateTaxCategory = 'CreateTaxCategory', + /** Grants permission to read TaxCategory */ + ReadTaxCategory = 'ReadTaxCategory', + /** Grants permission to update TaxCategory */ + UpdateTaxCategory = 'UpdateTaxCategory', + /** Grants permission to delete TaxCategory */ + DeleteTaxCategory = 'DeleteTaxCategory', + /** Grants permission to create TaxRate */ + CreateTaxRate = 'CreateTaxRate', + /** Grants permission to read TaxRate */ + ReadTaxRate = 'ReadTaxRate', + /** Grants permission to update TaxRate */ + UpdateTaxRate = 'UpdateTaxRate', + /** Grants permission to delete TaxRate */ + DeleteTaxRate = 'DeleteTaxRate', + /** Grants permission to create System */ + CreateSystem = 'CreateSystem', + /** Grants permission to read System */ + ReadSystem = 'ReadSystem', + /** Grants permission to update System */ + UpdateSystem = 'UpdateSystem', + /** Grants permission to delete System */ + DeleteSystem = 'DeleteSystem', + /** Grants permission to create Zone */ + CreateZone = 'CreateZone', + /** Grants permission to read Zone */ + ReadZone = 'ReadZone', + /** Grants permission to update Zone */ + UpdateZone = 'UpdateZone', + /** Grants permission to delete Zone */ + DeleteZone = 'DeleteZone', +} + +export enum SortOrder { + Asc = 'ASC', + Desc = 'DESC', +} + +export enum ErrorCode { + UnknownError = 'UNKNOWN_ERROR', + NativeAuthStrategyError = 'NATIVE_AUTH_STRATEGY_ERROR', + InvalidCredentialsError = 'INVALID_CREDENTIALS_ERROR', + OrderStateTransitionError = 'ORDER_STATE_TRANSITION_ERROR', + EmailAddressConflictError = 'EMAIL_ADDRESS_CONFLICT_ERROR', + OrderLimitError = 'ORDER_LIMIT_ERROR', + NegativeQuantityError = 'NEGATIVE_QUANTITY_ERROR', + InsufficientStockError = 'INSUFFICIENT_STOCK_ERROR', + OrderModificationError = 'ORDER_MODIFICATION_ERROR', + IneligibleShippingMethodError = 'INELIGIBLE_SHIPPING_METHOD_ERROR', + OrderPaymentStateError = 'ORDER_PAYMENT_STATE_ERROR', + IneligiblePaymentMethodError = 'INELIGIBLE_PAYMENT_METHOD_ERROR', + PaymentFailedError = 'PAYMENT_FAILED_ERROR', + PaymentDeclinedError = 'PAYMENT_DECLINED_ERROR', + CouponCodeInvalidError = 'COUPON_CODE_INVALID_ERROR', + CouponCodeExpiredError = 'COUPON_CODE_EXPIRED_ERROR', + CouponCodeLimitError = 'COUPON_CODE_LIMIT_ERROR', + AlreadyLoggedInError = 'ALREADY_LOGGED_IN_ERROR', + MissingPasswordError = 'MISSING_PASSWORD_ERROR', + PasswordAlreadySetError = 'PASSWORD_ALREADY_SET_ERROR', + VerificationTokenInvalidError = 'VERIFICATION_TOKEN_INVALID_ERROR', + VerificationTokenExpiredError = 'VERIFICATION_TOKEN_EXPIRED_ERROR', + IdentifierChangeTokenInvalidError = 'IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR', + IdentifierChangeTokenExpiredError = 'IDENTIFIER_CHANGE_TOKEN_EXPIRED_ERROR', + PasswordResetTokenInvalidError = 'PASSWORD_RESET_TOKEN_INVALID_ERROR', + PasswordResetTokenExpiredError = 'PASSWORD_RESET_TOKEN_EXPIRED_ERROR', + NotVerifiedError = 'NOT_VERIFIED_ERROR', + NoActiveOrderError = 'NO_ACTIVE_ORDER_ERROR', +} + +export enum LogicalOperator { + And = 'AND', + Or = 'OR', +} + +/** Retured when attempting an operation that relies on the NativeAuthStrategy, if that strategy is not configured. */ +export type NativeAuthStrategyError = ErrorResult & { + __typename?: 'NativeAuthStrategyError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Returned if the user authentication credentials are not valid */ +export type InvalidCredentialsError = ErrorResult & { + __typename?: 'InvalidCredentialsError' + errorCode: ErrorCode + message: Scalars['String'] + authenticationError: Scalars['String'] +} + +/** Returned if there is an error in transitioning the Order state */ +export type OrderStateTransitionError = ErrorResult & { + __typename?: 'OrderStateTransitionError' + errorCode: ErrorCode + message: Scalars['String'] + transitionError: Scalars['String'] + fromState: Scalars['String'] + toState: Scalars['String'] +} + +/** Retured when attemting to create a Customer with an email address already registered to an existing User. */ +export type EmailAddressConflictError = ErrorResult & { + __typename?: 'EmailAddressConflictError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Retured when the maximum order size limit has been reached. */ +export type OrderLimitError = ErrorResult & { + __typename?: 'OrderLimitError' + errorCode: ErrorCode + message: Scalars['String'] + maxItems: Scalars['Int'] +} + +/** Retured when attemting to set a negative OrderLine quantity. */ +export type NegativeQuantityError = ErrorResult & { + __typename?: 'NegativeQuantityError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Returned when attempting to add more items to the Order than are available */ +export type InsufficientStockError = ErrorResult & { + __typename?: 'InsufficientStockError' + errorCode: ErrorCode + message: Scalars['String'] + quantityAvailable: Scalars['Int'] + order: Order +} + +export type PaginatedList = { + items: Array + totalItems: Scalars['Int'] +} + +export type Node = { + id: Scalars['ID'] +} + +export type ErrorResult = { + errorCode: ErrorCode + message: Scalars['String'] +} + +export type Adjustment = { + __typename?: 'Adjustment' + adjustmentSource: Scalars['String'] + type: AdjustmentType + description: Scalars['String'] + amount: Scalars['Int'] +} + +export type TaxLine = { + __typename?: 'TaxLine' + description: Scalars['String'] + taxRate: Scalars['Float'] +} + +export type ConfigArg = { + __typename?: 'ConfigArg' + name: Scalars['String'] + value: Scalars['String'] +} + +export type ConfigArgDefinition = { + __typename?: 'ConfigArgDefinition' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + required: Scalars['Boolean'] + defaultValue?: Maybe + label?: Maybe + description?: Maybe + ui?: Maybe +} + +export type ConfigurableOperation = { + __typename?: 'ConfigurableOperation' + code: Scalars['String'] + args: Array +} + +export type ConfigurableOperationDefinition = { + __typename?: 'ConfigurableOperationDefinition' + code: Scalars['String'] + args: Array + description: Scalars['String'] +} + +export type DeletionResponse = { + __typename?: 'DeletionResponse' + result: DeletionResult + message?: Maybe +} + +export type ConfigArgInput = { + name: Scalars['String'] + /** A JSON stringified representation of the actual value */ + value: Scalars['String'] +} + +export type ConfigurableOperationInput = { + code: Scalars['String'] + arguments: Array +} + +export type StringOperators = { + eq?: Maybe + notEq?: Maybe + contains?: Maybe + notContains?: Maybe + in?: Maybe> + notIn?: Maybe> + regex?: Maybe +} + +export type BooleanOperators = { + eq?: Maybe +} + +export type NumberRange = { + start: Scalars['Float'] + end: Scalars['Float'] +} + +export type NumberOperators = { + eq?: Maybe + lt?: Maybe + lte?: Maybe + gt?: Maybe + gte?: Maybe + between?: Maybe +} + +export type DateRange = { + start: Scalars['DateTime'] + end: Scalars['DateTime'] +} + +export type DateOperators = { + eq?: Maybe + before?: Maybe + after?: Maybe + between?: Maybe +} + +/** + * Used to construct boolean expressions for filtering search results + * by FacetValue ID. Examples: + * + * * ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }` + * * ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }` + * * ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }` + */ +export type FacetValueFilterInput = { + and?: Maybe + or?: Maybe> +} + +export type SearchInput = { + term?: Maybe + facetValueIds?: Maybe> + facetValueOperator?: Maybe + facetValueFilters?: Maybe> + collectionId?: Maybe + collectionSlug?: Maybe + groupByProduct?: Maybe + take?: Maybe + skip?: Maybe + sort?: Maybe +} + +export type SearchResultSortParameter = { + name?: Maybe + price?: Maybe +} + +export type CreateCustomerInput = { + title?: Maybe + firstName: Scalars['String'] + lastName: Scalars['String'] + phoneNumber?: Maybe + emailAddress: Scalars['String'] + customFields?: Maybe +} + +export type CreateAddressInput = { + fullName?: Maybe + company?: Maybe + streetLine1: Scalars['String'] + streetLine2?: Maybe + city?: Maybe + province?: Maybe + postalCode?: Maybe + countryCode: Scalars['String'] + phoneNumber?: Maybe + defaultShippingAddress?: Maybe + defaultBillingAddress?: Maybe + customFields?: Maybe +} + +export type UpdateAddressInput = { + id: Scalars['ID'] + fullName?: Maybe + company?: Maybe + streetLine1?: Maybe + streetLine2?: Maybe + city?: Maybe + province?: Maybe + postalCode?: Maybe + countryCode?: Maybe + phoneNumber?: Maybe + defaultShippingAddress?: Maybe + defaultBillingAddress?: Maybe + customFields?: Maybe +} + +/** Indicates that an operation succeeded, where we do not want to return any more specific information. */ +export type Success = { + __typename?: 'Success' + success: Scalars['Boolean'] +} + +export type ShippingMethodQuote = { + __typename?: 'ShippingMethodQuote' + id: Scalars['ID'] + price: Scalars['Int'] + priceWithTax: Scalars['Int'] + code: Scalars['String'] + name: Scalars['String'] + description: Scalars['String'] + /** Any optional metadata returned by the ShippingCalculator in the ShippingCalculationResult */ + metadata?: Maybe +} + +export type PaymentMethodQuote = { + __typename?: 'PaymentMethodQuote' + id: Scalars['ID'] + code: Scalars['String'] + name: Scalars['String'] + description: Scalars['String'] + isEligible: Scalars['Boolean'] + eligibilityMessage?: Maybe +} + +export type Country = Node & { + __typename?: 'Country' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + code: Scalars['String'] + name: Scalars['String'] + enabled: Scalars['Boolean'] + translations: Array +} + +export type CountryTranslation = { + __typename?: 'CountryTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type CountryList = PaginatedList & { + __typename?: 'CountryList' + items: Array + totalItems: Scalars['Int'] +} + +/** + * @description + * ISO 4217 currency code + * + * @docsCategory common + */ +export enum CurrencyCode { + /** United Arab Emirates dirham */ + Aed = 'AED', + /** Afghan afghani */ + Afn = 'AFN', + /** Albanian lek */ + All = 'ALL', + /** Armenian dram */ + Amd = 'AMD', + /** Netherlands Antillean guilder */ + Ang = 'ANG', + /** Angolan kwanza */ + Aoa = 'AOA', + /** Argentine peso */ + Ars = 'ARS', + /** Australian dollar */ + Aud = 'AUD', + /** Aruban florin */ + Awg = 'AWG', + /** Azerbaijani manat */ + Azn = 'AZN', + /** Bosnia and Herzegovina convertible mark */ + Bam = 'BAM', + /** Barbados dollar */ + Bbd = 'BBD', + /** Bangladeshi taka */ + Bdt = 'BDT', + /** Bulgarian lev */ + Bgn = 'BGN', + /** Bahraini dinar */ + Bhd = 'BHD', + /** Burundian franc */ + Bif = 'BIF', + /** Bermudian dollar */ + Bmd = 'BMD', + /** Brunei dollar */ + Bnd = 'BND', + /** Boliviano */ + Bob = 'BOB', + /** Brazilian real */ + Brl = 'BRL', + /** Bahamian dollar */ + Bsd = 'BSD', + /** Bhutanese ngultrum */ + Btn = 'BTN', + /** Botswana pula */ + Bwp = 'BWP', + /** Belarusian ruble */ + Byn = 'BYN', + /** Belize dollar */ + Bzd = 'BZD', + /** Canadian dollar */ + Cad = 'CAD', + /** Congolese franc */ + Cdf = 'CDF', + /** Swiss franc */ + Chf = 'CHF', + /** Chilean peso */ + Clp = 'CLP', + /** Renminbi (Chinese) yuan */ + Cny = 'CNY', + /** Colombian peso */ + Cop = 'COP', + /** Costa Rican colon */ + Crc = 'CRC', + /** Cuban convertible peso */ + Cuc = 'CUC', + /** Cuban peso */ + Cup = 'CUP', + /** Cape Verde escudo */ + Cve = 'CVE', + /** Czech koruna */ + Czk = 'CZK', + /** Djiboutian franc */ + Djf = 'DJF', + /** Danish krone */ + Dkk = 'DKK', + /** Dominican peso */ + Dop = 'DOP', + /** Algerian dinar */ + Dzd = 'DZD', + /** Egyptian pound */ + Egp = 'EGP', + /** Eritrean nakfa */ + Ern = 'ERN', + /** Ethiopian birr */ + Etb = 'ETB', + /** Euro */ + Eur = 'EUR', + /** Fiji dollar */ + Fjd = 'FJD', + /** Falkland Islands pound */ + Fkp = 'FKP', + /** Pound sterling */ + Gbp = 'GBP', + /** Georgian lari */ + Gel = 'GEL', + /** Ghanaian cedi */ + Ghs = 'GHS', + /** Gibraltar pound */ + Gip = 'GIP', + /** Gambian dalasi */ + Gmd = 'GMD', + /** Guinean franc */ + Gnf = 'GNF', + /** Guatemalan quetzal */ + Gtq = 'GTQ', + /** Guyanese dollar */ + Gyd = 'GYD', + /** Hong Kong dollar */ + Hkd = 'HKD', + /** Honduran lempira */ + Hnl = 'HNL', + /** Croatian kuna */ + Hrk = 'HRK', + /** Haitian gourde */ + Htg = 'HTG', + /** Hungarian forint */ + Huf = 'HUF', + /** Indonesian rupiah */ + Idr = 'IDR', + /** Israeli new shekel */ + Ils = 'ILS', + /** Indian rupee */ + Inr = 'INR', + /** Iraqi dinar */ + Iqd = 'IQD', + /** Iranian rial */ + Irr = 'IRR', + /** Icelandic króna */ + Isk = 'ISK', + /** Jamaican dollar */ + Jmd = 'JMD', + /** Jordanian dinar */ + Jod = 'JOD', + /** Japanese yen */ + Jpy = 'JPY', + /** Kenyan shilling */ + Kes = 'KES', + /** Kyrgyzstani som */ + Kgs = 'KGS', + /** Cambodian riel */ + Khr = 'KHR', + /** Comoro franc */ + Kmf = 'KMF', + /** North Korean won */ + Kpw = 'KPW', + /** South Korean won */ + Krw = 'KRW', + /** Kuwaiti dinar */ + Kwd = 'KWD', + /** Cayman Islands dollar */ + Kyd = 'KYD', + /** Kazakhstani tenge */ + Kzt = 'KZT', + /** Lao kip */ + Lak = 'LAK', + /** Lebanese pound */ + Lbp = 'LBP', + /** Sri Lankan rupee */ + Lkr = 'LKR', + /** Liberian dollar */ + Lrd = 'LRD', + /** Lesotho loti */ + Lsl = 'LSL', + /** Libyan dinar */ + Lyd = 'LYD', + /** Moroccan dirham */ + Mad = 'MAD', + /** Moldovan leu */ + Mdl = 'MDL', + /** Malagasy ariary */ + Mga = 'MGA', + /** Macedonian denar */ + Mkd = 'MKD', + /** Myanmar kyat */ + Mmk = 'MMK', + /** Mongolian tögrög */ + Mnt = 'MNT', + /** Macanese pataca */ + Mop = 'MOP', + /** Mauritanian ouguiya */ + Mru = 'MRU', + /** Mauritian rupee */ + Mur = 'MUR', + /** Maldivian rufiyaa */ + Mvr = 'MVR', + /** Malawian kwacha */ + Mwk = 'MWK', + /** Mexican peso */ + Mxn = 'MXN', + /** Malaysian ringgit */ + Myr = 'MYR', + /** Mozambican metical */ + Mzn = 'MZN', + /** Namibian dollar */ + Nad = 'NAD', + /** Nigerian naira */ + Ngn = 'NGN', + /** Nicaraguan córdoba */ + Nio = 'NIO', + /** Norwegian krone */ + Nok = 'NOK', + /** Nepalese rupee */ + Npr = 'NPR', + /** New Zealand dollar */ + Nzd = 'NZD', + /** Omani rial */ + Omr = 'OMR', + /** Panamanian balboa */ + Pab = 'PAB', + /** Peruvian sol */ + Pen = 'PEN', + /** Papua New Guinean kina */ + Pgk = 'PGK', + /** Philippine peso */ + Php = 'PHP', + /** Pakistani rupee */ + Pkr = 'PKR', + /** Polish złoty */ + Pln = 'PLN', + /** Paraguayan guaraní */ + Pyg = 'PYG', + /** Qatari riyal */ + Qar = 'QAR', + /** Romanian leu */ + Ron = 'RON', + /** Serbian dinar */ + Rsd = 'RSD', + /** Russian ruble */ + Rub = 'RUB', + /** Rwandan franc */ + Rwf = 'RWF', + /** Saudi riyal */ + Sar = 'SAR', + /** Solomon Islands dollar */ + Sbd = 'SBD', + /** Seychelles rupee */ + Scr = 'SCR', + /** Sudanese pound */ + Sdg = 'SDG', + /** Swedish krona/kronor */ + Sek = 'SEK', + /** Singapore dollar */ + Sgd = 'SGD', + /** Saint Helena pound */ + Shp = 'SHP', + /** Sierra Leonean leone */ + Sll = 'SLL', + /** Somali shilling */ + Sos = 'SOS', + /** Surinamese dollar */ + Srd = 'SRD', + /** South Sudanese pound */ + Ssp = 'SSP', + /** São Tomé and Príncipe dobra */ + Stn = 'STN', + /** Salvadoran colón */ + Svc = 'SVC', + /** Syrian pound */ + Syp = 'SYP', + /** Swazi lilangeni */ + Szl = 'SZL', + /** Thai baht */ + Thb = 'THB', + /** Tajikistani somoni */ + Tjs = 'TJS', + /** Turkmenistan manat */ + Tmt = 'TMT', + /** Tunisian dinar */ + Tnd = 'TND', + /** Tongan paʻanga */ + Top = 'TOP', + /** Turkish lira */ + Try = 'TRY', + /** Trinidad and Tobago dollar */ + Ttd = 'TTD', + /** New Taiwan dollar */ + Twd = 'TWD', + /** Tanzanian shilling */ + Tzs = 'TZS', + /** Ukrainian hryvnia */ + Uah = 'UAH', + /** Ugandan shilling */ + Ugx = 'UGX', + /** United States dollar */ + Usd = 'USD', + /** Uruguayan peso */ + Uyu = 'UYU', + /** Uzbekistan som */ + Uzs = 'UZS', + /** Venezuelan bolívar soberano */ + Ves = 'VES', + /** Vietnamese đồng */ + Vnd = 'VND', + /** Vanuatu vatu */ + Vuv = 'VUV', + /** Samoan tala */ + Wst = 'WST', + /** CFA franc BEAC */ + Xaf = 'XAF', + /** East Caribbean dollar */ + Xcd = 'XCD', + /** CFA franc BCEAO */ + Xof = 'XOF', + /** CFP franc (franc Pacifique) */ + Xpf = 'XPF', + /** Yemeni rial */ + Yer = 'YER', + /** South African rand */ + Zar = 'ZAR', + /** Zambian kwacha */ + Zmw = 'ZMW', + /** Zimbabwean dollar */ + Zwl = 'ZWL', +} + +export type CustomField = { + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe +} + +export type StringCustomFieldConfig = CustomField & { + __typename?: 'StringCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + length?: Maybe + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + pattern?: Maybe + options?: Maybe> +} + +export type StringFieldOption = { + __typename?: 'StringFieldOption' + value: Scalars['String'] + label?: Maybe> +} + +export type LocaleStringCustomFieldConfig = CustomField & { + __typename?: 'LocaleStringCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + length?: Maybe + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + pattern?: Maybe +} + +export type IntCustomFieldConfig = CustomField & { + __typename?: 'IntCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + min?: Maybe + max?: Maybe + step?: Maybe +} + +export type FloatCustomFieldConfig = CustomField & { + __typename?: 'FloatCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + min?: Maybe + max?: Maybe + step?: Maybe +} + +export type BooleanCustomFieldConfig = CustomField & { + __typename?: 'BooleanCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe +} + +/** + * Expects the same validation formats as the `` HTML element. + * See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes + */ +export type DateTimeCustomFieldConfig = CustomField & { + __typename?: 'DateTimeCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + min?: Maybe + max?: Maybe + step?: Maybe +} + +export type RelationCustomFieldConfig = CustomField & { + __typename?: 'RelationCustomFieldConfig' + name: Scalars['String'] + type: Scalars['String'] + list: Scalars['Boolean'] + label?: Maybe> + description?: Maybe> + readonly?: Maybe + internal?: Maybe + entity: Scalars['String'] + scalarFields: Array +} + +export type LocalizedString = { + __typename?: 'LocalizedString' + languageCode: LanguageCode + value: Scalars['String'] +} + +export type CustomFieldConfig = + | StringCustomFieldConfig + | LocaleStringCustomFieldConfig + | IntCustomFieldConfig + | FloatCustomFieldConfig + | BooleanCustomFieldConfig + | DateTimeCustomFieldConfig + | RelationCustomFieldConfig + +export type CustomerGroup = Node & { + __typename?: 'CustomerGroup' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + name: Scalars['String'] + customers: CustomerList +} + +export type CustomerGroupCustomersArgs = { + options?: Maybe +} + +export type CustomerListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +export type Customer = Node & { + __typename?: 'Customer' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + title?: Maybe + firstName: Scalars['String'] + lastName: Scalars['String'] + phoneNumber?: Maybe + emailAddress: Scalars['String'] + addresses?: Maybe> + orders: OrderList + user?: Maybe + customFields?: Maybe +} + +export type CustomerOrdersArgs = { + options?: Maybe +} + +export type CustomerList = PaginatedList & { + __typename?: 'CustomerList' + items: Array + totalItems: Scalars['Int'] +} + +export type FacetValue = Node & { + __typename?: 'FacetValue' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + facet: Facet + name: Scalars['String'] + code: Scalars['String'] + translations: Array + customFields?: Maybe +} + +export type FacetValueTranslation = { + __typename?: 'FacetValueTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type Facet = Node & { + __typename?: 'Facet' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] + code: Scalars['String'] + values: Array + translations: Array + customFields?: Maybe +} + +export type FacetTranslation = { + __typename?: 'FacetTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type FacetList = PaginatedList & { + __typename?: 'FacetList' + items: Array + totalItems: Scalars['Int'] +} + +export type HistoryEntry = Node & { + __typename?: 'HistoryEntry' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + type: HistoryEntryType + data: Scalars['JSON'] +} + +export enum HistoryEntryType { + CustomerRegistered = 'CUSTOMER_REGISTERED', + CustomerVerified = 'CUSTOMER_VERIFIED', + CustomerDetailUpdated = 'CUSTOMER_DETAIL_UPDATED', + CustomerAddedToGroup = 'CUSTOMER_ADDED_TO_GROUP', + CustomerRemovedFromGroup = 'CUSTOMER_REMOVED_FROM_GROUP', + CustomerAddressCreated = 'CUSTOMER_ADDRESS_CREATED', + CustomerAddressUpdated = 'CUSTOMER_ADDRESS_UPDATED', + CustomerAddressDeleted = 'CUSTOMER_ADDRESS_DELETED', + CustomerPasswordUpdated = 'CUSTOMER_PASSWORD_UPDATED', + CustomerPasswordResetRequested = 'CUSTOMER_PASSWORD_RESET_REQUESTED', + CustomerPasswordResetVerified = 'CUSTOMER_PASSWORD_RESET_VERIFIED', + CustomerEmailUpdateRequested = 'CUSTOMER_EMAIL_UPDATE_REQUESTED', + CustomerEmailUpdateVerified = 'CUSTOMER_EMAIL_UPDATE_VERIFIED', + CustomerNote = 'CUSTOMER_NOTE', + OrderStateTransition = 'ORDER_STATE_TRANSITION', + OrderPaymentTransition = 'ORDER_PAYMENT_TRANSITION', + OrderFulfillment = 'ORDER_FULFILLMENT', + OrderCancellation = 'ORDER_CANCELLATION', + OrderRefundTransition = 'ORDER_REFUND_TRANSITION', + OrderFulfillmentTransition = 'ORDER_FULFILLMENT_TRANSITION', + OrderNote = 'ORDER_NOTE', + OrderCouponApplied = 'ORDER_COUPON_APPLIED', + OrderCouponRemoved = 'ORDER_COUPON_REMOVED', + OrderModified = 'ORDER_MODIFIED', +} + +export type HistoryEntryList = PaginatedList & { + __typename?: 'HistoryEntryList' + items: Array + totalItems: Scalars['Int'] +} + +export type HistoryEntryListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +/** + * @description + * Languages in the form of a ISO 639-1 language code with optional + * region or script modifier (e.g. de_AT). The selection available is based + * on the [Unicode CLDR summary list](https://unicode-org.github.io/cldr-staging/charts/37/summary/root.html) + * and includes the major spoken languages of the world and any widely-used variants. + * + * @docsCategory common + */ +export enum LanguageCode { + /** Afrikaans */ + Af = 'af', + /** Akan */ + Ak = 'ak', + /** Albanian */ + Sq = 'sq', + /** Amharic */ + Am = 'am', + /** Arabic */ + Ar = 'ar', + /** Armenian */ + Hy = 'hy', + /** Assamese */ + As = 'as', + /** Azerbaijani */ + Az = 'az', + /** Bambara */ + Bm = 'bm', + /** Bangla */ + Bn = 'bn', + /** Basque */ + Eu = 'eu', + /** Belarusian */ + Be = 'be', + /** Bosnian */ + Bs = 'bs', + /** Breton */ + Br = 'br', + /** Bulgarian */ + Bg = 'bg', + /** Burmese */ + My = 'my', + /** Catalan */ + Ca = 'ca', + /** Chechen */ + Ce = 'ce', + /** Chinese */ + Zh = 'zh', + /** Simplified Chinese */ + ZhHans = 'zh_Hans', + /** Traditional Chinese */ + ZhHant = 'zh_Hant', + /** Church Slavic */ + Cu = 'cu', + /** Cornish */ + Kw = 'kw', + /** Corsican */ + Co = 'co', + /** Croatian */ + Hr = 'hr', + /** Czech */ + Cs = 'cs', + /** Danish */ + Da = 'da', + /** Dutch */ + Nl = 'nl', + /** Flemish */ + NlBe = 'nl_BE', + /** Dzongkha */ + Dz = 'dz', + /** English */ + En = 'en', + /** Australian English */ + EnAu = 'en_AU', + /** Canadian English */ + EnCa = 'en_CA', + /** British English */ + EnGb = 'en_GB', + /** American English */ + EnUs = 'en_US', + /** Esperanto */ + Eo = 'eo', + /** Estonian */ + Et = 'et', + /** Ewe */ + Ee = 'ee', + /** Faroese */ + Fo = 'fo', + /** Finnish */ + Fi = 'fi', + /** French */ + Fr = 'fr', + /** Canadian French */ + FrCa = 'fr_CA', + /** Swiss French */ + FrCh = 'fr_CH', + /** Fulah */ + Ff = 'ff', + /** Galician */ + Gl = 'gl', + /** Ganda */ + Lg = 'lg', + /** Georgian */ + Ka = 'ka', + /** German */ + De = 'de', + /** Austrian German */ + DeAt = 'de_AT', + /** Swiss High German */ + DeCh = 'de_CH', + /** Greek */ + El = 'el', + /** Gujarati */ + Gu = 'gu', + /** Haitian Creole */ + Ht = 'ht', + /** Hausa */ + Ha = 'ha', + /** Hebrew */ + He = 'he', + /** Hindi */ + Hi = 'hi', + /** Hungarian */ + Hu = 'hu', + /** Icelandic */ + Is = 'is', + /** Igbo */ + Ig = 'ig', + /** Indonesian */ + Id = 'id', + /** Interlingua */ + Ia = 'ia', + /** Irish */ + Ga = 'ga', + /** Italian */ + It = 'it', + /** Japanese */ + Ja = 'ja', + /** Javanese */ + Jv = 'jv', + /** Kalaallisut */ + Kl = 'kl', + /** Kannada */ + Kn = 'kn', + /** Kashmiri */ + Ks = 'ks', + /** Kazakh */ + Kk = 'kk', + /** Khmer */ + Km = 'km', + /** Kikuyu */ + Ki = 'ki', + /** Kinyarwanda */ + Rw = 'rw', + /** Korean */ + Ko = 'ko', + /** Kurdish */ + Ku = 'ku', + /** Kyrgyz */ + Ky = 'ky', + /** Lao */ + Lo = 'lo', + /** Latin */ + La = 'la', + /** Latvian */ + Lv = 'lv', + /** Lingala */ + Ln = 'ln', + /** Lithuanian */ + Lt = 'lt', + /** Luba-Katanga */ + Lu = 'lu', + /** Luxembourgish */ + Lb = 'lb', + /** Macedonian */ + Mk = 'mk', + /** Malagasy */ + Mg = 'mg', + /** Malay */ + Ms = 'ms', + /** Malayalam */ + Ml = 'ml', + /** Maltese */ + Mt = 'mt', + /** Manx */ + Gv = 'gv', + /** Maori */ + Mi = 'mi', + /** Marathi */ + Mr = 'mr', + /** Mongolian */ + Mn = 'mn', + /** Nepali */ + Ne = 'ne', + /** North Ndebele */ + Nd = 'nd', + /** Northern Sami */ + Se = 'se', + /** Norwegian Bokmål */ + Nb = 'nb', + /** Norwegian Nynorsk */ + Nn = 'nn', + /** Nyanja */ + Ny = 'ny', + /** Odia */ + Or = 'or', + /** Oromo */ + Om = 'om', + /** Ossetic */ + Os = 'os', + /** Pashto */ + Ps = 'ps', + /** Persian */ + Fa = 'fa', + /** Dari */ + FaAf = 'fa_AF', + /** Polish */ + Pl = 'pl', + /** Portuguese */ + Pt = 'pt', + /** Brazilian Portuguese */ + PtBr = 'pt_BR', + /** European Portuguese */ + PtPt = 'pt_PT', + /** Punjabi */ + Pa = 'pa', + /** Quechua */ + Qu = 'qu', + /** Romanian */ + Ro = 'ro', + /** Moldavian */ + RoMd = 'ro_MD', + /** Romansh */ + Rm = 'rm', + /** Rundi */ + Rn = 'rn', + /** Russian */ + Ru = 'ru', + /** Samoan */ + Sm = 'sm', + /** Sango */ + Sg = 'sg', + /** Sanskrit */ + Sa = 'sa', + /** Scottish Gaelic */ + Gd = 'gd', + /** Serbian */ + Sr = 'sr', + /** Shona */ + Sn = 'sn', + /** Sichuan Yi */ + Ii = 'ii', + /** Sindhi */ + Sd = 'sd', + /** Sinhala */ + Si = 'si', + /** Slovak */ + Sk = 'sk', + /** Slovenian */ + Sl = 'sl', + /** Somali */ + So = 'so', + /** Southern Sotho */ + St = 'st', + /** Spanish */ + Es = 'es', + /** European Spanish */ + EsEs = 'es_ES', + /** Mexican Spanish */ + EsMx = 'es_MX', + /** Sundanese */ + Su = 'su', + /** Swahili */ + Sw = 'sw', + /** Congo Swahili */ + SwCd = 'sw_CD', + /** Swedish */ + Sv = 'sv', + /** Tajik */ + Tg = 'tg', + /** Tamil */ + Ta = 'ta', + /** Tatar */ + Tt = 'tt', + /** Telugu */ + Te = 'te', + /** Thai */ + Th = 'th', + /** Tibetan */ + Bo = 'bo', + /** Tigrinya */ + Ti = 'ti', + /** Tongan */ + To = 'to', + /** Turkish */ + Tr = 'tr', + /** Turkmen */ + Tk = 'tk', + /** Ukrainian */ + Uk = 'uk', + /** Urdu */ + Ur = 'ur', + /** Uyghur */ + Ug = 'ug', + /** Uzbek */ + Uz = 'uz', + /** Vietnamese */ + Vi = 'vi', + /** Volapük */ + Vo = 'vo', + /** Welsh */ + Cy = 'cy', + /** Western Frisian */ + Fy = 'fy', + /** Wolof */ + Wo = 'wo', + /** Xhosa */ + Xh = 'xh', + /** Yiddish */ + Yi = 'yi', + /** Yoruba */ + Yo = 'yo', + /** Zulu */ + Zu = 'zu', +} + +export type Order = Node & { + __typename?: 'Order' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + /** + * The date & time that the Order was placed, i.e. the Customer + * completed the checkout and the Order is no longer "active" + */ + orderPlacedAt?: Maybe + /** A unique code for the Order */ + code: Scalars['String'] + state: Scalars['String'] + /** An order is active as long as the payment process has not been completed */ + active: Scalars['Boolean'] + customer?: Maybe + shippingAddress?: Maybe + billingAddress?: Maybe + lines: Array + /** + * Surcharges are arbitrary modifications to the Order total which are neither + * ProductVariants nor discounts resulting from applied Promotions. For example, + * one-off discounts based on customer interaction, or surcharges based on payment + * methods. + */ + surcharges: Array + discounts: Array + /** An array of all coupon codes applied to the Order */ + couponCodes: Array + /** Promotions applied to the order. Only gets populated after the payment process has completed. */ + promotions: Array + payments?: Maybe> + fulfillments?: Maybe> + totalQuantity: Scalars['Int'] + /** + * The subTotal is the total of all OrderLines in the Order. This figure also includes any Order-level + * discounts which have been prorated (proportionally distributed) amongst the OrderItems. + * To get a total of all OrderLines which does not account for prorated discounts, use the + * sum of `OrderLine.discountedLinePrice` values. + */ + subTotal: Scalars['Int'] + /** Same as subTotal, but inclusive of tax */ + subTotalWithTax: Scalars['Int'] + currencyCode: CurrencyCode + shippingLines: Array + shipping: Scalars['Int'] + shippingWithTax: Scalars['Int'] + /** Equal to subTotal plus shipping */ + total: Scalars['Int'] + /** The final payable amount. Equal to subTotalWithTax plus shippingWithTax */ + totalWithTax: Scalars['Int'] + /** A summary of the taxes being applied to this Order */ + taxSummary: Array + history: HistoryEntryList + customFields?: Maybe +} + +export type OrderHistoryArgs = { + options?: Maybe +} + +/** + * A summary of the taxes being applied to this order, grouped + * by taxRate. + */ +export type OrderTaxSummary = { + __typename?: 'OrderTaxSummary' + /** A description of this tax */ + description: Scalars['String'] + /** The taxRate as a percentage */ + taxRate: Scalars['Float'] + /** The total net price or OrderItems to which this taxRate applies */ + taxBase: Scalars['Int'] + /** The total tax being applied to the Order at this taxRate */ + taxTotal: Scalars['Int'] +} + +export type OrderAddress = { + __typename?: 'OrderAddress' + fullName?: Maybe + company?: Maybe + streetLine1?: Maybe + streetLine2?: Maybe + city?: Maybe + province?: Maybe + postalCode?: Maybe + country?: Maybe + countryCode?: Maybe + phoneNumber?: Maybe + customFields?: Maybe +} + +export type OrderList = PaginatedList & { + __typename?: 'OrderList' + items: Array + totalItems: Scalars['Int'] +} + +export type ShippingLine = { + __typename?: 'ShippingLine' + shippingMethod: ShippingMethod + price: Scalars['Int'] + priceWithTax: Scalars['Int'] + discountedPrice: Scalars['Int'] + discountedPriceWithTax: Scalars['Int'] + discounts: Array +} + +export type Discount = { + __typename?: 'Discount' + adjustmentSource: Scalars['String'] + type: AdjustmentType + description: Scalars['String'] + amount: Scalars['Int'] + amountWithTax: Scalars['Int'] +} + +export type OrderItem = Node & { + __typename?: 'OrderItem' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + cancelled: Scalars['Boolean'] + /** The price of a single unit, excluding tax and discounts */ + unitPrice: Scalars['Int'] + /** The price of a single unit, including tax but excluding discounts */ + unitPriceWithTax: Scalars['Int'] + /** + * The price of a single unit including discounts, excluding tax. + * + * If Order-level discounts have been applied, this will not be the + * actual taxable unit price (see `proratedUnitPrice`), but is generally the + * correct price to display to customers to avoid confusion + * about the internal handling of distributed Order-level discounts. + */ + discountedUnitPrice: Scalars['Int'] + /** The price of a single unit including discounts and tax */ + discountedUnitPriceWithTax: Scalars['Int'] + /** + * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed) + * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax + * and refund calculations. + */ + proratedUnitPrice: Scalars['Int'] + /** The proratedUnitPrice including tax */ + proratedUnitPriceWithTax: Scalars['Int'] + unitTax: Scalars['Int'] + taxRate: Scalars['Float'] + adjustments: Array + taxLines: Array + fulfillment?: Maybe + refundId?: Maybe +} + +export type OrderLine = Node & { + __typename?: 'OrderLine' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + productVariant: ProductVariant + featuredAsset?: Maybe + /** The price of a single unit, excluding tax and discounts */ + unitPrice: Scalars['Int'] + /** The price of a single unit, including tax but excluding discounts */ + unitPriceWithTax: Scalars['Int'] + /** Non-zero if the unitPrice has changed since it was initially added to Order */ + unitPriceChangeSinceAdded: Scalars['Int'] + /** Non-zero if the unitPriceWithTax has changed since it was initially added to Order */ + unitPriceWithTaxChangeSinceAdded: Scalars['Int'] + /** + * The price of a single unit including discounts, excluding tax. + * + * If Order-level discounts have been applied, this will not be the + * actual taxable unit price (see `proratedUnitPrice`), but is generally the + * correct price to display to customers to avoid confusion + * about the internal handling of distributed Order-level discounts. + */ + discountedUnitPrice: Scalars['Int'] + /** The price of a single unit including discounts and tax */ + discountedUnitPriceWithTax: Scalars['Int'] + /** + * The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed) + * Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax + * and refund calculations. + */ + proratedUnitPrice: Scalars['Int'] + /** The proratedUnitPrice including tax */ + proratedUnitPriceWithTax: Scalars['Int'] + quantity: Scalars['Int'] + items: Array + taxRate: Scalars['Float'] + /** The total price of the line excluding tax and discounts. */ + linePrice: Scalars['Int'] + /** The total price of the line including tax bit excluding discounts. */ + linePriceWithTax: Scalars['Int'] + /** The price of the line including discounts, excluding tax */ + discountedLinePrice: Scalars['Int'] + /** The price of the line including discounts and tax */ + discountedLinePriceWithTax: Scalars['Int'] + /** + * The actual line price, taking into account both item discounts _and_ prorated (proportially-distributed) + * Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax + * and refund calculations. + */ + proratedLinePrice: Scalars['Int'] + /** The proratedLinePrice including tax */ + proratedLinePriceWithTax: Scalars['Int'] + /** The total tax on this line */ + lineTax: Scalars['Int'] + discounts: Array + taxLines: Array + order: Order + customFields?: Maybe +} + +export type Payment = Node & { + __typename?: 'Payment' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + method: Scalars['String'] + amount: Scalars['Int'] + state: Scalars['String'] + transactionId?: Maybe + errorMessage?: Maybe + refunds: Array + metadata?: Maybe +} + +export type Refund = Node & { + __typename?: 'Refund' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + items: Scalars['Int'] + shipping: Scalars['Int'] + adjustment: Scalars['Int'] + total: Scalars['Int'] + method?: Maybe + state: Scalars['String'] + transactionId?: Maybe + reason?: Maybe + orderItems: Array + paymentId: Scalars['ID'] + metadata?: Maybe +} + +export type Fulfillment = Node & { + __typename?: 'Fulfillment' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + orderItems: Array + state: Scalars['String'] + method: Scalars['String'] + trackingCode?: Maybe + customFields?: Maybe +} + +export type Surcharge = Node & { + __typename?: 'Surcharge' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + description: Scalars['String'] + sku?: Maybe + taxLines: Array + price: Scalars['Int'] + priceWithTax: Scalars['Int'] + taxRate: Scalars['Float'] +} + +export type ProductOptionGroup = Node & { + __typename?: 'ProductOptionGroup' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + code: Scalars['String'] + name: Scalars['String'] + options: Array + translations: Array + customFields?: Maybe +} + +export type ProductOptionGroupTranslation = { + __typename?: 'ProductOptionGroupTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type ProductOption = Node & { + __typename?: 'ProductOption' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + code: Scalars['String'] + name: Scalars['String'] + groupId: Scalars['ID'] + group: ProductOptionGroup + translations: Array + customFields?: Maybe +} + +export type ProductOptionTranslation = { + __typename?: 'ProductOptionTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type SearchReindexResponse = { + __typename?: 'SearchReindexResponse' + success: Scalars['Boolean'] +} + +export type SearchResponse = { + __typename?: 'SearchResponse' + items: Array + totalItems: Scalars['Int'] + facetValues: Array +} + +/** + * Which FacetValues are present in the products returned + * by the search, and in what quantity. + */ +export type FacetValueResult = { + __typename?: 'FacetValueResult' + facetValue: FacetValue + count: Scalars['Int'] +} + +export type SearchResultAsset = { + __typename?: 'SearchResultAsset' + id: Scalars['ID'] + preview: Scalars['String'] + focalPoint?: Maybe +} + +export type SearchResult = { + __typename?: 'SearchResult' + sku: Scalars['String'] + slug: Scalars['String'] + productId: Scalars['ID'] + productName: Scalars['String'] + productAsset?: Maybe + productVariantId: Scalars['ID'] + productVariantName: Scalars['String'] + productVariantAsset?: Maybe + price: SearchResultPrice + priceWithTax: SearchResultPrice + currencyCode: CurrencyCode + description: Scalars['String'] + facetIds: Array + facetValueIds: Array + /** An array of ids of the Collections in which this result appears */ + collectionIds: Array + /** A relevence score for the result. Differs between database implementations */ + score: Scalars['Float'] +} + +/** The price of a search result product, either as a range or as a single price */ +export type SearchResultPrice = PriceRange | SinglePrice + +/** The price value where the result has a single price */ +export type SinglePrice = { + __typename?: 'SinglePrice' + value: Scalars['Int'] +} + +/** The price range where the result has more than one price */ +export type PriceRange = { + __typename?: 'PriceRange' + min: Scalars['Int'] + max: Scalars['Int'] +} + +export type Product = Node & { + __typename?: 'Product' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] + slug: Scalars['String'] + description: Scalars['String'] + featuredAsset?: Maybe + assets: Array + variants: Array + optionGroups: Array + facetValues: Array + translations: Array + collections: Array + customFields?: Maybe +} + +export type ProductTranslation = { + __typename?: 'ProductTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] + slug: Scalars['String'] + description: Scalars['String'] +} + +export type ProductList = PaginatedList & { + __typename?: 'ProductList' + items: Array + totalItems: Scalars['Int'] +} + +export type ProductVariant = Node & { + __typename?: 'ProductVariant' + id: Scalars['ID'] + product: Product + productId: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + sku: Scalars['String'] + name: Scalars['String'] + featuredAsset?: Maybe + assets: Array + price: Scalars['Int'] + currencyCode: CurrencyCode + priceWithTax: Scalars['Int'] + stockLevel: Scalars['String'] + taxRateApplied: TaxRate + taxCategory: TaxCategory + options: Array + facetValues: Array + translations: Array + customFields?: Maybe +} + +export type ProductVariantTranslation = { + __typename?: 'ProductVariantTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] +} + +export type Promotion = Node & { + __typename?: 'Promotion' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + startsAt?: Maybe + endsAt?: Maybe + couponCode?: Maybe + perCustomerUsageLimit?: Maybe + name: Scalars['String'] + enabled: Scalars['Boolean'] + conditions: Array + actions: Array +} + +export type PromotionList = PaginatedList & { + __typename?: 'PromotionList' + items: Array + totalItems: Scalars['Int'] +} + +export type Role = Node & { + __typename?: 'Role' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + code: Scalars['String'] + description: Scalars['String'] + permissions: Array + channels: Array +} + +export type RoleList = PaginatedList & { + __typename?: 'RoleList' + items: Array + totalItems: Scalars['Int'] +} + +export type ShippingMethod = Node & { + __typename?: 'ShippingMethod' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + code: Scalars['String'] + name: Scalars['String'] + description: Scalars['String'] + fulfillmentHandlerCode: Scalars['String'] + checker: ConfigurableOperation + calculator: ConfigurableOperation + translations: Array + customFields?: Maybe +} + +export type ShippingMethodTranslation = { + __typename?: 'ShippingMethodTranslation' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + languageCode: LanguageCode + name: Scalars['String'] + description: Scalars['String'] +} + +export type ShippingMethodList = PaginatedList & { + __typename?: 'ShippingMethodList' + items: Array + totalItems: Scalars['Int'] +} + +export type Tag = Node & { + __typename?: 'Tag' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + value: Scalars['String'] +} + +export type TagList = PaginatedList & { + __typename?: 'TagList' + items: Array + totalItems: Scalars['Int'] +} + +export type TaxCategory = Node & { + __typename?: 'TaxCategory' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + name: Scalars['String'] + isDefault: Scalars['Boolean'] +} + +export type TaxRate = Node & { + __typename?: 'TaxRate' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + name: Scalars['String'] + enabled: Scalars['Boolean'] + value: Scalars['Float'] + category: TaxCategory + zone: Zone + customerGroup?: Maybe +} + +export type TaxRateList = PaginatedList & { + __typename?: 'TaxRateList' + items: Array + totalItems: Scalars['Int'] +} + +export type User = Node & { + __typename?: 'User' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + identifier: Scalars['String'] + verified: Scalars['Boolean'] + roles: Array + lastLogin?: Maybe + authenticationMethods: Array + customFields?: Maybe +} + +export type AuthenticationMethod = Node & { + __typename?: 'AuthenticationMethod' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + strategy: Scalars['String'] +} + +export type Zone = Node & { + __typename?: 'Zone' + id: Scalars['ID'] + createdAt: Scalars['DateTime'] + updatedAt: Scalars['DateTime'] + name: Scalars['String'] + members: Array +} + +/** Returned when attempting to modify the contents of an Order that is not in the `AddingItems` state. */ +export type OrderModificationError = ErrorResult & { + __typename?: 'OrderModificationError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Returned when attempting to set a ShippingMethod for which the Order is not eligible */ +export type IneligibleShippingMethodError = ErrorResult & { + __typename?: 'IneligibleShippingMethodError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Returned when attempting to add a Payment to an Order that is not in the `ArrangingPayment` state. */ +export type OrderPaymentStateError = ErrorResult & { + __typename?: 'OrderPaymentStateError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Returned when attempting to add a Payment using a PaymentMethod for which the Order is not eligible. */ +export type IneligiblePaymentMethodError = ErrorResult & { + __typename?: 'IneligiblePaymentMethodError' + errorCode: ErrorCode + message: Scalars['String'] + eligibilityCheckerMessage?: Maybe +} + +/** Returned when a Payment fails due to an error. */ +export type PaymentFailedError = ErrorResult & { + __typename?: 'PaymentFailedError' + errorCode: ErrorCode + message: Scalars['String'] + paymentErrorMessage: Scalars['String'] +} + +/** Returned when a Payment is declined by the payment provider. */ +export type PaymentDeclinedError = ErrorResult & { + __typename?: 'PaymentDeclinedError' + errorCode: ErrorCode + message: Scalars['String'] + paymentErrorMessage: Scalars['String'] +} + +/** Returned if the provided coupon code is invalid */ +export type CouponCodeInvalidError = ErrorResult & { + __typename?: 'CouponCodeInvalidError' + errorCode: ErrorCode + message: Scalars['String'] + couponCode: Scalars['String'] +} + +/** Returned if the provided coupon code is invalid */ +export type CouponCodeExpiredError = ErrorResult & { + __typename?: 'CouponCodeExpiredError' + errorCode: ErrorCode + message: Scalars['String'] + couponCode: Scalars['String'] +} + +/** Returned if the provided coupon code is invalid */ +export type CouponCodeLimitError = ErrorResult & { + __typename?: 'CouponCodeLimitError' + errorCode: ErrorCode + message: Scalars['String'] + couponCode: Scalars['String'] + limit: Scalars['Int'] +} + +/** Retured when attemting to set the Customer for an Order when already logged in. */ +export type AlreadyLoggedInError = ErrorResult & { + __typename?: 'AlreadyLoggedInError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Retured when attemting to register or verify a customer account without a password, when one is required. */ +export type MissingPasswordError = ErrorResult & { + __typename?: 'MissingPasswordError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** Retured when attemting to verify a customer account with a password, when a password has already been set. */ +export type PasswordAlreadySetError = ErrorResult & { + __typename?: 'PasswordAlreadySetError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Retured if the verification token (used to verify a Customer's email address) is either + * invalid or does not match any expected tokens. + */ +export type VerificationTokenInvalidError = ErrorResult & { + __typename?: 'VerificationTokenInvalidError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Returned if the verification token (used to verify a Customer's email address) is valid, but has + * expired according to the `verificationTokenDuration` setting in the AuthOptions. + */ +export type VerificationTokenExpiredError = ErrorResult & { + __typename?: 'VerificationTokenExpiredError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Retured if the token used to change a Customer's email address is either + * invalid or does not match any expected tokens. + */ +export type IdentifierChangeTokenInvalidError = ErrorResult & { + __typename?: 'IdentifierChangeTokenInvalidError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Retured if the token used to change a Customer's email address is valid, but has + * expired according to the `verificationTokenDuration` setting in the AuthOptions. + */ +export type IdentifierChangeTokenExpiredError = ErrorResult & { + __typename?: 'IdentifierChangeTokenExpiredError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Retured if the token used to reset a Customer's password is either + * invalid or does not match any expected tokens. + */ +export type PasswordResetTokenInvalidError = ErrorResult & { + __typename?: 'PasswordResetTokenInvalidError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Retured if the token used to reset a Customer's password is valid, but has + * expired according to the `verificationTokenDuration` setting in the AuthOptions. + */ +export type PasswordResetTokenExpiredError = ErrorResult & { + __typename?: 'PasswordResetTokenExpiredError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Returned if `authOptions.requireVerification` is set to `true` (which is the default) + * and an unverified user attempts to authenticate. + */ +export type NotVerifiedError = ErrorResult & { + __typename?: 'NotVerifiedError' + errorCode: ErrorCode + message: Scalars['String'] +} + +/** + * Returned when invoking a mutation which depends on there being an active Order on the + * current session. + */ +export type NoActiveOrderError = ErrorResult & { + __typename?: 'NoActiveOrderError' + errorCode: ErrorCode + message: Scalars['String'] +} + +export type AuthenticationInput = { + native?: Maybe +} + +export type RegisterCustomerInput = { + emailAddress: Scalars['String'] + title?: Maybe + firstName?: Maybe + lastName?: Maybe + phoneNumber?: Maybe + password?: Maybe +} + +export type UpdateCustomerInput = { + title?: Maybe + firstName?: Maybe + lastName?: Maybe + phoneNumber?: Maybe + customFields?: Maybe +} + +export type UpdateOrderInput = { + customFields?: Maybe +} + +/** Passed as input to the `addPaymentToOrder` mutation. */ +export type PaymentInput = { + /** This field should correspond to the `code` property of a PaymentMethodHandler. */ + method: Scalars['String'] + /** + * This field should contain arbitrary data passed to the specified PaymentMethodHandler's `createPayment()` method + * as the "metadata" argument. For example, it could contain an ID for the payment and other + * data generated by the payment provider. + */ + metadata: Scalars['JSON'] +} + +export type CollectionListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +export type OrderListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +export type ProductListOptions = { + skip?: Maybe + take?: Maybe + sort?: Maybe + filter?: Maybe +} + +export type UpdateOrderItemsResult = + | Order + | OrderModificationError + | OrderLimitError + | NegativeQuantityError + | InsufficientStockError + +export type RemoveOrderItemsResult = Order | OrderModificationError + +export type SetOrderShippingMethodResult = + | Order + | OrderModificationError + | IneligibleShippingMethodError + | NoActiveOrderError + +export type ApplyCouponCodeResult = + | Order + | CouponCodeExpiredError + | CouponCodeInvalidError + | CouponCodeLimitError + +export type AddPaymentToOrderResult = + | Order + | OrderPaymentStateError + | IneligiblePaymentMethodError + | PaymentFailedError + | PaymentDeclinedError + | OrderStateTransitionError + | NoActiveOrderError + +export type TransitionOrderToStateResult = Order | OrderStateTransitionError + +export type SetCustomerForOrderResult = + | Order + | AlreadyLoggedInError + | EmailAddressConflictError + | NoActiveOrderError + +export type RegisterCustomerAccountResult = + | Success + | MissingPasswordError + | NativeAuthStrategyError + +export type RefreshCustomerVerificationResult = + | Success + | NativeAuthStrategyError + +export type VerifyCustomerAccountResult = + | CurrentUser + | VerificationTokenInvalidError + | VerificationTokenExpiredError + | MissingPasswordError + | PasswordAlreadySetError + | NativeAuthStrategyError + +export type UpdateCustomerPasswordResult = + | Success + | InvalidCredentialsError + | NativeAuthStrategyError + +export type RequestUpdateCustomerEmailAddressResult = + | Success + | InvalidCredentialsError + | EmailAddressConflictError + | NativeAuthStrategyError + +export type UpdateCustomerEmailAddressResult = + | Success + | IdentifierChangeTokenInvalidError + | IdentifierChangeTokenExpiredError + | NativeAuthStrategyError + +export type RequestPasswordResetResult = Success | NativeAuthStrategyError + +export type ResetPasswordResult = + | CurrentUser + | PasswordResetTokenInvalidError + | PasswordResetTokenExpiredError + | NativeAuthStrategyError + +export type NativeAuthenticationResult = + | CurrentUser + | InvalidCredentialsError + | NotVerifiedError + | NativeAuthStrategyError + +export type AuthenticationResult = + | CurrentUser + | InvalidCredentialsError + | NotVerifiedError + +export type ActiveOrderResult = Order | NoActiveOrderError + +export type CollectionFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + languageCode?: Maybe + name?: Maybe + slug?: Maybe + position?: Maybe + description?: Maybe +} + +export type CollectionSortParameter = { + id?: Maybe + createdAt?: Maybe + updatedAt?: Maybe + name?: Maybe + slug?: Maybe + position?: Maybe + description?: Maybe +} + +export type ProductFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + languageCode?: Maybe + name?: Maybe + slug?: Maybe + description?: Maybe +} + +export type ProductSortParameter = { + id?: Maybe + createdAt?: Maybe + updatedAt?: Maybe + name?: Maybe + slug?: Maybe + description?: Maybe +} + +export type ProductVariantFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + languageCode?: Maybe + sku?: Maybe + name?: Maybe + price?: Maybe + currencyCode?: Maybe + priceWithTax?: Maybe + stockLevel?: Maybe + discountPrice?: Maybe +} + +export type ProductVariantSortParameter = { + id?: Maybe + productId?: Maybe + createdAt?: Maybe + updatedAt?: Maybe + sku?: Maybe + name?: Maybe + price?: Maybe + priceWithTax?: Maybe + stockLevel?: Maybe + discountPrice?: Maybe +} + +export type CustomerFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + title?: Maybe + firstName?: Maybe + lastName?: Maybe + phoneNumber?: Maybe + emailAddress?: Maybe +} + +export type CustomerSortParameter = { + id?: Maybe + createdAt?: Maybe + updatedAt?: Maybe + title?: Maybe + firstName?: Maybe + lastName?: Maybe + phoneNumber?: Maybe + emailAddress?: Maybe +} + +export type OrderFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + orderPlacedAt?: Maybe + code?: Maybe + state?: Maybe + active?: Maybe + totalQuantity?: Maybe + subTotal?: Maybe + subTotalWithTax?: Maybe + currencyCode?: Maybe + shipping?: Maybe + shippingWithTax?: Maybe + total?: Maybe + totalWithTax?: Maybe +} + +export type OrderSortParameter = { + id?: Maybe + createdAt?: Maybe + updatedAt?: Maybe + orderPlacedAt?: Maybe + code?: Maybe + state?: Maybe + totalQuantity?: Maybe + subTotal?: Maybe + subTotalWithTax?: Maybe + shipping?: Maybe + shippingWithTax?: Maybe + total?: Maybe + totalWithTax?: Maybe +} + +export type HistoryEntryFilterParameter = { + createdAt?: Maybe + updatedAt?: Maybe + type?: Maybe +} + +export type HistoryEntrySortParameter = { + id?: Maybe + createdAt?: Maybe + updatedAt?: Maybe +} + +export type ProductVariantCustomFields = { + __typename?: 'ProductVariantCustomFields' + discountPrice?: Maybe +} + +export type NativeAuthInput = { + username: Scalars['String'] + password: Scalars['String'] +} + +export type CartFragment = { __typename?: 'Order' } & Pick< + Order, + | 'id' + | 'code' + | 'createdAt' + | 'totalQuantity' + | 'subTotal' + | 'subTotalWithTax' + | 'total' + | 'totalWithTax' + | 'currencyCode' +> & { + customer?: Maybe<{ __typename?: 'Customer' } & Pick> + lines: Array< + { __typename?: 'OrderLine' } & Pick< + OrderLine, + | 'id' + | 'quantity' + | 'linePriceWithTax' + | 'discountedLinePriceWithTax' + | 'unitPriceWithTax' + | 'discountedUnitPriceWithTax' + > & { + featuredAsset?: Maybe< + { __typename?: 'Asset' } & Pick + > + discounts: Array< + { __typename?: 'Discount' } & Pick< + Discount, + 'description' | 'amount' + > + > + productVariant: { __typename?: 'ProductVariant' } & Pick< + ProductVariant, + | 'id' + | 'name' + | 'sku' + | 'price' + | 'priceWithTax' + | 'stockLevel' + | 'productId' + > & { product: { __typename?: 'Product' } & Pick } + } + > + } + +export type SearchResultFragment = { __typename?: 'SearchResult' } & Pick< + SearchResult, + 'productId' | 'productName' | 'description' | 'slug' | 'sku' | 'currencyCode' +> & { + productAsset?: Maybe< + { __typename?: 'SearchResultAsset' } & Pick< + SearchResultAsset, + 'id' | 'preview' + > + > + priceWithTax: + | ({ __typename?: 'PriceRange' } & Pick) + | ({ __typename?: 'SinglePrice' } & Pick) + } + +export type AddItemToOrderMutationVariables = Exact<{ + variantId: Scalars['ID'] + quantity: Scalars['Int'] +}> + +export type AddItemToOrderMutation = { __typename?: 'Mutation' } & { + addItemToOrder: + | ({ __typename: 'Order' } & CartFragment) + | ({ __typename: 'OrderModificationError' } & Pick< + OrderModificationError, + 'errorCode' | 'message' + >) + | ({ __typename: 'OrderLimitError' } & Pick< + OrderLimitError, + 'errorCode' | 'message' + >) + | ({ __typename: 'NegativeQuantityError' } & Pick< + NegativeQuantityError, + 'errorCode' | 'message' + >) + | ({ __typename: 'InsufficientStockError' } & Pick< + InsufficientStockError, + 'errorCode' | 'message' + >) +} + +export type AdjustOrderLineMutationVariables = Exact<{ + orderLineId: Scalars['ID'] + quantity: Scalars['Int'] +}> + +export type AdjustOrderLineMutation = { __typename?: 'Mutation' } & { + adjustOrderLine: + | ({ __typename: 'Order' } & CartFragment) + | ({ __typename: 'OrderModificationError' } & Pick< + OrderModificationError, + 'errorCode' | 'message' + >) + | ({ __typename: 'OrderLimitError' } & Pick< + OrderLimitError, + 'errorCode' | 'message' + >) + | ({ __typename: 'NegativeQuantityError' } & Pick< + NegativeQuantityError, + 'errorCode' | 'message' + >) + | ({ __typename: 'InsufficientStockError' } & Pick< + InsufficientStockError, + 'errorCode' | 'message' + >) +} + +export type LoginMutationVariables = Exact<{ + username: Scalars['String'] + password: Scalars['String'] +}> + +export type LoginMutation = { __typename?: 'Mutation' } & { + login: + | ({ __typename: 'CurrentUser' } & Pick) + | ({ __typename: 'InvalidCredentialsError' } & Pick< + InvalidCredentialsError, + 'errorCode' | 'message' + >) + | ({ __typename: 'NotVerifiedError' } & Pick< + NotVerifiedError, + 'errorCode' | 'message' + >) + | ({ __typename: 'NativeAuthStrategyError' } & Pick< + NativeAuthStrategyError, + 'errorCode' | 'message' + >) +} + +export type LogoutMutationVariables = Exact<{ [key: string]: never }> + +export type LogoutMutation = { __typename?: 'Mutation' } & { + logout: { __typename?: 'Success' } & Pick +} + +export type RemoveOrderLineMutationVariables = Exact<{ + orderLineId: Scalars['ID'] +}> + +export type RemoveOrderLineMutation = { __typename?: 'Mutation' } & { + removeOrderLine: + | ({ __typename: 'Order' } & CartFragment) + | ({ __typename: 'OrderModificationError' } & Pick< + OrderModificationError, + 'errorCode' | 'message' + >) +} + +export type SignupMutationVariables = Exact<{ + input: RegisterCustomerInput +}> + +export type SignupMutation = { __typename?: 'Mutation' } & { + registerCustomerAccount: + | ({ __typename: 'Success' } & Pick) + | ({ __typename: 'MissingPasswordError' } & Pick< + MissingPasswordError, + 'errorCode' | 'message' + >) + | ({ __typename: 'NativeAuthStrategyError' } & Pick< + NativeAuthStrategyError, + 'errorCode' | 'message' + >) +} + +export type ActiveCustomerQueryVariables = Exact<{ [key: string]: never }> + +export type ActiveCustomerQuery = { __typename?: 'Query' } & { + activeCustomer?: Maybe< + { __typename?: 'Customer' } & Pick< + Customer, + 'id' | 'firstName' | 'lastName' | 'emailAddress' + > + > +} + +export type GetAllProductPathsQueryVariables = Exact<{ + first?: Maybe +}> + +export type GetAllProductPathsQuery = { __typename?: 'Query' } & { + products: { __typename?: 'ProductList' } & { + items: Array<{ __typename?: 'Product' } & Pick> + } +} + +export type GetAllProductsQueryVariables = Exact<{ + input: SearchInput +}> + +export type GetAllProductsQuery = { __typename?: 'Query' } & { + search: { __typename?: 'SearchResponse' } & { + items: Array<{ __typename?: 'SearchResult' } & SearchResultFragment> + } +} + +export type ActiveOrderQueryVariables = Exact<{ [key: string]: never }> + +export type ActiveOrderQuery = { __typename?: 'Query' } & { + activeOrder?: Maybe<{ __typename?: 'Order' } & CartFragment> +} + +export type GetCollectionsQueryVariables = Exact<{ [key: string]: never }> + +export type GetCollectionsQuery = { __typename?: 'Query' } & { + collections: { __typename?: 'CollectionList' } & { + items: Array< + { __typename?: 'Collection' } & Pick< + Collection, + 'id' | 'name' | 'description' | 'slug' + > & { + productVariants: { __typename?: 'ProductVariantList' } & Pick< + ProductVariantList, + 'totalItems' + > + parent?: Maybe<{ __typename?: 'Collection' } & Pick> + children?: Maybe< + Array<{ __typename?: 'Collection' } & Pick> + > + } + > + } +} + +export type GetProductQueryVariables = Exact<{ + slug: Scalars['String'] +}> + +export type GetProductQuery = { __typename?: 'Query' } & { + product?: Maybe< + { __typename?: 'Product' } & Pick< + Product, + 'id' | 'name' | 'slug' | 'description' + > & { + assets: Array< + { __typename?: 'Asset' } & Pick + > + variants: Array< + { __typename?: 'ProductVariant' } & Pick< + ProductVariant, + 'id' | 'priceWithTax' | 'currencyCode' + > & { + options: Array< + { __typename?: 'ProductOption' } & Pick< + ProductOption, + 'id' | 'name' | 'code' | 'groupId' + > & { + group: { __typename?: 'ProductOptionGroup' } & Pick< + ProductOptionGroup, + 'id' + > & { + options: Array< + { __typename?: 'ProductOption' } & Pick< + ProductOption, + 'name' + > + > + } + } + > + } + > + optionGroups: Array< + { __typename?: 'ProductOptionGroup' } & Pick< + ProductOptionGroup, + 'id' | 'code' | 'name' + > & { + options: Array< + { __typename?: 'ProductOption' } & Pick< + ProductOption, + 'id' | 'name' + > + > + } + > + } + > +} + +export type SearchQueryVariables = Exact<{ + input: SearchInput +}> + +export type SearchQuery = { __typename?: 'Query' } & { + search: { __typename?: 'SearchResponse' } & Pick< + SearchResponse, + 'totalItems' + > & { items: Array<{ __typename?: 'SearchResult' } & SearchResultFragment> } +} diff --git a/packages/vendure/schema.graphql b/packages/vendure/schema.graphql new file mode 100644 index 0000000..326e2bc --- /dev/null +++ b/packages/vendure/schema.graphql @@ -0,0 +1,4162 @@ +type Query { + """ + The active Channel + """ + activeChannel: Channel! + + """ + The active Customer + """ + activeCustomer: Customer + + """ + The active Order. Will be `null` until an Order is created via `addItemToOrder`. Once an Order reaches the + state of `PaymentApproved` or `PaymentSettled`, then that Order is no longer considered "active" and this + query will once again return `null`. + """ + activeOrder: Order + + """ + An array of supported Countries + """ + availableCountries: [Country!]! + + """ + A list of Collections available to the shop + """ + collections(options: CollectionListOptions): CollectionList! + + """ + Returns a Collection either by its id or slug. If neither 'id' nor 'slug' is speicified, an error will result. + """ + collection(id: ID, slug: String): Collection + + """ + Returns a list of eligible shipping methods based on the current active Order + """ + eligibleShippingMethods: [ShippingMethodQuote!]! + + """ + Returns a list of payment methods and their eligibility based on the current active Order + """ + eligiblePaymentMethods: [PaymentMethodQuote!]! + + """ + Returns information about the current authenticated User + """ + me: CurrentUser + + """ + Returns the possible next states that the activeOrder can transition to + """ + nextOrderStates: [String!]! + + """ + Returns an Order based on the id. Note that in the Shop API, only orders belonging to the + currently-authenticated User may be queried. + """ + order(id: ID!): Order + + """ + Returns an Order based on the order `code`. For guest Orders (i.e. Orders placed by non-authenticated Customers) + this query will only return the Order within 2 hours of the Order being placed. This allows an Order confirmation + screen to be shown immediately after completion of a guest checkout, yet prevents security risks of allowing + general anonymous access to Order data. + """ + orderByCode(code: String!): Order + + """ + Get a Product either by id or slug. If neither 'id' nor 'slug' is speicified, an error will result. + """ + product(id: ID, slug: String): Product + + """ + Get a list of Products + """ + products(options: ProductListOptions): ProductList! + + """ + Search Products based on the criteria set by the `SearchInput` + """ + search(input: SearchInput!): SearchResponse! +} + +type Mutation { + """ + Adds an item to the order. If custom fields are defined on the OrderLine entity, a third argument 'customFields' will be available. + """ + addItemToOrder(productVariantId: ID!, quantity: Int!): UpdateOrderItemsResult! + + """ + Remove an OrderLine from the Order + """ + removeOrderLine(orderLineId: ID!): RemoveOrderItemsResult! + + """ + Remove all OrderLine from the Order + """ + removeAllOrderLines: RemoveOrderItemsResult! + + """ + Adjusts an OrderLine. If custom fields are defined on the OrderLine entity, a third argument 'customFields' of type `OrderLineCustomFieldsInput` will be available. + """ + adjustOrderLine(orderLineId: ID!, quantity: Int!): UpdateOrderItemsResult! + + """ + Applies the given coupon code to the active Order + """ + applyCouponCode(couponCode: String!): ApplyCouponCodeResult! + + """ + Removes the given coupon code from the active Order + """ + removeCouponCode(couponCode: String!): Order + + """ + Transitions an Order to a new state. Valid next states can be found by querying `nextOrderStates` + """ + transitionOrderToState(state: String!): TransitionOrderToStateResult + + """ + Sets the shipping address for this order + """ + setOrderShippingAddress(input: CreateAddressInput!): ActiveOrderResult! + + """ + Sets the billing address for this order + """ + setOrderBillingAddress(input: CreateAddressInput!): ActiveOrderResult! + + """ + Allows any custom fields to be set for the active order + """ + setOrderCustomFields(input: UpdateOrderInput!): ActiveOrderResult! + + """ + Sets the shipping method by id, which can be obtained with the `eligibleShippingMethods` query + """ + setOrderShippingMethod(shippingMethodId: ID!): SetOrderShippingMethodResult! + + """ + Add a Payment to the Order + """ + addPaymentToOrder(input: PaymentInput!): AddPaymentToOrderResult! + + """ + Set the Customer for the Order. Required only if the Customer is not currently logged in + """ + setCustomerForOrder(input: CreateCustomerInput!): SetCustomerForOrderResult! + + """ + Authenticates the user using the native authentication strategy. This mutation is an alias for `authenticate({ native: { ... }})` + """ + login( + username: String! + password: String! + rememberMe: Boolean + ): NativeAuthenticationResult! + + """ + Authenticates the user using a named authentication strategy + """ + authenticate( + input: AuthenticationInput! + rememberMe: Boolean + ): AuthenticationResult! + + """ + End the current authenticated session + """ + logout: Success! + + """ + Register a Customer account with the given credentials. There are three possible registration flows: + + _If `authOptions.requireVerification` is set to `true`:_ + + 1. **The Customer is registered _with_ a password**. A verificationToken will be created (and typically emailed to the Customer). That + verificationToken would then be passed to the `verifyCustomerAccount` mutation _without_ a password. The Customer is then + verified and authenticated in one step. + 2. **The Customer is registered _without_ a password**. A verificationToken will be created (and typically emailed to the Customer). That + verificationToken would then be passed to the `verifyCustomerAccount` mutation _with_ the chosed password of the Customer. The Customer is then + verified and authenticated in one step. + + _If `authOptions.requireVerification` is set to `false`:_ + + 3. The Customer _must_ be registered _with_ a password. No further action is needed - the Customer is able to authenticate immediately. + """ + registerCustomerAccount( + input: RegisterCustomerInput! + ): RegisterCustomerAccountResult! + + """ + Regenerate and send a verification token for a new Customer registration. Only applicable if `authOptions.requireVerification` is set to true. + """ + refreshCustomerVerification( + emailAddress: String! + ): RefreshCustomerVerificationResult! + + """ + Update an existing Customer + """ + updateCustomer(input: UpdateCustomerInput!): Customer! + + """ + Create a new Customer Address + """ + createCustomerAddress(input: CreateAddressInput!): Address! + + """ + Update an existing Address + """ + updateCustomerAddress(input: UpdateAddressInput!): Address! + + """ + Delete an existing Address + """ + deleteCustomerAddress(id: ID!): Success! + + """ + Verify a Customer email address with the token sent to that address. Only applicable if `authOptions.requireVerification` is set to true. + + If the Customer was not registered with a password in the `registerCustomerAccount` mutation, the a password _must_ be + provided here. + """ + verifyCustomerAccount( + token: String! + password: String + ): VerifyCustomerAccountResult! + + """ + Update the password of the active Customer + """ + updateCustomerPassword( + currentPassword: String! + newPassword: String! + ): UpdateCustomerPasswordResult! + + """ + Request to update the emailAddress of the active Customer. If `authOptions.requireVerification` is enabled + (as is the default), then the `identifierChangeToken` will be assigned to the current User and + a IdentifierChangeRequestEvent will be raised. This can then be used e.g. by the EmailPlugin to email + that verification token to the Customer, which is then used to verify the change of email address. + """ + requestUpdateCustomerEmailAddress( + password: String! + newEmailAddress: String! + ): RequestUpdateCustomerEmailAddressResult! + + """ + Confirm the update of the emailAddress with the provided token, which has been generated by the + `requestUpdateCustomerEmailAddress` mutation. + """ + updateCustomerEmailAddress(token: String!): UpdateCustomerEmailAddressResult! + + """ + Requests a password reset email to be sent + """ + requestPasswordReset(emailAddress: String!): RequestPasswordResetResult + + """ + Resets a Customer's password based on the provided token + """ + resetPassword(token: String!, password: String!): ResetPasswordResult! +} + +type Address implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + fullName: String + company: String + streetLine1: String! + streetLine2: String + city: String + province: String + postalCode: String + country: Country! + phoneNumber: String + defaultShippingAddress: Boolean + defaultBillingAddress: Boolean + customFields: JSON +} + +type Asset implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + name: String! + type: AssetType! + fileSize: Int! + mimeType: String! + width: Int! + height: Int! + source: String! + preview: String! + focalPoint: Coordinate + customFields: JSON +} + +type Coordinate { + x: Float! + y: Float! +} + +type AssetList implements PaginatedList { + items: [Asset!]! + totalItems: Int! +} + +enum AssetType { + IMAGE + VIDEO + BINARY +} + +type CurrentUser { + id: ID! + identifier: String! + channels: [CurrentUserChannel!]! +} + +type CurrentUserChannel { + id: ID! + token: String! + code: String! + permissions: [Permission!]! +} + +type Channel implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + code: String! + token: String! + defaultTaxZone: Zone + defaultShippingZone: Zone + defaultLanguageCode: LanguageCode! + currencyCode: CurrencyCode! + pricesIncludeTax: Boolean! + customFields: JSON +} + +type Collection implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode + name: String! + slug: String! + breadcrumbs: [CollectionBreadcrumb!]! + position: Int! + description: String! + featuredAsset: Asset + assets: [Asset!]! + parent: Collection + children: [Collection!] + filters: [ConfigurableOperation!]! + translations: [CollectionTranslation!]! + productVariants(options: ProductVariantListOptions): ProductVariantList! + customFields: JSON +} + +type CollectionBreadcrumb { + id: ID! + name: String! + slug: String! +} + +type CollectionTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! + slug: String! + description: String! +} + +type CollectionList implements PaginatedList { + items: [Collection!]! + totalItems: Int! +} + +type ProductVariantList implements PaginatedList { + items: [ProductVariant!]! + totalItems: Int! +} + +input ProductVariantListOptions { + skip: Int + take: Int + sort: ProductVariantSortParameter + filter: ProductVariantFilterParameter +} + +enum GlobalFlag { + TRUE + FALSE + INHERIT +} + +enum AdjustmentType { + PROMOTION + DISTRIBUTED_ORDER_PROMOTION +} + +enum DeletionResult { + """ + The entity was successfully deleted + """ + DELETED + + """ + Deletion did not take place, reason given in message + """ + NOT_DELETED +} + +""" +@description +Permissions for administrators and customers. Used to control access to +GraphQL resolvers via the {@link Allow} decorator. + +@docsCategory common +""" +enum Permission { + Placeholder + + """ + Authenticated means simply that the user is logged in + """ + Authenticated + + """ + SuperAdmin has unrestricted access to all operations + """ + SuperAdmin + + """ + Owner means the user owns this entity, e.g. a Customer's own Order + """ + Owner + + """ + Public means any unauthenticated user may perform the operation + """ + Public + + """ + Grants permission to update GlobalSettings + """ + UpdateGlobalSettings + + """ + Grants permission to create Products, Facets, Assets, Collections + """ + CreateCatalog + + """ + Grants permission to read Products, Facets, Assets, Collections + """ + ReadCatalog + + """ + Grants permission to update Products, Facets, Assets, Collections + """ + UpdateCatalog + + """ + Grants permission to delete Products, Facets, Assets, Collections + """ + DeleteCatalog + + """ + Grants permission to create PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings + """ + CreateSettings + + """ + Grants permission to read PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings + """ + ReadSettings + + """ + Grants permission to update PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings + """ + UpdateSettings + + """ + Grants permission to delete PaymentMethods, ShippingMethods, TaxCategories, TaxRates, Zones, Countries, System & GlobalSettings + """ + DeleteSettings + + """ + Grants permission to create Administrator + """ + CreateAdministrator + + """ + Grants permission to read Administrator + """ + ReadAdministrator + + """ + Grants permission to update Administrator + """ + UpdateAdministrator + + """ + Grants permission to delete Administrator + """ + DeleteAdministrator + + """ + Grants permission to create Asset + """ + CreateAsset + + """ + Grants permission to read Asset + """ + ReadAsset + + """ + Grants permission to update Asset + """ + UpdateAsset + + """ + Grants permission to delete Asset + """ + DeleteAsset + + """ + Grants permission to create Channel + """ + CreateChannel + + """ + Grants permission to read Channel + """ + ReadChannel + + """ + Grants permission to update Channel + """ + UpdateChannel + + """ + Grants permission to delete Channel + """ + DeleteChannel + + """ + Grants permission to create Collection + """ + CreateCollection + + """ + Grants permission to read Collection + """ + ReadCollection + + """ + Grants permission to update Collection + """ + UpdateCollection + + """ + Grants permission to delete Collection + """ + DeleteCollection + + """ + Grants permission to create Country + """ + CreateCountry + + """ + Grants permission to read Country + """ + ReadCountry + + """ + Grants permission to update Country + """ + UpdateCountry + + """ + Grants permission to delete Country + """ + DeleteCountry + + """ + Grants permission to create Customer + """ + CreateCustomer + + """ + Grants permission to read Customer + """ + ReadCustomer + + """ + Grants permission to update Customer + """ + UpdateCustomer + + """ + Grants permission to delete Customer + """ + DeleteCustomer + + """ + Grants permission to create CustomerGroup + """ + CreateCustomerGroup + + """ + Grants permission to read CustomerGroup + """ + ReadCustomerGroup + + """ + Grants permission to update CustomerGroup + """ + UpdateCustomerGroup + + """ + Grants permission to delete CustomerGroup + """ + DeleteCustomerGroup + + """ + Grants permission to create Facet + """ + CreateFacet + + """ + Grants permission to read Facet + """ + ReadFacet + + """ + Grants permission to update Facet + """ + UpdateFacet + + """ + Grants permission to delete Facet + """ + DeleteFacet + + """ + Grants permission to create Order + """ + CreateOrder + + """ + Grants permission to read Order + """ + ReadOrder + + """ + Grants permission to update Order + """ + UpdateOrder + + """ + Grants permission to delete Order + """ + DeleteOrder + + """ + Grants permission to create PaymentMethod + """ + CreatePaymentMethod + + """ + Grants permission to read PaymentMethod + """ + ReadPaymentMethod + + """ + Grants permission to update PaymentMethod + """ + UpdatePaymentMethod + + """ + Grants permission to delete PaymentMethod + """ + DeletePaymentMethod + + """ + Grants permission to create Product + """ + CreateProduct + + """ + Grants permission to read Product + """ + ReadProduct + + """ + Grants permission to update Product + """ + UpdateProduct + + """ + Grants permission to delete Product + """ + DeleteProduct + + """ + Grants permission to create Promotion + """ + CreatePromotion + + """ + Grants permission to read Promotion + """ + ReadPromotion + + """ + Grants permission to update Promotion + """ + UpdatePromotion + + """ + Grants permission to delete Promotion + """ + DeletePromotion + + """ + Grants permission to create ShippingMethod + """ + CreateShippingMethod + + """ + Grants permission to read ShippingMethod + """ + ReadShippingMethod + + """ + Grants permission to update ShippingMethod + """ + UpdateShippingMethod + + """ + Grants permission to delete ShippingMethod + """ + DeleteShippingMethod + + """ + Grants permission to create Tag + """ + CreateTag + + """ + Grants permission to read Tag + """ + ReadTag + + """ + Grants permission to update Tag + """ + UpdateTag + + """ + Grants permission to delete Tag + """ + DeleteTag + + """ + Grants permission to create TaxCategory + """ + CreateTaxCategory + + """ + Grants permission to read TaxCategory + """ + ReadTaxCategory + + """ + Grants permission to update TaxCategory + """ + UpdateTaxCategory + + """ + Grants permission to delete TaxCategory + """ + DeleteTaxCategory + + """ + Grants permission to create TaxRate + """ + CreateTaxRate + + """ + Grants permission to read TaxRate + """ + ReadTaxRate + + """ + Grants permission to update TaxRate + """ + UpdateTaxRate + + """ + Grants permission to delete TaxRate + """ + DeleteTaxRate + + """ + Grants permission to create System + """ + CreateSystem + + """ + Grants permission to read System + """ + ReadSystem + + """ + Grants permission to update System + """ + UpdateSystem + + """ + Grants permission to delete System + """ + DeleteSystem + + """ + Grants permission to create Zone + """ + CreateZone + + """ + Grants permission to read Zone + """ + ReadZone + + """ + Grants permission to update Zone + """ + UpdateZone + + """ + Grants permission to delete Zone + """ + DeleteZone +} + +enum SortOrder { + ASC + DESC +} + +enum ErrorCode { + UNKNOWN_ERROR + NATIVE_AUTH_STRATEGY_ERROR + INVALID_CREDENTIALS_ERROR + ORDER_STATE_TRANSITION_ERROR + EMAIL_ADDRESS_CONFLICT_ERROR + ORDER_LIMIT_ERROR + NEGATIVE_QUANTITY_ERROR + INSUFFICIENT_STOCK_ERROR + ORDER_MODIFICATION_ERROR + INELIGIBLE_SHIPPING_METHOD_ERROR + ORDER_PAYMENT_STATE_ERROR + INELIGIBLE_PAYMENT_METHOD_ERROR + PAYMENT_FAILED_ERROR + PAYMENT_DECLINED_ERROR + COUPON_CODE_INVALID_ERROR + COUPON_CODE_EXPIRED_ERROR + COUPON_CODE_LIMIT_ERROR + ALREADY_LOGGED_IN_ERROR + MISSING_PASSWORD_ERROR + PASSWORD_ALREADY_SET_ERROR + VERIFICATION_TOKEN_INVALID_ERROR + VERIFICATION_TOKEN_EXPIRED_ERROR + IDENTIFIER_CHANGE_TOKEN_INVALID_ERROR + IDENTIFIER_CHANGE_TOKEN_EXPIRED_ERROR + PASSWORD_RESET_TOKEN_INVALID_ERROR + PASSWORD_RESET_TOKEN_EXPIRED_ERROR + NOT_VERIFIED_ERROR + NO_ACTIVE_ORDER_ERROR +} + +enum LogicalOperator { + AND + OR +} + +""" +Retured when attempting an operation that relies on the NativeAuthStrategy, if that strategy is not configured. +""" +type NativeAuthStrategyError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned if the user authentication credentials are not valid +""" +type InvalidCredentialsError implements ErrorResult { + errorCode: ErrorCode! + message: String! + authenticationError: String! +} + +""" +Returned if there is an error in transitioning the Order state +""" +type OrderStateTransitionError implements ErrorResult { + errorCode: ErrorCode! + message: String! + transitionError: String! + fromState: String! + toState: String! +} + +""" +Retured when attemting to create a Customer with an email address already registered to an existing User. +""" +type EmailAddressConflictError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured when the maximum order size limit has been reached. +""" +type OrderLimitError implements ErrorResult { + errorCode: ErrorCode! + message: String! + maxItems: Int! +} + +""" +Retured when attemting to set a negative OrderLine quantity. +""" +type NegativeQuantityError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned when attempting to add more items to the Order than are available +""" +type InsufficientStockError implements ErrorResult { + errorCode: ErrorCode! + message: String! + quantityAvailable: Int! + order: Order! +} + +""" +The `JSON` scalar type represents JSON values as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf). +""" +scalar JSON + +""" +A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. +""" +scalar DateTime + +""" +The `Upload` scalar type represents a file upload. +""" +scalar Upload + +interface PaginatedList { + items: [Node!]! + totalItems: Int! +} + +interface Node { + id: ID! +} + +interface ErrorResult { + errorCode: ErrorCode! + message: String! +} + +type Adjustment { + adjustmentSource: String! + type: AdjustmentType! + description: String! + amount: Int! +} + +type TaxLine { + description: String! + taxRate: Float! +} + +type ConfigArg { + name: String! + value: String! +} + +type ConfigArgDefinition { + name: String! + type: String! + list: Boolean! + required: Boolean! + defaultValue: JSON + label: String + description: String + ui: JSON +} + +type ConfigurableOperation { + code: String! + args: [ConfigArg!]! +} + +type ConfigurableOperationDefinition { + code: String! + args: [ConfigArgDefinition!]! + description: String! +} + +type DeletionResponse { + result: DeletionResult! + message: String +} + +input ConfigArgInput { + name: String! + + """ + A JSON stringified representation of the actual value + """ + value: String! +} + +input ConfigurableOperationInput { + code: String! + arguments: [ConfigArgInput!]! +} + +input StringOperators { + eq: String + notEq: String + contains: String + notContains: String + in: [String!] + notIn: [String!] + regex: String +} + +input BooleanOperators { + eq: Boolean +} + +input NumberRange { + start: Float! + end: Float! +} + +input NumberOperators { + eq: Float + lt: Float + lte: Float + gt: Float + gte: Float + between: NumberRange +} + +input DateRange { + start: DateTime! + end: DateTime! +} + +input DateOperators { + eq: DateTime + before: DateTime + after: DateTime + between: DateRange +} + +""" +Used to construct boolean expressions for filtering search results +by FacetValue ID. Examples: + +* ID=1 OR ID=2: `{ facetValueFilters: [{ or: [1,2] }] }` +* ID=1 AND ID=2: `{ facetValueFilters: [{ and: 1 }, { and: 2 }] }` +* ID=1 AND (ID=2 OR ID=3): `{ facetValueFilters: [{ and: 1 }, { or: [2,3] }] }` +""" +input FacetValueFilterInput { + and: ID + or: [ID!] +} + +input SearchInput { + term: String + facetValueIds: [ID!] + facetValueOperator: LogicalOperator + facetValueFilters: [FacetValueFilterInput!] + collectionId: ID + collectionSlug: String + groupByProduct: Boolean + take: Int + skip: Int + sort: SearchResultSortParameter +} + +input SearchResultSortParameter { + name: SortOrder + price: SortOrder +} + +input CreateCustomerInput { + title: String + firstName: String! + lastName: String! + phoneNumber: String + emailAddress: String! + customFields: JSON +} + +input CreateAddressInput { + fullName: String + company: String + streetLine1: String! + streetLine2: String + city: String + province: String + postalCode: String + countryCode: String! + phoneNumber: String + defaultShippingAddress: Boolean + defaultBillingAddress: Boolean + customFields: JSON +} + +input UpdateAddressInput { + id: ID! + fullName: String + company: String + streetLine1: String + streetLine2: String + city: String + province: String + postalCode: String + countryCode: String + phoneNumber: String + defaultShippingAddress: Boolean + defaultBillingAddress: Boolean + customFields: JSON +} + +""" +Indicates that an operation succeeded, where we do not want to return any more specific information. +""" +type Success { + success: Boolean! +} + +type ShippingMethodQuote { + id: ID! + price: Int! + priceWithTax: Int! + code: String! + name: String! + description: String! + + """ + Any optional metadata returned by the ShippingCalculator in the ShippingCalculationResult + """ + metadata: JSON +} + +type PaymentMethodQuote { + id: ID! + code: String! + name: String! + description: String! + isEligible: Boolean! + eligibilityMessage: String +} + +type Country implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + code: String! + name: String! + enabled: Boolean! + translations: [CountryTranslation!]! +} + +type CountryTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type CountryList implements PaginatedList { + items: [Country!]! + totalItems: Int! +} + +""" +@description +ISO 4217 currency code + +@docsCategory common +""" +enum CurrencyCode { + """ + United Arab Emirates dirham + """ + AED + + """ + Afghan afghani + """ + AFN + + """ + Albanian lek + """ + ALL + + """ + Armenian dram + """ + AMD + + """ + Netherlands Antillean guilder + """ + ANG + + """ + Angolan kwanza + """ + AOA + + """ + Argentine peso + """ + ARS + + """ + Australian dollar + """ + AUD + + """ + Aruban florin + """ + AWG + + """ + Azerbaijani manat + """ + AZN + + """ + Bosnia and Herzegovina convertible mark + """ + BAM + + """ + Barbados dollar + """ + BBD + + """ + Bangladeshi taka + """ + BDT + + """ + Bulgarian lev + """ + BGN + + """ + Bahraini dinar + """ + BHD + + """ + Burundian franc + """ + BIF + + """ + Bermudian dollar + """ + BMD + + """ + Brunei dollar + """ + BND + + """ + Boliviano + """ + BOB + + """ + Brazilian real + """ + BRL + + """ + Bahamian dollar + """ + BSD + + """ + Bhutanese ngultrum + """ + BTN + + """ + Botswana pula + """ + BWP + + """ + Belarusian ruble + """ + BYN + + """ + Belize dollar + """ + BZD + + """ + Canadian dollar + """ + CAD + + """ + Congolese franc + """ + CDF + + """ + Swiss franc + """ + CHF + + """ + Chilean peso + """ + CLP + + """ + Renminbi (Chinese) yuan + """ + CNY + + """ + Colombian peso + """ + COP + + """ + Costa Rican colon + """ + CRC + + """ + Cuban convertible peso + """ + CUC + + """ + Cuban peso + """ + CUP + + """ + Cape Verde escudo + """ + CVE + + """ + Czech koruna + """ + CZK + + """ + Djiboutian franc + """ + DJF + + """ + Danish krone + """ + DKK + + """ + Dominican peso + """ + DOP + + """ + Algerian dinar + """ + DZD + + """ + Egyptian pound + """ + EGP + + """ + Eritrean nakfa + """ + ERN + + """ + Ethiopian birr + """ + ETB + + """ + Euro + """ + EUR + + """ + Fiji dollar + """ + FJD + + """ + Falkland Islands pound + """ + FKP + + """ + Pound sterling + """ + GBP + + """ + Georgian lari + """ + GEL + + """ + Ghanaian cedi + """ + GHS + + """ + Gibraltar pound + """ + GIP + + """ + Gambian dalasi + """ + GMD + + """ + Guinean franc + """ + GNF + + """ + Guatemalan quetzal + """ + GTQ + + """ + Guyanese dollar + """ + GYD + + """ + Hong Kong dollar + """ + HKD + + """ + Honduran lempira + """ + HNL + + """ + Croatian kuna + """ + HRK + + """ + Haitian gourde + """ + HTG + + """ + Hungarian forint + """ + HUF + + """ + Indonesian rupiah + """ + IDR + + """ + Israeli new shekel + """ + ILS + + """ + Indian rupee + """ + INR + + """ + Iraqi dinar + """ + IQD + + """ + Iranian rial + """ + IRR + + """ + Icelandic króna + """ + ISK + + """ + Jamaican dollar + """ + JMD + + """ + Jordanian dinar + """ + JOD + + """ + Japanese yen + """ + JPY + + """ + Kenyan shilling + """ + KES + + """ + Kyrgyzstani som + """ + KGS + + """ + Cambodian riel + """ + KHR + + """ + Comoro franc + """ + KMF + + """ + North Korean won + """ + KPW + + """ + South Korean won + """ + KRW + + """ + Kuwaiti dinar + """ + KWD + + """ + Cayman Islands dollar + """ + KYD + + """ + Kazakhstani tenge + """ + KZT + + """ + Lao kip + """ + LAK + + """ + Lebanese pound + """ + LBP + + """ + Sri Lankan rupee + """ + LKR + + """ + Liberian dollar + """ + LRD + + """ + Lesotho loti + """ + LSL + + """ + Libyan dinar + """ + LYD + + """ + Moroccan dirham + """ + MAD + + """ + Moldovan leu + """ + MDL + + """ + Malagasy ariary + """ + MGA + + """ + Macedonian denar + """ + MKD + + """ + Myanmar kyat + """ + MMK + + """ + Mongolian tögrög + """ + MNT + + """ + Macanese pataca + """ + MOP + + """ + Mauritanian ouguiya + """ + MRU + + """ + Mauritian rupee + """ + MUR + + """ + Maldivian rufiyaa + """ + MVR + + """ + Malawian kwacha + """ + MWK + + """ + Mexican peso + """ + MXN + + """ + Malaysian ringgit + """ + MYR + + """ + Mozambican metical + """ + MZN + + """ + Namibian dollar + """ + NAD + + """ + Nigerian naira + """ + NGN + + """ + Nicaraguan córdoba + """ + NIO + + """ + Norwegian krone + """ + NOK + + """ + Nepalese rupee + """ + NPR + + """ + New Zealand dollar + """ + NZD + + """ + Omani rial + """ + OMR + + """ + Panamanian balboa + """ + PAB + + """ + Peruvian sol + """ + PEN + + """ + Papua New Guinean kina + """ + PGK + + """ + Philippine peso + """ + PHP + + """ + Pakistani rupee + """ + PKR + + """ + Polish złoty + """ + PLN + + """ + Paraguayan guaraní + """ + PYG + + """ + Qatari riyal + """ + QAR + + """ + Romanian leu + """ + RON + + """ + Serbian dinar + """ + RSD + + """ + Russian ruble + """ + RUB + + """ + Rwandan franc + """ + RWF + + """ + Saudi riyal + """ + SAR + + """ + Solomon Islands dollar + """ + SBD + + """ + Seychelles rupee + """ + SCR + + """ + Sudanese pound + """ + SDG + + """ + Swedish krona/kronor + """ + SEK + + """ + Singapore dollar + """ + SGD + + """ + Saint Helena pound + """ + SHP + + """ + Sierra Leonean leone + """ + SLL + + """ + Somali shilling + """ + SOS + + """ + Surinamese dollar + """ + SRD + + """ + South Sudanese pound + """ + SSP + + """ + São Tomé and Príncipe dobra + """ + STN + + """ + Salvadoran colón + """ + SVC + + """ + Syrian pound + """ + SYP + + """ + Swazi lilangeni + """ + SZL + + """ + Thai baht + """ + THB + + """ + Tajikistani somoni + """ + TJS + + """ + Turkmenistan manat + """ + TMT + + """ + Tunisian dinar + """ + TND + + """ + Tongan paʻanga + """ + TOP + + """ + Turkish lira + """ + TRY + + """ + Trinidad and Tobago dollar + """ + TTD + + """ + New Taiwan dollar + """ + TWD + + """ + Tanzanian shilling + """ + TZS + + """ + Ukrainian hryvnia + """ + UAH + + """ + Ugandan shilling + """ + UGX + + """ + United States dollar + """ + USD + + """ + Uruguayan peso + """ + UYU + + """ + Uzbekistan som + """ + UZS + + """ + Venezuelan bolívar soberano + """ + VES + + """ + Vietnamese đồng + """ + VND + + """ + Vanuatu vatu + """ + VUV + + """ + Samoan tala + """ + WST + + """ + CFA franc BEAC + """ + XAF + + """ + East Caribbean dollar + """ + XCD + + """ + CFA franc BCEAO + """ + XOF + + """ + CFP franc (franc Pacifique) + """ + XPF + + """ + Yemeni rial + """ + YER + + """ + South African rand + """ + ZAR + + """ + Zambian kwacha + """ + ZMW + + """ + Zimbabwean dollar + """ + ZWL +} + +interface CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean +} + +type StringCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + length: Int + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + pattern: String + options: [StringFieldOption!] +} + +type StringFieldOption { + value: String! + label: [LocalizedString!] +} + +type LocaleStringCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + length: Int + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + pattern: String +} + +type IntCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + min: Int + max: Int + step: Int +} + +type FloatCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + min: Float + max: Float + step: Float +} + +type BooleanCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean +} + +""" +Expects the same validation formats as the `` HTML element. +See https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes +""" +type DateTimeCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + min: String + max: String + step: Int +} + +type RelationCustomFieldConfig implements CustomField { + name: String! + type: String! + list: Boolean! + label: [LocalizedString!] + description: [LocalizedString!] + readonly: Boolean + internal: Boolean + entity: String! + scalarFields: [String!]! +} + +type LocalizedString { + languageCode: LanguageCode! + value: String! +} + +union CustomFieldConfig = + StringCustomFieldConfig + | LocaleStringCustomFieldConfig + | IntCustomFieldConfig + | FloatCustomFieldConfig + | BooleanCustomFieldConfig + | DateTimeCustomFieldConfig + | RelationCustomFieldConfig + +type CustomerGroup implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + name: String! + customers(options: CustomerListOptions): CustomerList! +} + +input CustomerListOptions { + skip: Int + take: Int + sort: CustomerSortParameter + filter: CustomerFilterParameter +} + +type Customer implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + title: String + firstName: String! + lastName: String! + phoneNumber: String + emailAddress: String! + addresses: [Address!] + orders(options: OrderListOptions): OrderList! + user: User + customFields: JSON +} + +type CustomerList implements PaginatedList { + items: [Customer!]! + totalItems: Int! +} + +type FacetValue implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + facet: Facet! + name: String! + code: String! + translations: [FacetValueTranslation!]! + customFields: JSON +} + +type FacetValueTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type Facet implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! + code: String! + values: [FacetValue!]! + translations: [FacetTranslation!]! + customFields: JSON +} + +type FacetTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type FacetList implements PaginatedList { + items: [Facet!]! + totalItems: Int! +} + +type HistoryEntry implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + type: HistoryEntryType! + data: JSON! +} + +enum HistoryEntryType { + CUSTOMER_REGISTERED + CUSTOMER_VERIFIED + CUSTOMER_DETAIL_UPDATED + CUSTOMER_ADDED_TO_GROUP + CUSTOMER_REMOVED_FROM_GROUP + CUSTOMER_ADDRESS_CREATED + CUSTOMER_ADDRESS_UPDATED + CUSTOMER_ADDRESS_DELETED + CUSTOMER_PASSWORD_UPDATED + CUSTOMER_PASSWORD_RESET_REQUESTED + CUSTOMER_PASSWORD_RESET_VERIFIED + CUSTOMER_EMAIL_UPDATE_REQUESTED + CUSTOMER_EMAIL_UPDATE_VERIFIED + CUSTOMER_NOTE + ORDER_STATE_TRANSITION + ORDER_PAYMENT_TRANSITION + ORDER_FULFILLMENT + ORDER_CANCELLATION + ORDER_REFUND_TRANSITION + ORDER_FULFILLMENT_TRANSITION + ORDER_NOTE + ORDER_COUPON_APPLIED + ORDER_COUPON_REMOVED + ORDER_MODIFIED +} + +type HistoryEntryList implements PaginatedList { + items: [HistoryEntry!]! + totalItems: Int! +} + +input HistoryEntryListOptions { + skip: Int + take: Int + sort: HistoryEntrySortParameter + filter: HistoryEntryFilterParameter +} + +""" +@description +Languages in the form of a ISO 639-1 language code with optional +region or script modifier (e.g. de_AT). The selection available is based +on the [Unicode CLDR summary list](https://unicode-org.github.io/cldr-staging/charts/37/summary/root.html) +and includes the major spoken languages of the world and any widely-used variants. + +@docsCategory common +""" +enum LanguageCode { + """ + Afrikaans + """ + af + + """ + Akan + """ + ak + + """ + Albanian + """ + sq + + """ + Amharic + """ + am + + """ + Arabic + """ + ar + + """ + Armenian + """ + hy + + """ + Assamese + """ + as + + """ + Azerbaijani + """ + az + + """ + Bambara + """ + bm + + """ + Bangla + """ + bn + + """ + Basque + """ + eu + + """ + Belarusian + """ + be + + """ + Bosnian + """ + bs + + """ + Breton + """ + br + + """ + Bulgarian + """ + bg + + """ + Burmese + """ + my + + """ + Catalan + """ + ca + + """ + Chechen + """ + ce + + """ + Chinese + """ + zh + + """ + Simplified Chinese + """ + zh_Hans + + """ + Traditional Chinese + """ + zh_Hant + + """ + Church Slavic + """ + cu + + """ + Cornish + """ + kw + + """ + Corsican + """ + co + + """ + Croatian + """ + hr + + """ + Czech + """ + cs + + """ + Danish + """ + da + + """ + Dutch + """ + nl + + """ + Flemish + """ + nl_BE + + """ + Dzongkha + """ + dz + + """ + English + """ + en + + """ + Australian English + """ + en_AU + + """ + Canadian English + """ + en_CA + + """ + British English + """ + en_GB + + """ + American English + """ + en_US + + """ + Esperanto + """ + eo + + """ + Estonian + """ + et + + """ + Ewe + """ + ee + + """ + Faroese + """ + fo + + """ + Finnish + """ + fi + + """ + French + """ + fr + + """ + Canadian French + """ + fr_CA + + """ + Swiss French + """ + fr_CH + + """ + Fulah + """ + ff + + """ + Galician + """ + gl + + """ + Ganda + """ + lg + + """ + Georgian + """ + ka + + """ + German + """ + de + + """ + Austrian German + """ + de_AT + + """ + Swiss High German + """ + de_CH + + """ + Greek + """ + el + + """ + Gujarati + """ + gu + + """ + Haitian Creole + """ + ht + + """ + Hausa + """ + ha + + """ + Hebrew + """ + he + + """ + Hindi + """ + hi + + """ + Hungarian + """ + hu + + """ + Icelandic + """ + is + + """ + Igbo + """ + ig + + """ + Indonesian + """ + id + + """ + Interlingua + """ + ia + + """ + Irish + """ + ga + + """ + Italian + """ + it + + """ + Japanese + """ + ja + + """ + Javanese + """ + jv + + """ + Kalaallisut + """ + kl + + """ + Kannada + """ + kn + + """ + Kashmiri + """ + ks + + """ + Kazakh + """ + kk + + """ + Khmer + """ + km + + """ + Kikuyu + """ + ki + + """ + Kinyarwanda + """ + rw + + """ + Korean + """ + ko + + """ + Kurdish + """ + ku + + """ + Kyrgyz + """ + ky + + """ + Lao + """ + lo + + """ + Latin + """ + la + + """ + Latvian + """ + lv + + """ + Lingala + """ + ln + + """ + Lithuanian + """ + lt + + """ + Luba-Katanga + """ + lu + + """ + Luxembourgish + """ + lb + + """ + Macedonian + """ + mk + + """ + Malagasy + """ + mg + + """ + Malay + """ + ms + + """ + Malayalam + """ + ml + + """ + Maltese + """ + mt + + """ + Manx + """ + gv + + """ + Maori + """ + mi + + """ + Marathi + """ + mr + + """ + Mongolian + """ + mn + + """ + Nepali + """ + ne + + """ + North Ndebele + """ + nd + + """ + Northern Sami + """ + se + + """ + Norwegian Bokmål + """ + nb + + """ + Norwegian Nynorsk + """ + nn + + """ + Nyanja + """ + ny + + """ + Odia + """ + or + + """ + Oromo + """ + om + + """ + Ossetic + """ + os + + """ + Pashto + """ + ps + + """ + Persian + """ + fa + + """ + Dari + """ + fa_AF + + """ + Polish + """ + pl + + """ + Portuguese + """ + pt + + """ + Brazilian Portuguese + """ + pt_BR + + """ + European Portuguese + """ + pt_PT + + """ + Punjabi + """ + pa + + """ + Quechua + """ + qu + + """ + Romanian + """ + ro + + """ + Moldavian + """ + ro_MD + + """ + Romansh + """ + rm + + """ + Rundi + """ + rn + + """ + Russian + """ + ru + + """ + Samoan + """ + sm + + """ + Sango + """ + sg + + """ + Sanskrit + """ + sa + + """ + Scottish Gaelic + """ + gd + + """ + Serbian + """ + sr + + """ + Shona + """ + sn + + """ + Sichuan Yi + """ + ii + + """ + Sindhi + """ + sd + + """ + Sinhala + """ + si + + """ + Slovak + """ + sk + + """ + Slovenian + """ + sl + + """ + Somali + """ + so + + """ + Southern Sotho + """ + st + + """ + Spanish + """ + es + + """ + European Spanish + """ + es_ES + + """ + Mexican Spanish + """ + es_MX + + """ + Sundanese + """ + su + + """ + Swahili + """ + sw + + """ + Congo Swahili + """ + sw_CD + + """ + Swedish + """ + sv + + """ + Tajik + """ + tg + + """ + Tamil + """ + ta + + """ + Tatar + """ + tt + + """ + Telugu + """ + te + + """ + Thai + """ + th + + """ + Tibetan + """ + bo + + """ + Tigrinya + """ + ti + + """ + Tongan + """ + to + + """ + Turkish + """ + tr + + """ + Turkmen + """ + tk + + """ + Ukrainian + """ + uk + + """ + Urdu + """ + ur + + """ + Uyghur + """ + ug + + """ + Uzbek + """ + uz + + """ + Vietnamese + """ + vi + + """ + Volapük + """ + vo + + """ + Welsh + """ + cy + + """ + Western Frisian + """ + fy + + """ + Wolof + """ + wo + + """ + Xhosa + """ + xh + + """ + Yiddish + """ + yi + + """ + Yoruba + """ + yo + + """ + Zulu + """ + zu +} + +type Order implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + + """ + The date & time that the Order was placed, i.e. the Customer + completed the checkout and the Order is no longer "active" + """ + orderPlacedAt: DateTime + + """ + A unique code for the Order + """ + code: String! + state: String! + + """ + An order is active as long as the payment process has not been completed + """ + active: Boolean! + customer: Customer + shippingAddress: OrderAddress + billingAddress: OrderAddress + lines: [OrderLine!]! + + """ + Surcharges are arbitrary modifications to the Order total which are neither + ProductVariants nor discounts resulting from applied Promotions. For example, + one-off discounts based on customer interaction, or surcharges based on payment + methods. + """ + surcharges: [Surcharge!]! + discounts: [Discount!]! + + """ + An array of all coupon codes applied to the Order + """ + couponCodes: [String!]! + + """ + Promotions applied to the order. Only gets populated after the payment process has completed. + """ + promotions: [Promotion!]! + payments: [Payment!] + fulfillments: [Fulfillment!] + totalQuantity: Int! + + """ + The subTotal is the total of all OrderLines in the Order. This figure also includes any Order-level + discounts which have been prorated (proportionally distributed) amongst the OrderItems. + To get a total of all OrderLines which does not account for prorated discounts, use the + sum of `OrderLine.discountedLinePrice` values. + """ + subTotal: Int! + + """ + Same as subTotal, but inclusive of tax + """ + subTotalWithTax: Int! + currencyCode: CurrencyCode! + shippingLines: [ShippingLine!]! + shipping: Int! + shippingWithTax: Int! + + """ + Equal to subTotal plus shipping + """ + total: Int! + + """ + The final payable amount. Equal to subTotalWithTax plus shippingWithTax + """ + totalWithTax: Int! + + """ + A summary of the taxes being applied to this Order + """ + taxSummary: [OrderTaxSummary!]! + history(options: HistoryEntryListOptions): HistoryEntryList! + customFields: JSON +} + +""" +A summary of the taxes being applied to this order, grouped +by taxRate. +""" +type OrderTaxSummary { + """ + A description of this tax + """ + description: String! + + """ + The taxRate as a percentage + """ + taxRate: Float! + + """ + The total net price or OrderItems to which this taxRate applies + """ + taxBase: Int! + + """ + The total tax being applied to the Order at this taxRate + """ + taxTotal: Int! +} + +type OrderAddress { + fullName: String + company: String + streetLine1: String + streetLine2: String + city: String + province: String + postalCode: String + country: String + countryCode: String + phoneNumber: String + customFields: JSON +} + +type OrderList implements PaginatedList { + items: [Order!]! + totalItems: Int! +} + +type ShippingLine { + shippingMethod: ShippingMethod! + price: Int! + priceWithTax: Int! + discountedPrice: Int! + discountedPriceWithTax: Int! + discounts: [Discount!]! +} + +type Discount { + adjustmentSource: String! + type: AdjustmentType! + description: String! + amount: Int! + amountWithTax: Int! +} + +type OrderItem implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + cancelled: Boolean! + + """ + The price of a single unit, excluding tax and discounts + """ + unitPrice: Int! + + """ + The price of a single unit, including tax but excluding discounts + """ + unitPriceWithTax: Int! + + """ + The price of a single unit including discounts, excluding tax. + + If Order-level discounts have been applied, this will not be the + actual taxable unit price (see `proratedUnitPrice`), but is generally the + correct price to display to customers to avoid confusion + about the internal handling of distributed Order-level discounts. + """ + discountedUnitPrice: Int! + + """ + The price of a single unit including discounts and tax + """ + discountedUnitPriceWithTax: Int! + + """ + The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed) + Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax + and refund calculations. + """ + proratedUnitPrice: Int! + + """ + The proratedUnitPrice including tax + """ + proratedUnitPriceWithTax: Int! + unitTax: Int! + taxRate: Float! + adjustments: [Adjustment!]! + taxLines: [TaxLine!]! + fulfillment: Fulfillment + refundId: ID +} + +type OrderLine implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + productVariant: ProductVariant! + featuredAsset: Asset + + """ + The price of a single unit, excluding tax and discounts + """ + unitPrice: Int! + + """ + The price of a single unit, including tax but excluding discounts + """ + unitPriceWithTax: Int! + + """ + Non-zero if the unitPrice has changed since it was initially added to Order + """ + unitPriceChangeSinceAdded: Int! + + """ + Non-zero if the unitPriceWithTax has changed since it was initially added to Order + """ + unitPriceWithTaxChangeSinceAdded: Int! + + """ + The price of a single unit including discounts, excluding tax. + + If Order-level discounts have been applied, this will not be the + actual taxable unit price (see `proratedUnitPrice`), but is generally the + correct price to display to customers to avoid confusion + about the internal handling of distributed Order-level discounts. + """ + discountedUnitPrice: Int! + + """ + The price of a single unit including discounts and tax + """ + discountedUnitPriceWithTax: Int! + + """ + The actual unit price, taking into account both item discounts _and_ prorated (proportially-distributed) + Order-level discounts. This value is the true economic value of the OrderItem, and is used in tax + and refund calculations. + """ + proratedUnitPrice: Int! + + """ + The proratedUnitPrice including tax + """ + proratedUnitPriceWithTax: Int! + quantity: Int! + items: [OrderItem!]! + taxRate: Float! + + """ + The total price of the line excluding tax and discounts. + """ + linePrice: Int! + + """ + The total price of the line including tax bit excluding discounts. + """ + linePriceWithTax: Int! + + """ + The price of the line including discounts, excluding tax + """ + discountedLinePrice: Int! + + """ + The price of the line including discounts and tax + """ + discountedLinePriceWithTax: Int! + + """ + The actual line price, taking into account both item discounts _and_ prorated (proportially-distributed) + Order-level discounts. This value is the true economic value of the OrderLine, and is used in tax + and refund calculations. + """ + proratedLinePrice: Int! + + """ + The proratedLinePrice including tax + """ + proratedLinePriceWithTax: Int! + + """ + The total tax on this line + """ + lineTax: Int! + discounts: [Discount!]! + taxLines: [TaxLine!]! + order: Order! + customFields: JSON +} + +type Payment implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + method: String! + amount: Int! + state: String! + transactionId: String + errorMessage: String + refunds: [Refund!]! + metadata: JSON +} + +type Refund implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + items: Int! + shipping: Int! + adjustment: Int! + total: Int! + method: String + state: String! + transactionId: String + reason: String + orderItems: [OrderItem!]! + paymentId: ID! + metadata: JSON +} + +type Fulfillment implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + orderItems: [OrderItem!]! + state: String! + method: String! + trackingCode: String + customFields: JSON +} + +type Surcharge implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + description: String! + sku: String + taxLines: [TaxLine!]! + price: Int! + priceWithTax: Int! + taxRate: Float! +} + +type ProductOptionGroup implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + code: String! + name: String! + options: [ProductOption!]! + translations: [ProductOptionGroupTranslation!]! + customFields: JSON +} + +type ProductOptionGroupTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type ProductOption implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + code: String! + name: String! + groupId: ID! + group: ProductOptionGroup! + translations: [ProductOptionTranslation!]! + customFields: JSON +} + +type ProductOptionTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type SearchReindexResponse { + success: Boolean! +} + +type SearchResponse { + items: [SearchResult!]! + totalItems: Int! + facetValues: [FacetValueResult!]! +} + +""" +Which FacetValues are present in the products returned +by the search, and in what quantity. +""" +type FacetValueResult { + facetValue: FacetValue! + count: Int! +} + +type SearchResultAsset { + id: ID! + preview: String! + focalPoint: Coordinate +} + +type SearchResult { + sku: String! + slug: String! + productId: ID! + productName: String! + productAsset: SearchResultAsset + productVariantId: ID! + productVariantName: String! + productVariantAsset: SearchResultAsset + price: SearchResultPrice! + priceWithTax: SearchResultPrice! + currencyCode: CurrencyCode! + description: String! + facetIds: [ID!]! + facetValueIds: [ID!]! + + """ + An array of ids of the Collections in which this result appears + """ + collectionIds: [ID!]! + + """ + A relevence score for the result. Differs between database implementations + """ + score: Float! +} + +""" +The price of a search result product, either as a range or as a single price +""" +union SearchResultPrice = PriceRange | SinglePrice + +""" +The price value where the result has a single price +""" +type SinglePrice { + value: Int! +} + +""" +The price range where the result has more than one price +""" +type PriceRange { + min: Int! + max: Int! +} + +type Product implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! + slug: String! + description: String! + featuredAsset: Asset + assets: [Asset!]! + variants: [ProductVariant!]! + optionGroups: [ProductOptionGroup!]! + facetValues: [FacetValue!]! + translations: [ProductTranslation!]! + collections: [Collection!]! + customFields: JSON +} + +type ProductTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! + slug: String! + description: String! +} + +type ProductList implements PaginatedList { + items: [Product!]! + totalItems: Int! +} + +type ProductVariant implements Node { + id: ID! + product: Product! + productId: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + sku: String! + name: String! + featuredAsset: Asset + assets: [Asset!]! + price: Int! + currencyCode: CurrencyCode! + priceWithTax: Int! + stockLevel: String! + taxRateApplied: TaxRate! + taxCategory: TaxCategory! + options: [ProductOption!]! + facetValues: [FacetValue!]! + translations: [ProductVariantTranslation!]! + customFields: ProductVariantCustomFields +} + +type ProductVariantTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! +} + +type Promotion implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + startsAt: DateTime + endsAt: DateTime + couponCode: String + perCustomerUsageLimit: Int + name: String! + enabled: Boolean! + conditions: [ConfigurableOperation!]! + actions: [ConfigurableOperation!]! +} + +type PromotionList implements PaginatedList { + items: [Promotion!]! + totalItems: Int! +} + +type Role implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + code: String! + description: String! + permissions: [Permission!]! + channels: [Channel!]! +} + +type RoleList implements PaginatedList { + items: [Role!]! + totalItems: Int! +} + +type ShippingMethod implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + code: String! + name: String! + description: String! + fulfillmentHandlerCode: String! + checker: ConfigurableOperation! + calculator: ConfigurableOperation! + translations: [ShippingMethodTranslation!]! + customFields: JSON +} + +type ShippingMethodTranslation { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + languageCode: LanguageCode! + name: String! + description: String! +} + +type ShippingMethodList implements PaginatedList { + items: [ShippingMethod!]! + totalItems: Int! +} + +type Tag implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + value: String! +} + +type TagList implements PaginatedList { + items: [Tag!]! + totalItems: Int! +} + +type TaxCategory implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + name: String! + isDefault: Boolean! +} + +type TaxRate implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + name: String! + enabled: Boolean! + value: Float! + category: TaxCategory! + zone: Zone! + customerGroup: CustomerGroup +} + +type TaxRateList implements PaginatedList { + items: [TaxRate!]! + totalItems: Int! +} + +type User implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + identifier: String! + verified: Boolean! + roles: [Role!]! + lastLogin: DateTime + authenticationMethods: [AuthenticationMethod!]! + customFields: JSON +} + +type AuthenticationMethod implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + strategy: String! +} + +type Zone implements Node { + id: ID! + createdAt: DateTime! + updatedAt: DateTime! + name: String! + members: [Country!]! +} + +""" +Returned when attempting to modify the contents of an Order that is not in the `AddingItems` state. +""" +type OrderModificationError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned when attempting to set a ShippingMethod for which the Order is not eligible +""" +type IneligibleShippingMethodError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned when attempting to add a Payment to an Order that is not in the `ArrangingPayment` state. +""" +type OrderPaymentStateError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned when attempting to add a Payment using a PaymentMethod for which the Order is not eligible. +""" +type IneligiblePaymentMethodError implements ErrorResult { + errorCode: ErrorCode! + message: String! + eligibilityCheckerMessage: String +} + +""" +Returned when a Payment fails due to an error. +""" +type PaymentFailedError implements ErrorResult { + errorCode: ErrorCode! + message: String! + paymentErrorMessage: String! +} + +""" +Returned when a Payment is declined by the payment provider. +""" +type PaymentDeclinedError implements ErrorResult { + errorCode: ErrorCode! + message: String! + paymentErrorMessage: String! +} + +""" +Returned if the provided coupon code is invalid +""" +type CouponCodeInvalidError implements ErrorResult { + errorCode: ErrorCode! + message: String! + couponCode: String! +} + +""" +Returned if the provided coupon code is invalid +""" +type CouponCodeExpiredError implements ErrorResult { + errorCode: ErrorCode! + message: String! + couponCode: String! +} + +""" +Returned if the provided coupon code is invalid +""" +type CouponCodeLimitError implements ErrorResult { + errorCode: ErrorCode! + message: String! + couponCode: String! + limit: Int! +} + +""" +Retured when attemting to set the Customer for an Order when already logged in. +""" +type AlreadyLoggedInError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured when attemting to register or verify a customer account without a password, when one is required. +""" +type MissingPasswordError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured when attemting to verify a customer account with a password, when a password has already been set. +""" +type PasswordAlreadySetError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured if the verification token (used to verify a Customer's email address) is either +invalid or does not match any expected tokens. +""" +type VerificationTokenInvalidError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned if the verification token (used to verify a Customer's email address) is valid, but has +expired according to the `verificationTokenDuration` setting in the AuthOptions. +""" +type VerificationTokenExpiredError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured if the token used to change a Customer's email address is either +invalid or does not match any expected tokens. +""" +type IdentifierChangeTokenInvalidError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured if the token used to change a Customer's email address is valid, but has +expired according to the `verificationTokenDuration` setting in the AuthOptions. +""" +type IdentifierChangeTokenExpiredError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured if the token used to reset a Customer's password is either +invalid or does not match any expected tokens. +""" +type PasswordResetTokenInvalidError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Retured if the token used to reset a Customer's password is valid, but has +expired according to the `verificationTokenDuration` setting in the AuthOptions. +""" +type PasswordResetTokenExpiredError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned if `authOptions.requireVerification` is set to `true` (which is the default) +and an unverified user attempts to authenticate. +""" +type NotVerifiedError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +""" +Returned when invoking a mutation which depends on there being an active Order on the +current session. +""" +type NoActiveOrderError implements ErrorResult { + errorCode: ErrorCode! + message: String! +} + +input AuthenticationInput { + native: NativeAuthInput +} + +input RegisterCustomerInput { + emailAddress: String! + title: String + firstName: String + lastName: String + phoneNumber: String + password: String +} + +input UpdateCustomerInput { + title: String + firstName: String + lastName: String + phoneNumber: String + customFields: JSON +} + +input UpdateOrderInput { + customFields: JSON +} + +""" +Passed as input to the `addPaymentToOrder` mutation. +""" +input PaymentInput { + """ + This field should correspond to the `code` property of a PaymentMethodHandler. + """ + method: String! + + """ + This field should contain arbitrary data passed to the specified PaymentMethodHandler's `createPayment()` method + as the "metadata" argument. For example, it could contain an ID for the payment and other + data generated by the payment provider. + """ + metadata: JSON! +} + +input CollectionListOptions { + skip: Int + take: Int + sort: CollectionSortParameter + filter: CollectionFilterParameter +} + +input OrderListOptions { + skip: Int + take: Int + sort: OrderSortParameter + filter: OrderFilterParameter +} + +input ProductListOptions { + skip: Int + take: Int + sort: ProductSortParameter + filter: ProductFilterParameter +} + +union UpdateOrderItemsResult = + Order + | OrderModificationError + | OrderLimitError + | NegativeQuantityError + | InsufficientStockError + +union RemoveOrderItemsResult = Order | OrderModificationError + +union SetOrderShippingMethodResult = + Order + | OrderModificationError + | IneligibleShippingMethodError + | NoActiveOrderError + +union ApplyCouponCodeResult = + Order + | CouponCodeExpiredError + | CouponCodeInvalidError + | CouponCodeLimitError + +union AddPaymentToOrderResult = + Order + | OrderPaymentStateError + | IneligiblePaymentMethodError + | PaymentFailedError + | PaymentDeclinedError + | OrderStateTransitionError + | NoActiveOrderError + +union TransitionOrderToStateResult = Order | OrderStateTransitionError + +union SetCustomerForOrderResult = + Order + | AlreadyLoggedInError + | EmailAddressConflictError + | NoActiveOrderError + +union RegisterCustomerAccountResult = + Success + | MissingPasswordError + | NativeAuthStrategyError + +union RefreshCustomerVerificationResult = Success | NativeAuthStrategyError + +union VerifyCustomerAccountResult = + CurrentUser + | VerificationTokenInvalidError + | VerificationTokenExpiredError + | MissingPasswordError + | PasswordAlreadySetError + | NativeAuthStrategyError + +union UpdateCustomerPasswordResult = + Success + | InvalidCredentialsError + | NativeAuthStrategyError + +union RequestUpdateCustomerEmailAddressResult = + Success + | InvalidCredentialsError + | EmailAddressConflictError + | NativeAuthStrategyError + +union UpdateCustomerEmailAddressResult = + Success + | IdentifierChangeTokenInvalidError + | IdentifierChangeTokenExpiredError + | NativeAuthStrategyError + +union RequestPasswordResetResult = Success | NativeAuthStrategyError + +union ResetPasswordResult = + CurrentUser + | PasswordResetTokenInvalidError + | PasswordResetTokenExpiredError + | NativeAuthStrategyError + +union NativeAuthenticationResult = + CurrentUser + | InvalidCredentialsError + | NotVerifiedError + | NativeAuthStrategyError + +union AuthenticationResult = + CurrentUser + | InvalidCredentialsError + | NotVerifiedError + +union ActiveOrderResult = Order | NoActiveOrderError + +input CollectionFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + languageCode: StringOperators + name: StringOperators + slug: StringOperators + position: NumberOperators + description: StringOperators +} + +input CollectionSortParameter { + id: SortOrder + createdAt: SortOrder + updatedAt: SortOrder + name: SortOrder + slug: SortOrder + position: SortOrder + description: SortOrder +} + +input ProductFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + languageCode: StringOperators + name: StringOperators + slug: StringOperators + description: StringOperators +} + +input ProductSortParameter { + id: SortOrder + createdAt: SortOrder + updatedAt: SortOrder + name: SortOrder + slug: SortOrder + description: SortOrder +} + +input ProductVariantFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + languageCode: StringOperators + sku: StringOperators + name: StringOperators + price: NumberOperators + currencyCode: StringOperators + priceWithTax: NumberOperators + stockLevel: StringOperators + discountPrice: NumberOperators +} + +input ProductVariantSortParameter { + id: SortOrder + productId: SortOrder + createdAt: SortOrder + updatedAt: SortOrder + sku: SortOrder + name: SortOrder + price: SortOrder + priceWithTax: SortOrder + stockLevel: SortOrder + discountPrice: SortOrder +} + +input CustomerFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + title: StringOperators + firstName: StringOperators + lastName: StringOperators + phoneNumber: StringOperators + emailAddress: StringOperators +} + +input CustomerSortParameter { + id: SortOrder + createdAt: SortOrder + updatedAt: SortOrder + title: SortOrder + firstName: SortOrder + lastName: SortOrder + phoneNumber: SortOrder + emailAddress: SortOrder +} + +input OrderFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + orderPlacedAt: DateOperators + code: StringOperators + state: StringOperators + active: BooleanOperators + totalQuantity: NumberOperators + subTotal: NumberOperators + subTotalWithTax: NumberOperators + currencyCode: StringOperators + shipping: NumberOperators + shippingWithTax: NumberOperators + total: NumberOperators + totalWithTax: NumberOperators +} + +input OrderSortParameter { + id: SortOrder + createdAt: SortOrder + updatedAt: SortOrder + orderPlacedAt: SortOrder + code: SortOrder + state: SortOrder + totalQuantity: SortOrder + subTotal: SortOrder + subTotalWithTax: SortOrder + shipping: SortOrder + shippingWithTax: SortOrder + total: SortOrder + totalWithTax: SortOrder +} + +input HistoryEntryFilterParameter { + createdAt: DateOperators + updatedAt: DateOperators + type: StringOperators +} + +input HistoryEntrySortParameter { + id: SortOrder + createdAt: SortOrder + updatedAt: SortOrder +} + +type ProductVariantCustomFields { + discountPrice: Int +} + +input NativeAuthInput { + username: String! + password: String! +} diff --git a/packages/vendure/src/api/endpoints/cart/index.ts b/packages/vendure/src/api/endpoints/cart/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/cart/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/catalog/index.ts b/packages/vendure/src/api/endpoints/catalog/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/catalog/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/catalog/products.ts b/packages/vendure/src/api/endpoints/catalog/products.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/catalog/products.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/checkout/index.ts b/packages/vendure/src/api/endpoints/checkout/index.ts new file mode 100644 index 0000000..e063dbf --- /dev/null +++ b/packages/vendure/src/api/endpoints/checkout/index.ts @@ -0,0 +1,58 @@ +import { NextApiHandler } from 'next' +import { CommerceAPI, createEndpoint, GetAPISchema } from '@vercel/commerce/api' +import { CheckoutSchema } from '@vercel/commerce/types/checkout' +import checkoutEndpoint from '@vercel/commerce/api/endpoints/checkout' + +const getCheckout: CheckoutEndpoint['handlers']['getCheckout'] = async ({ + req, + res, + config, +}) => { + try { + const html = ` + + + + + + Checkout + + +

+ + + +

Checkout not yet implemented :(

+

+ See #64 +

+
+ + + ` + + res.status(200) + res.setHeader('Content-Type', 'text/html') + res.write(html) + res.end() + } catch (error) { + console.error(error) + + const message = 'An unexpected error ocurred' + + res.status(500).json({ data: null, errors: [{ message }] }) + } +} + +export type CheckoutAPI = GetAPISchema + +export type CheckoutEndpoint = CheckoutAPI['endpoint'] + +export const handlers: CheckoutEndpoint['handlers'] = { getCheckout } + +const checkoutApi = createEndpoint({ + handler: checkoutEndpoint, + handlers, +}) + +export default checkoutApi diff --git a/packages/vendure/src/api/endpoints/customer/address.ts b/packages/vendure/src/api/endpoints/customer/address.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/customer/address.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/customer/card.ts b/packages/vendure/src/api/endpoints/customer/card.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/customer/card.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/customer/index.ts b/packages/vendure/src/api/endpoints/customer/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/customer/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/login/index.ts b/packages/vendure/src/api/endpoints/login/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/login/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/logout/index.ts b/packages/vendure/src/api/endpoints/logout/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/logout/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/signup/index.ts b/packages/vendure/src/api/endpoints/signup/index.ts new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/signup/index.ts @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/endpoints/wishlist/index.tsx b/packages/vendure/src/api/endpoints/wishlist/index.tsx new file mode 100644 index 0000000..491bf0a --- /dev/null +++ b/packages/vendure/src/api/endpoints/wishlist/index.tsx @@ -0,0 +1 @@ +export default function noopApi(...args: any[]): void {} diff --git a/packages/vendure/src/api/index.ts b/packages/vendure/src/api/index.ts new file mode 100644 index 0000000..cbe56be --- /dev/null +++ b/packages/vendure/src/api/index.ts @@ -0,0 +1,56 @@ +import type { CommerceAPIConfig } from '@vercel/commerce/api' +import { + CommerceAPI, + getCommerceApi as commerceApi, +} from '@vercel/commerce/api' +import fetchGraphqlApi from './utils/fetch-graphql-api' + +import login from './operations/login' +import getAllPages from './operations/get-all-pages' +import getPage from './operations/get-page' +import getSiteInfo from './operations/get-site-info' +import getCustomerWishlist from './operations/get-customer-wishlist' +import getAllProductPaths from './operations/get-all-product-paths' +import getAllProducts from './operations/get-all-products' +import getProduct from './operations/get-product' + +export interface VendureConfig extends CommerceAPIConfig {} + +const API_URL = process.env.NEXT_PUBLIC_VENDURE_SHOP_API_URL + +if (!API_URL) { + throw new Error( + `The environment variable NEXT_PUBLIC_VENDURE_SHOP_API_URL is missing and it's required to access your store` + ) +} + +const ONE_DAY = 60 * 60 * 24 +const config: VendureConfig = { + commerceUrl: API_URL, + apiToken: '', + cartCookie: '', + customerCookie: '', + cartCookieMaxAge: ONE_DAY * 30, + fetch: fetchGraphqlApi, +} + +const operations = { + login, + getAllPages, + getPage, + getSiteInfo, + getCustomerWishlist, + getAllProductPaths, + getAllProducts, + getProduct, +} + +export const provider = { config, operations } + +export type Provider = typeof provider + +export function getCommerceApi

( + customProvider: P = provider as any +): CommerceAPI

{ + return commerceApi(customProvider) +} diff --git a/packages/vendure/src/api/operations/get-all-pages.ts b/packages/vendure/src/api/operations/get-all-pages.ts new file mode 100644 index 0000000..7865cf9 --- /dev/null +++ b/packages/vendure/src/api/operations/get-all-pages.ts @@ -0,0 +1,40 @@ +import { VendureConfig } from '../' +import { OperationContext } from '@vercel/commerce/api/operations' +import { Provider } from '../' + +export type Page = any + +export type GetAllPagesResult = + T + +export default function getAllPagesOperation({ + commerce, +}: OperationContext) { + async function getAllPages(opts?: { + config?: Partial + preview?: boolean + }): Promise + + async function getAllPages(opts: { + url: string + config?: Partial + preview?: boolean + }): Promise> + + async function getAllPages({ + config: cfg, + preview, + }: { + url?: string + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + + return { + pages: [], + } + } + + return getAllPages +} diff --git a/packages/vendure/src/api/operations/get-all-product-paths.ts b/packages/vendure/src/api/operations/get-all-product-paths.ts new file mode 100644 index 0000000..bdb4797 --- /dev/null +++ b/packages/vendure/src/api/operations/get-all-product-paths.ts @@ -0,0 +1,55 @@ +import { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import type { GetAllProductPathsQuery } from '../../../schema' +import { Provider } from '../index' +import { getAllProductPathsQuery } from '../../utils/queries/get-all-product-paths-query' +import { GetAllProductPathsOperation } from '@vercel/commerce/types/product' +import { VendureConfig } from '../' + +export type GetAllProductPathsResult = { + products: Array<{ node: { path: string } }> +} + +export default function getAllProductPathsOperation({ + commerce, +}: OperationContext) { + async function getAllProductPaths< + T extends GetAllProductPathsOperation + >(opts?: { + variables?: T['variables'] + config?: VendureConfig + }): Promise + + async function getAllProductPaths( + opts: { + variables?: T['variables'] + config?: VendureConfig + } & OperationOptions + ): Promise + + async function getAllProductPaths({ + query = getAllProductPathsQuery, + variables, + config: cfg, + }: { + query?: string + variables?: T['variables'] + config?: VendureConfig + } = {}): Promise { + const config = commerce.getConfig(cfg) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { data } = await config.fetch(query, { + variables, + }) + const products = data.products.items + + return { + products: products.map((p) => ({ path: `/${p.slug}` })), + } + } + + return getAllProductPaths +} diff --git a/packages/vendure/src/api/operations/get-all-products.ts b/packages/vendure/src/api/operations/get-all-products.ts new file mode 100644 index 0000000..f609ac8 --- /dev/null +++ b/packages/vendure/src/api/operations/get-all-products.ts @@ -0,0 +1,46 @@ +import { Product } from '@vercel/commerce/types/product' +import { Provider, VendureConfig } from '../' +import { GetAllProductsQuery } from '../../../schema' +import { normalizeSearchResult } from '../../utils/normalize' +import { getAllProductsQuery } from '../../utils/queries/get-all-products-query' +import { OperationContext } from '@vercel/commerce/api/operations' + +export type ProductVariables = { first?: number } + +export default function getAllProductsOperation({ + commerce, +}: OperationContext) { + async function getAllProducts(opts?: { + variables?: ProductVariables + config?: Partial + preview?: boolean + }): Promise<{ products: Product[] }> + + async function getAllProducts({ + query = getAllProductsQuery, + variables: { ...vars } = {}, + config: cfg, + }: { + query?: string + variables?: ProductVariables + config?: Partial + preview?: boolean + } = {}): Promise<{ products: Product[] | any[] }> { + const config = commerce.getConfig(cfg) + const variables = { + input: { + take: vars.first, + groupByProduct: true, + }, + } + const { data } = await config.fetch(query, { + variables, + }) + + return { + products: data.search.items.map((item) => normalizeSearchResult(item)), + } + } + + return getAllProducts +} diff --git a/packages/vendure/src/api/operations/get-customer-wishlist.ts b/packages/vendure/src/api/operations/get-customer-wishlist.ts new file mode 100644 index 0000000..35fca53 --- /dev/null +++ b/packages/vendure/src/api/operations/get-customer-wishlist.ts @@ -0,0 +1,23 @@ +import { OperationContext } from '@vercel/commerce/api/operations' +import { Provider, VendureConfig } from '../' + +export default function getCustomerWishlistOperation({ + commerce, +}: OperationContext) { + async function getCustomerWishlist({ + config: cfg, + variables, + includeProducts, + }: { + url?: string + variables: any + config?: Partial + includeProducts?: boolean + }): Promise { + // Not implemented as Vendure does not ship with wishlist functionality at present + const config = commerce.getConfig(cfg) + return { wishlist: {} } + } + + return getCustomerWishlist +} diff --git a/packages/vendure/src/api/operations/get-page.ts b/packages/vendure/src/api/operations/get-page.ts new file mode 100644 index 0000000..909277b --- /dev/null +++ b/packages/vendure/src/api/operations/get-page.ts @@ -0,0 +1,45 @@ +import { VendureConfig, Provider } from '../' +import { OperationContext } from '@vercel/commerce/api/operations' + +export type Page = any + +export type GetPageResult = T + +export type PageVariables = { + id: number +} + +export default function getPageOperation({ + commerce, +}: OperationContext) { + async function getPage(opts: { + url?: string + variables: PageVariables + config?: Partial + preview?: boolean + }): Promise + + async function getPage(opts: { + url: string + variables: V + config?: Partial + preview?: boolean + }): Promise> + + async function getPage({ + url, + variables, + config: cfg, + preview, + }: { + url?: string + variables: PageVariables + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + return {} + } + + return getPage +} diff --git a/packages/vendure/src/api/operations/get-product.ts b/packages/vendure/src/api/operations/get-product.ts new file mode 100644 index 0000000..6b58e96 --- /dev/null +++ b/packages/vendure/src/api/operations/get-product.ts @@ -0,0 +1,69 @@ +import { Product } from '@vercel/commerce/types/product' +import { OperationContext } from '@vercel/commerce/api/operations' +import { Provider, VendureConfig } from '../' +import { GetProductQuery } from '../../../schema' +import { getProductQuery } from '../../utils/queries/get-product-query' + +export default function getProductOperation({ + commerce, +}: OperationContext) { + async function getProduct({ + query = getProductQuery, + variables, + config: cfg, + }: { + query?: string + variables: { slug: string } + config?: Partial + preview?: boolean + }): Promise { + const config = commerce.getConfig(cfg) + + const locale = config.locale + const { data } = await config.fetch(query, { variables }) + const product = data.product + + if (product) { + const getOptionGroupName = (id: string): string => { + return product.optionGroups.find((og) => og.id === id)!.name + } + return { + product: { + id: product.id, + name: product.name, + description: product.description, + slug: product.slug, + images: product.assets.map((a) => ({ + url: a.preview, + alt: a.name, + })), + variants: product.variants.map((v) => ({ + id: v.id, + options: v.options.map((o) => ({ + // This __typename property is required in order for the correct + // variant selection to work, see `components/product/helpers.ts` + // `getVariant()` function. + __typename: 'MultipleChoiceOption', + id: o.id, + displayName: getOptionGroupName(o.groupId), + values: [{ label: o.name }], + })), + })), + price: { + value: product.variants[0].priceWithTax / 100, + currencyCode: product.variants[0].currencyCode, + }, + options: product.optionGroups.map((og) => ({ + id: og.id, + displayName: og.name, + values: og.options.map((o) => ({ label: o.name })), + })), + } as Product, + } + } + + return {} + } + + return getProduct +} diff --git a/packages/vendure/src/api/operations/get-site-info.ts b/packages/vendure/src/api/operations/get-site-info.ts new file mode 100644 index 0000000..ce2f5fa --- /dev/null +++ b/packages/vendure/src/api/operations/get-site-info.ts @@ -0,0 +1,50 @@ +import { Provider, VendureConfig } from '../' +import { GetCollectionsQuery } from '../../../schema' +import { arrayToTree } from '../../utils/array-to-tree' +import { getCollectionsQuery } from '../../utils/queries/get-collections-query' +import { OperationContext } from '@vercel/commerce/api/operations' +import { Category } from '@vercel/commerce/types/site' + +export type GetSiteInfoResult< + T extends { categories: any[]; brands: any[] } = { + categories: Category[] + brands: any[] + } +> = T + +export default function getSiteInfoOperation({ + commerce, +}: OperationContext) { + async function getSiteInfo({ + query = getCollectionsQuery, + variables, + config: cfg, + }: { + query?: string + variables?: any + config?: Partial + preview?: boolean + } = {}): Promise { + const config = commerce.getConfig(cfg) + // RecursivePartial forces the method to check for every prop in the data, which is + // required in case there's a custom `query` + const { data } = await config.fetch(query, { + variables, + }) + const collections = data.collections?.items.map((i) => ({ + ...i, + entityId: i.id, + path: i.slug, + productCount: i.productVariants.totalItems, + })) + const categories = arrayToTree(collections).children + const brands = [] as any[] + + return { + categories: categories ?? [], + brands, + } + } + + return getSiteInfo +} diff --git a/packages/vendure/src/api/operations/login.ts b/packages/vendure/src/api/operations/login.ts new file mode 100644 index 0000000..07ee5fa --- /dev/null +++ b/packages/vendure/src/api/operations/login.ts @@ -0,0 +1,60 @@ +import type { ServerResponse } from 'http' +import type { + OperationContext, + OperationOptions, +} from '@vercel/commerce/api/operations' +import { ValidationError } from '@vercel/commerce/utils/errors' +import type { LoginOperation } from '../../types/login' +import type { LoginMutation } from '../../../schema' +import { Provider, VendureConfig } from '..' +import { loginMutation } from '../../utils/mutations/log-in-mutation' + +export default function loginOperation({ + commerce, +}: OperationContext) { + async function login(opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + }): Promise + + async function login( + opts: { + variables: T['variables'] + config?: Partial + res: ServerResponse + } & OperationOptions + ): Promise + + async function login({ + query = loginMutation, + variables, + res: response, + config: cfg, + }: { + query?: string + variables: T['variables'] + res: ServerResponse + config?: Partial + }): Promise { + const config = commerce.getConfig(cfg) + + const { data, res } = await config.fetch(query, { + variables, + }) + switch (data.login.__typename) { + case 'NativeAuthStrategyError': + case 'InvalidCredentialsError': + case 'NotVerifiedError': + throw new ValidationError({ + code: data.login.errorCode, + message: data.login.message, + }) + } + return { + result: data.login.id, + } + } + + return login +} diff --git a/packages/vendure/src/api/utils/fetch-graphql-api.ts b/packages/vendure/src/api/utils/fetch-graphql-api.ts new file mode 100644 index 0000000..7c0fbc7 --- /dev/null +++ b/packages/vendure/src/api/utils/fetch-graphql-api.ts @@ -0,0 +1,36 @@ +import { FetcherError } from '@vercel/commerce/utils/errors' +import type { GraphQLFetcher } from '@vercel/commerce/api' +import { getCommerceApi } from '../' +import fetch from './fetch' + +const fetchGraphqlApi: GraphQLFetcher = async ( + query: string, + { variables, preview } = {}, + fetchOptions +) => { + const config = getCommerceApi().getConfig() + const res = await fetch(config.commerceUrl, { + ...fetchOptions, + method: 'POST', + headers: { + ...fetchOptions?.headers, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query, + variables, + }), + }) + + const json = await res.json() + if (json.errors) { + throw new FetcherError({ + errors: json.errors ?? [{ message: 'Failed to fetch Vendure API' }], + status: res.status, + }) + } + + return { data: json.data, res } +} + +export default fetchGraphqlApi diff --git a/packages/vendure/src/api/utils/fetch.ts b/packages/vendure/src/api/utils/fetch.ts new file mode 100644 index 0000000..9d9fff3 --- /dev/null +++ b/packages/vendure/src/api/utils/fetch.ts @@ -0,0 +1,3 @@ +import zeitFetch from '@vercel/fetch' + +export default zeitFetch() diff --git a/packages/vendure/src/auth/index.ts b/packages/vendure/src/auth/index.ts new file mode 100644 index 0000000..36e757a --- /dev/null +++ b/packages/vendure/src/auth/index.ts @@ -0,0 +1,3 @@ +export { default as useLogin } from './use-login' +export { default as useLogout } from './use-logout' +export { default as useSignup } from './use-signup' diff --git a/packages/vendure/src/auth/use-login.tsx b/packages/vendure/src/auth/use-login.tsx new file mode 100644 index 0000000..ce1a454 --- /dev/null +++ b/packages/vendure/src/auth/use-login.tsx @@ -0,0 +1,53 @@ +import { useCallback } from 'react' +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogin, { UseLogin } from '@vercel/commerce/auth/use-login' +import { LoginHook } from '../types/login' +import { CommerceError, ValidationError } from '@vercel/commerce/utils/errors' +import useCustomer from '../customer/use-customer' +import { LoginMutation, LoginMutationVariables } from '../../schema' +import { loginMutation } from '../utils/mutations/log-in-mutation' + +export default useLogin as UseLogin + +export const handler: MutationHook = { + fetchOptions: { + query: loginMutation, + }, + async fetcher({ input: { email, password }, options, fetch }) { + if (!(email && password)) { + throw new CommerceError({ + message: 'A email and password are required to login', + }) + } + + const variables: LoginMutationVariables = { + username: email, + password, + } + + const { login } = await fetch({ + ...options, + variables, + }) + + if (login.__typename !== 'CurrentUser') { + throw new ValidationError(login) + } + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function login(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/auth/use-logout.tsx b/packages/vendure/src/auth/use-logout.tsx new file mode 100644 index 0000000..8a099cf --- /dev/null +++ b/packages/vendure/src/auth/use-logout.tsx @@ -0,0 +1,35 @@ +import { useCallback } from 'react' +import { MutationHook } from '@vercel/commerce/utils/types' +import useLogout, { UseLogout } from '@vercel/commerce/auth/use-logout' +import useCustomer from '../customer/use-customer' +import { LogoutMutation } from '../../schema' +import { logoutMutation } from '../utils/mutations/log-out-mutation' +import { LogoutHook } from '../types/logout' + +export default useLogout as UseLogout + +export const handler: MutationHook = { + fetchOptions: { + query: logoutMutation, + }, + async fetcher({ options, fetch }) { + await fetch({ + ...options, + }) + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function logout() { + const data = await fetch() + await mutate(null, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/auth/use-signup.tsx b/packages/vendure/src/auth/use-signup.tsx new file mode 100644 index 0000000..0c19c91 --- /dev/null +++ b/packages/vendure/src/auth/use-signup.tsx @@ -0,0 +1,71 @@ +import { useCallback } from 'react' +import { MutationHook } from '@vercel/commerce/utils/types' +import { CommerceError, ValidationError } from '@vercel/commerce/utils/errors' +import useSignup, { UseSignup } from '@vercel/commerce/auth/use-signup' +import useCustomer from '../customer/use-customer' +import { + RegisterCustomerInput, + SignupMutation, + SignupMutationVariables, +} from '../../schema' +import { signupMutation } from '../utils/mutations/sign-up-mutation' +import { SignupHook } from '../types/signup' + +export default useSignup as UseSignup + +export type SignupInput = { + email: string + firstName: string + lastName: string + password: string +} + +export const handler: MutationHook = { + fetchOptions: { + query: signupMutation, + }, + async fetcher({ + input: { firstName, lastName, email, password }, + options, + fetch, + }) { + if (!(firstName && lastName && email && password)) { + throw new CommerceError({ + message: + 'A first name, last name, email and password are required to signup', + }) + } + const variables: SignupMutationVariables = { + input: { + firstName, + lastName, + emailAddress: email, + password, + }, + } + const { registerCustomerAccount } = await fetch({ + ...options, + variables, + }) + + if (registerCustomerAccount.__typename !== 'Success') { + throw new ValidationError(registerCustomerAccount) + } + + return null + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCustomer() + + return useCallback( + async function signup(input) { + const data = await fetch({ input }) + await mutate() + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/cart/index.ts b/packages/vendure/src/cart/index.ts new file mode 100644 index 0000000..3b8ba99 --- /dev/null +++ b/packages/vendure/src/cart/index.ts @@ -0,0 +1,4 @@ +export { default as useCart } from './use-cart' +export { default as useAddItem } from './use-add-item' +export { default as useRemoveItem } from './use-remove-item' +export { default as useUpdateItem } from './use-update-item' diff --git a/packages/vendure/src/cart/use-add-item.tsx b/packages/vendure/src/cart/use-add-item.tsx new file mode 100644 index 0000000..d7bb0bf --- /dev/null +++ b/packages/vendure/src/cart/use-add-item.tsx @@ -0,0 +1,54 @@ +import useAddItem, { UseAddItem } from '@vercel/commerce/cart/use-add-item' +import { CommerceError } from '@vercel/commerce/utils/errors' +import { MutationHook } from '@vercel/commerce/utils/types' +import { useCallback } from 'react' +import useCart from './use-cart' +import { AddItemToOrderMutation } from '../../schema' +import { normalizeCart } from '../utils/normalize' +import { addItemToOrderMutation } from '../utils/mutations/add-item-to-order-mutation' +import { AddItemHook } from '../types/cart' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: addItemToOrderMutation, + }, + async fetcher({ input, options, fetch }) { + if ( + input.quantity && + (!Number.isInteger(input.quantity) || input.quantity! < 1) + ) { + throw new CommerceError({ + message: 'The item quantity has to be a valid integer greater than 0', + }) + } + + const { addItemToOrder } = await fetch({ + ...options, + variables: { + quantity: input.quantity || 1, + variantId: input.variantId, + }, + }) + + if (addItemToOrder.__typename === 'Order') { + return normalizeCart(addItemToOrder) + } + throw new CommerceError(addItemToOrder) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function addItem(input) { + const data = await fetch({ input }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/cart/use-cart.tsx b/packages/vendure/src/cart/use-cart.tsx new file mode 100644 index 0000000..750f110 --- /dev/null +++ b/packages/vendure/src/cart/use-cart.tsx @@ -0,0 +1,46 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCart, { UseCart } from '@vercel/commerce/cart/use-cart' +import { ActiveOrderQuery, CartFragment } from '../../schema' +import { normalizeCart } from '../utils/normalize' +import { useMemo } from 'react' +import { getCartQuery } from '../utils/queries/get-cart-query' +import { GetCartHook } from '../types/cart' + +export type CartResult = { + activeOrder?: CartFragment + addItemToOrder?: CartFragment + adjustOrderLine?: CartFragment + removeOrderLine?: CartFragment +} + +export default useCart as UseCart + +export const handler: SWRHook = { + fetchOptions: { + query: getCartQuery, + }, + async fetcher({ input: { cartId }, options, fetch }) { + const { activeOrder } = await fetch(options) + return activeOrder ? normalizeCart(activeOrder) : null + }, + useHook: + ({ useData }) => + (input) => { + const response = useData({ + swrOptions: { revalidateOnFocus: false, ...input?.swrOptions }, + }) + + return useMemo( + () => + Object.create(response, { + isEmpty: { + get() { + return (response.data?.lineItems.length ?? 0) <= 0 + }, + enumerable: true, + }, + }), + [response] + ) + }, +} diff --git a/packages/vendure/src/cart/use-remove-item.tsx b/packages/vendure/src/cart/use-remove-item.tsx new file mode 100644 index 0000000..2aa3165 --- /dev/null +++ b/packages/vendure/src/cart/use-remove-item.tsx @@ -0,0 +1,56 @@ +import { useCallback } from 'react' +import { + HookFetcherContext, + MutationHook, + MutationHookContext, + SWRHook, +} from '@vercel/commerce/utils/types' +import useRemoveItem, { + UseRemoveItem, +} from '@vercel/commerce/cart/use-remove-item' +import { CommerceError } from '@vercel/commerce/utils/errors' +import { Cart } from '@vercel/commerce/types/cart' +import useCart from './use-cart' +import { + RemoveOrderLineMutation, + RemoveOrderLineMutationVariables, +} from '../../schema' +import { normalizeCart } from '../utils/normalize' +import { RemoveItemHook } from '../types/cart' +import { removeOrderLineMutation } from '../utils/mutations/remove-order-line-mutation' + +export default useRemoveItem as UseRemoveItem + +export const handler: MutationHook = { + fetchOptions: { + query: removeOrderLineMutation, + }, + async fetcher({ input, options, fetch }) { + const variables: RemoveOrderLineMutationVariables = { + orderLineId: input.itemId, + } + const { removeOrderLine } = await fetch({ + ...options, + variables, + }) + + if (removeOrderLine.__typename === 'Order') { + return normalizeCart(removeOrderLine) + } + throw new CommerceError(removeOrderLine) + }, + useHook: + ({ fetch }) => + () => { + const { mutate } = useCart() + + return useCallback( + async function removeItem(input) { + const data = await fetch({ input: { itemId: input.id } }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/cart/use-update-item.tsx b/packages/vendure/src/cart/use-update-item.tsx new file mode 100644 index 0000000..2f3c8d4 --- /dev/null +++ b/packages/vendure/src/cart/use-update-item.tsx @@ -0,0 +1,84 @@ +import { useCallback } from 'react' +import { + HookFetcherContext, + MutationHook, + MutationHookContext, +} from '@vercel/commerce/utils/types' +import { CommerceError, ValidationError } from '@vercel/commerce/utils/errors' +import useUpdateItem, { + UseUpdateItem, +} from '@vercel/commerce/cart/use-update-item' +import { CartItemBody, LineItem } from '@vercel/commerce/types/cart' +import useCart from './use-cart' +import { + AdjustOrderLineMutation, + AdjustOrderLineMutationVariables, +} from '../../schema' +import { normalizeCart } from '../utils/normalize' +import { adjustOrderLineMutation } from '../utils/mutations/adjust-order-line-mutation' +import { UpdateItemHook } from '../types/cart' + +export type UpdateItemActionInput = T extends LineItem + ? Partial + : UpdateItemHook['actionInput'] + +export default useUpdateItem as UseUpdateItem + +export const handler = { + fetchOptions: { + query: adjustOrderLineMutation, + }, + async fetcher(context: HookFetcherContext) { + const { input, options, fetch } = context + const variables: AdjustOrderLineMutationVariables = { + quantity: input.item.quantity || 1, + orderLineId: input.itemId, + } + const { adjustOrderLine } = await fetch({ + ...options, + variables, + }) + + if (adjustOrderLine.__typename === 'Order') { + return normalizeCart(adjustOrderLine) + } + throw new CommerceError(adjustOrderLine) + }, + useHook: + ({ fetch }: MutationHookContext) => + ( + ctx: { + item?: LineItem + wait?: number + } = {} + ) => { + const { item } = ctx + const { mutate } = useCart() + + return useCallback( + async function addItem(input: UpdateItemActionInput) { + const itemId = item?.id + const productId = input.productId ?? item?.productId + const variantId = input.productId ?? item?.variantId + if (!itemId || !productId || !variantId) { + throw new ValidationError({ + message: 'Invalid input used for this operation', + }) + } + const data = await fetch({ + input: { + item: { + productId, + variantId, + quantity: input.quantity, + }, + itemId, + }, + }) + await mutate(data, false) + return data + }, + [fetch, mutate] + ) + }, +} diff --git a/packages/vendure/src/checkout/use-checkout.tsx b/packages/vendure/src/checkout/use-checkout.tsx new file mode 100644 index 0000000..76997be --- /dev/null +++ b/packages/vendure/src/checkout/use-checkout.tsx @@ -0,0 +1,16 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCheckout, { + UseCheckout, +} from '@vercel/commerce/checkout/use-checkout' + +export default useCheckout as UseCheckout + +export const handler: SWRHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ useData }) => + async (input) => ({}), +} diff --git a/packages/vendure/src/commerce.config.json b/packages/vendure/src/commerce.config.json new file mode 100644 index 0000000..70806f0 --- /dev/null +++ b/packages/vendure/src/commerce.config.json @@ -0,0 +1,6 @@ +{ + "provider": "vendure", + "features": { + "wishlist": false + } +} diff --git a/packages/vendure/src/customer/address/use-add-item.tsx b/packages/vendure/src/customer/address/use-add-item.tsx new file mode 100644 index 0000000..4f85c84 --- /dev/null +++ b/packages/vendure/src/customer/address/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/address/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/vendure/src/customer/card/use-add-item.tsx b/packages/vendure/src/customer/card/use-add-item.tsx new file mode 100644 index 0000000..77d149e --- /dev/null +++ b/packages/vendure/src/customer/card/use-add-item.tsx @@ -0,0 +1,17 @@ +import useAddItem, { + UseAddItem, +} from '@vercel/commerce/customer/card/use-add-item' +import { MutationHook } from '@vercel/commerce/utils/types' + +export default useAddItem as UseAddItem + +export const handler: MutationHook = { + fetchOptions: { + query: '', + }, + async fetcher({ input, options, fetch }) {}, + useHook: + ({ fetch }) => + () => + async () => ({}), +} diff --git a/packages/vendure/src/customer/index.ts b/packages/vendure/src/customer/index.ts new file mode 100644 index 0000000..6c903ec --- /dev/null +++ b/packages/vendure/src/customer/index.ts @@ -0,0 +1 @@ +export { default as useCustomer } from './use-customer' diff --git a/packages/vendure/src/customer/use-customer.tsx b/packages/vendure/src/customer/use-customer.tsx new file mode 100644 index 0000000..80da077 --- /dev/null +++ b/packages/vendure/src/customer/use-customer.tsx @@ -0,0 +1,37 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useCustomer, { + UseCustomer, +} from '@vercel/commerce/customer/use-customer' +import { ActiveCustomerQuery } from '../../schema' +import { activeCustomerQuery } from '../utils/queries/active-customer-query' +import { CustomerHook } from '../types/customer' + +export default useCustomer as UseCustomer + +export const handler: SWRHook = { + fetchOptions: { + query: activeCustomerQuery, + }, + async fetcher({ options, fetch }) { + const { activeCustomer } = await fetch({ + ...options, + }) + return activeCustomer + ? ({ + firstName: activeCustomer.firstName ?? '', + lastName: activeCustomer.lastName ?? '', + email: activeCustomer.emailAddress ?? '', + } as any) + : null + }, + useHook: + ({ useData }) => + (input) => { + return useData({ + swrOptions: { + revalidateOnFocus: false, + ...input?.swrOptions, + }, + }) + }, +} diff --git a/packages/vendure/src/fetcher.ts b/packages/vendure/src/fetcher.ts new file mode 100644 index 0000000..ad0d4bc --- /dev/null +++ b/packages/vendure/src/fetcher.ts @@ -0,0 +1,53 @@ +import { Fetcher } from '@vercel/commerce/utils/types' +import { FetcherError } from '@vercel/commerce/utils/errors' + +async function getText(res: Response) { + try { + return (await res.text()) || res.statusText + } catch (error) { + return res.statusText + } +} + +async function getError(res: Response) { + if (res.headers.get('Content-Type')?.includes('application/json')) { + const data = await res.json() + return new FetcherError({ errors: data.errors, status: res.status }) + } + return new FetcherError({ message: await getText(res), status: res.status }) +} + +export const fetcher: Fetcher = async ({ + url, + method = 'POST', + variables, + query, + body: bodyObj, +}) => { + const shopApiUrl = + process.env.NEXT_PUBLIC_VENDURE_LOCAL_URL || + process.env.NEXT_PUBLIC_VENDURE_SHOP_API_URL + if (!shopApiUrl) { + throw new Error( + 'The Vendure Shop API url has not been provided. Please define NEXT_PUBLIC_VENDURE_SHOP_API_URL in .env.local' + ) + } + const hasBody = Boolean(variables || query) + const body = hasBody ? JSON.stringify({ query, variables }) : undefined + const headers = hasBody ? { 'Content-Type': 'application/json' } : undefined + const res = await fetch(shopApiUrl, { + method, + body, + headers, + credentials: 'include', + }) + if (res.ok) { + const { data, errors } = await res.json() + if (errors) { + throw await new FetcherError({ status: res.status, errors }) + } + return data + } + + throw await getError(res) +} diff --git a/packages/vendure/src/index.tsx b/packages/vendure/src/index.tsx new file mode 100644 index 0000000..14d0d4c --- /dev/null +++ b/packages/vendure/src/index.tsx @@ -0,0 +1,12 @@ +import { + getCommerceProvider, + useCommerce as useCoreCommerce, +} from '@vercel/commerce' +import { vendureProvider, VendureProvider } from './provider' + +export { vendureProvider } +export type { VendureProvider } + +export const CommerceProvider = getCommerceProvider(vendureProvider) + +export const useCommerce = () => useCoreCommerce() diff --git a/packages/vendure/src/next.config.cjs b/packages/vendure/src/next.config.cjs new file mode 100644 index 0000000..2e6842f --- /dev/null +++ b/packages/vendure/src/next.config.cjs @@ -0,0 +1,8 @@ +const commerce = require('./commerce.config.json') + +module.exports = { + commerce, + images: { + domains: ['localhost', 'demo.vendure.io','readonlydemo.vendure.io'], + }, +} diff --git a/packages/vendure/src/product/index.ts b/packages/vendure/src/product/index.ts new file mode 100644 index 0000000..426a3ed --- /dev/null +++ b/packages/vendure/src/product/index.ts @@ -0,0 +1,2 @@ +export { default as usePrice } from './use-price' +export { default as useSearch } from './use-search' diff --git a/packages/vendure/src/product/use-price.tsx b/packages/vendure/src/product/use-price.tsx new file mode 100644 index 0000000..fd42d70 --- /dev/null +++ b/packages/vendure/src/product/use-price.tsx @@ -0,0 +1,2 @@ +export * from '@vercel/commerce/product/use-price' +export { default } from '@vercel/commerce/product/use-price' diff --git a/packages/vendure/src/product/use-search.tsx b/packages/vendure/src/product/use-search.tsx new file mode 100644 index 0000000..86c6467 --- /dev/null +++ b/packages/vendure/src/product/use-search.tsx @@ -0,0 +1,64 @@ +import { SWRHook } from '@vercel/commerce/utils/types' +import useSearch, { UseSearch } from '@vercel/commerce/product/use-search' +import { Product } from '@vercel/commerce/types/product' +import { SearchQuery, SearchQueryVariables } from '../../schema' +import { normalizeSearchResult } from '../utils/normalize' +import { searchQuery } from '../utils/queries/search-query' +import { SearchProductsHook } from '../types/product' + +export default useSearch as UseSearch + +export type SearchProductsInput = { + search?: string + categoryId?: string + brandId?: string + sort?: string +} + +export type SearchProductsData = { + products: Product[] + found: boolean +} + +export const handler: SWRHook = { + fetchOptions: { + query: searchQuery, + }, + async fetcher({ input, options, fetch }) { + const { categoryId, brandId } = input + + const variables: SearchQueryVariables = { + input: { + term: input.search, + collectionId: input.categoryId?.toString(), + groupByProduct: true, + // TODO: what is the "sort" value? + }, + } + const { search } = await fetch({ + query: searchQuery, + variables, + }) + + return { + found: search.totalItems > 0, + products: search.items.map((item) => normalizeSearchResult(item)) ?? [], + } + }, + useHook: + ({ useData }) => + (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort], + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, + }, + }) + }, +} diff --git a/packages/vendure/src/provider.ts b/packages/vendure/src/provider.ts new file mode 100644 index 0000000..73f7dd5 --- /dev/null +++ b/packages/vendure/src/provider.ts @@ -0,0 +1,22 @@ +import { handler as useCart } from './cart/use-cart' +import { handler as useAddItem } from './cart/use-add-item' +import { handler as useUpdateItem } from './cart/use-update-item' +import { handler as useRemoveItem } from './cart/use-remove-item' +import { handler as useCustomer } from './customer/use-customer' +import { handler as useSearch } from './product/use-search' +import { handler as useLogin } from './auth/use-login' +import { handler as useLogout } from './auth/use-logout' +import { handler as useSignup } from './auth/use-signup' +import { fetcher } from './fetcher' + +export const vendureProvider = { + locale: 'en-us', + cartCookie: 'session', + fetcher, + cart: { useCart, useAddItem, useUpdateItem, useRemoveItem }, + customer: { useCustomer }, + products: { useSearch }, + auth: { useLogin, useLogout, useSignup }, +} + +export type VendureProvider = typeof vendureProvider diff --git a/packages/vendure/src/types/cart.ts b/packages/vendure/src/types/cart.ts new file mode 100644 index 0000000..e6838fb --- /dev/null +++ b/packages/vendure/src/types/cart.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/cart' diff --git a/packages/vendure/src/types/checkout.ts b/packages/vendure/src/types/checkout.ts new file mode 100644 index 0000000..d139db6 --- /dev/null +++ b/packages/vendure/src/types/checkout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/checkout' diff --git a/packages/vendure/src/types/common.ts b/packages/vendure/src/types/common.ts new file mode 100644 index 0000000..23b8daa --- /dev/null +++ b/packages/vendure/src/types/common.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/common' diff --git a/packages/vendure/src/types/customer.ts b/packages/vendure/src/types/customer.ts new file mode 100644 index 0000000..c637055 --- /dev/null +++ b/packages/vendure/src/types/customer.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/customer' diff --git a/packages/vendure/src/types/index.ts b/packages/vendure/src/types/index.ts new file mode 100644 index 0000000..7ab0b7f --- /dev/null +++ b/packages/vendure/src/types/index.ts @@ -0,0 +1,25 @@ +import * as Cart from './cart' +import * as Checkout from './checkout' +import * as Common from './common' +import * as Customer from './customer' +import * as Login from './login' +import * as Logout from './logout' +import * as Page from './page' +import * as Product from './product' +import * as Signup from './signup' +import * as Site from './site' +import * as Wishlist from './wishlist' + +export type { + Cart, + Checkout, + Common, + Customer, + Login, + Logout, + Page, + Product, + Signup, + Site, + Wishlist, +} diff --git a/packages/vendure/src/types/login.ts b/packages/vendure/src/types/login.ts new file mode 100644 index 0000000..283a575 --- /dev/null +++ b/packages/vendure/src/types/login.ts @@ -0,0 +1,12 @@ +import * as Core from '@vercel/commerce/types/login' +import type { LoginMutationVariables } from '../../schema' +import { LoginBody, LoginTypes } from '@vercel/commerce/types/login' + +export * from '@vercel/commerce/types/login' + +export type LoginHook = { + data: null + actionInput: LoginBody + fetcherInput: LoginBody + body: T['body'] +} diff --git a/packages/vendure/src/types/logout.ts b/packages/vendure/src/types/logout.ts new file mode 100644 index 0000000..1de06f8 --- /dev/null +++ b/packages/vendure/src/types/logout.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/logout' diff --git a/packages/vendure/src/types/page.ts b/packages/vendure/src/types/page.ts new file mode 100644 index 0000000..12f6b02 --- /dev/null +++ b/packages/vendure/src/types/page.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/page' diff --git a/packages/vendure/src/types/product.ts b/packages/vendure/src/types/product.ts new file mode 100644 index 0000000..72ca02f --- /dev/null +++ b/packages/vendure/src/types/product.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/product' diff --git a/packages/vendure/src/types/signup.ts b/packages/vendure/src/types/signup.ts new file mode 100644 index 0000000..3f0d1af --- /dev/null +++ b/packages/vendure/src/types/signup.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/signup' diff --git a/packages/vendure/src/types/site.ts b/packages/vendure/src/types/site.ts new file mode 100644 index 0000000..96a2e47 --- /dev/null +++ b/packages/vendure/src/types/site.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/site' diff --git a/packages/vendure/src/types/wishlist.ts b/packages/vendure/src/types/wishlist.ts new file mode 100644 index 0000000..af92d9f --- /dev/null +++ b/packages/vendure/src/types/wishlist.ts @@ -0,0 +1 @@ +export * from '@vercel/commerce/types/wishlist' diff --git a/packages/vendure/src/utils/array-to-tree.ts b/packages/vendure/src/utils/array-to-tree.ts new file mode 100644 index 0000000..403cf22 --- /dev/null +++ b/packages/vendure/src/utils/array-to-tree.ts @@ -0,0 +1,67 @@ +export type HasParent = { id: string; parent?: { id: string } | null } +export type TreeNode = T & { + children: Array> + expanded: boolean +} +export type RootNode = { + id?: string + children: Array> +} + +export function arrayToTree( + nodes: T[], + currentState?: RootNode +): RootNode { + const topLevelNodes: Array> = [] + const mappedArr: { [id: string]: TreeNode } = {} + const currentStateMap = treeToMap(currentState) + + // First map the nodes of the array to an object -> create a hash table. + for (const node of nodes) { + mappedArr[node.id] = { ...(node as any), children: [] } + } + + for (const id of nodes.map((n) => n.id)) { + if (mappedArr.hasOwnProperty(id)) { + const mappedElem = mappedArr[id] + mappedElem.expanded = currentStateMap.get(id)?.expanded ?? false + const parent = mappedElem.parent + if (!parent) { + continue + } + // If the element is not at the root level, add it to its parent array of children. + const parentIsRoot = !mappedArr[parent.id] + if (!parentIsRoot) { + if (mappedArr[parent.id]) { + mappedArr[parent.id].children.push(mappedElem) + } else { + mappedArr[parent.id] = { children: [mappedElem] } as any + } + } else { + topLevelNodes.push(mappedElem) + } + } + } + // tslint:disable-next-line:no-non-null-assertion + const rootId = topLevelNodes.length ? topLevelNodes[0].parent!.id : undefined + return { id: rootId, children: topLevelNodes } +} + +/** + * Converts an existing tree (as generated by the arrayToTree function) into a flat + * Map. This is used to persist certain states (e.g. `expanded`) when re-building the + * tree. + */ +function treeToMap( + tree?: RootNode +): Map> { + const nodeMap = new Map>() + function visit(node: TreeNode) { + nodeMap.set(node.id, node) + node.children.forEach(visit) + } + if (tree) { + visit(tree as TreeNode) + } + return nodeMap +} diff --git a/packages/vendure/src/utils/fragments/cart-fragment.ts b/packages/vendure/src/utils/fragments/cart-fragment.ts new file mode 100644 index 0000000..54ac089 --- /dev/null +++ b/packages/vendure/src/utils/fragments/cart-fragment.ts @@ -0,0 +1,44 @@ +export const cartFragment = /* GraphQL */ ` + fragment Cart on Order { + id + code + createdAt + totalQuantity + subTotal + subTotalWithTax + total + totalWithTax + currencyCode + customer { + id + } + lines { + id + quantity + linePriceWithTax + discountedLinePriceWithTax + unitPriceWithTax + discountedUnitPriceWithTax + featuredAsset { + id + preview + } + discounts { + description + amount + } + productVariant { + id + name + sku + price + priceWithTax + stockLevel + product { + slug + } + productId + } + } + } +` diff --git a/packages/vendure/src/utils/fragments/search-result-fragment.ts b/packages/vendure/src/utils/fragments/search-result-fragment.ts new file mode 100644 index 0000000..e143ce2 --- /dev/null +++ b/packages/vendure/src/utils/fragments/search-result-fragment.ts @@ -0,0 +1,23 @@ +export const searchResultFragment = /* GraphQL */ ` + fragment SearchResult on SearchResult { + productId + productName + description + slug + sku + currencyCode + productAsset { + id + preview + } + priceWithTax { + ... on SinglePrice { + value + } + ... on PriceRange { + min + max + } + } + } +` diff --git a/packages/vendure/src/utils/mutations/add-item-to-order-mutation.ts b/packages/vendure/src/utils/mutations/add-item-to-order-mutation.ts new file mode 100644 index 0000000..5ed41d9 --- /dev/null +++ b/packages/vendure/src/utils/mutations/add-item-to-order-mutation.ts @@ -0,0 +1,15 @@ +import { cartFragment } from '../fragments/cart-fragment' + +export const addItemToOrderMutation = /* GraphQL */ ` + mutation addItemToOrder($variantId: ID!, $quantity: Int!) { + addItemToOrder(productVariantId: $variantId, quantity: $quantity) { + __typename + ...Cart + ... on ErrorResult { + errorCode + message + } + } + } + ${cartFragment} +` diff --git a/packages/vendure/src/utils/mutations/adjust-order-line-mutation.ts b/packages/vendure/src/utils/mutations/adjust-order-line-mutation.ts new file mode 100644 index 0000000..ce9864b --- /dev/null +++ b/packages/vendure/src/utils/mutations/adjust-order-line-mutation.ts @@ -0,0 +1,15 @@ +import { cartFragment } from '../fragments/cart-fragment' + +export const adjustOrderLineMutation = /* GraphQL */ ` + mutation adjustOrderLine($orderLineId: ID!, $quantity: Int!) { + adjustOrderLine(orderLineId: $orderLineId, quantity: $quantity) { + __typename + ...Cart + ... on ErrorResult { + errorCode + message + } + } + } + ${cartFragment} +` diff --git a/packages/vendure/src/utils/mutations/log-in-mutation.ts b/packages/vendure/src/utils/mutations/log-in-mutation.ts new file mode 100644 index 0000000..75e2ddb --- /dev/null +++ b/packages/vendure/src/utils/mutations/log-in-mutation.ts @@ -0,0 +1,14 @@ +export const loginMutation = /* GraphQL */ ` + mutation login($username: String!, $password: String!) { + login(username: $username, password: $password) { + __typename + ... on CurrentUser { + id + } + ... on ErrorResult { + errorCode + message + } + } + } +` diff --git a/packages/vendure/src/utils/mutations/log-out-mutation.ts b/packages/vendure/src/utils/mutations/log-out-mutation.ts new file mode 100644 index 0000000..6f222c5 --- /dev/null +++ b/packages/vendure/src/utils/mutations/log-out-mutation.ts @@ -0,0 +1,7 @@ +export const logoutMutation = /* GraphQL */ ` + mutation logout { + logout { + success + } + } +` diff --git a/packages/vendure/src/utils/mutations/remove-order-line-mutation.ts b/packages/vendure/src/utils/mutations/remove-order-line-mutation.ts new file mode 100644 index 0000000..47a8903 --- /dev/null +++ b/packages/vendure/src/utils/mutations/remove-order-line-mutation.ts @@ -0,0 +1,15 @@ +import { cartFragment } from '../fragments/cart-fragment' + +export const removeOrderLineMutation = /* GraphQL */ ` + mutation removeOrderLine($orderLineId: ID!) { + removeOrderLine(orderLineId: $orderLineId) { + __typename + ...Cart + ... on ErrorResult { + errorCode + message + } + } + } + ${cartFragment} +` diff --git a/packages/vendure/src/utils/mutations/sign-up-mutation.ts b/packages/vendure/src/utils/mutations/sign-up-mutation.ts new file mode 100644 index 0000000..410e395 --- /dev/null +++ b/packages/vendure/src/utils/mutations/sign-up-mutation.ts @@ -0,0 +1,14 @@ +export const signupMutation = /* GraphQL */ ` + mutation signup($input: RegisterCustomerInput!) { + registerCustomerAccount(input: $input) { + __typename + ... on Success { + success + } + ... on ErrorResult { + errorCode + message + } + } + } +` diff --git a/packages/vendure/src/utils/normalize.ts b/packages/vendure/src/utils/normalize.ts new file mode 100644 index 0000000..adde436 --- /dev/null +++ b/packages/vendure/src/utils/normalize.ts @@ -0,0 +1,62 @@ +import { Product } from '@vercel/commerce/types/product' +import { Cart } from '@vercel/commerce/types/cart' +import { CartFragment, SearchResultFragment } from '../../schema' + +export function normalizeSearchResult(item: SearchResultFragment): Product { + return { + id: item.productId, + name: item.productName, + description: item.description, + slug: item.slug, + path: item.slug, + images: [ + { + url: item.productAsset?.preview + ? item.productAsset?.preview + '?w=800&mode=crop' + : '', + }, + ], + variants: [], + price: { + value: (item.priceWithTax as any).min / 100, + currencyCode: item.currencyCode, + }, + options: [], + sku: item.sku, + } +} + +export function normalizeCart(order: CartFragment): Cart { + return { + id: order.id.toString(), + createdAt: order.createdAt, + taxesIncluded: true, + lineItemsSubtotalPrice: order.subTotalWithTax / 100, + currency: { code: order.currencyCode }, + subtotalPrice: order.subTotalWithTax / 100, + totalPrice: order.totalWithTax / 100, + customerId: order.customer?.id, + lineItems: order.lines?.map((l) => ({ + id: l.id, + name: l.productVariant.name, + quantity: l.quantity, + url: l.productVariant.product.slug, + variantId: l.productVariant.id, + productId: l.productVariant.productId, + images: [{ url: l.featuredAsset?.preview + '?preset=thumb' || '' }], + discounts: l.discounts.map((d) => ({ value: d.amount / 100 })), + path: '', + variant: { + id: l.productVariant.id, + name: l.productVariant.name, + sku: l.productVariant.sku, + price: l.discountedUnitPriceWithTax / 100, + listPrice: l.unitPriceWithTax / 100, + image: { + url: l.featuredAsset?.preview + '?preset=thumb' || '', + }, + requiresShipping: true, + }, + })), + } +} diff --git a/packages/vendure/src/utils/queries/active-customer-query.ts b/packages/vendure/src/utils/queries/active-customer-query.ts new file mode 100644 index 0000000..65b2807 --- /dev/null +++ b/packages/vendure/src/utils/queries/active-customer-query.ts @@ -0,0 +1,10 @@ +export const activeCustomerQuery = /* GraphQL */ ` + query activeCustomer { + activeCustomer { + id + firstName + lastName + emailAddress + } + } +` diff --git a/packages/vendure/src/utils/queries/get-all-product-paths-query.ts b/packages/vendure/src/utils/queries/get-all-product-paths-query.ts new file mode 100644 index 0000000..29922dc --- /dev/null +++ b/packages/vendure/src/utils/queries/get-all-product-paths-query.ts @@ -0,0 +1,9 @@ +export const getAllProductPathsQuery = /* GraphQL */ ` + query getAllProductPaths($first: Int = 100) { + products(options: { take: $first }) { + items { + slug + } + } + } +` diff --git a/packages/vendure/src/utils/queries/get-all-products-query.ts b/packages/vendure/src/utils/queries/get-all-products-query.ts new file mode 100644 index 0000000..1b44b20 --- /dev/null +++ b/packages/vendure/src/utils/queries/get-all-products-query.ts @@ -0,0 +1,12 @@ +import { searchResultFragment } from '../fragments/search-result-fragment' + +export const getAllProductsQuery = /* GraphQL */ ` + query getAllProducts($input: SearchInput!) { + search(input: $input) { + items { + ...SearchResult + } + } + } + ${searchResultFragment} +` diff --git a/packages/vendure/src/utils/queries/get-cart-query.ts b/packages/vendure/src/utils/queries/get-cart-query.ts new file mode 100644 index 0000000..7faac35 --- /dev/null +++ b/packages/vendure/src/utils/queries/get-cart-query.ts @@ -0,0 +1,10 @@ +import { cartFragment } from '../fragments/cart-fragment' + +export const getCartQuery = /* GraphQL */ ` + query activeOrder { + activeOrder { + ...Cart + } + } + ${cartFragment} +` diff --git a/packages/vendure/src/utils/queries/get-collections-query.ts b/packages/vendure/src/utils/queries/get-collections-query.ts new file mode 100644 index 0000000..ed09196 --- /dev/null +++ b/packages/vendure/src/utils/queries/get-collections-query.ts @@ -0,0 +1,21 @@ +export const getCollectionsQuery = /* GraphQL */ ` + query getCollections { + collections { + items { + id + name + description + slug + productVariants { + totalItems + } + parent { + id + } + children { + id + } + } + } + } +` diff --git a/packages/vendure/src/utils/queries/get-product-query.ts b/packages/vendure/src/utils/queries/get-product-query.ts new file mode 100644 index 0000000..f36c730 --- /dev/null +++ b/packages/vendure/src/utils/queries/get-product-query.ts @@ -0,0 +1,45 @@ +export const getProductQuery = /* GraphQL */ ` + query getProduct($slug: String!) { + product(slug: $slug) { + id + name + slug + description + assets { + id + preview + name + } + collections { + name + slug + } + variants { + id + priceWithTax + currencyCode + options { + id + name + code + groupId + group { + id + options { + name + } + } + } + } + optionGroups { + id + code + name + options { + id + name + } + } + } + } +` diff --git a/packages/vendure/src/utils/queries/search-query.ts b/packages/vendure/src/utils/queries/search-query.ts new file mode 100644 index 0000000..f95c437 --- /dev/null +++ b/packages/vendure/src/utils/queries/search-query.ts @@ -0,0 +1,13 @@ +import { searchResultFragment } from '../fragments/search-result-fragment' + +export const searchQuery = /* GraphQL */ ` + query search($input: SearchInput!) { + search(input: $input) { + items { + ...SearchResult + } + totalItems + } + } + ${searchResultFragment} +` diff --git a/packages/vendure/src/wishlist/use-add-item.tsx b/packages/vendure/src/wishlist/use-add-item.tsx new file mode 100644 index 0000000..75f067c --- /dev/null +++ b/packages/vendure/src/wishlist/use-add-item.tsx @@ -0,0 +1,13 @@ +import { useCallback } from 'react' + +export function emptyHook() { + const useEmptyHook = async (options = {}) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/vendure/src/wishlist/use-remove-item.tsx b/packages/vendure/src/wishlist/use-remove-item.tsx new file mode 100644 index 0000000..a2d3a8a --- /dev/null +++ b/packages/vendure/src/wishlist/use-remove-item.tsx @@ -0,0 +1,17 @@ +import { useCallback } from 'react' + +type Options = { + includeProducts?: boolean +} + +export function emptyHook(options?: Options) { + const useEmptyHook = async ({ id }: { id: string | number }) => { + return useCallback(async function () { + return Promise.resolve() + }, []) + } + + return useEmptyHook +} + +export default emptyHook diff --git a/packages/vendure/src/wishlist/use-wishlist.tsx b/packages/vendure/src/wishlist/use-wishlist.tsx new file mode 100644 index 0000000..ab41921 --- /dev/null +++ b/packages/vendure/src/wishlist/use-wishlist.tsx @@ -0,0 +1,46 @@ +// TODO: replace this hook and other wishlist hooks with a handler, or remove them if +// Vendure doesn't have a built-in wishlist + +import { HookFetcher } from '@vercel/commerce/utils/types' +import { Product } from '../../schema' + +const defaultOpts = {} + +export type Wishlist = { + items: [ + { + product_id: number + variant_id: number + id: number + product: Product + } + ] +} + +export interface UseWishlistOptions { + includeProducts?: boolean +} + +export interface UseWishlistInput extends UseWishlistOptions { + customerId?: number +} + +export const fetcher: HookFetcher = () => { + return null +} + +export function extendHook( + customFetcher: typeof fetcher, + // swrOptions?: SwrOptions + swrOptions?: any +) { + const useWishlist = ({ includeProducts }: UseWishlistOptions = {}) => { + return { data: null } + } + + useWishlist.extend = extendHook + + return useWishlist +} + +export default extendHook(fetcher) diff --git a/packages/vendure/taskfile.js b/packages/vendure/taskfile.js new file mode 100644 index 0000000..39b1b2a --- /dev/null +++ b/packages/vendure/taskfile.js @@ -0,0 +1,20 @@ +export async function build(task, opts) { + await task + .source('src/**/*.+(ts|tsx|js)') + .swc({ dev: opts.dev, outDir: 'dist', baseUrl: 'src' }) + .target('dist') + .source('src/**/*.+(cjs|json)') + .target('dist') + task.$.log('Compiled src files') +} + +export async function release(task) { + await task.clear('dist').start('build') +} + +export default async function dev(task) { + const opts = { dev: true } + await task.clear('dist') + await task.start('build', opts) + await task.watch('src/**/*.+(ts|tsx|js|cjs|json)', 'build', opts) +} diff --git a/packages/vendure/tsconfig.json b/packages/vendure/tsconfig.json new file mode 100644 index 0000000..cd04ab2 --- /dev/null +++ b/packages/vendure/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "outDir": "dist", + "baseUrl": "src", + "lib": ["dom", "dom.iterable", "esnext"], + "declaration": true, + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "incremental": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/site/.env.template b/site/.env.template new file mode 100644 index 0000000..a9eb798 --- /dev/null +++ b/site/.env.template @@ -0,0 +1,56 @@ +# Available providers: +# @vercel/commerce-local +# @vercel/commerce-bigcommerce +# @vercel/commerce-shopify +# @vercel/commerce-swell +# @vercel/commerce-saleor +# @vercel/commerce-spree +# @vercel/commerce-ordercloud +# @vercel/commerce-vendure +# @vercel/commerce-kibocommerce +# @vercel/commerce-commercejs +# @vercel/commerce-sfcc +COMMERCE_PROVIDER= + +BIGCOMMERCE_STOREFRONT_API_URL= +BIGCOMMERCE_STOREFRONT_API_TOKEN= +BIGCOMMERCE_STORE_API_URL= +BIGCOMMERCE_STORE_API_TOKEN= +BIGCOMMERCE_STORE_API_CLIENT_ID= +BIGCOMMERCE_CHANNEL_ID= +BIGCOMMERCE_STORE_URL= +BIGCOMMERCE_STORE_API_STORE_HASH= +BIGCOMMERCE_STORE_API_CLIENT_SECRET= + + +NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN= +NEXT_PUBLIC_SHOPIFY_STOREFRONT_ACCESS_TOKEN= + +NEXT_PUBLIC_SWELL_STORE_ID= +NEXT_PUBLIC_SWELL_PUBLIC_KEY= + +NEXT_PUBLIC_SALEOR_API_URL= +NEXT_PUBLIC_SALEOR_CHANNEL= + +NEXT_PUBLIC_VENDURE_SHOP_API_URL= +NEXT_PUBLIC_VENDURE_LOCAL_URL= + +ORDERCLOUD_CLIENT_ID= +ORDERCLOUD_CLIENT_SECRET= +STRIPE_SECRET= + +KIBO_API_URL= +KIBO_CLIENT_ID= +KIBO_SHARED_SECRET= +KIBO_CART_COOKIE= +KIBO_CUSTOMER_COOKIE= +KIBO_API_HOST= + +NEXT_PUBLIC_COMMERCEJS_PUBLIC_KEY= +NEXT_PUBLIC_COMMERCEJS_DEPLOYMENT_URL= + +SFCC_CLIENT_ID= +SFCC_CLIENT_SECRET= +SFCC_ORG_ID= +SFCC_SHORT_CODE= +SFCC_SITE_ID=RefArch \ No newline at end of file diff --git a/site/.eslintrc b/site/.eslintrc new file mode 100644 index 0000000..96856ac --- /dev/null +++ b/site/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": ["next", "prettier"], + "rules": { + "react/no-unescaped-entities": "off" + } +} diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..22f1bf4 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +.next/ +out/ + +# production +/build + +# misc +.DS_Store +*.pem +.idea + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# vercel +.vercel diff --git a/site/.prettierignore b/site/.prettierignore new file mode 100644 index 0000000..105738c --- /dev/null +++ b/site/.prettierignore @@ -0,0 +1,3 @@ +node_modules +.next +public \ No newline at end of file diff --git a/site/.prettierrc b/site/.prettierrc new file mode 100644 index 0000000..e1076ed --- /dev/null +++ b/site/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/site/assets/aboutpng.png b/site/assets/aboutpng.png new file mode 100644 index 0000000000000000000000000000000000000000..1d6ec45b522938b3181b395a3a0b1f9d26e35ad7 GIT binary patch literal 174031 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

qQms*E^8h$I7*dxT+v-?dL(-HQZ?AC3#M^^1y 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%0AV&6=lXqGi@1$WC3Dm1wrH(m7h@!C-o0f1P% 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 V4t`n$h$G%CrSHn9!oK_a{{cQYl#KuY literal 0 HcmV?d00001 diff --git a/site/assets/aboutteam01.png b/site/assets/aboutteam01.png new file mode 100644 index 0000000000000000000000000000000000000000..f3798e99d4fe22a56a0213417e2f146536b0fc36 GIT binary patch literal 113618 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

27WmI-V@Sj&uAcRT(cV7e z2kj^eCn5dn2mCdBh)54a4d|HXm8$KCnH{sV~X(oNqZm_nR+4a|F3`|Zb-dHDKg^c@_hYBA^ZUy3;z(Ph-g6cX2E{{e69^TU@l32Ly z2X129jwKemLkDish4RXxWmoA1*^J|9zTWZC`%L|9zcSYIG0ZSa%n`)A`JR~XD!t?Q zpThJ3g>0m>6(nHii%extRy(jHB8qKJ0-$ z_yS+u?_yuwuVF8n9!dC)HQpEQZ?e176~xzye$uwYIBofx*Svp8DRTH9?l*s^e&wD| zwEmb=QujYVmPD@q0HK$oJhSf2kJcy*0(!AchrO^rxnNe0s6VJK_45bqq(8aBuI9gN z%>?XXSnM}KzY%Fa@kqfU{w;FR-NhehFbwi5^#&n(eoaSvXZTwgjz*6%t<(4>=le9qfObXw#>oGVIm5pO8tV#pRF}%mt zdbWaSC!L_1LFRVx-Ua0XH-(lp6wTe#k3?!jv1y~swceuKK|GNU5Y)%C1QhzlR11ii zQ=15472^=P*;5$6n+l$a)EYo}7!|(I^B85Cj%-72^T{mcQ@j#fV`Ml=B)`PE;t|9b z5iw3Qi*`c*GMr240Vq8t^xni#zo8%uqtQ23_9iRoVmEJTNltwwO_5g6nx=O@xFo?w z{iUETSBsg3c)YbEL)(^PNu;o)u+`C$zY`vX$up+Y;nAP0sk6lI=y3IeC)i$0>c6PJ_P?mM{{T__OELG6@9JVAhtZ$#tk~bNXa+s;oHOjrnB#W$ zOrW^+l^8qW{Y)DBg5xD2hW0z=qQxF9Df^fLw=#kKMonh0)%PcJ{6i6XHXp>pyk15E z8QulhSRQNWz@c6n7>&p4E#!$j%iv2wVauc|-g*h?`ata+k1?A=&LEl#GUm|C5j`+H zrF1-!k21SL^ma|fmJ zj>HhR?-y>B=dZN0lwW8~@1?=4ppg??%=;c6;E?h^=cIs zyHFt&m$29QoNDF#tM@G^UXS~jfcBr%5FO8;m`eSL{{Ra9p!Z(q^$ECuxm*W!_ds&{ zp*j6n2Y;%;aE9VR*=EV~$+5s%n0ym+hp@ti%*3oeWZKWNAJPzC&`WLI=!U~TaSk%} zLzC!`ztB(90t3P9PYdY*Mc8=n1MfRJF_MdrX{Y&QOa-WF4?9~l1?7$p} zRMYk{{iAn5{1THC-BJ21w9(use&k-e?I+opi45VNiF_T_{{YGis|r|-CQOdlOXcnf zE)LG~&kkUSf20RwmA(=2O!*}};yXs|7Dh7~#PrF36|FpJPUf~Ju6NjDQC785ycE1L z=%-+1srV1PwFkD_{6t)X!2aWxVZE=^-7|gXn{vYdMA+QjEf5T=m~-hdqaEgVFa{18OG?pU(ec{ck(bK_U9Ou^p>Tz*m0y@roO zs5DnLu>Hj4DY~nD5_Z|i57~!%p)vTB%RJVGRp zj1|mBhEh%2OC8{QEUTDzCApl*9h_B^SW7_ovcc&dwqXv*Uoc1`5T}3A9fe+#v|nq? zHyL}eCmzw92$+F|aDtY{#7(uY5yvtzrF-R>LwrOfhsl5_s8`F?4#mR=Ix z-P}|5jJ3B3zjD#>mwzxS0kAGos!rlRxyEOA_DohcAZ7vXTfd1?Al=C4=cN3G_-hmO-stIv_VM2#heD_a%LKTvFNlf2k=>Vq&RigS%E>;F>cu=7L+G zrAVlVnmHJ1iwjo6q^1%skfwPwSFj?4S@~_0@1mOgsZT!FsUOY} z*I(SFbh)_n?c}W+;)M^WH%B~ILxuqF6Qx;$Ue7oExP-5Bbs)&v4xOr~`1HM5^J4#W z21;iALT@0bY%HeEHkArVcnCXKH6K(*H=_RqOH!S>Z)j_uGa65cj!KV#xdd+o)54xX zYYy(de=qb%KeU5T_w*-Xd9W1eEUqbI4YRHfx^<+yzzl|MHYkE7`OW|V%jO}5#6{`&=^t{=i4 zwVn=W+*L2wY`LLw%Q2^|*+100*69f#F7%t(Sw{w>j^5L!oCf!OLQm(`^m+YW{-D^` z{+xbSagc?&DN9{fBWnfLl`&ceH>JfLcF+Hf=tBGH(TPu$pSRVa3&V4aE%c9^CkZE_ zk-}(k4|*yWp?lKx)aDQh?zi#)U-tf3w7p>0xkJBErLRW|O`2>~Rd@U5_ZQwhaq?14 z=T~*#Dn9z3<|lrl)?Z}#{|NtGcP>Ixc<)@hqM&B0=5HN*|MgE`p8uD-s{{L+R`;E% zk}(c^wN75`dNw~=`2M#4Hy7JqT>F(jZM(X;#_LMK&AvTLUVnVr_~ox(;+HPxLa)87 zev#C7mUQPAnSATdW9{>glI=)+c98`-P-+(uYx|{MUcqwav?iC@X(Q z4Db0ex3%r?gzcBBhrJk0Z`WMi3jDhg3zoKi-TTYrxqsIgmhS)e#X87(J^l6mW`J-r z9uTDyd$a#tXPxXvA+scR!bc(sZ(P||U-~48_qB4C;oQbi|GVzl+$6b)mcg+5BXbR@ zV0C%Q5{(N##y(@#$oh1b!0H#XZ+KtTTB2x3Eh@bE7N?vm^gK;a<;*-1b?A~;eg&kX zyszI(-}3W$N=Y7(B!ANzy__e3Yu3J?v1pbYn%VYs>sQ0Co1u}J_!Xv>!pkl~QoAY1 zA=*S=qv^h>$I#7xw6@6FE)ypDlye`hmbT4|)~ZFBF|b+xq2vJ?E@b7Tgk5A!ar2QL z7l`nhzJe^V znP?(CF}^~!X3>I3(K;$zgddX-b&(r+Xli%iJ19o5dNFzQ&2`6FodsX%o`QxsSw&UT z?Z-{J3#Wf$jVf1wP--e%2*psW55DTo(V<&;XcIWDZ}Fr^OR;kw2qSyYw3HgYan8&L zMJ=-*`WoOPMTH)f;#W!~+d>rTRkU-WzOORKBu?EoXa@t3c3#&V~zw5S~&R~s<_O0uV5SuwzK=nxC`@m*$QfW{j zyRV$-@7n{)mMHmmBh+)RI+psbVpa{Hq9MK;sgjnZ%fOM;6 zJNeL|JNWe;J*wOuq&&)>!K$#9kM;ImnLKy<-fra4e zvKI%PP`EYy#rJ>W+{@vNj&n1Ev{t0fhm7684L1Y6tZ!YkP$k>;Qu!I7P;Hj0kNCzu z_3wgyh>a^?9Ju)239;#d6g6$Pvm+M)$pD}1djLO`{_+%kuwH)5EFo$o2Uc17KyEdk zXiXZ8hKYyp%Y4fyrlH`K6iM=y1|K4DDCR=bf`ja;2R-CY)YPr3moCm43(6x+Uc?4k zv$l>`;=15z0z6)l^9~BPRq(=bA4rOrlnPuEhfgJp^{RT@{|gNcOFKnD1R-x%Rg z%!aso?UieeHvZmgo5c-n{HjQt+1N$G9&ZAWXvhLumbyYo4m(b(z~QxXHF#is>1i>z z!RS2e4#U!r#|`Hn#f`yhWDKA1hMtK|+DZqxYT4EE_q+Gne&wLCHfEKpBu~bcII%k( zKvEGH3ZM-2T&tcx2hIzA`6GEfzme2|?!*u(8RW*y9zQFXw=t3g_2Qe8UXai7xAyOP z5&PI|#U<};zc?eVC-%Td3@(RhN2Vk6Z-HD~*_-r=i(nYX08Ow%!= zaNwIeGYvbD1}C(8kEwQ?wYOJr8q=c>CUx@L{vNqA^B{0#J}Bv0ke@4yrl?d+u-i%? zfVyUFP)r!>3em)ES8A|phqjHHtxV<}=2!AmL_vBM!>4QRwNeAN3d0dVl(W=8Qzzwp z_6%y@WwQ~2)_c#oktVFi*d>(IMP-DQ8`bqg>`bR=Uw251lXt;6bxTbi$}7QL^y7_T zN73Y_KbQ5PJ>=%P1_L|8)yto^FQ+x_IYM}burdnn3NC?1&M*+$0{XGmBlmIehj#)( zA!h2{4Gb7>`*M?yzpV(b?P3@aK-{in189;{ndXL4BR4c{&~({~XRo*&IvfC?reXud z*CrdzuUs&W_NIYr;3-OvRcdoY^x(>-6rre}>Y0~R4qZpWrvorAh|eCVjzk;mE5m)@ z2=%bZc<}X^zzLBT7U9h3zRNV+Mq!*8+-dL^H}nkJA7*C=@Kek_)H>-s}!2IE{KE=J7l zV+EJ^o2+;Vm3W|;){hBL4yz{>yv9&6E46WW6An%7EPqLbH~5|06}X7m%U=%OLmLEZ z*ZNR?WHrD^aO^92Jkxw;ZZH)-%iMHNa{K6*y61T^q{I$V`lzx(t&@a$1;I|j%o{Zx zJPa9O%CV&8R<}O_^x+e9y2T~ zpnM*^n*lYw77R#Q)dj|z>J4dl9vVxosAnDD>S8W%Es>N)>e_MWjXAR!>blX47N!Wk$URzsO5Jlj3Yb5_WiYO}zIOILu~I-Iu!XigfB>)QLRgpVcbEQhus!H52GySEj*qY&-Z;wAxS7Ua2~^K1-1N* z#sSsRgNTV~tmL6d;sNpHfyst1da=>ArDB(1LzZ-V9@Y+Epn1yCW%LVb*U}Ajk8KI1 zG)5xin(l4I~nwJ3PDms5hkUw+Zx zvGQ`+Id$_?E=n{jhUNLWG5<7cl2EYCO;V)$Soww^8xSGnRttN3Tjzk5yDu8#6?ni0 zrm$|}9+Gq~1v>#)x@bnOFK;3kniiobEN5w~U}nuQnHVzvI z!rT-nl;YL8gL6bd2II!WJG9+8U_Ju-pa;h7E5@tmnsr_2D~^6fID)b&aC6(t$RyXc za!;_TWP)*%-H9TK(z7&jWb{@G^WNQpoDH$|wGLmt$MvlM;dQ3}kWNKn8q&s_=phbk)IwFQkj@Q33Eg2;mH98E5gD6s3k|dRFiE=eMaKYRbCO zi8K8-E_=!%(Qd-YG3gcn;P8sIlnaJ{K0&2!cF_c=ykAb8L&g#$-GT64p%@f@9dkvW zvRg9f+MFf1K4w5POrpg{V?T1=P!#E|qA*xI^h6M~_dIvLs{SJRY;YA$%~U97Tino; zq@*ND%tFyk~b=d@&@9QgXEi95=6pV`F1BrX?Il-v-`Tz95-s zna)zuB(xkf%Chic0Iy>Ijbe33lE*O+$bd#0dV)Z00u>2=hcW!+TN&I+vfD(2t z(QsR$rejs#YRgOGoJrjn<(v#XJvO>UiOs|Xszn(O9il6nFTA%x>#fpjBTf(ifhhQr z3^MxAFb-diVeQAF!tRR0!omug6Om!zSqFy>lAIcK(hzx2v9s~rg7rd?LUSj$yb%u> z2_xH(+KZyol8Nz{K???Z-sca&y-LJ}VH4{Z59ML$Era{R-v$&h^H7c6;-O3ZZuc95 zs>ikB^E|jV-%3h{$Xwr049O%MJ6#;; z14NYc95wI9nwH|bDeI$HZ$oX805N^8Q13OG+Lf_H?atz51M}mCx4lkxGq*l|!olqO zU1qLjjYLD9j|GtzhpaD~5dI9Uzjeq|aQ5c9c&Rqu!q&#Lf+s}bXXSS69`hcgpRYcF zC(;aq@ZEWU?xAIa7QX2-3jefYrwP^3EUuv%)qK_U=lfxK>z<2zG12D~pS2Dx_qx(4 zZx1L`RgpupiNTefR`_S9Y@QJisB4^PZgj5JIzVZVi4N%kjAda&~)i(gN&2`WxjPoe_uq{!+lJpodJQ-d;y4>6wlPw4ytMu-U zcu+njKIwu*?(}>EIXh(TGv;1l<^;twDFI|`oKtdF)ubhCN zob?XRbLXL&XhT{FCFwdeK8outJw|2hS*Os*Lpj&Xmmn!DDph+Z!3z@^`C)%$@rWSF zM51)ErjWo+I^m9GE0fPB!lvFvh8(Qeg zNN6=CXu>7Pu$5oDk>R8cG~`?iDZ!OW(}_!R=rMnD5ME~#-2cN_4xx@~ot<`YE^&tl zmwImc9NrOjF<$ls@Io2_D3-}+8Lg?Ci3&6n{W_ZVlNMZsJO;8vTw>`yq4U|JKaZl6 zLxvG<-4WeHoiVWoZP1^3H|{8G@R3+7-4IIacwT?ySW*!vM6fJ*s!%}6c;zFBIg(IP zcUnJT*|bPF(XomN(Bv_~eMLGJZHTAb3mWglyzRg<5M!d}GssQdxks!kG*_=Z%c3n! zl&E!xO}Iva=1zG%lbUug^N2Ci89dWB;#adD&VTDQ_Vmj@-w%VRyOIb=q6KQwymvi+ z9-f{vGi(s5YWO7d!Wt26oZHV)(7bs|QsgeROp=HU$TfMl|7Vfo>Cyku{_d!Zn&kXh zJMY!wvQmM#&`~~cq37p-J6lW(*xR~4?MfLVwH2kOCkBA)nuiI9Fn4z+-1R%(FsS(i zp<}Tmsi}Y}2l08U9S-{n)St>vnm;i@<|@oB291KxWF(mBp#^AR0u7q3gP*p}NnyZGS85%C@4G1t%y-`O zrMu3TMG`n7LU6eyY77AJN{$I~lZQ3#n14DW&-L0-J2Jd$+Vm_zK~N~tvkvJd?pRX0 znIu{|NT+qNAq1N4wxusVZIgsK3mI3ve20E6Ms~= zyu?^+u7i9#Pp1$6=MVXSO>>qG4tz+o+;k88)q4>|0#NV8Wo3s_tvH|jyi_RBd*E|p zXv*(rz9r;EM$dUL!5N}5tWN7M%!S4(Nc)OGPpq#-zP+3QTd%)}5=vIpxkRaPYT3T`~`iTash;F7EE# z^nW6y{(mARSZWX~(5ofV zI#>Uw&zD~C!k^eW5b>@u^Ci9Fgv?x?}2Yet0EQZ&aLHN8(qdexI5{^HyZ`P zJd{b;^{9VN!QH)CaF7JH=!pCt_`f&l^wuQ z3BDE1!-TrO3;QP^Ok(f?X0Op`27>go8DgD#{07hZLapK)GP{v(go9dzoDE^$5d{~u zHXi;bkj%Y6fZ%R_Lw$XZsB#x9~h83ist#J}t?Ge-agOp3D(tdR`9R+b||R+6u{_U-%KM zg=^kjI2A&PX2f9{<$9LfD6U(X$Jz7t8kk0IoLvR0TK(B`I;F_eJI{FU)v}_TVF!#W zyhfnlS?-9Bv(8c-@}K%V_4WzUtc8&F!$6tWE}h}#%eN-TkatIf^zA(K_MYQNXAL3G{+=gdvc83$mXG4g1*zxK9~f(-mbK_L6fAGp8u09f2ayvoI;6L=7;Zy`j1*g zSggM#lgPxQ-IUx$6i)cQm2Bg;?LDTM&xZ`)8Uxef*{eGYR;*uar3Wj^NDg2Ph^|1S zJL$PEYxfXmv7^&T9rnKUx?1OxI#$!*C3wz6?Ra*_%1r4*z0Vr@;N8WY3_^P-ec;wi zlY^SLFAG`8s{4@!`FVEknKS&T8)wVt)MzNsIE|VuqXtY8P6uuTrkSbw&>fzglX)fgAr($N_*5&uz~#^JRtc(!)kGZemn(*e8bygGyBO&# zH^jR2oFmhIvvW@GTLB{>m%@Ltc4|2`aK78f3edj2TEbE#t&2l>CK9}L6&(^ljzgl z7uOt6WEd8j>9K+Z=8yR~_p!02EC!A7MhJTs-g~z4`C#MD zMErr4xqP3oSOyr{7=R_mnkIWy_Zq)US;(CaCU zOOI~a>Ma(3r%Zj8=!-y@yD_eqRt1W}W*{{)vkGo6`>0Wrx+g9@d#-Eq$tXr^#|Cu5 zMjNYvwktDv)#Go)<11UoCS+Z+4Q^eTSy%|Y-# zD$zof?}o^5Wdr=DOj3NV|GGRfCx@DRzK=y8h;3wZ+j;Ut%ru#I1sZ8Zxs*=%Si;9h z)6jbkj`=tV5s}FpX2(~=XgLZuO$I>GM~N-wPbe-4ANBEkut9zXPK%|9xS+!cT1oUa zvqSVXeadBx4b+x1mg_q^AfD^(8we+iS2nq5 z>|8aVDrcQVi+DUUoE+J|3AC0fCYtLKGk>*oxXX)98uX#vFG0iLbRAcU_IK&Mv+0aN zo0j%ZXsbk&o?FlSQ#t1{$4tKG-BwXWOIoXU47~E5ejlZ6(jl=Gohr;Kw#;YFsZ{W%y z7qF!EVn$74IvD%>qiGD3F2Z7))Scbg%uq7BsaHt$cRq?~o)Wgb_=8^>sYz!(>;K^A z0}mplNS8j%UxDi7-u=$QL8yuvU-7h|N>L#btC*nVf%db^o7nIfj#}D)^mC25JQ9*g?8LT)8pu(27Bh0w1xGs8 zAZ?!eq{KSkM|%1j9%|;dVsIdOOVV7EuqMqP@5BAJW@xb0DsQM8ZytkJcRHb(-_1Yi z8M~y}$7};xtd-CRZ1-+V>@7tRb8RbB-V&yVx@X^=$=Lq3+PN;9E1UMcKwrm}&B9hT zK02w5L^bQ)itLwu(bF-KDyr`Fo$D_g0EK6> zg>Z(Q^V;UHNs`yw*d^j>af5&{~rP&nB z)L{azIR%O)5j$z8Q}I=M=Zz>l(ZrciZSS3!Nq;?2df~>Sro3idTZ_8or;>BY6`48H zipsV-QALe(#{VbG%=W44KDJGOD$z$eK+%fL1zFxa_c<8KA6VOHhKIV<0blUzeU3oabP7mC@z7+8#DF!Ba(RXu3~mH*cwjXxN~= zj+uxy8Y~Fb$}>#5)=(-ievo$5n(`|yKn1!`fVn|?RnAug!z8ZX@Y?9x0G<0>a(}o7 zJjCXL<7x}Z2>~_EUa=`1WWw)hBz+--_IKll(!HW zX=&%)UQY48T@^p$heb87nmfNqesDA2w-qwVYxc4KBY}sS^0PuoCq&du=a_!se;W+- ztOic4K6#vDVi9>+ijA3{At^jVWl3aZ)uKdV}qPo_Q=i6uP>?2prqx2CPf}V5l&wG z48N5Yy(7=^kfP#fNb!D%@A2|8IyGOf-o@0zkWI58Ikh7)0HmQP)L!8h{{(0iHii^g zngV5+`LWPQYoZ7gV&##M=;Y7^<=9;KE5akuXJ3Z9`MX^>hTq0P>kENEq;<~Y*cO4J z@~ncx&x+QBW5>E+j9({ukXRTXK~csyO8ms6j(o>P$=r12yAof#(siWC!IBEK0=7dq zg4rK&W!MRx=}iD?mBI?Y2S@lor4b|(hc2sAR1ngNlPcy3?G^@Qj{k6yzg zBKpY{m0Qvw=V9JuTSDCezB?4C#wt=?yG5M1*quf-fo(3R0EB#`r?3~`BQTRTZsF;~ zcc=grkI#q3k;LE(f`@$cwsONmom+ujW=^#XTrt%;mmx4bINab2NoKo?T@h+AX|Uz^ zL{D+jomSJvF|0A=Fdo1h01R!C?jUyYFa$}y=^aC=+yl)$QA~RN-D+lT5vT=4242G% zLwnXgH1FLI6o9qAzOg8ps!O^qPX9^W$qZ+h@<7~oM^e3$F2X8PticH7d6$5(6Qz6C zQvjq_T^d68BP1m8?$bJM^qF{~ zspF%FA5xw-cxRZ<*taF6o2v(@264iP)0KGz7+@ zDmzt7gy9{CJS=2X<&trt_O8av^<%iAVzlFcNAbj&&o=LYQ?AaUj;-lcwYLHuPf7O8 z+j&7nBli-IQQwdPZ6USK5{#o%%5unTMo$O7oY@`>7)RM>Xqh$$x3-E2QAP^=v9}o( zz100UeZtZsO7agLH4hyi)*O`{IIX}gDK&&Qq$YSulJ z9{q52@B7-?TIGkOr3z0OW3fj1`-<@Q!|5o&YKGr7cY*WCIffiOtMqBUeh3FlD&oWG zVANn_A1y;M+hv0#cjh#Il-(g{+c+05g5jat37D3i_O_X&<7~6hOMCQ1it>D4p^8%N z^Is<{Nq(#nb*u)(xA|=ODEj+xU%;P?6phQv@?#78%l=pYBIaJ$ zZNZgCKYgw1)641=BdRa)VI@zQJ5Z8HJRJ;j)y!y_uOv}NEPIVv@pqwwX&0YXI0Lbd z&0^Tko}ZY42Wz~&w;DCtz@5a}-d3C(3W@qiU=4+AyNGxY{?V*{KlB6x_R*_fv2ysL zEm*kggmM|Oe+2gKv)*(zuJ_xP7@3RVJn_NJyeI5SGAZ)768kEW2=3o6DxxfvFJ(lp zt34CQm&G&5>`vurSP7UuP}6uD4kn@g zb+wpjd~8s5S9bSq@7WoV=y7I7!cN{!o)kX|5g@e3Xg}j_ir$x|?&N(!?LZsU&4F!cMiCL77w6Wz<4IJ zE%`p&b4J0U;m5dO{J-%=m}l9^dw*SpoNT-@BVY3K?C59!6Cx%DcMs5k@@em2A{CYg zOEz;n{pmEIYp4d*=V&(XX^wgx60mS}`@Sb>yMH5z#WyW>TG+*xN4g~(V8k8(aTtgD z`U6d&UcyLO;wyQ^L{UaJ-6_1Lu9=dsXn_J_8*58zpn|7jf?Hm0iAn5ta~z;d^aiVD Uo$M~{Ik0Rrw8wbi?Z40eAGCBArT_o{ literal 0 HcmV?d00001 diff --git a/site/assets/aboutteam02.png b/site/assets/aboutteam02.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0e2c2f221c85ee40546e6d90b08427ccae1ea4 GIT binary patch literal 104161 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 }hjaN>9n)i+KKQKu-AajV^ntVLg( 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 literal 0 HcmV?d00001 diff --git a/site/assets/aboutteam03.png b/site/assets/aboutteam03.png new file mode 100644 index 0000000000000000000000000000000000000000..ce9dc4b95a6196ed0d0bcbce37bfff79864d44fc GIT binary patch literal 367365 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�uJOtY-}vd_Afgb=|N3I`gOx>n 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�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%0ABIFP9txE+D|@cW=q( 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 P@?qUyW)rW`^nd@^EvZ03 literal 0 HcmV?d00001 diff --git a/site/assets/arrow_down.png b/site/assets/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..89b4b500764eb767cd16a8cee3d9b953233144c3 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4`~f~8u0T2>A_|V!7O$NQ6k;t2 z@(X4VNLYXV$HS+bKmi3$7sn8enaK$a%*t$RsceF*YVK@q>Y|KnY=Z7BGRzF}XBcO8 T-Sb)sRLkJ$>gTe~DWM4fGWH(9 literal 0 HcmV?d00001 diff --git a/site/assets/banner1.png b/site/assets/banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..21c8fff7f9caaba0d68abad31c21266b6da40d3c GIT binary patch literal 259566 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�u3BC;^VP&X0a&fG#H)~B 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%0DB_T8G=2(Rj^3nFvl=KVwR(xsjp@~rRm7{ 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 z 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�lcr!gF6LWpS4x1-`=sW zG50B2KvfYMto#5PIOt*8hy*R`92|8Ha-|KmF<9Me^K+e|m@HIB3~rx{va}ywk~A#` zn@cJz-av)=Jq#Wrm7YL&ZO`Pf3y)f1<{D|VSF~`1r| zz}$#`9ctF9Fw3j)D99yAOKD4ar6l>d6h(e%^;|giP~%}=`xN|4#ZDUHY7vMU4)<*HP>?-dpniJL8DkCiyzc>Z4Dp~pt zI#J(qKe)DK?2d!Oxow``r|D5!+yhi+wsxipUF3o&ik3yJq?yuR=&jtek}G36>}GIF zNypXWhqj*E;ggqV&bsUR(7!y?DP(;td>}jXFwfTzwrkE0GQBWQT0}`%Z!;K@p59GO zUz(aw^An!#m@d+>)ikbPBrEiCn-{utt-Z{febthko&Bu1-sy66^z9>WGOvgGw_0mk zJmJR$&tMp|x;#!jJ2)@md*ucD>FVqs)b}s*-gB%HT8t6$kA2v5Qh<|I%0DjSYqYMd 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 literal 0 HcmV?d00001 diff --git a/site/assets/banner2.png b/site/assets/banner2.png new file mode 100644 index 0000000000000000000000000000000000000000..26f58b64c7f41286e1cb6d9bb7c0e2b99e7358f7 GIT binary patch literal 408442 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%0Dm`-@ZsU%*SNzTQO1u~ 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

I>iFe#sbaK1NcW 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�`Z16{!PMbP4m01`<;8sE z8|9dvja@QSnGziC+{Y$Rx$0`RSB_$tLmlYOSkKLI3AW%h4-TF&i3Wu?V-BT~ypSX0 zmXf`EeUM3|9(l!H;z%SzNt7)KL)e57|7c-?iXdF_a8oW?BhcmX zAL!<}fO}fS{FLrSIzm!Ywhy0NHw$<7}~HWbO> zVrCU)W#!7n#pP8wpu>`qvE^%AM%x076LHHbN)q^Tq3_xTRg+v%gH|YuOb*)Aa|jfh zJNRWB5{djjq`hTOoJ|`w_=E&^cL?t85Fof~U|?`}1`BQp?gV#-;4Xtpa1U;SySv*? z-mPzIf9$`l>bvTurmLn3=+mdqIoH*I3?`WO49&)sJbMyQPBvX-4hd|Y|BmEf?Gu$6 zwL9}w@}O0_foNF;1;3PJ+mEC8%T~w(36V&BfF+=Bs=&0pA#$QnUZ)Co+CwCzHGxpW zKSO+S7i)Q9Pwmo`5*J?mP*`(vHtB-}TeN9Q{-D=X*l7jfvmEx_`ORX?n9+lCVyTLE zsz){H@t}mZ2*KBPKfZ70OzrL?;Cq-yr0GBb86L*MO{n^+HZm+Lp62eUe4PhUX%9q73g5z9(4C2s$&ut2!TX%&9Uy^nyPIw^A4rV1*zW zf+XIcJv=mouNMRtWyy@F8p%1~mWGG|GBJ6tq?d+rjHvu!Qq3q_5d59dJA+tZ zpb@`9wAxf2k`HUr*xv#}Q~Xp_LWi49ONF2V`` zT!jS6iyP}h|I{IIIwLoy#4F2Npv|FFq3L~eSzI1SV>vgb zZu@zsE5)rhRQP5msAO4hC731GTdJYMX7KYHXt& z)Z^M8;4u~Bu@>Sp5aBT$bi5)!5?VYJLlDDih_}f+;JRW!3kvrK=CW%e@FI z?TV}0xS`jKv24sD*N3( zG|p?F!rnP>TK!-0Td`%a@g+F>ly=mq+4onLh?BR@mgDn7)0QJ~DD-CG^vV4hF!{f? zw(Wahj(?l)Bf~!1iv4lQmrfB|HzL6Hzj<_L@6|>z&>}=)lo0X?Eg}?bG!{%W7AYNw zS8vc91_i^{#a${p7i?asZZ}UZCX00mAo#&_sRmA)#}ml)tj+hh$o>rEd(`Ig0#3C7 zGv*cvw1DJTz%w@t5Er%`C&rrHVcV3AW#!tKPUFuxXW{Z9!TAVF;Bbx!hh==x4ac8_ zHemCt^nnjo-u3vHp`H1m4KdTg3b17@;$Bf;`JSeP4(T$dWpXQt2(MaWQ&>Of*n>9a z{F>c2CHPU2x9YmciqFPz9n|MiP3WM`q+>$dIm^1|5(;D{8BAGXmhSRpE?2s_QM3JJB_6O`i2+%mh~FlB!^uF-g2>j?*7#$T@1TySFv!2 zh!gwS{JTllLf9>UG$sQTVSyNd_O2#g5aF?2)g&O%>Cb)!Vs@G3uDTH9!0c6;j+n1) zLm8d=25O5IqKF-_n<;&L;y)hlWnMiseUrw|v(*n`b;oF)9xxH-Qy_e`!-Aw$#`~Y9#;FZ%W({&k@z~wCM?YpV77`1LqTn9TLQ8%=P znRQVi-xr_dYf)>^=AF!ZvnwM~_E(Ih)4ay|Nbg~W9ef-PPC;ce0Tp)?d(Amg+YIK> zqe%nii;C;&99&QV{0T5H?P-sPGD&8Ck= z0YTnu>w+KR1rA-YzjR}oh9ir>^3~{&C4&t$8MK<=GEKFR<_llr51q5=-*uE;rYS#z zuMFgynlJKjEaf!mo`~`dI%?vKzdm#3+eVWUU`XVf<*dqC={r8%oWH&At~`;^ctIB) zse5+_Sdp1>vvq}bK08!vkM?7yUW)ENGP9WP-bsu}1Ag=hge@QcIeyl6=4c-YhOQOo z?52SW~7%b^cjIOTR`0Z$pS!LPjK)>9zvMBV;pxQ9r$mj$dr9=2va)wzm9~@%+mel`nDR< zVIFok?bdph#F45#DJ##l&2TzacxyC4DADO)k|$?ez|`&B7WxPvR7oJsn+U74K=Peq z$KKUPNpAeBsji^V<6Fk*Tp~M~&)O9>F+${JOMFmKW?A7)(A!KFJ2M{PpXSLDHM(JD zVU=E+t(NHp9}n!K^FU+}YiC7w3;a0RKzLn20|$;!ka8*=Qikm>+5-4KbWlJM%)tFW zsk_fejQP3wj0Qey7y zD5^jNOiN$rTbXQ{a4~5KEj2Hpg1v!lOT&MP;9m9_fgMYI(~W{J`wC8^lV+fImfxaX ze;{wf1YIqWo7$W+GV!T`nL{VF+_dO)TsOO+{>4mbyZC{vOkOi@B= z!pdK0U#0A+@M_1fuT!6Y##6wUQw5dNYFnoVf{0NR*cp3+;J$%Ur@!vQDiGKq8=(b? zptNErJ{$k}*o$;5jFz0PIHonZHB3sKC`n56AMu$DbtF% z1MPG6dfo%-FDAXB#)Cq18%>N4pU@55KXbZ?M~WhWMMIjqq?=dK9BI@fuo@S;JR80l zo%kGRU63{;3{DmczbEYBf&3Brx25j9F5x5&#__Hq6`DQo$u#F05B5+v+Ty8c=4qEs z??i^E7MRGg&QES`3vy~T>mmwUFg2qE64K@;SR+QxzNxCqODVBnbJY_t1MFBoWGHk~ z$Tyq82KJ8(^-<47M<;3k;?r_eOuPic4-a=zlBcKV`X5f1EsC-0XTp_mYLQ^-X|aVR zBxbpJ)O0k(46Moelccy^c{xjS`dAU0HF)OLwKdwq&^6OQ`6?)&x$$Olab0t4D=I`` z968iH`VZ9OqlJC}KMxIBLzb3&0ELwMWDvXRe1-}1Kg11y#CQ6YHg)?j`xVW6HNk)%y|I@_V8`5C$MX@>a3ca!bJ`wf+~{hlYulIyS&C~=m}=`VmgjYG6{E!prv{VMMDy!7kPZD1s!VvUFjuo zDfOAqU{NfZ)7$n(J&5;@`keFa9l9K6zexkulO=_%DQt~(`Fy61Uwds!vwF&Td+LHL zd`MOu2I33j&LQzcY2$~ze*Q#_Yf;txKkL2FbmzGDMx1VvsKzwzxYXyBEyYlymx^Y0 zanur$248QON2WPTC)tXMTjPE{0b0v44$5qdOB%@sqmpWHzBUdi-ot^UcDheb}o(>=ZL0Q+N%Jrkq)7`%}2lp3|<7)>n zo9OO~d7J%f{NRG+xN@(}zj@DnukW~Hm)VG*kH~R@cDiPS3pYng+6`nrM)0kj(+ZAbnoo@?ti}IFF#(} zsP`P!WWFQ?A39?7=I9k}vdPdt+^fjG`=5WifZ)%zKaom2V^8HU{z+IKzk0RCV{~m+ zpv6Fval}Q(265EPnukz)pyf%u4WPgf13tq*uU5f>+lLuq`piabN?Ws*xEVHDyy!-<1>5O5_|7F*Gzv!6BR_G#tK@l=ydTC3?-K|D?e* zg_@);Y|W;~!7OZf&mw|Jewb;zDECXs@;sxorF2a=nqFCy0^rTBS#uSA`Ljb{Q#_H< ze{!gwTUTe@=hfzPq=EJnMLbfo;91Tufn5!VYvIu?6nif(sEgDDR z>reOzv2i+Hkrfd*AoI1t+%kfMoxZXX?Ig=UU9r_M+U0@#C-BSj>Gi>K)0B;F=(p}O z$4#t60tl#orP8sa<<+BIOk+H>mw}_0k4uE3cj$l``b&zOBm1}YzkxRZN#LGk7Jo}y zq07Plv~D))+G@vIQV-Jd8w=w`gdQ~vKd^IrhmxwhcBa>SGd=c&mAjrfz+GR)D%mWX4?AAX$UDDI zh3n$vG%GwFY7kZL&1C3}dVt`+^>-+y+;Hgfc1t?(Nx)X#?DG6g(~@wR_br>gVvtiT zW@bsaiaJ4n{I>X(p{wZb`SEp*h+Nmpi?a1xM_uG(*@)(uN_qnE-Z|mVsim~>~ z0cLnqmGO-j5fc4hEc^Lw2gvLbPBf+@-BH$r>-gZn@ww8=z|rhbTH#m&l$c)oFG6uy zA^q!K`P*K{mgC3B{R3~x(4Ne()&KtvpcRh9kf4>KF8O)<*Xg0wa7LwLYpbDaoH5;oNoA*gIPl`9sjHxGt z-@+ktFXi?i@z4U!C+kxAr0Gq66`f$>afN6r5}Psjh9!+*0$c{P#|ce^Z4;w+J^;?$ zIQ=`)Hj>~17KpXmXU1$yh>1&2576k?oA+VH9mw-GD;*AA4n9#CW?NomFe&=GB)zF9 zb2Yvb{gwzHJL!@etU7Obe-UAPyTCo=a-h49?Sv^JyV6CL`CbL4dBOfqDb+uAFHGJRNW!MeXafE<$4B< z55RgjZ7x{ttm^=Zq2=6eui}rb)Ft&8vPT21RY;eLG$Tt#vJ-Rp+10(iEtu!g02pu^ z!rCc?2RQVx&kry?usD<&6vZG*YRSVfE$B((`s;C41V(Pv16#CSfJyXyT@1)Sr+%S zg*{XDe?PgoytbZvFKh{3As4@W`t^mZLK(j?T1l_XHKRS>#KK~~W+|)Iq?aBdU0_$` z{oJrUscb0vWGD((9lLc3@cG6=&MGFB*r0t|m@hpq1!XoVxf_W)1Ou&R!Gs+@2j+R5 zk&xtuhp4IOQYO|!DwMTO&ZXz`G;0O*QB-1PW~apctT`Bf*3{;OahYlICSHv0@#h@u zyaCX|C@W%W7T^ZJRsUO{74C_?l9i^5GWI4PXBv5?#HQ3jT{JvbPL>QE4H%yfdCW5(oGrrf1S1$P-oq`}YM|79^S=`0J}vgi{Fyv zo+RW6E)&mu`tWO@E00HhyOv~hhlTAa`l4~mI2_00mz5uKg811+ zL@xq9bgQ@Y$*IhbBmzBSr-uSsL;?@}!u(bzM0FH}g4Z4}U{z$9amfOoccCoFgsy$6 z7K*3Z{q{G#6ij4xZa<+%Vyc3KC>2Ex;euY1#=&f^h$i&;sn^p#_9PZLEGlhI)LyDS ze?N4S+ESgVt}dG4MiN+qLHK4kJar;vjNXpgQa3KVaIFI+3>5{;MPbQN^0e|gQz_qb zM{P}b+ma`23315VB)8TIGM8^Lz5U-Q$=~*oeV(==+n*q!*9)R=#13zlq8`t|`-}Gj ztP|(LL#Kho&5ifep6fKfYVNV_McO2<)`+S7yrOr6!9#+nit{~YWnFAkE)JY2>t9CE z*~m7BuAljD{#d?T3~1>sxnvR>`VG##h6;3@|7Ur3z6;UHaoPN9z)H3>I9Fg8=XgV( zBDy*V&5jJ-S9gu3>61HKEDUCPZJYXe+?s-Xor6|#$mljB6U<0j6c1Z)h|ch)k~Dk2 ziebM#Mx&%OvFk01TN?1-$_e1C%H?r01ddebjd0a5D2?ZG3a9)I;M9pMvzjO`r0I&7 zh=&WY5hScQ5?>JbS>+OteZ>oR0H%0`L=lwcaG z5X2sYSJ*OnA~Xknf{1-d7ge`rvO!QLl$$ltY?>O5n_gMH*{<(?!>11Jb;Em=XU(2etSFy(aM1d7~~S;hWvIVfNQ!ylFVQM!{9R9)T|%TF)H8sqpvDQ?~{ zD#GuJUf<-u6L(P)oZLKPPgV;F3BS2LJ+#l%JSqG+b@K!?-#+%Hj=3=d=*S!}aztPL zLX_Q}O{|XN8{rppaqrhZf&C|=hu^av=cpzg0IJA5>f6vc zs@Qxncj{et1O9*};3+FeP%%gcbqq|9t6)|zFWYQ|;y>{j*^`QSH@YsBLzcfN<+cKo zw@wBqM{Y*tjq^{2B$95O|8cF3yBUOrch-ohY-P$&^zkY*&ynE0LvT;IaJuat%h%Ar z;vvIUk)*4CafW3(KHDI`EsUf6_`y{V;REC>0g3=OC=ZcuCTKgy`BR2E?WKFziuT2j#Q}B$c zy;;XVx6K?0^6t#1h`|dS)J+!B9$k)!7YnINpDtYgYQ$P^xLTD^_Yq9%oKrNeb3-GM z21)v6f))X4{#d>S4B$t;_As{gFwu5d_6Avc0yz(^NhI(J#TlSt70s#O$8%xRaBP!` zU&9e^a?a!PIdJo4KV+$x#_QYr{Pya+Y3#`zluDvRM<-+%ezgFRbp%Qv5O|#*;CeynRLE!R%BwY0TLW;1svI+VPY5%kMB<*L@lnQoB&YAf+B{4aM z(lnsi&W<`zcktrj6QGz0U~h{rc@hvg++r>G)Jk8_iowm&^!u#9kvLdZ zN=+5l8rxnt!;x4_7l=k#N}=ccpBi$mN8sY8w6}1lqh(!shYIR0#+0jMtTO0@Nua9S zj$+g-Yc#pIIGo21VIxQZlvGw&f^FFYYZlY;3C)RqiO7WTEpgAni2W(eN#4OLE#MNH zYKi>@5Hc8zC!i^y6}ZIcP3HZc86TmqQGm!D@trZIjErO%bEuC0Bcf8E;bIuJi2#i11ktr;2Hc*WFS%Fz~EuoH~e?#BYI z->52_pf*4bKBz#O$*xDI?d~%kuqRL2&l2Cv4uG%R7RG4hflICoZGbyHroDh*s^m+c zBjf0%XjD#Y)SCPAiX8N-^_+iy{VmGDaDDtuv|~i*{gR~meWmOA>HIBA>+Ry*<8{}6 z^K{`YQf19AoE+_h;_!rUdO~mGF7905b?QUR`BUb0Tj$0KU)Rp_YG||j0nsjBq?K${ z-Wdq@a4_NFEobR1;L?O$F z?Ekr(Y;iUdO}X>wNdt>)Jt#OhpY-ed++XSXyiW^ddR*Ff`a1FLuS0rw-O(Lw&z;m` zGpWu`NaY<0zhxz=`08+=9!fQsrA(!NlehO0p}C)?Z%&Z4RwqgVwrH5`sV2qA=qqEA z((v3Q@=ohd4{f}<4cL06m7JPZ`I6Y?#4I&&3>-ak+$e4naB!>$hg)mM+C!ppUGma2 zeU!;RP<)j|#0E$NL5zLs*Z@w)-(DXy{41oKaU3-JiG_ZKDHpzUUP#D7m4BIX=YJ9b z+vQvTb!osvpwo&>Q;PzzCSS|8aRmt*6m7YTC1pP zc~ud<4}+5RuDz3+hn2(a>;FenxO`*^U8(fnS8GOn+9z+2PJVsJ0{H-NbAUY#@rXob zcu^ocR1g5QlVAiy@UhkivDW6MzQm=TA1aU@Tj=kbo6aNG8}LGp=6@Fnl7OU+wGeCb z+SM`jwzNiGWT;@7tWc~?Phd)6nc81Lk<10J4Fy}CjvQz#h(0wa-+G9Y1{xq3J*2GI zmj^1I_qf&KIEZ5_EUkW;S;lbC;B=?W=#c(w4cX3>0kX9)D3LWzF1FqE= z40)+j1$>9g-r39dF*A+lFniZ6{M9MOT?R4n%RxfmNY!2b??Og`|NWM#VGeXftU$Ko z@2zMFs6eKeFJdRY`a+LvR}#mpK#{zI5vl&mQ$SW52?OW#la%OnKn_htsAhR6Zbm3g zMv7Eh3akuuB(JDg;7EXhsZ`fvx^gSk524TEu}tx3Lc}Zp0Fe^&95KSeIA%p!zZQ=~ zv+|@*$IoCdu2EDx0C7bH-{N9Pef_dgFevWU;OCq&{AeZKA6J)8WtIpFir7^d=ABM4 z{k+%;`WAmyX}@IE(`RutKi`xTSitZmdGZYDI0nyMFm7&`>@;I!`lEneHx1!HV9HY! zSg@{t6Db4)|3kF@e%*l-1fD1_xDH;t93=jF`^3I{$_;k^6_=m@#YG9zZH^o-91zcV zJqzTGrTX1%iKE#U$H_FQft4`yn>gSLLOxOX??khEi6n4-*=C|-W_*}JGW$}+4JxX0 zS6O^irX8nq-SF6WUTbFz!z#0~T;HCviPNIfFqU*%T2HuGSw`6~>j*84P;lWGbv$Q+ z?3gSy4_(qoh&)tBaH2=cEK9K7=05d3)!+fBt0pPTzjD{fe;ckI%WJO8WJ2&8P&Bhv)*4w-Y;{j5}a(umqI8wd~BP;7ni2mRC_5 z^gP}VabV7CZ3*byG#Eoej`%&mC@Uo=Hm!kE9kFDdZ=aiVv!%gGo4sRqC04cL(_8r` z0Wu`iyW3C?8E#Xu*P@!?RY0-NiYG5V>4&;b4B3l)vM$eRxa0vPn^Q1dZnIP19YEIKe_QH%j2b-w1aLlKWki%2r+-m<{;ltL<0PhN^I(i0i}<;`zg=huX4 z{>x=hr^g$O$lEKq=Y7k*=k5AilIYv@`|kbwQBMv~PPZ%7Egoj%`!PN}j|JWW?mI5Z{?`n}_x>ZpV3Cc! z(Kdm%L4A_v~Vt+n^~zUof8;~m^9w)MON04GiOAw*?3 z|BFE2$c`doJSTl;itO6>%Fb%51kjn02k1F#wyTz-FR3d=^YK1|u=2npzm;5K`%{cE z>E4}ngOkvNpD=c#?}6?hhV+>B^LIsVG!w$qUcr(jxBqX%wGQt+-Twc^TR3oRlXD8L%1Nf? zoDVbwvCo&4MdmN$>$7I99sLiWbNEI4cOBbs?Id(_nKyFiHX`-9!keV-(r|sG5xc~^ z{tL-4YO}eh{e55i8@;ct485k}z77hu>;;^nl{MT2wVai;B1N?#dD4vbGPnS5Qp_5A zjyi~qN#op@bY$A&mRd5h3~++nSimwYsX~mm4(_w}r@By}!dVDJ4ez|k_>}^Ezs zpMe>7wY;0gp0XA#EC1ZOT>x@5gN86~(X!OW4e zSgl96K4ykbL42ahIqhac0k3SHs(b*8Ml_Y3hg&^-^Lc-r-*js;)wyY$@)6_C$?3Ut zLXwvs9vUv{YzYPia!hZ|Z$<#;0nO3*_Bf#T`33*B6Q}{HQF$0&y97Ii2hZE~qnDvy zXG0phbV$?G@fZVEuP#X6k%NOv$=3zjQ!3bOZ|_%Pvb>ug84Ky@*ug&giv6OVvR=dw z{U)x`oWi2E;QR>6>Fa5^33*x$s<^%=$+O>UH0A7(zb9zFZ1*dWP5%6vKc`n*khYobl ze!OW#hY$zW->n6i(;+5EAd{ql($JeofWD>g{(!GJK*Ijw49rZi9*F6l50qN1F4F(F)6txtFSUcs@Vngv>JM0t zSLYTtXKzmP4xGDl>GA}1sD;j&OB2^^W_&jWky;kEV=D~e+!>H2xV}bdxEUX2_0I}N z*LoAJ{2()5miv2RF@`<;Dx<$ADl zd_K5Opl&lIEzIXD9^B;3Ubk`cdO5wh^ei^!`QOI5_3)C^YmZ}B5T0MTj!%1l2t7c5 zIsv`V5}s%NaG#el0vI_dn|szz^TITtL&f8X$&t()^A1rs@RZF;BM{wo1~gBnF)wYN zdefadWZpOem7ox7ea#!Dd;|7T-G?i~`ryCG+m? zejw}@86%-p`uc*CMD8#1yns*GmKq~mjcExK3VD(KU2ltN^9&^5tQBPXISyZiL2Q!h zYM!lWA8u|RE@dAFdruj;Ov&V&>dHV8xZ-O5zZ9Sv(g34l$_~b;^Dk5ygsWs(W8NKj zF`$t?lFW}qT#IpBxP>nW$Qj26tWwK7y5dG?((~j^lFQl-1bizx839HJGMxA@`WO}g z?AS({)tV&qni}oN;mG#p?x~KK0>1aO|@I`4#I(-R{v<lzQ&v8Z5f%-bt*TH}eom^0w@YtbNv+qV#4WDFD^=H|N@|*t z3oP@@Mgj*M4Hh-0HKtpUALTdXrM9OtBOTW>*iRHUwMA^TiX$;zms*#bLt~s72jbHZ z*=5?AR&$){sNtgG&hq#bLVN-DeSWR!&TY`890)&W!(V%XzP0kKPhK?GZ6Lkl8T;@cPd!Zjnh7@$h9UbGr|W{ zxV|I4WnNXZPAwpsbaliS5uw1)X86x>1Y~?1Kb3Ov_G~b}ns)^ico0|qb>pY8bNf&} z9^8M_XX7G#W0|4vQE~+UP*yhG!eK)pSW!`#tC-KEQNWQOmPDE2-%5OK)1{HYglQ7`-hxWHl`MUZeg&<**^b7N$4Jn(ldxU(gz^aw6Qfze87l=dAW1tR~_x65|t zayKJP;{ER1xp+%-{_^N)@HXkcrSg91|2X6F-bc(PJoxXaO7RMKJ}0t?c;qCklNGg;erQ{bFsQcl`W_$igjbg^E#SMOE8^vX zU)^!xz2^Hk>2o^;VkL>zSX~o#4Imzjb$q&>Y=Q!NElk9gbQTiq@yaWhz@Bg{HNMhWxee zo)_u;t||HyqBbkW6q1bSg_KUneA+$B8{FwhqJK@WH$m7(f&508<{21TvlKXaNRbP7 zVf#TtOu~(^Bp`&c1ydi1HxfHkse3mO6BbwM?#p*Ny&KEeEqkA6Xbkl5o-NzI9jXT` zA0jLKzw!vrE+mFc#PvcQ{-W;LZ-hQ>&6>0DEHh1iPS>5^F#iQe$DvRSo*CTF3Yq&K zOowk@YeBQoAx#DXt@DHgIJY+AKsS zG?xF#59HdQ$Thbu#0tM^Y&fv>W6*uQ+BQA`S&p>{lrsrv3Z%Q#J*u~sY#CA9v! zs-Pv+eKB1lO{9T3W_VzNL02~x&ySO(g%*Ju=*mJWB@qy*0y5N|3|*{tB)4PcUFVV4xp?u|1Z zpTQzj*OKVPK=?7del)2yueQ$rlMeim*F=yZpvb1>nXc>X+vjs~SWrQA!UDbk-83YQ zH9etT@Je33*=e7(2sh~>+M=tb{34DchRb9Na#;hnexo2A&6J$b7t~aRZMCW|!wXHN zMK97IiaAlW36~g<$LkL4a8C!^*|~qK5i-Th2CN0q{!EKA8M8gjrMFfBO(v zeC;)w010Zz!?z8#nF{=)Ne!cgiL`1OhO(LxsJpnDvvYi$ydvQWzf^ftP^@{t_u;4U zV8DuW9&ftL<@^~2G$JC*(6p2_c69U4%`2Z7T&9unPJAzb-oEuUyqHZ-$<)DwCIMwrtn`o*qMkt=<&Fo$VCE zt?LDY-E#dl{+kIQ5}$p0H2)h+c+sa{lj|$v_k*#j>#EVpqN5uZ7=XawxK4_)$k7(x zO{8b&41NDMs`JhlOSJZ`j8PeMm+c1*5ShTlV+Z_$+kGg>f5W5Y?%Ok` zC9*xDkmLB+A1m-4dN1&3*v5Yg$;f=$UeWVEb^-Z0|0tALk8^t>NzloMMmIYIyASp|H0dD&cst{-nlIs-?#X%)7X`E`ML0T!*_Y!2IXWgNu00ud{3 zXt}vGrw5IUnYQoSFuhS8q_f86(WVk+x*g@IcVBHuS4 zk5g_ZwR@Pc)qN9lV{E2DuPZUG=jR}-SgfoX+?cO?R5L?Y4h^EVY36yCNT@lGlY=I{ z9*fqxJl-zrX0~mM*_ee{pt_Kc?*ED_CY^kiKx1b&Z?6!~Crfq%Ct{T^qRIbXTEp`} zYtxiKmhSa-g6{(hBSnF@Djim;6J|CRFf$n%&(~gP5j%(P$Z?hUWT_P`maG(4kt$)Q zy|+{|7HIx~8G1MHfBL^}Iilyp!oSx4Gz!diTqTKg^#UBBR4fnz%Xw-Hct+)?5EKMD zm@RL=zJ11tsY!-JYCeC%q4GuI`3VS3c{PNIcIkDp7?vWO9L0PR&bx8%kAqHH$TZb<@&%X0giN< zN2_BuF}DVot)7`Gq11hT0$z<_-vvR7cOGy>Kk#%1;FiYY?Hc0o2rMHxTUVKb~(Q|}JNpeZMh{64cX%`I{8x0x3 za(uSfWCXX}xp1qL4Fb76W6nu28?R0QnhDGeN5I3{y1%v*f9)l$v-+04M0D7rcrJFg zYnqOCbVvAyZ?OFbj?E5yVL4uV6Lx&IvfZh)I(8E6;JK>zdw-?st{i;cST0$>?@8{8Qk5E$3BtgRvV{Y&P`64^gBe5DQUL9{;$G7XOT}aK*Yo3h5pbB1m7cVaR z)79_yDD0eq;h>42xxGI$c1=4;I3y;8BfL7UO!UqbM{bVagN~jAkrWh$hK6ZrsIvaC zWd((UqsR(aTeq}Y1dAxNkK3&rI^H_;rHr&Jd`aHc?xu2MvY(;6`L2`qH%da(MATo% zLig){c-;uL9E<$twl7%~btvk{GYlon`L*Sw_4G!V<|p|P-`uGFMOcZ`H0X)SDmK>e zK(ApD@zm1`;GrjCcXL(s@YMd~Pb&okL&iUHv_7pG{{ipJ?i1y07jf-&;zezY? z2?V=Z2~F*_oMKV$-AE4%&_TPR_1o3<>(H!_R{h_^$*Noy#LaP4B8&c+@97%WonSvP zEw9Y2?0o0f%^cyx`SRed{UFw zdm1PrbDqB*O5L4$B`}4?IKCbi=sjN{Xo-mS?Z%?JoF1c56j#C$^voifG%q<#VGowW|B`9_68 zLlKppEMo4RJ$BV^qmtj4xW=?SptBpyiW$la`@ZLN+@Hi8w_@4*&k}EUdK4Q5{th54+S&r)v9`xTjd z??3p+PspL=cgvQO_4D%QCbZr^9>*vKW?IwePb@xHr#&uHM0Id-+jA)b?l^&Ky^7=i zA-nc6^Tg!YWr?o{g#PUaD^-cHmyLGS3skZnFm~Rk;jfM0rLO;2-5WZ-^|fHy^eOa1rpy~py>A=JiuX`eB1Re_v^uXGXSwCO=WmTe8L zvSfOA_#Zj~!*nRizGEaQFpp9L%+Th|&Lqu$U%@-I{YI?&ja-|LUTcC-4;?lLffO(y z^aRP+TYx<(5pz00yT0{2%GoN)hkCmKrg0?Eh_g#EkCj`fIL zb(*W*Lq(tO(Rttr_UlK~0QX~rRqr2Xc6jRQG_xq1j7+f3}55WJz+y~3& zRGDSom{c<&E@@Ab--HcVLSU$rgx1AsVvQmRaRg^Ik4fA0Nc&94f1j6j1W>YXe-<>i zbX8w2X=)Tp>Gp~YX_TgkTbA-k`sQ(LiRi`%B;&66VnO}I;xl{2z?5+8Uy<-Ucev*$ zxUP-QTPRp}_G6l8B0#5S@Xo2II^<1qxz*3F(i?JnZjBEO-yneL)QsCaqcd5_Eh2*k zjG)43GGxny(e^ksJ!8u%#$4X2L*v@V9E&cU@d?{#1ljEvQj;%`U~xRrVm7^16;j(5sc9x{9)^ z*~)g!9?Hn0D_N{0Nr?*JdMv&+AeVfiDd3{wZkYR~nyunxK=f$txr1YwkQvvv+8~s; zki;Rv7oynKm*^9Jmq#m4j6B4kQe4BE6W?lb#dyU~#*mj+fE&FOG;b$Wv&gZW8BSR1 z=AKUpa0Y2Y7W=?c~gaJZz0+^8w4kW>|* zi@>U>uN4bS)z|;ZX9A}fja^zXSS&1dxn>&y&P>}_`w6km!uu$4H2W>zzNhch)kDSv z29g@K3zH$g?Mq-=QZc{*{b?9rJamhCO9jZAs#BZVrH!jetssXE4Gs~DaA3y{&c5U3 zyyuzO>X!1IYy6eNFMwBQ`!aWgZXLtM zSTx(kwwAWA(yAe!FZJ(Xw3X|Y#Fm?j!PVYz23La8UeHbB5-GhV5j6UkW~eP*Fh>Yr1)m+ZLm=`N2_}?IS4#ucDKJh>9E64ku@u%&_Bz%9t*zbG_k~r_2 zcv~d#$c+FwQ1 zJ738RJMZ8ex-PH`eQ!AWA7RHPCa4k^Qb{w+y^I2W&V$OXBAT6VK9P65Af1amTZ;G^ zlk=gG>`nYEfQUM#LmaAA{kYSX69~C8hw=}tXwf_6em@o1;&l0jv@fXqx*ah->$u@@ zH+TpjeiqqZ^M;puy3w8P6cU>V9>rPjknjW`;XV>->{zO1$H^bQJ}0hqshApw^rA*H zyWQs<5QNM8tRNR#6^yPjh0`BId71!5bwq|qI9E7hW*A9u%4>gOQm)6&nTa)X z%l%c#5f0EpWAk%3$io|AEk>^&j_Eg(scX4tetGyJ=0i-(1|ID?EoEE>A2ZstoQR9oy@t}IhS9x_(Y^lng`KP}xvh?0pL$Trnr?`88;_g=5;q3o=@0mGw&fJ+FOg@A_ zCc|EP$+Mo;cNHO|6~S#~7&j6ih~~E%gdF*PDp`@}i-H9+@3Xt|eRvpW zmpf$AtY5moLP5382m}%QT*-3`So?7M*}92Txgu8WoLyPtN7xR9)g5~3^M+i*R|$kb zE@dr(dblucA7I|42aLiN8QVNJSuU8C=5icH8Rr`ZWoUXg3gk3~6{j|-C_TcLIx00g zDlIh`=Ac)oB*se=wh=bI$G22HNJn zM?r`Bo!-!pK}f8+pTFGRy=C8==ZdUAa>60{6rr<`z%@nXn2wRDu%RvjNIU=W{Gc9+ z(Vd0cc^c#^%P;irc1><*Q*uiAvRgX+ImVBq0p7yarCKgxjh^n}yW zRVkPym?n_Zq=b`bBbo;HT0l))d0C~=VIw~^lCpAhe6x1rG2`L_=HU`_bmf4W0W236 zPL~F<1$yPoMvE%XBnhso4Dk?i$ues@(t6&^r5YI`|bu-olcQ3+7?70U@to_GZGaF zKBzIgb4Pb_u|=kY!WD}Q2gcwhTva~`#)V%f56Vf8nzrf zbltq91ixE8b+zFpaBcIk9;&AV)!L0Ma%EQGB9g-fhD}=x*fbe)W=tP{LJU9)G!#RX z2T&b05wF`uS^&$aRtVFazL7XsB~r9Zym-EF9#_d45m%m@GSvL|oju1-KZOX$I^wIM z?9%v$(QNEoemZrYh19`^C%-GNWuj(VZUG2<-NZp&g`{ks*?x zRN>;KH1}fe*zWQH$aO#54w{m*h>e$daS|$;Y5OeoVFbv zE<9iEy@hm%d5~iXQU}AAk9$sCHZDLHk6G>=5CQ$S7~)C+s~7h_mB#>O;9sO>(juqR=uI++GwE7<^P zc{_u7c%(!bcw6q_PWz1$QNWF>eE89ZnT6T!bE)8I6jSKfCVvEa1nEMa;LHC!z;rE6A%`@J<6G|kgRv^zy{(PKO zi7OCZuANR`3Yj;B*J>-dt^M_-<`+sGGqoni>+cArbTkurY4I#o!Zv_V;^^DhQX5U^&&k)i`i{b~ z=FmWEF?2!Ykf01^(HEy0(jPq|t@_5|&b8pn8mo&s@SWXwezdfRx*nQ(mXUh)X6WAH zuSN9a`q5ibw2Iug>2FHT7}%?f1Ra$bA1Zae8GfmU$dCQhtN*Cg2&+{etO*U(O6=)l zBHKzqW!OVyC;`y>hgx8+OQ0}YuKKZ=+V%syHOevGxBs05&=x-CBVn*|6K${1?MqT9 za10L{QxF5ww3|}2n$k2`n0t^ZTeb<9)9_iFcnpkOMkP-rB@Yz=5*EV++n0(!YW243 zK71@OYivzxCDgKT- z0dRFWJGpz3J!Bc%2I!ctqK@wNUNAuv4!RIwfbs~Vc3ad<|H})$jv~a*TuL*Dqrk7y ztc(fO-DB}!J?LtC^G?{8e6w}1W?$CQ{64ifC+Q;pL2d4a6Y9*$$~)4x!)Vp{5)#*>H>ce4b3L?`60dX?gjL$qD83{|!WrO_tWQXC1-a3?W%LbAKq94H7|D zPUjpe!#Th^E-Yz`$*L2$q(>N{A0`7m3DJ32e&3nz|BtUdEKYv~NKgU~*&8$GiV=muBgJay&UN=Cu{p&v-rCZ&}p+SGa)h@Fq&VU z$kSJ~diL8&K1{b_E`~M(^&>@rMUMq1#pi+CFdY$2fTThu2Imf=V=eD04Lav$bhtX?O(g6`A4 zO)_9UpKlkvjgqP4fQBB{{eIs7f$=4;+&IUBcU1e6Dn8rnF3@TvpKbCM^VqoORh$*j zJqU{I-QD<->+o8L!uvYUPw2ZV-|6*Wi`?-@EGhJw5SZ)TU0U5S+&0wxVZv&n5|*|DQ!w`9C#&JK4);zKPW3`2 zDpa2axf-K%G9DG`3#Xs^p?Y%oKi$jW@Bax_zA*s%O(I$Of7lV`RrB#|Vc+Q5 z1b+PO!dFj$?j8Co`Y6P?IJv_2am~?>1!B5nqTIqp)AE}8lqF8JB`!3k#|Z@39W_aY zdWU9u+va+?KPy+08iY62jmHnn_4eOa!6EuiJ&91G;m>UyCTv>kP|mb|6y&o|+hV~L zZC#gUwMLC7&3DiE9jwg=SI2guXmov3Kjv+Zcc{x2!%%#G&VxE;)swm!l%y5ROx)jn>@WJj4ank{m4-cB?#>?t; zVjOMAg9aMXkT1cfQ<7uTjB@j^wZ%5?nD?W}j8(5DHK_zN3pR+4VN+UtL9Km+&ukA8 z=Rxb1mjgOZ*1knGnbsz!4-!%E){bBdWlfh;m`j3bd#a43zhW>OlWZKRe@x48Krz>MwK z(hmpO73Kxzy7@TN=GQtpfnC-6W1O&t3avv7O*~fg(^;w=+v*UdHbl28!rLZL5gDk- zLr}>4og!<5wFjOgWdJ`aHKs20-WQtk^p1GRk>y+rC{O{SxZ$U;B2*`T$$|>?Q=C`} z&$?|sUSDqm=14?!9{M(~*?CwBiy9KzpN*H6+O!hNfIPL%mh02&vj!a`nwmg6dk9#t znyu&a{rkMicU=W>GbSVy?E?aQu(u~dutfAQxPQ;t(1{PowufPJP-kKVON1cj6vV_NS;TogIQU06}ROzfawH!tJ5h+o&{yGLpMO#DKNR4ih>Y-@QEFmFN zM8ph!mEvXS6P4o&xrtL?!!@UhzJaKbc(?kTt+Wfg8WPtv@*TzOPgL8Kph_1$Hh%Qv z9`4c)72kSnptfN;aNxFR@#FyiTCx#*`l0GEiV99M*%kE$Go@=%Ix^9US-cE_ul8ZM zC)kK!0`*dyir#3M>XP!>q=o{1-B!1#M7Pe(>z5B%!@PYDD}}n_!sCl=p&-8}+H|VB zL%efSX_jwx95m%ArTv zf|yIQ_GFgmm`igutRCSL5SSCxTryXdDA`Bt61Bav8xjaiQ>bTG=KAihF}1sYEJBvc zg_`&&D_xh>TORgKbfg{0rNdpv)hmcfXFJqf7$6Ni^8{kfp6{zBYN!B?dRo%Fngj*z z3+Jq~s@MRXQi-;aR*mnwm7q*AvPgqX{}Gt~{FG;vf7rF<(%Q;k@bfw`#Z^~~{b^U{&QXOy+(Wd*`pe3A)}skO+)%J(0)pW0~)Y&+f zcrCiYw-A<;9X99G$9N)ZljkeP5Mkz`{SKQ9eZ`WkT?Wi{_mIlenE1MLew8&LnTb~? zQ(}SMUB#}gzfb2*o4Mn}(t6gvql94Sc$eu0J3i%d<)|uC+?LC}4hc#J7~DD+M)X z%~#5JMiStaLCh;VGt*NzeI#R(Tl}2vef1 zw1=Zr9gXV$vJo);<-(S`g8jbjh>0P4fZeExq@I-kHwpG?52c6bxqD9_-O>YYhQR-& zmI%l%aV zsYjFJZGTVbkIG#w+%1v01K4cTsiCl16AAaDSP%Bu>9U0?KP4_rQa3awkbZEjwfYlm5 z`kngt&dU+&wH-TX$8o8%w=HhtYg8;jz(A=eIEV9S>u#m{T@H$ChGZ_-XI4fZKUZ3K_s!|6|Iy!~M>)p# z+jVTTDzf?1@ss?MBBp<$+?^46SJe>C8F0gk+$^7U~_8m?AZv1;g<_nx6jkLb>414zTq z%JRa7%7C63bbM`MRso?9IVMRvOf*LFg8rL#LV3NbT(mqabq@WjoElhl)^ zxu$xju5qud@T?MvtHi(3S*2@?rfFtvikN@t=h`(*-AU9-P=sia6}u!~D z)kna$hVuWk{8iMn*h+1HqA~ z2o7(d%iznTtz;%|kygd`XmlH5?2=b7<136T#MJ|Hg3+ohBrfmS z(#Ec1ZxZ#LV~YTWCj%NOE2;)%dj5!PS$CoXhAuf`9d9R;nb$z_F4lPLz35i;*p1R( zYqXUQ#s9!k1W-*!c&aWfb#NyI0252h<^1$RKNa@1_pq3YvNjzbwSJjpZ>u~?PprM9 zJOTIq<*o9*FM@RyiBfc}5{|D}>?06W%|!V(O<}+<`dCjz_UjbchQNSHo!@nMcu!X+ zbM+!IVtG7eSiM4Uns|}4U=DA};>M!E^BNYdLj-u+kW}b@|DOyt;mfDEAFt-&W|&)` zLSe4MFH*x7!o!88rz~ixiv0XckQY}Pg-EJtKHWN_22dKFPQigT+kOte#3Ko_(*5%2 zpXWg}`qvl2mM+1O7jtCCn@I!5o4IP-W-YO|8-d4PX0v`=k*}kN&bb|9p&|yrTyBjYx8DZu=i>5bo=zplZ^~wSIRNZHuC+P_uDv;^V}cR#8gS6OCVBj zu)mgGulxLLjofvKO!uTXV^5u(Z;ds!X3^vB_i=Pp`cJ7>y6~UAzvfhkzDcr!%VmE$ zyaQ+UCla1c*k<0G!@S;ZxU}pDsrD09SA5<`*Sr2l64=L=}{MwjnLT)NakRQnRnvSR8$=&dH&)JR#-8a`mFhh&V}3 zp!1cxGtAfuel-9;aw$wT>7SNhbJdv`!46XVaRXmXCgq7I19KzMXcX~y7|g>EdAT%I zz{-!_ojz!7?NSmHQf&t5VaeVsEm7baMrE|7F_7)UEJ z8-cllJA!|uJY*}(-ErRsHZGP;yB18P@{oOI-{owItD8#9&$$9e9XQ{)$z?dm0<(Y6qOtLXYp(QFg=;lc+!~6m zEWz}hyjQmoF>WGdXd)e*f9D_@W@a7svtP0AgaYU}w7IThbk{^{ul%g9{)y#S;tktc zLb#$JHZASmX*3`BARB0Tro6x8rM# zF|5HZVmF*DBeX2s?Ku1vFDyD!6L6eJu)|Rh81F3qxeeDgOy)y!f0watvbABrxS9;u z(l*QWkx=a*quriD9G(`6PWKR34eHdN-Pf=UUOcu7jSx*TO7P#J_ac7 z;p`+OYuKqRD=3T`p^n8mBX?;#RLq52xP)(B2Uv)d^8CjcD%x^0mOSe&>*?rOikfO; zZgaR{2Sd`dvLtM$3>(66$6zFMME98KaSllE^74yw>W&-{Mk9cln9`=QoSb|iu-Vnm zPfXf{#Ep64`KoL}{L&^~9Duixq@Jp(tRXIMLiAD?_*0w*0P z#dZ`T=lsA9*3cIF<*a7gaO^eiwh!6brZpZx?TP8SuU8J2IUS;}UD;H3Zy<@yH&FMB zA84r9?-ZyDy-&DB;s5GaKZ*cjYLgM2-i}d5HxvtNi z$;8_k#l-Wb>cp#u@V>!gimDyq*7L$3t<-Q{ZF5wQSDEg^+2`D@OMJVx3oRkfS8@G& zsNa6{`kTL7j*tIB&I3no`!lojK4eONZb0gZ)E29e6Dw6IIaz))o3gH2pJI0m1R>%b zd$_wxydGvN?@}yyvLRDV#b;f^>vy$AUmfydUOIER#8m$3m{VXLlW;=< zC-pR*O8Ih&;i&%@^G5^OezOII_urEbq0fz=ieh#lA4TM2k0?IE=uZ~f(yGds%}3V~ z{72jh3-h0O>G3PrV1%~#WTgCxEHMqX=n@-rpGCxh@=tOuk-ST4X*#K_+$@GRdSW&P zVzUChHaG8j`%kZNpi^r9e%uD|@yX&J(AyOi7R3L`poYcg$F)5*FE9x!`-N8GIhaP2 zCMMMRqq(T}SN#Um{X$#7eGIZfjRQ&i5<2W}>b&u1*@0Or9xNt@0UP9il;MDNM2Dqb z6`jWrG>G>%4(hu?Oah5TiJg4<0NnJ)4jPvBZxJh|WXAv{Vw#Vj+rHCTAA8^e518Mx zW81$JGl94Z5+r>sl@ zD;U5I)BEL5Tk`~noA5RbQpghU_Y{DG|BNi`3nVQz`bwM7R2H?SJ-;5C=xvgBT9}(n z19!i@5i^4s)I+U8X%?&25j9rQVasU`aK4NXK=2Bio2=U)`{jt5jsDr05xp|owAc~- zLWRm-XFQGr;gc$(fu-2Rrrv;o(B!p_2CnZZqAH1=2ygs1#*S=FFkDH6Ss0H@yvlLB z!FcKU5Yy%Qb4C%4P@dHr-FJ`1z9+C|ZrnCWmQhnPwuc%=JRQ}Ln0hK=B@-UJLd8WC zT^Msjp39H5-q!j4jDca`M9fP|nNv_oiHX6Df_WV3|Hl;P`W?X(caO*PO46ATpu=Ig zoq~$y^dk)PyN>Sb7%nOGV>p3#pNqb_i~jtz&^!-#{ulmp<>&B)R2SkD7h>abByLmN z?`JDkE`&PHHsgiS3OZp58Bom}DQ~^(M9p-+wEK{iXcpckdK;+h@JB#Bd>3fl$JFm#ce_2yTLoDJ3!^DsFNgy$!y`!AK4); zc0{lsb|_xAv7vIy?|*%$Oxfe#=QI*jlO%mDH`QggK@TwWfv{D|v1^QZ*bRs=D5?u9 zU(I~Duw2xV7Sw0{u8sY^ejMfJ>MRK5b1U zW+MlgG$L2I1fxeR+oc(3F!S@;2SgV537Ozao8FV zQJ^8&6uUHvp&{8iSpASC$M?HGs&Iv_^Q-5$e4W*Kg0@3oQNZZRn9$^D)~Koa3Xqn{ ziitZ`g{%490w-ZsAaw&DB`w*p^g*dTLoEn!N}B|F-%C=jZ)48^YW6yT!LxD$BQ5IuAdP*i5d_ z_LyI1f30vwf3#v(@wEgyiX%eVC_@o5G%e%AIO7XF-cL)ThLS-40J!U-g{fTiz;^F< z-%cr0TDAJhEw6Vma2d>N=a`KANC%e~d;hf8kU=mkGD_2`fl;1|7{d-0!Be%@8PO;qAuj^+m^bcI{*{R=3X(c7hKCo4_>7nGr&0U!&U9o zIdfcfo8AgD?H@+kKT^cPfZ9+o7}|ddu#UH|`{m(|be0AxTS0$PAwO2Kwstaa1!18I zH~3rMeVe&e-r}~nM8#YM zZmy?1H8a`Ktup!(7b5TU3C{;*9PVO6ZXasU~G;_6trMJTa%1_<2 z?AXrJdy|cPgq^Sh3ae`j4p>dLPg+X_@jMJR zfr;=&$0Rrxv5_A`#bJE-yiaAk$Jql=Qo^{0G^X zi~bt-^W7o5Jnls_{KrtFAh;XGyTh<+i_fkM_AX3Dr+U8ySt$1yWJO@kNPP{`3`sA3 zh)i|0^`FLiNG*B#dibvSa@W#v_+>@9slGlG3$Gh2uY34}cRX(;B-CA6&CJx(F;s&g z`XTBxkd|_Jn(LpnDP1xS3>p@3!*f6XcmgsKdrQV*%clVv$%8ZN(x&``o&?>?$U3?z z+M+WNtZ`eUs3?>g+T4D_KZXqlXmZ+r_&~Ex+s-J?%G!Dg3d-*ngCD+g{h1d0JNb7E zv%XF|<&VscHW!5|24@pgMPCQl*un-9|AeWLqPna*n&65Z%o^FlIvC}hloRiIq|HEA z!BEoN`eP;o-7%t`uA0Hz8$vh@?xECTU8?%Kq9Di35B4fJa;?8~l`hL`sZXx#VVwEG zA;ls?1|<*NYSne5S8dU-=Zl7L{O>FPAkk-H&Y5#mrHTAfE9A*Ut3tObOrLJi0t|-c zc+d3FJ4Ji8T^(jH;g-yqo9;OO*kV*5VMkjo#X{F64EW<#6&ava%xIs+mGO?Abe(mF$6Jw!BBDL9k@qpwe*M!s)x3$fOd3~;j@4V} zc#Tjgx~_@S09oBhfzhfHS<|FarA2j#K`DX{s)4ke+G2%B72}P;dY6Vyo;6a;C(P&A z;Njpk3uFC!LkpX%+co`xQgcludO-RL<0kMdgl}B?F+iHflQD%G)K?7!l%z{_z(1JB zC8o38MHrutS{|p#<1t5n0pvsJ$Weo1o8?tfpd11RyZ%EY=%U7dkmxtF%$VD_id$n; zb&sFybH)*%mgE&6tclwlGw|-}O#xF7d zMN-OR&l>W!r<&l`m3#bl=fwQHPm|@b_l3F3J8fsOTG^R9^{CA(4LtW(%`?d)u^~lG z#ra%lc%Q}oqOCXUVeeh;nOCse+ob@@>n+~vwcl&@{_82;n)j`lf{#m9&yEfK48}~; z#yk-_iviVkk6GQM9`#k(RNV5}}pJt@ zRC6^%)xbh1j-v+^7N$jY(f-e#j~v#x=D2uy%gTs49E# zyKrQ!CGl)X16Ibqk`S(W3HZnK2=n8}@&UbVQO9$4O3kV7l!TouO)rs8RMRcTB3qx_ z9j#NxHY1WkVUA`GIfni5iTgD=@wD{sgMRbtEi6Izk35jTFJ1G|b`vqyV_}?DeL_ZJ zxO4fqarx;}#)W3KFBn!%@U&UdSolp%zbVSv>^H6RTnH%3Tl<#%M`5zIJ$io>>N7xp0*~@>>DP?pxyKJFoiZKkK$eN4bC?@U? zCZtwe8BEd-r7De|px~i>{pVG;2Ku@h&oBl~GO|9QVCNh>YR{NTh%k$eX;v_mXASJ{ zE?<)ov!wjhh_105HpKK1NA6?lnAk2lTXAOdNN>b^Z{39WpABOzdkhT0<$n-s%M&u{ zM~u0Kfv+%ZVk?-`^!J+BFO_Klm3V=b@bBlZJA)e3_`*l1Qm~M>=y4ddQ7ZUY9I|=H zZ0Cd28U!b*grXgYTnwckA5#KNdbc~lUhYk z5ug*=sW~^q{!(4<-?#s2J28QyI> zh5myp_!uy%nB4pl-tZC(*u*V;d#^XjE$%$KxdxY4f(W_7Q9J)OZh`@o0^kfPD%#SP zT3F*uM6^l3HR>k6;{lA5eY%g*#ph4~L}-u10LVZnP64b2s&s^O-DuG=i4sjiM{p7l z&_5!mpsQdc@1o7Tu6$aN?f7QIEu)e3c-5A#Tzx&UCKnz0?44x6|9o=%{ql_ zVUnGFwriTbC28vjhMs_ah<>anul)zm!RAc;pMa5S{d0mAuYVxw)ljBU4b#Y*$;Mm6I)rzB4$M9 zp>D&-9_|ZJk$yX%ZIlOAK_|@$^NoznplcTbBKO2`XHYC_0@-e@V(2>0vFQhJ@EB2}_Jdv#SVq{=V^9cer}^w&HvC4*GVD z1kHWPsOWkNV3_pnZ%pmno%bpodVD3W!i%PTN^)=1?*nli4TByDGJXyZm)8DF8z?Zo zJX_hFFPkOwe)}Ng`+%i?KYs49=l8-e`CPsJ@8s>y@8P5|R=UGIHR6v=MB-Vz%PxM| zK1+hjE4v3yb-dFfyXAV$=3d)+{LM5-MyOSK6h~`}&|1{DonWyW*)%jmIosx|Z+pPQ zc|_VHdEh2W!h!ELebv*%SE3+kR zvX;@IOC@yJ$C7Ek&diF+BVQxt#k_V#s9TS;53FnoJ8F|B_FNyATk+2E!A<5-{r+@2 zz4bo_uu;KkQuG|Y)4{UVz1H@qte)^0-thhm%@_E(9~+4Su8_07k?#pH%^STpk_s%) z2r(85H|h>Dh_Ly-8uG6>5Z<-he}vj=>-G@*f2&De|EWnNZ~t!ymZVmwMbN)W_`ktB z=Kp_Z`E+N6yim11jS6SY0#TAQXl}dr=o;`f2BW+5$RRxIk?REH8;CZIQpgrm1={8X zTdK#aRmEZo~i3otnyAF+0)I@>-8}SwfV3=LUJ~`un1^x2?Wfw%9C-IXqa@^3|Ijgj%}Igb)?~0+3lEygZQ;X2K{%CSsV99{6Jp8L z+|#05!@4at9tf_LGs=H(XuS_JH(v2~|8$Zq_S)7D&# zgJv=%Q(y>xKZWHfKK=Q%#vry@FZ`(+=GRdl;j+|?K*e075`{^NbBNRhW_JP|`P|ii zV;JY$U#o{4yS^Is$QjNLTxJE%;lUkmW2=XX%|CsbhrRxbPYsXwGn_@5@mLq|{$VCa z-}@yQ(%ycLSPtzRWEq;wJl?(q=2;ytAS1$EJNsUkuU|h#&iOB6{07oSth_Qn!1Rp{*7HSq@A9>@%yH2$HCf%ufLD zrRHZ6S)w9`5SQHfSDJC#n?Ky&_sZ=njz7S)*@c(27{6YVO$4{#>WWSG0*0K@l}sq`>WM3pr{=WH{~a zs3qgRE$oYdXE}Om%Oh*ju1n$tlHC27!o;i=w;&ETp{=prSkUW+QN~1rMm5qA(G@LmHa>II+Nq5#oE&>P zM!bRI?@3G3uxsd-)X~7@(|#K?Hr%Qf0vK1b)3ZrNb^e0Y=mi|le7A>5dTaxYlh<;n zjPGj1U!HIt(oJ}p8aT?6Zr1m7B9vLbOPbhJrWJ3>j3=J^X>{L~EPwf(a`L=#$F_1{ z;fCCZt-@2<5gK*(h%Qr(L(AR&U8q5PpD>}FE?H0OLf>B9CKKK|u9Ey*Lnqp}hB5|f zhQ~fukv)rkE}ixVgX7mSsAcTd3!66JRrOYBB?b@dY>IX!h$g(B+0MJ}i2dHo4OYuq zUsO9U+x*75UdEx#w~L>0bX&w1quai(b|~&fre#deg^jN>7o4`5E-P}CUfgnL z{{==mXSFNd%^A0zB~8CHr@Tf`Tb&D+94QD9iOpI6@;3%KC`7CM8tgP3C~MeKfp4DUZr7&KufphBi!?<_ zbneq~r4C!9r2H0^BthPYDUxxAp60TZ(P)%eYn%g=)^m`xY)QR-oVJh9yvCc>jL`Hp zTgPBf;gn{@9REbvw&m)k>O~4!hurEg693zkUCK2#xhPpY@0-zoW~`DjaCz}ujb5Fs z2YJsuJy)bPKi#22mFd!Db^A=p%!iYFQd$jQ?L1%po*z#xPw4M2=vSZP^ox+vZr*3+`dXXKULyoROS3*ah zEqg}{usPVqGe(m>8v}Y)^WQWFhP(R7_U%XemX~Hhf8C0Q{pw7X(L_NKhEALD<@5WK zRKeHCfjURZM%4~n6zZ_%o}m7B%4A<>(8*1b|DvPYXl>aXk=s~_+LV3!??EI(CCJsj zs%}qax6gK|O>`-FXxwg`x4zzHp)Y%W=$6;wTV8mLkZI53PlDcHtD0C|PB6;N&)`a9IW4YzT|@7#RqLtA_5{zY zbulW}HwT#+_)Mo4rxw^(5@$GzX3~piHj8GqN>*zWTL+1)V+I$WX4G&*s)r@k_G>|@ zG@&$$4J_unRe}$QIsr)5SxB-`NUBNlfqj<=p;*PSQPe{rbO@s8eP-NM4)f#FD~!uG z+35|L{5ECvHjEF8nwRF{l`Err0jbd*D97wPz#+KGA#4*KmDWp-tRnJgW8WXE71$@` zra~p+LObS3IN*vq`4fLMRl8J9wOT~2SKnvV50hRl&aM_&bc|`5!DZu|{ujTYmWwfg z7>beUgsyX4Q@3L-e`cV!oEvM90Tfsckh z9c%{rMxQ?68{>A1Gr3;$PgJ*A)hs8hx;-J+#jn0?@Sz}YRd%oQ^mxHHQim>sGG3R8 zFuZUs{eT2Fzpy^F%o2~fo{4AP^iE=wWe;DUr}OXm{ZV6o)#~Q3+S-{6SJlK1?TW8e zI-6nfI&3)`|8NNK^#Ebr z#Cnb)>|Mq(wV%$~oUnrUfjJMw;--;~V4S`5tZXB9@2DJqUu}MV3mfZ#UsV|~{$L64 zW4ac;xr~s^n>$K05z_ZR8cOP!+4(y9I?{Tw7~A!;pPAv->~Y%`WJ%F`38HqEsLcCM zKXQ%F3DCDFiuCucL@jSE!JMV6?6^+5ShdloE6W?Zrqu&vLc*GRmPbg`Xbyu}kXLc- zWfJ7EFPYVRCA5#=*LQQN*rIZYS9<0%7QQUm{O=#(4biyV_@oKy$1zs|iBKf3-_aC1 zJtthMDh7SoGX%Px?kQhl6&%UlK6;?U*zftOujDY_r!gecG%Ndr9M6?DE4yTTi3Muv zx+Qfz90NvU6`i`a=y#bEEr=}g{OV#YA21QJ5d!<8RyX_ilO5-pUcYkxz6>pF4ipKf z1=O;j0jmNxo4AMp{0QsOGK*iutySUWDPYe5iFDNpC7m(c6LM_mm+oE9;$|1V)n?tC zm3`?7j{LdwDFViprWNgM_svY3ANVIhfg&Z{<(^Ynv-D5%I(7mq!>Ow7*gNEk$g&Vsi2RW&hZ zJ=Cx{4eZ}nVjPtGS@XNepc_EerMc(h3);s_jAWT!Lu;Cw;9`Lm-^e4$;3%kD4JY@2 zmrjCcqXZ6%1Ir6t;hP8Jh{z1J?Wp zOcjNjB51Y`yHOg@LJK0%gWP_>%HNCpu~4A$=LfoZCZhbqyNCqhD6T?Hf)ciQdD4c_ zS~muVYwMaDx+%92r3U$$DeejHL0l904n%I(+2tt(KwA5tCm4l{%qGM)aDD%={u>4( z@?-(N!B^qJK7s0Qx}2Lzn)YQMvt$Sqijh)B{56iL4gaBW2g7If^dX`ZMEY)By(ec! z@dx1$rxS(BiKXGNGHKQx>o$KRAyZ5`P^iI)1XtJeC^}02DTqy1TEQz4x=Z>=*|MVG$Axz*bC7q(mb(qSbSA?)ynj|slB-naI$x9|NDI51P*HQr>Q6g`wmsEF} zRE2(=f{SMzg=DS123bt73DeSQ8~qPj@XcolO=d}Ji&KFRjb=)lmeys$^v6X`DVwx{ zN&+hONAuJ8^`K_GOsCqG4KuwxYQb$%!9?5Ic6JjQ5M3N08^$qL+`+^|lb-ED?RZ_+bn*#FQaC@aZpB71d zEr>ksjHhnK&eWx6BxGr_Nl;=blXNqdA{f2Mm;vO_HhSrl+ys1RtJqL9IuU_dQC{>x z(0HmFtlp=*XcrcLC3 zPqfPRFE<>$99la55;2RlVRVBBZP0*>sodn)^y;jnttt_fTK{)Wf#Uqal!`{jNod73coG0Maw;r11hw?a~k__ zvUkVp@#e#f{gM_bo@@U+f%333L#D6}nh3mnk{c&i-p0aqtoUc_GcOQK(s7h;e2<@ zNF7sSqmb4Ki3lqhx^gcWEhns9rbYqV%Hr0J=n;Iv;Bb|IKX}6@WWNu;0K4N3Nnbikgzdr5DjLJRV@d$0k z-QC@_xVy{6-QC?OR=gC~i&Lx=x1tv*?(RP4{r>#_OeUFRk|*WlhLDhQ_Imc(Yp)fp zX**PoSx*NY+DaOji;^@EHkJaq1ffHhWA7gx9+yA4z+rh2t9l+2CrFjWx3o0z^2hpH zgpaHn*%b(GS{V_`^xl8iczfEo&gy-qc>%v4gC9nnUQv2p=kI?%Z>l;5`lh~Iq=dCwvW-roOLRi2=EOzX zF`zFImZBl$Ziz#!aM=7bDff!(E3+~|>O4XTx-O87ty5J#1jaZ5XLp+R+O4`Cw}Fv&UqhDy|Y z%-NtYi&>`b^hD0|C}K9}M`AWnUQ`NfU21Bo7-@9L{>uR4?6QNmSO{3i*$1-hwCw#e zYj|uj=Jn10)XU741$pq)-mz;VbZ{-C4Jh>I^nUrqe%(Etr>S0b3VmNN!8E~(IQ#$t z5Y~UL>wN1z+~06}1-`Kk6a0ZLamB>S-7eGFKgYxjuMTqnBW4RiRMG0jbmJWcR1u=M z_tXYWHQ>ww4*1{o$(bW{u*plIW4PRIBH*Vz@&_Ze%oIq>$5LM^x44HBo7eI;V>v#U zAv&nC%CVA=s&@u&>oJ^F)l_38ijN@Xj*3crG-OiOxMSs;tN`QI3V%@1oA0=LSulVnIJk# zo5~51)6K75SuF(#&xU3-13n`|GQS8(%Uwz72up7Q7bega6ipWt(IKsrkXBlKvviPt zx>D|7W^zVr?!pP;s)t)Tm)jkid8!W2kS@pYGAqqeJ#`aStH6mogb9F(?!i{()Le$n zMhd6JKVl0Wn>f}h!oxVwXC34MRh|KC5N02VGs}QYKDkbT?K^~7Pjl|Ey}aC8JenLj zfkU~J@o-t+)nB9EGyc@)NP-J2DiU`+nGU&$2$=Y}3Ah|I7<8(V)98#z4SPg8)F$n^ zQ*S+m^aHd23|RO@R6W{Niv4Pl8CuN*BRAzIH`S&?;8oAJXAQ;NOEmDDjvZV1HLs>q8j)7+_Qj|dD&#<5+d>>$QIfEU5JR&yts z!(?6;*H^}=!5ZZ-tqRE!)uIK)A~m`%KX$&)>*iDePn9^T^jTkMadh-jo7&ofC%;Vr zo%2ng>~m$Y8s5ad!+^t6U#ukhq=v`s^RL@0U069;`4# z;`+4t+24Cp;N@ZU*&x6_;;8^gVEDwJhL#}~HEAY_$jjOesPQ>n?)Ky+Hw1>3{f7D6 z?s2WpNVZP~RQR4RV11GjQ?%@e{&c563_1w!v z?#5o-`*Gp5!27V%Mdv%j>58WJ^7G5VdC$<{y~xhlh#;|Xhxpqgf*^0MOkX>KV7GU| zR$7*i>&-`+_ana-NYE2LkTnUQ!g&9L>sevF~6Sj2H0`>wQe!{ z`Gqdi&yY9vGaJtBH>NXbAG;=3`v^GD@49f{2e#oD{Z{Eg3C>WWG4 zmln4ouW?S!1Eb@rZ=V?dbjL173~Mw36bnmlP_I0^1DQ)o;4M zM2DLVmH@9FW?~TC$l{_Yk8YdsmS-KQL+__7aQ7^IpSmd=EE31dj2A)k=Fq5rQE-=KltbYP)XOWM&T zPg*dDldzp(_TbflCCu{gt5&UNCQ8U&nQ}Wj|-WQUwu@98s)!C_b_3x>(lz9 z_$@FvVUsF*wu!$u7#acMia>kn@Z*GWiU3aKNA$#zY$X)B9)U}@?Cb%lrDqDapIbG4 zK&et-svZwqLR2$dI#wfg3{u=+E7N2qY4^`^u11Nw^Mwgjpz`CHQ^t{fHJ`v8i&;Zb zIH4&$&Ey_mNoCE@X*2(Dqj|3;=g}i#@^WskY?;*MaQ(mOzZE0GNde zDQ>P0+~KrUle}`qd6Kkp;l$^}$C58& zX8>u^r;k#l%TvkkqSI%4bn%$atmNrA^q#PK z(^CG&P#fu5y>DfmIrO>L|!Asvm35*YgZW}Q1kInbbtxtq z3YWDV(plDcq;t;C3I0i1HIqbyuJ>NWCGxB$=E08oRCS$G?{Olluj+2nw9KY22>|uJ z^gm=Y4qm%8BMt-99j<+Uad@VH>zKCo>eDAQ|2|&kAl!=krym*t*s7qjicS_&6Iz`tq{s_{6XHzPY)$=ch#_<&j(Z z_k7ngsy(;!z57W)+xHKr#?LA*lXb8B?-x89w+SUoK6SL zMIs&S)Is!Ue0X___b)8qgj-OX$*24-#+r&Jb`eivEgxbp7t5YD&H3|2gFnA2KX1SH8(F2hwU#Zf-Y>NrT@ww2X+!65j6No)|O><~w;Rfbfh_Y-ux=>^?1 z->Q~c+N?;9PD7lCmM{oh+!aFWUy-%ess4+&X?QN^Q3`nuq{+P75?$@-jOqNZYVYx1 z)xOtT2|mKyyGslZ(F2!&zrjM@Yq#f0BJTyq=OJwYWo-#{7N~i|779P|+HQx@p|<2g zXQ0+iD7}Yu+!m?HE+M($Oe0}$<;qHz z=hqS|ji_t`Q|${tXSkK=c-8IbxKS@TQ~peW8fIU@FiBbZ;r&g(T~8Z!yKjRe+m4E<@+ zg7ZR*_mhqMj50^LWL)JImeLA(R^(J1=sDAd?nqfS{ zvFj2m2j)`erkdyGYlOaHla6rckkG+Qu2l0m#_peI$6%}I)ER|Rj}*eHj^7+1odcP| zzgoFRGo{V+DH?ikNty0bQrqPw{B$y&Wf{UOG|1S$vR1A9MetYsTTAz zZGkPwXA4mI7Mgoz9y04^@T+-k`OQt-WR2YP$#{*)c&sUBJgL9|9*$>5x7qmo=V3pF^c9DADLzFfWZoU`X8>CE5BbzaBNT3>HEkgQOWgu9kcw z-U`IHRO6HfI3VlF-Q)j`*U>e020XM<8>Hm?Fa`tI%!+u~4s*JcsOBiWc20r+Xzl(=FD|6_f2bU<^Wv3!k4^?BP%%T?L?S7yPK_2LHUf1TTv%VQQJoB6 z_HfanRV4*{4F)7pMdR=W30g_YPJjR9nW8UA{fhGe6!Qsa!8s5NTj6{P+vSG)d-$PsKt3SGbcSjx@ z&6?5cuxuvIpQQRv3axM}V?(U_zVQQ_F+t(LtULso{m;-r(@i0WiL$QmSWIIS( z_mQwr;t#K4{=y_7Uy_3{2Z=6BJakpF({Ge+RoC^zR9`XV_2lX7gGT3CXHOPuJTyF; zX9YN7e$j13hu1%KDABZXcuQvimEJk=H(C_Vg<@4ox)!=GP3nT! z7t;YI4)a1T3Prqn#X~lw@2W^ltn+OBCgwZ?pzeQf_G{DP+U5vC6HGU)V2?2$0h^Kk@B?d_zBcb2w&GNWRGIi_65wb0{;^(m4F{C+5q}@w=6}Mr+ z={WBA2$0*O+bo8QT((-CVEHK|!(6sDp)L>DV{}qW(@D`{(xL}rr1z7Tbo*L#Wa%Nl%J^c?;U*+?ERe4Ia zYzJiOee6c8R<(E&vz&`7_&%GD#s|w>mjG($Uv2;#0Do8i4;Hb0Vro;QWcDaoeR2mK z%2vkC)0BZy4>We)7$mpQQzF~WT^#^6)|_kV9g~_I;~GG5VcAe*zgn4pj)wjojSdm* zV-3+4q9j2UyCv6{!suQMyEY>_Q)uC3(J&X$PTW;QD_4hJn#9`fHi~(-;!4cTc!-5K zXS8hluS7mHV|jU?q_nbab#q8QTgM2fN)j9^|?G%+qRHLTlO_{oO5;QSURMF}JC?_eJv zRSULkPnrjox!GA1{hB}-&q~!u`Xh?VI)?6mwR`r6Asi2@q_v71za5V8_wWqa$3U`1074*aZL{w(f?i$>wLu3;ks3j| z1h0ENTDnA{Z1$U)?U$;S_H!(FEP(3=4zQM0CLbkVBU8e)x05ezF9}HT)sBNcMo7o$ z6@u6t(3y1d0ng`Wdyx7@_;ZRfUBQ~ zQIO$t-9(kC^Dit}d{5wr5ZRd%cpoi72%18f3~LoR{X6=)84jdIc}CZ*@y`wqU#se7S;GcHMik zChTH8)~>CER6~p~-SB-DgH+K_2Eyd)upf*spk0np zU@oA#VU-!|(qhkMi0%08yw&crw<3qrTSUsLyVFx!&E)k8uSy$ISJs(-WyIljF%zbs zVi$gHg4|+kEgW9`b?<0^mR0JjsEziMEFpdf1+q!pTx5M z?c|r?4-%|d4Fhp?T|6c%EKY5$X)Sdn6?KYF2_ViaEj8~;GXJ95VT+4Kc#;hq5W>eHr6&#j;FZnyEj z_Ohp_9wKc+gU?BLzUSNl@6KsCC<+a01e69~*>Acb)4X9$q7h~0@S1D?#AzBbri0nF zSAwfcLn5xMtj6@SD{TNZ(3m)gCg8qs)(sr~_`@@vs3f~%c*ZNqlsJ1xsD!#2I~qS< zmYT-28{@t>Siw;ukE57GoBTZAw96yAD3bW;Sm4mWk&`(l+q!!!>u-e$5PxR=gm*4WbQ`XGW7*>I|@&9GR={-^Y{zqEugz*5L7 z^8cQ?4!LcCU|0Wp@Vch7N(2xxF3+`1i;uV02G8b~e-O5~$*F)+|KW32=%V5K`pxxu z`x|jIL};j{kDi^MD-L-7uwqf=%VDY1y(MNlNk+XICQGi< zoU+CgeUFr(9MwMacN6xAK$FH?2dsT0t^R^#eO(VJ$V=C&w((4{VN-9Uf%?}HYO#ZE zu}MN0U4P`Lgu|?CvtNwl5aUeLz~EKX()Voh65m9dP0};{8gEDL%`Ua5S2ZkgBe=}D z2;RvI)E+IR19_^g2%7BkOmpVyKFtN?Z#^VI5+dtQ!l9rNptQr?PofilrD1QBv@no! z&{J_;SCn@gYb0$X2RHq=NmljKS%g`deq5e@)SY|O(d^V&d|u*?T5613#wK?_Sgzw4 z7i*o^WTcK^GN&9a7c&Eftf0|Wk@aaA-9$OEPL5k@fm;u$BhN1>?qNx887TGuX*D8zwHkV@l|Q8dz{Gk{Ai<&e zaM^A~tR(YP4=Wcdt~%qlP5`?^qjRdwCe%!-EjpJg`{|SQmM8T;jjZ|zVzY4{&=HKx z*m*|ya1M2O>`TZA!anMUX|+lN>=B5v++h&ga4)n1}%o_ zCc=TM$b!{qmq142R9NWsV+P;&fdCNgc*+FgGg^&%3UF5-n$wh&OFU_sitIF&;)UZcM;eGg=Qh#5-zJDw8e8#W2eI;h<~qr>LI5~Ov-s$BE^4)$)TnZggLQU z=;J;|%nwxe$1B=ed202UOtC8Mwg`5=Ci_)Px*QIa2#$72_B}FS8g|PKy~=Q6TI*Bs z2nWb3xu9uAL^Nw_bF9uP8wVh?JeIBU`J@bNynNVrxqcrBdNF?UdOHw#!+G1S3L1z( z2^_C!vZm__O!&9r`V>Ve@iTVtF=<}-^zwDb_cfJQ=Grz^RaX6x2QIPAR3e$yX96sb13 z2*jHkQu;lrhwGy;aWMdIVF_Z?^eVPFv97fJ$M7ENj*dz!A=ttdy`?Qir<*rxye&hE zFpgTI1RbPr~Vn6dB(T;ebi@Oqfx=}%gol7hK! zy3^+K5SKV3{{m96ASgP*39Ti0ms00&9onz2%Pb*n34_LO59F0u7h5jCWN7LRqkY^qB*oY6uJk8T%Iu zx}DteRHb0z8K=fmOvX|vj^a|9BR81>p;uaq%>chaTD8Jz{|h(w4y!fKmfOH~fpA%C zr1RrFFbLe$GljJGN1|HJF^0%}G{?L_0maJ$5kZYp$*JKT;Qs!e}c$S~x+B^-G?giEZoU2`IChu5dS5!KU% z79fXV79g@d2`9KV=j~?=hsc7KyU;|BBge8LHwu-BlV44{TK%J|+V+#ffy5Lml#XgU z01tiW9~3BQoWRwl3rZmd8K;?S`lg+h@%4^~)(ja5=-Jy2U(Frx&6YjqzOpiWokrO5 z)FiM{A{dE*D0zf40mm|%tG#eMH0h=*3pl`YOW8j;QX&ipMzcp*zgMy}R;@6X0VE$f zJqpb&9ZxX_UvX26#X@R`TsnoQ8@U*h580CKG#gf{N#~0x*J@3xhWn+nViJ%gY5{u# z=@IGnJjF}G!{Ir~YntS%;b`F;O4Sz8a>J>Gde}7L?7Idb0t<;fYt20>zHM^0Q%bH~ zQjT4V_6^DMjsCl6B5Fd5Unhey6OuF_**N7?v*_;vimNyjc*?+D;1I};Z@`uQnh{yC z>!nKon9YEJcA(B{G1TT{NN7%FEat8HxnfbMhiAfms?DSQm9G)~Ov;t~zTM6M=nYKV zdeFmWp5zN~zcAd&HRy$lfMeIq){ST7E0M9DGx zkYO~E=O4ZW(DFUr*%&y&dk-Ns|G9v8?ds;ORhKdr|D^n&Hx?aP#)*^5pN$le6!qXlAE7f3GLkMar2o$!39uILDJvoG7N? ziK77v*KZuL2l3?aHF(RZ_z`NuT@EobA#8f~_&!hHf?viKz0~e?i!ji>e@02x_FvN@V2z{Wo6BIojy1ZeH*VBLC^1RctLl$y%Qv_ zzupJHZ%@Yt0zRSrRoXuOyYLx{PBVeM$qV)(`^CkJE}~!cYptjVe>=PII7(Xmc6NYtB+{#N zo%7sWI8|}>fMh4!Dfavrg}6pVRfBQ7RtO=EHS zmuu<5rY3tYGy9yxvbiR=Xb%}CcjeH@rmU(qCNmbl<2V=3@!aZ%Q}lA5D)z7PFUl<6 z3XR2+t6b>a+x|$e@^dJM1&=XqVXu0h7=;$F2C8HS^N3I5P!P(Z!cnJ)GsqTMt|E&t zccMg1giUM>I@A{}>Q37!+WdhzDJIC8ivsfM2}iY-ewoD>{A^kL<-%gbbJ>wg=>D&_ z*(|~pC(sjccXn&V$5zA)YQf29!^+W#tGUvM%Av>5 zz)G1zmC=SohnJO|zW%osK!k7zXVkG(qK~#HSaJ!6YzG;`GZL0B6zVh(Ks4f+2xE5) z_vaWGa?1XORl-d}UE;K@!ENBjS#DiYreacH#&*@`tYZCK{^^zT9hf%s$TNN=M_(pu zmFG+$%QT?)`WrPhHQZdTR5I4aHNwUfk1pl)J>1-d{1Pg~J6={WGCi7tYD+RL#=5J# zD`1Y@g@vtkqw(6%y7$xd;+l@XZcL$ZdN+4@k;&Z?8uCzd_;x$e=@iAA(Fh*{+btWnN=a<&(G zt`}++pX~Uu+~kU!a$L1y4A2HSC@<-fG$tQ%q#m->FI1Yh=#JPmrM7S*5eQk$8dA>^ z!Kh8(YvF5DYcVxw_5A*&&Ih4#T_BliNEMN~8bM^3SE%;DUB*S%CGcwGBQXhBpL)tm zx~1bGFjrmxWK%Fuz~PQMb%^KJA@Qi^J|pGWq!e3n>P@=En zRxZ(3W_XxYBF^k;_Kz{hjxBe65iFp@Gp5GUx1uT_&+!&wdwNNzOmTjJ_Pqbuxe+DN zuqy0*f6t;{b(h-mUa)oNvAD=X^nNyEbom}gvSH+3i3Ju>+UikUKcjN=g6zC;7T~mX z0tDt?yJl&3UpGhMAAQ+afU$P;klnCZ3&qOXa^|GK@aZ?*x36zI$z6r+OrwFg!iwzB=Wj$ z%$1EEqX7WlS!yA<-h900^L&+1UK1LP2u(9!n%vgA#AC)P_}d?5p4T0e-4s#id^8i4 z7jVI*ji8ch?2_Mc#||UIpOc?!V#J-G))1}gB#J4u>c|6hT~v)Mn3R}F=<#yirKpq1 zIDXS1ckkBc!jO{DIl-ykkbuTcCllg{oAJ9FPvb=+P?eu`YlWXLL~+8irRqm*H93*3 zoU9;hvM4FpCs;B#UDV$u(CFgpe&_vu=aYP!6qso2{`Y;VP@&H8m;%uLO3MHW^rwuz;`w1%M5)lQe(6$PsF!m(|= zJ6*o^{mM4)l&=a|Z9cd3;IUDgj==oqmKMPub^DtM1kLL`69WW1|9&W-skvHLQ`T6Y zeDeDF;nDaVn|HB)yv$R}4(7`rl=?4oBk~}cA1lZ(lMB-? zGklJ3Ta-NadF4<0H0^Iq+ZtzlV%H)5j{aWSzN<@ zB5vjQvof?aCrsT5lXHk?ZfX*{TSOP1rl3=SwX{FKl-az5<$HpUft-evHJ?C(be&^* zBL>A5P8)$%c7bqyr}W-6f&E!J4Jk}Da9g=!qJuVq9VhZI?dcxc(Rk9W&2Zvd4I)@> zQ1oN3NC;&a4lUZpK4%z#-QT1~m-61L#exWHdqehje>r?m6^Wt#b<2twwi&keB>avUVaT<6wv^X__c!8v?j<`7+`$_llb*&~wvsp9jthU%K~r**1GE z0s?-100;Q{&s{5cai_d&A`0{7tt-wiF|VFk@zhOuy}oqL)pyJh96LoqzQ8z!%|x#f z^W70T1~gD&ll|ODh0jnPUiXcij7z0EP5CQvua<%+$^(d?ct7j977g~IQj)T@WQ8Zf!dCVLZv zJK-gixmvG1Y$i48Q?()BoKS<@r%O7F zNMg$EM2=lU#|T9gd@vJdG(@wS_Rp!hj$5kL7(n2$H8Pvg~Lnmv424DUK{)qZd?{OVBpeUR^8l)}1wa9%s zJ}#cmF^X%G&tP_gc%IB3DdynDYavQANT(TG=1BkBa1I>)+H^H*(Pz!R`OYbiowd$kyQt8R<+Pn&I%{^R;5BfWLDi z4 zp04h$w#P8}P#OkYpJpwX(0`dw7n+(7<#PC9K4&mB|$SX<+T`-x*}= zUJGz<^|<(c$P8xq(H__kZO^w)CzO^J0y&0;{$toK9$-rct~D$v>dFIOz%lL!9jm@O^KzO)=%MnnYR`-6GllXlRM@%!JT$10Jh5APd=FCr)Jm&EcY z1?5Mg$YA81%LivTiDmGCpx)4YufWKRh<{R2(0<{=Q13fg;Y$>W%bALB*+bND+nX}; zDIZwp`>EI*Z+MYybeTQVjb+BQ^EuyHuV3Wn^WEteWo(|eL)du{Va3w|42_o)QXY}< zVw%pp2>W{-#?Gn1U6{x?M|Q21!JqRGL<1+Qjz_wc0yxHP1>U_sZJD>>4vviQSZ)#& zh|MEdVAq0azq*9VNik}H$ZR_ji>E`>>--W%PZf(|5`&+d9pRR0F&@fcAh{$%%U_nx ze_MSnd8JmFT?kftqO)yR<;|_1yj-8p6NeeVWb1*&%7uS=QJkNTkoej&oLRGfQ=;ln zp~{Y?SfJi2n7)LdzKO!(IhEviUBZyNJbr{wYc$I{H(i6fehFTyAl-U+Cq* z0#&>sDOo0UW`Tmd%^xa46vmN?E_jLtypJO((r5CJVMA~u11ql@s+Jy%D{&=-DoEzP zj#|tTX>346T8oZq9xVe}HtWSnh$^$3Nt37MOy{FsTxdq0)NQWqrsDmbZ6Gx6o(JHVf{ilwe*IbXag+X5U zT3){9uf}RF&sc2_+mRxpm7(s$DER4N;OBB$?OP_&zOU~>3O@j-LsuBjgVeO*O^LHmMQ+rPA&h;=(e4rjzjC}e@^ z1*8DgsZo7*6x~vbYWJ1;52xJG40@%E0u+HXn&SQx>YJMn>)>X2J027)-`g{-`4CVtro0bOJF zfmoH=w)rPHJc+A&>)85ol+-`6uA0^ICWf66t@<4HJescD>1umi3YCRHieTBm`C$OU zl;~15Mu2r6_>e!1ET39ztCg(XW@x60^PAB~z^EkPdVW(XHd_id#|$TeCbZo8CjQ+Q z_-RL{hL@`i?TS3tmb3W$gJz}4(u{+)h^6eDc~guLGK?5up-W_}1{(NOkbG(lJkX<2 z5;Hff|FC$CNwmm~oFD$7I0P!TO=*E3IQ*F!n2_SGvX<3UPW_%s=3(3?odqXt=%DB) z#{^5czpFK3+qQPX-L!0L0YY$G{0yo_g2*KZPCb1~*s0GLtWM)ffNiBcPNa3wj*f1d zuRP^)CO|&d0x$ryV{94l2D(-lIOP#rt+OwAAy4<`+Q9Vm@CB4%e4iR^OO-a>eoWam z|H2`znj2$ESF(Cu5E#hQIpt>L=CG=QD_I71MJ%P-$H!MWx6{l8PaXEf#sa>cb6>Wd zqLpk@RMTe79Q^st$w2FV?T#o|++3c#z2EzH?4+Ae_#JK--csjv>*V=F;FWl2zP%ZF z)!f@LSa%3B%>2_IE)AEb{tt;3L81#0QzPv+RR1Etn;Xf6<+{vC=LMPWB65nlPu{gA z%?PtVe@a}TE9t#NqQOIUTEsJN-aA~>waB)(4>p)sdzSAex+euWlKLq-r%<#+y?EY! zn!qEQ2%AtCM|mb@*yQ)i8ObIRPc&trBUwM8FhF>~ThmC-(v-`k78PN*IGb?z0Z}Oj>b%#Ei z786&UY5fG+czoYsm`caCzM-n2^aYJCL3KHiQTN`fGkq63lyUM%{7t6}&c|r|ZC!7M zZLb9br+4NPRgFaU#vY8mL@VVrS1bU(9P*v`4tO~&p`j3g{kbv_vjzR z%Fy<#w&>1C+LalIq;h1O5HTeCq_l?Z&EvdKYuIXdC5=EOp=0&qIho*CG zZCI91{XSw+pi5+{5TD?~p`7FU8re~xd+^sn;+-dzo^OXG9P#_}->MuXTwXt#SbnKLto}-57UI+?)>6>V2NMi#ILQ5mU>7)j83@q{o*2g?oBpbz+O6p8q=Tj>56X z6>H^9EcK44V2Hu!rC5AYAhsqH_rpFhqhjvBcW?Th#SCB7Bd~X z%+QVQI2WAp_B@6Yb@=R5n3gO|){AJ~J8rcNUTb^N>_3e&){lfZ)5_6ilVU2OB37f{ z(7-*Wg@2;!4}l6~3#Wu`{pWtD4i9l?$8**Uw(od&AM;`vnzB=NdXwe^nRG=6R+;5P zmgvt;O%MZAvLHEe77vF$FDfhC`a%j z^JYWL1EH9tHtqfI6tNHkI8ZS8v^JqY9zX6!vnQa5o1iPDJc0)YWM1 z0gZIxv#6BiY0)-NCzJ(zsV;_42)T2?XQuJ^xMT{tKoJ0Pu>24+A z6ltTZ;TNM=UGN}c0P%d)=L2dBp$$98PsK3l`&BbWT_LBg7%N-8&5P$|Am7*}ZpC`P z)TIk_0yp0;yrQR@IsFqH8Bx~qEK``o+?hM2o1RMBS-m3a;Y#M&T!z8nYNS0|RIMju zMVRbvfpc|AW;1DW4wG{3>vI0>|LKAz(yX70UJLH&#VVwSMh8C4A6G_W-xwwbfn|B|ke94_2G9g`&}bg$>% z9rtH`-G3;Rm~75pN>5lCbZbsX$krj^OvU9yKc7VfX`|X2Qm>br++M<8W>TdxjX5+| zE;-CK%>1xCP5HVbK^61NPO)cm!30Im) zg&z0un8S$sm!Tj*@}_6WfapMbM;#6ehTbe5krs0qJMQwLPZi)d#q{?j;23itBtYJUXR^+S02M(&Ov+Li**ih1yXVvDQj8*lXq21s!-8i;kxc^u-C9+o*cIs3aF z)`{0egnMM|>lr(=%ZIJm^e;?Q*Ji8Zptw=qyCoX0%4p5tSYQS8S?l`ox;>&!s2m>@ z9-7&-X2nFPu5=bA2hnBCJwEe&eI^511(zQOZgzGu9j&>M(KI3OmG+O9XfjyZ5Zc9$l=?)+Q@Lby0( z{?}AE3OZkNc>D@6e_(CZcUsi+k?N`z`^&t}*lDJK2G3gQ=BALZv<$nmy&HmSu7wk7 z66!CCaF^$goz4LFWc>UqrA`8J>Rh$B{Dm%ok)={MTbq?nctCW6bOQXfO;cS)Ne<5v z2cg~f?Bk;Aq-r2{R%25;URzDKe@+L3_IGCH@{YFbr&+bHwZ{8KN=h)GTn2`Ak5l|b z1o$@3&5u|(*L1&yN3GA_vhUwFWnQk0-;sjeWr8L*dtZ~ks<5cNHW?hf3uk?P*O1&O zpnuw^DZkD?zUk7J7!xQncpg(HeC}P}?hbmFcsm0AxqDeaX%G4VuYC`1R`=0-?jHs1 za}MvW^gEQv*#?^2Gq0)HwzeM%-Gt(91y(a$_H2Z+hN3nj2JB#e@ zJ)wOscD~mP2fZ4@7N>@Lxe(pJ)r0_xg8GGc73;zJuKueB&g+3~+Fw>PDlFzXn&$bc z=D3E^8@yqyU z@>i>%`zT{aw_5o9IlFi_XUn-NZ$I-InV3fu7_*-d8F!zxx-7(Asiy-(B3 z1>rtGA%hF_Ck_e59B-Dn^MyV^#zC$i5W5-U$e5k-LU0&R3s1(Srj&+7K!fTeNs{_$ zeznEzdyyjv)pR3>EfT6J*(@jPDN;-kyg~Hy9Eto<9O`8%NIIu=cGGz;^d7{5*bDOf z|3ivTv-cSavESxiC?~8|5wQG5#D<2)j!MLhPQZpn z!i7P=VNJ>t)~-L_cIY`eLiZe}*#T+fH=S7R;WxGP7#H`~sBJbR;%wwMA)Tq9S*WDG zvY`3|j?sd?lo_KWuB(5PM5^I05L#$_lpT1Y;5tUpbP)d17l5^@DYgxt%d;;xKT+@N zSFmHwmHVnypya!xgDO|^AjhmwJ@KeR;?=-rV_q^mt``+DsBT!k#m!|#(}Lv46Gc>= zw6uF3(AO6^IaMwsKMEiP@`%$5N}ZL}D!jfkgA_RwxhkF$MS~Mk$$#pS6NgjH)}8UJ z_+!>cF1;t%eB5(MN&Cq0{rYZH|B)MmKa4nEEN=3fl+&Lg4jWZ_O-6>yY~wt0&%ns# zM?3%|Z0wzOJ-3-0dDe?-x-&LsK1i3t*qnB$_^esF!Y8`Dya3oh_*Y}|1Ar96S=RTi zHATU-F*1lOH*BnHO6QU|NcT=||BJAfVpG~V-LyYJAR2xQrS$N+ zzq%6ej(a4btvI1QTuj+gBc&{TA`6KSG4p!~A!KUo>+3+;q*+tctS)DL zE95CHut#w4%dakDKS)+hirO;+Edm;;@Axh0h$-!ZAi?pkvUC1I`EkdqNu+24zRs{o z)yx*xbQ8@Or+)`XlC!D62Sj{03z_r+ievRe06=Uj4D!`5XHge&#ykxT>s6Hgs(!}A zW|U7A1lb5*@;@j8!aC=8#y(xEtVH4TK&P{sJj-*t*K6DaAXzk^S-qgO#lN zifZ#`w6wHmSw+BIS6f8lu-(o=`@eHfXm}V)ikR9I7J?%5hJ{$h>qlEVt}i{NKj5f( z-Lud1_9kv`JJ1Vc4D<2nvCs|FDYofrNQry!Db7_oLCPWzHjIZZFX>0e3$`{a$B3RI zu?@XPCV(aJDbkn71d)ft!**Wf=NOiYtwOV_r{Ce{IddG>m%5RyP6_wQC$;Wtn9rm$ zQ&(fu;ePIsCa-2J1?>Z(3xa)p@iBjkNQR${%A#6FwpV{WUJ3$?L+x5MrprU_)mh9+R%9E>K-d+Iv$@9pr_Bt&hgAOLYGM7p2elv9gUEjx zsG0N`m|8#D{PZlN^t4emCz3}KF{vg*iHg63|^f3aWqW3d5W^s){;wf z(T{j<@~#J8)G!e+B6JYbtVLs8MLFxF{I3_F2k}uO3=t`Bg8|boa$xpZ`~|=BbL1CR zC3_Ux=dbv(h!pP6Kw!pOW&bK#nQ1(l4fNsiSi@{HM!2|lO~j65WSZBWtuO#mq(CF+ z;1GlI(}w0bmxjI*(lAMcx_7g$WOz4TgO+sg0>(m$@G!1nfY0APaGa-kBbvXRpdp`s zMr022$6x4z(ixwXa{OpN-r0r*_X2G`WMTjRU!-`V8E5fX0bj#LTTLr}iPB<z@L=N+h|c}i%7S4!~sOpwJ0Is zl))^X#Mcrsq@bL7j~`J;JcK{FXCaEevkzniXR2rIjBGm?#v6z|3|umTp?3g@6{+U} z0iji&gkxL|0JT4O1DFz6KE{=T@>O8s=sNfQ&y=7$-sq#Bv1P|^eUUQyul#GCv_&>r z4k*5Q2+R-UaG0Bd{x{qlm~?Qnue^ywuvbErGB%{P`(Q+W4pf%1LL8s*Kd z-$057sUxc&OUQ-r&V0~#aasEi;NEsd7cQ{=m9>%!qS@`!o@K5!R;vQucP&#nA;n!a zylZ6;5C$0c^FCz3YsVy7A0W(Y5;9w|dy7k^h*(5A*M|)qj}BBE8OH6KpEwJLl@nBb zqib>S2Iz&x_Zgcq8Czw55n&EAH^DzWTr=q3ySr?aboAM-A(scrs&zE42YQdok#IRB zNPM(r&@W_lGW|u*C#-9T;-UiQ%U8E3XiP@qby3&_RDD|Hd!Cm~C|?p*y$3Miuiwmg z5YM+&Pr4rB|572Guu>>W^u*o4QHUC6W9L+I^TLZct^cd$m5^bUq=swwN3hcW0>wjZ zYg;vmW!H6|t0W?Vp5G@upVV(;h4eMGRpf;&MEEH-^CtrRz|e*jh#Alm)NpWAw6#)Y zB~^qAdM)Va1tkZAY{HdI<6135v_+mGt^INo4(^wD7=HmNlo`8fP5KkMOU7Zodf zy8%KDYGn~MFgrJ-Yv7Q0y8`u80xB?kHD#pq?cTLx^s@A_&wzdDDWu<%BZ`pbB00W)`{XH-XAsXeM`zC9;KLmji!r=bjz2F)7tBH= z{=OIJ{pSP)T3P*6S9bcwf&bMfnsue_JvSi%)LMxBqbuoaLrl!-7Ex?lC7_#Iv!&?X zNzJhU&0L1zuJ_z{y8vpbKx_5O=o&YLo5%z5QiWY zv5RpnaFUXm3b^tITHOHDga^+?)L`SZ%@+K`%38`545JL0FPlB>Hq-^lyHKE{$1@85 zlUdLhPX4EFalib?K%tA3at$w&d^ z*b<9{NP+~kvjY7)so^v0W?lL6R68yfgOn*@?{AH;v4zR(@I(ASI={qMf^R;ernZx# zeX&{fB-n#!Lg$4#SgkY~kE3O1+F>yR?inAehi?g!OG7BJX^byjXW#pBXJTSyBa*Lb zK(3*a>-Tx@Cm1VdI3BqKgkfuNfY% z%L}4(ZF}rF_bm#VnV*ELEy->3!Tv`(Gt=rE%WZsg{){H~W0>6vU~8mzoY&bGJ%q(~ zpgJ#xPp>hB!wiAf&?|Fl4*f#*ghY7UD+d^fW^PvK?Tz?X-aV@Q(*s~ikdYfb3IZ7| z#vS*%(eEd6o(cS}a$Y&wZ%JP%{azm1$3>oc4bOVBg);f<{kv2P*=5B++XXNe<0Kna z6P6WtyDD*BKf126x}=S2?5-5moufDFWx zJ_j{La?Z-wJ-0I(11eVYo*9V3cfE+`L0)WXaMPtE_w^}h?tKDNHqnsDo(-H+3TP_L zB`jJsC6%eT-?I{7xRu15AswH&sZ(uKAD2)!&Dy=^`!TW9!AaHhVw8nv+FA|TZVOE3 zw_e*SveeALW8salH<-2lZiC@IdLceC5pF%7zfA}G4FvqP?t7pnV`pbA(dTAn)+nEtLw8SnD!YyX&T)mKhbk!C2HW$ zpaJetFb1{gIg%X~2^jjK5_b55c%oR{@19f$91H_ys>u8z1M>({ao!=RT($dy<7AjP zR%Z`!&hC5gPA?f6uY-X0Ttdhwpy7>ZMBwV0_@o!ofutCGSd{_AZ)_yOpMme+26&3Z zpYW}O~@wE8AQ~m&vgHwRP4EFEdA5~ih_!&SLe)xYC zb910W{|Qz1U^e9p`k*fzS-u%jZiLgVz-;+Ncj?Z=`cAAgG#5X+d~@5iv3?OCaIO(3 z0Ia~B^JDSL;#>k%HsJik3|yOKa-&!1!KN}j$5dND8p+U}lLK1$t#Cm<7k%pLT$GCu zjO2+~tnrRdv%DF95Un4`=*x5N!r!;bMoGvWS}5YJrSX$#LYd`koDY$f(m(sXyhV{d z_-npOuEmCUo1Ci{Qimo9yQzP zklGN9dDicpWk<6kjb0lo1CU)y!u_Z#WrSu=6^BdP5YYwGZ3;oKG zT1&hPaolXw^aUc;>J^J`t>d3-G?jsur>tx>KXULZPOJSrxU~BZ-Y;%Gqv17Mn;r?9 zp2W_@s~p1+a2O^Bpaon1q=|pNXa^8K%B?6A%&2`h8~0rk(@r%O@C;o`NYok`73or^oAYBj7IPvHjG7WTE)+#kGGH}XKf?j3h=k`H&lyIfXp0oW#W#f-px^Zoo zOMMTD5+O`I!G=9hKntF(`}sHZ$KSfNL=Dq!0`l#!Atz7)-TDB-OQ_%`H!8U6zs_CW z`t`qZUTM>JoWbB|IL2e^^3d!J?Qci(-tLF6>Dr_+nMayq!zW;7iN;73N|w+3nzho> z(KdJR2)plvGv6^M$jSU=_baF2hIYx%J?3FYM~*RKa8N+@Cdg#VP*~h`#Yic8c|2&C z_WNP0xb>?(yg7fWM)V}xqLi#Y8|_83J=3YYu*fqSf|FloXNwzO>Mb*^yzs8~wTe;_ zvFU2i?fun~mvRV_Mj!H}HVh?;H(&uW&GlBvR6vj1F3p~T1~2nG zzxqH~pZ;ui^Q0L)D!#t9BRhaKHwhKFui#O1vXG)?LxIio;=k2(MaHh4Kh7uU;k|lAsR{P%NTUAcQL#=bb75NVF>esR4g(nPLl z^gL(c!b2$@Y*Xm9xSwuQ9r&4(oO`!HU%HE9ldVeW!yWn9Z4fvPkI{zT<>iieovSed z2OCJ3ROTWOinefuPI#`2A3Bo3CP-}Z>xdg1otgh~rrjJ-s@3w0-@9DMwBoCv>C4BV z?)GKXV@OV%QI*Rr4Kfo@QIG!E@!?OK!=KZ7w#lG(Ae#Vktu5#V8O3(VKrTV8tLxle{<4WVrspB{cJ};k_5hq1I zQahWZBR{rri(aX)P?dM3q0qg~0;ly^2xcTj{6fsP59bFy?#>2+{455o=$%aD{9kr>!{Jw7UV6^JU*p|RRxlU{M01~4B)jTy4!7m0cZs+ zG?;*LaELsxDoz%@ma_VZIcW1;UKkI^plyHm(bni%F=iDIkOAA#(kd_|01X|O)XSjl zi_bj;w^QUId85xv?@s%66vQy(h;szM#hW>yeW&jaTI=U>TDHtbXv*+-25qwozRy&l zq8_T=hlkJBIRZW3wsg1E4_A(@6S7`_GtH1JJIML{?0DtsTRoo)j~VNx=S#!(b5bwL zrRD%xy-q6Rd{_v6=ME}{oXrM`guOepw-{M%j+L7`D}K3_ZN*6a0bqb?y`l@ubdV3_m*FY~;+2<`zT-}G?6s96kNtxDd-^N9ZB816&BtyV zd@*Erm_-+I1v7 zhK@GV@3CWg@yh=)3%5UHDm{*n(A~v2iQKRyk?>>>GH2apC%wt~8Yqbyndnu*C^ z|6)MMblK7nFV|tbitAv1El%9EBnzSZ#WQyb9CxyJ8H=Y`&oaz>6an7hloFsM{H8gk z>MJKuP*hx$Rb150a5Rl?v-KJ2)2Yn9CgHPgb&PNI1cs6LXLw^kOmEdO_TkU-;iqWT z>GILZgZ0!1QT*LEQiettiuOGW^+1c5JC=wm4xg=t--c|m(!)0IIeqt29HgGAnbVPf znhJP1CEBNx)h}w|HHxwu=g49GjAdX3z<{FcQpPh@y}+wn;*mWAx$HS*8MyT*`9VT? zrTeV|Sx5?t*s2TAYVyqq+BK;F?&;htZpMGj4n<4OW(C9C8My27(oI&-C5N^0vd2`g@o z$_pNQeV#ir3H}4Y&)nYuNmJrgWNmh&`5XycVg%uXMBzbfcUX$p=`=Gx4<+UnOT0hF!8O+AcJurVor~fl+$+}(ncv%OT z5rxhnpb+X0@%aU$VxVE^41<%_puL z3m@MTt8qutdG`d5zG6n$Ko6UY$+b~N{2EF88i@Lun$=N-WBE67+D>$jXOp0M{bQ{W zX{~Wq)wdj{wXdFM1XK2h{l^!ZH!_VvSj;(BI*p2kR4@FUEJkQjjz=Wf03ptFZ|!VQK$I*Uwx5xQ=MPZH+@BE*Fk|{dfHA4E#n^DU$g^w{SRQd0o`5>RUBGhYaA7uycD(@fZaJ z>92I*EEs)y4-Pa}|8|!1LT_F% zDbso8q*)9QAS?t~O{v|zu!>tq-3%BT$^=qlxYzi7a!mKhmh>rH-H_ME=)PXk{eW!B z06sXooAt88E++{3VU$uPs*gKq^u}o_^*oRAH+xJ6`?srWf?a168+$O5fiSOi;T@UT z9RWW87gmyzF#{eTc?3>o6f-Dw9|K5m?SXFX#NJae+N7OxYuds6?BJw5U}`HH4BcAN zxIW^pTQ+!`Q4y-BG|#S;q2$=rw^)><786|$;u{3n(pV}ef)%5056xPRXR!8Xuny<2 zN#h;3g@60KwN1#U*${uIl!T_Nb2q_(2bBQ#$K2vfnaE7ljf7;0;-FMUxP`41x32nc z66S?6#bUgmG+zO7 zycU+M0%Tim@l&IsD?zBsfz~lk0+Cxy6WtGrcZ{Nd`Vh}SvXS7ZdvNwUtV7;D1H(8l z2r(|!o9IfqUBDjltaGQ{zX$jtXSN}2?U#SN?bdG$FRsC>*}>!)%VDD@J;wDW4fCw& zO!$%JS3smiD`tUQceq&ZWKBSC0nQFya%y&(iH&!BZk%YgYyIS+Zw^#(Mr}6HzC159 zKz>1wd2m}p6;2s)%E3F)IqyxX975vITAi2xCw+g_V<0T}g!Wjwx;a&rbGF?iWNIkz z8Puy1jq5Y?a!CqMO0?b%AeJ19_VKnObUvSb46|#zrYVE|gf?^j2hz!j<-WTuMA-c2 zX|CCLRqtTzducxJb+Q}_zpk+O{LB`bU9CZKG(-N5>UeQeP4hU-oZ;#kN}^99J#p5L zd|DTLk1Rf2DZM%Ndl$md20|VC;hUzKL&xzkDVbY)1x!kbTlRlAV=_zcm%dw?Yvg~n z<;Zo>`YUkcXl)XM5;6Q^>eNiBwIi#+Je(1Q&+k*nB@SQaCz0NBMrmGk&-8$dAU%k# z(tZ~5P Av)j)_uWLQKvi$uCSb$?XB6$mu?x76C?4>iXdnXzSILeuqd_OJynV2 z!q$k~MN)Da2j`2vb6iOPOq0(=Zv-GA{{pN>z!t*?Q!@wmQ-hV)5WlsYmkXBrcE4S> zyXDn8)R!%=U&iYTf?tR7>yF*s#q;gp;w_(tw)B9IN2pUjno4Yvq#1}!(IaVzPet^y zUz0%iZ{UpPsnI;C5qDb4Jb6N4B$qU&dzxp^#)MFu>oyg#`oqU2%)d)UW|z#^ z(Kt&rmn270pea<^mdXk*bYAeC0`rp;EvOz<^t8+Ff?~hb9mn;k7M=;4zid;dr54wF zO2az=*LxGU#l*a&TdGAIUauQIGvC~1)4U8D*QQp3NM1?rBa1--Y0f8qDEYdhT;mc2 zX#8eX9#cS`9bDt1%To_F6%J>20Dv*);RQ>1NVv(e9!c~>jSe!Qh_zz92C=|8eipUO! zA_EySSu)kRX2FEa(JA1YC27~a#uDx62Je#p;dkt~C0eQ>_|R$e&Ems8l?CR)4WwD? zm}&#B$nrc?rv(#*B->OwS7Ymw{+I9XcBf=B^`{y=3o#M!VuNwdW0bkCKTK?AyP*ZXNy!bDm+&VFeCJOU4Za!L* zIO4%Log21?QfjVCJv#Tm*YzN{Pz9s@mQpN>N|TMo54*8ObY%<$y*)0)I`qN>B`oX2 zXR)vR;pZf%)3;NvStyAIaxo^VR%*n`jM6`kBCe;aLawcws{!Ca>fI4ens5rxnyzO`p)Cwu91k7*9hU4*;8s-LSI1x5l{?z z;c$XYmW|t=H=4i|sfh!X63!8NwUIIUGyso`*%!E*{E9N#I?+hL+zz$pSSghns$X4` zpSlv%X11oBZ`olfZ52jP&wiE01uWJQ@z$rHv#)M0Uy)v(be`5S9wGp`HyM~YVX0Yx z9oe<^c3R*_=$Zr)-9FkmCBUbhF6$zW0^3@L-Q7u zSFKz1ZjTb$E+C#Skk^!Q$gn7y_^pG`QVJYOgfpIkIkxl#y3^!od9`X{>hkoDMprve zmfRMy9+|x^S9d?JGo#_0uDc&&D$Q6V=qL652!JIT5K+*$N2*~|PEc_V*oc^U&-iBo zVx#p0vhgLAN+AZX0avk%&lkQEelPsp7N}a#KUl1gcN|wEPDHmP@2bvS03L3d^o$CQ zCR{pd9373O8ROCaQ&o`&Iga^)kLn(Xaq<~aG?XIT;T^dWD?T(Bs`(zw@_1*5yadvK zf+TgLW(T&WiSkWUuWnJNmS-gof0~o5Smo_ca)D-Momy*xOU<_R=$UsMRWLQfQJQqV z_7ud6F(-X+tj`OOFDTGsqF?`NNuM%2RK&uNw=qJ1979ZboaJ^0w)4wqe_WiqE3Nbn z5_$Y7vUX_rM6vo1(Z1&Qx@~yz(*8=AMtZVkqd^0=u#iY3pa|pLEU9Lv93K`nb-H4!{@#$MqFe9l6^UxoZMKNWgk$bW8-MZL0VYBUtXc_@|H zu$INXmN8rSS3`t9%E1vWXDG7XE__h8{5_9g-?WgD+M)RhE}0PumK)spVOArTd5ew! zc`3pmGoX67b8;^+phRn<7}R5{?9%>nUC-n;A(%2Em@pyb+92ZD{K!GgVcf%K(*ZoL zqJFmD{lZp#+(w;jn;qpBYcr2$X>d9=Fisa zgvI#=_~C5P+x)WJIu zKJ-{-g#a<}$2MbyRQLH!^E<*(PR8tXC1&Uu_^_#}>7-gz8PtFmA zDi%rNt%q@E+C-J5#LsaVeF+sLaIIdkBJ(v${Vt0ar;3ir@ezrrF*yt!^8!DH+@$e*}} zo%nrCGSuQ&Y3BiKb7KzIJSVi|Ib4O6P32=V z2LtOpy@b>Tw(6zjEFkV%{AWVM69$bBDiuUt`h= zn6Xjx`%HDW0O|RLYO!yzj>$D6{&D<9N9%x%W7U#uF_&_sf^xRlqOHHfJ14I9Er-2SIq4GM7i@dTq>*X;@_=VX+_eVmVN6bdZ3HICzP8<0c0XH~ z`zJDEb!9ADJH^_oFIg>i?NKu-c!X2FsVH5}Z~nlgUe&U1m>NyT*~pg5HOv^O1ZidC zYLQ&mu&)`Hj}Lmr{G4GXM9IR%eIRC1y3MO0xbxl3Z2NX(*Pd42EO4%ZE8fN^Dmp3)- zWKonj3&8KAZDq|E3Pw>N3F-r_3@C| zKEEXS&aAf_lzN3d`B3$UTF|!;MJX&5ak3u-&mw zshyZDsCa!YI7Z4pynKc1iKcJ5_R|yI&pkWswK41fLGk%HjG&s**>VZt}+m#^sb~#|U;uMX1l{Q!qK| zA57E+B;d>AS^`xO?BU;U4}Df3hcx-wf5Q2?MG>_eKPkV-RK;On^F>DGGLjG-8^h#7~(oI8;R#XN(Ez zU~;FxP>$fEC~PFEc(3JPtUyX-=zG8j)mvy!g1B)De+Kb(Cnjk@Ll-Vg@gJ7%*cP{U z$JF=js(6D5{@n8k!xav3!6%fPMYJ^J7p4E+2SkV@MK(qaix?9bHeS3sxcYOZ1X-Ni zl1R)^7^bUS=nX3%-Ge8B#4Y+u8osIPR_)vJDk|w|xUr-02*;3$VkA7C46)Y`iN_nZ zu-@nWU$Mjc34I;d8AmGwK&HU9ad|A_vIeEL(%ahy78mT7u&!b717ZvN+bqjm&cw`! zxFz@9$>(=Kz!yg1*+am)Kvt4Uf8e~djROWo7ZeBF9(=#LBe*rS#y!Kp_knr~6_c|W zNg*RtNk>cFT}$Oo>nqi{t3K&lYr%T(aXR%-I9vSUxT_+bxjx~};M6aVkFD?E37j#% zgcxxn{#2SJJq(>i!}#=Fn%^}?#*=a#mIvv?`ty<>G5IDax(MyjmKeb{}!+LCFIorRHnL{n< zPo2~eFZWG_;G5{Wh0(0E@pNZb(a(EKfiNS&YEhJlw;Yb``)LvgBR%k+dP2%b%{sco za)Nq=hil7YA@AvXmXW~`%QRTTo?EzF7bZAgYr}!$y?YX3lvYn%&xASbWgWmj1w5?f z#hf^*B~UN4-2UHX8+(kIanEfD0_sYPR`(TfmH~Q0X(ShBR@R zQj>PpWpyr=JNqtz8O9DwnNp)xs(qEevipb({kw8 zS8&w5C~ZW7Z*n~rVFR2!Q}w#mMwkz#4a(qcF<)1_is{4$;|UV;1wyk4QcBEFOl%Vg zaked)53=DkNR5u1(L~SJoyUdiw!oYb1{k6L(O!y%s~#!_!2JTIrKb`Szr(rgXOVX~ zozQaI1Rj%mKGwAI|6#s#vdF_48K|+RC>2JdSp_G>Uq2)K{Fx=_IW1#rOW)gTLC?V7 zeXWbG0kg&dm9ZSkFzl|d{-62^soxw!IJ2o*~K|@P9 zCT}(7=|4nwxH(|E_^4#RW6a%Of}Wu78k%2#z~_D^4tG({qsp1rMb*4)8h$K>eF76X~B{|07lfKkE>q(icW{POfQuezKl^H zoaz;L*}Tbz28mFuUqmS1HbiaS_95Oi+ydIB{bRGpD+>yk8}gXeY71<`TSdJE&i;xO zo7q?;ug8UbSmIvw>gXnnT7ozy{kg=mEUVboFyrDG8fr4o>ASx83Q|jSD9=l@#wnP_ zq0*(A!^2V0{PNia#5~i~R6IL~s;;h4l)f98Fg>iCti9qaWo zp~CB>ZRG0q_y`{8g)wW}idw66N6wECAZEr{%o<-!> ztub~tIDMia`d7GcXzZLoX)|k1uJ?HQd9&zN>|r%kYx>U>H!)-sKth4K^0BHz4|r z5jb=U75iGgCkWqxTx$ANrOP0#N}gs7akCn+aa35riUWwsJuXALE`vWV!)+b%*S6@i zs`>`zx1R^1f=FP5Mb_=_=$D3M;(H>_ZX_#DxtDw!E}LmjD!tct&6Haj)^F;WmwaX~ zn~hxmO&$xGs1owt^!cm9Wy+0!~44jcqY)RdB^djYNNgvJSe~P?<7xW z=TR*%STKS7r6V`ddx6>F)Q@Tq(5O;?Q|0NE;>HS6#%s2r&jmI=C`f}&L}>AfUem&;B)0z0t~;HeM5 z>KIef7;oa@S}cu>H*2R}vx)4Q7;$%W+4$e5y@{Ce#o7ez^k-7_C8Xup$E7OJ2yZKy z_a(Gcc8%w;e-_)PtvHKIy~ZN0j>B)jB(1?BtRuV4h<%8Z@I(b(pw|`fQO2k5!y0I` z%bzQ)jcQ{|1a4{6ra{i&fUWkg8P!S&^~D#_y%(m9XL@7XaTwbc`2;bjd&*AG0stpj zQX0()WiF}n-+4qc=(R1OHi3|j$(4!}b61q=SFDCSJs0(|v!@JNwzE~UCdOv-eHVcV zy#ze+a-@t0ZwMLQ){%dS0Mu&jbVuM|y%~TM4Vl?ETEw@t>|5sLEMW~-jqU(c0Gw1; zY(($=n_el3@gFn6Bf}6P_LzzgUdgar!90j+KtbW*{hcwR+l$4Shii` z<`FaHcVFGsO*tQa1d_qOXlu(n_c}7` zmHw_1&M}dcp7**CcQtMAjy}q9q_aTaD?p$x66)KpajqFVriPG3#Yb2)c~_<*EQ8(W zmnC$^eLNp@@rh2pnf?wrk28>xhR_!eZrhLfx{~?;cbZ`{%Z8|0O<54+Tw}Fsa}t2# z98N+JPZ_iWt*)5~E@?!cLQ(u&LM1#$3?a@3LpgBN|c{dU29jY+jtCv z;k>iVbjGKjZZ>1 zu!i?Uj#LP=w4~Jd3S@WKKu-n?5GbAHo!=!(IdZ=qs?gPs&~wr^9`Enx=Qm{~3*36t z!GTU^XQtHjhs(p|K#56C`FW8UN!y%i$$;LJIBYg}Gob5KT$lKeM=^$nJNZRj(nkf8 z%fsV?sYPLlUHjv$-}vh5{@mU0xL=sa^U~?%_Ub*0_c5d42IRAt8I~%HQ*JoZw6F0ivweCy{orU-SNwq{IepWG# zIhsAYI7sf|cRsR>%YqGd&o<8u{|*pfhx%aI@vL(*jA5TkB0(r+Kw*tMoh^Pp8iBJl zn9`F{v1*tSW}&~Ns7&8uH%NvxZU%Z+TdZ+^h!%zg3mf`}V$dAnA$h_CF1_s{`4P&K zT2c|koA8~`2_cT?g=#TfFK`6Z#m(}zHpG7>;@d4He~{WtIg>;fyvbm=QH;c2oIYzj z`;R`U^-5QAjEj7fB?PELe5eQ7s0=~4Szlw6^80^r7*A(ZX&=oqX=J)0_~wMz)5)ks zVFe&v!iu%8Nr)rkjcEty#(q$ zb~T7i(NFc+-aI6%YJ4U{0f*6sUMlaAsM~L;sg$VK$cIwM$@6A|jJ9sxogs+j_(Scf z8c@NN?k~3#jf(YhXmX)SZ`&7x?G&VKx<-Q8wQ-vA5UY4o%H;Gp#HM|(Z8GBjn`I1v?-F9RTI_Ng((}q^I$(Q%kLjr^x(`>&qe^y( zna`ENvIK{nwEn1r{8)P_#hS`s0*P6vCV2+`H5jXPD~lal3*& zf0hRy-|NJ}k4QWy20lgxdZLC3c?K-=2Qq&WOTn#{RxXZK5d~;uayI1!Xib zEki^~Nv3hWt|E|__VMU4FrWRCPxSUl!QB(RRVCh654M!}MIz?a;#{ZSX|ru!f+x-5 zy1PFA&c~`pvX;uc5V2S7jWi$pw0V%@B@WhLVX{EFJ5`n(OCp>dF zji`7@Uh3W;T7zWEeVd#e@gOyLGth?-3myA&XPl885B8 zl6~{RhkxXfPMoayzUV)WYQ0>K;Up=+uhl<*FsL{jI%&O~+3pf2K#abZLDYNXu!&8{ zD+IIRFF}_`2Ear3IWX`CL-D$fXSoMImSZOAjAx28=~Xfm=GH`(;uPqW)9nIu5&#L)TiYszYCS<4##Wb? z#k@{5>Oo!rasZUmzwzNDj*`gxRLJ-0*l$DE@4}_+Jc#A8VD(<;Wz9{vpVVjF?fzk| zZAAHH(~vL2C3LCor`qxO#!v-Ox-0I)6A0(FO}DSrkJ)0YpC|SCT#@sXi|u91h2*s= zvkxq{$L~t4?!)p&U{h~CLH=AfWbiTOS*;~Y_8KBx4(g)ldZMW*?u;=Nb0ifpP=*kNgDIN74)IQI?-W zoF)NlZJ>i#h@&am=x^kiMC9v8tm`u5@~=U_t(;PoTy^WJkBajO=4IxDuBD&gz!?kP zia?e%iCc}!1Y&Y^tpx+W>m1zK;2@h)|0);BzlFIvX zAQ&;8JD>;`={sCN9|k!jaxWRP6>I%Vz!zRAUMyOC*{*WKNGg%`m2Zw>Oo2d2Fk{gj zq^0l(7%;$GV8prxwve9?lc{EdnS{I0L<}OZV@89<*U8r|$UWgGetfa2gjTVL{r$92 ze_wT|kDr7)tqO16H?0sglAHQ9H+x1<)y$ept7>mF)rF?a97UrRE@U)%{E&tz_^Ul( zn8bWA^tfdZ`%$y)?6T(nD@O>TgO1V0xtHYrVF}*u|Ctrq2ki+X#zjV@?HPOL5c_j5 zi-)U)`2KNR=(h% zCrk;5zoBKfNC~a5(RLV32exghdI8Xm*O*qq6wZ`AGO;U1|dXlrZm>HD3YW<;85Y zpdJCE}R6I9Xg$MaAyaAetQH5fj%)lOC@_=kGNTeg6YHR8MXJGoa>_8EM=VSPFzYYilH4=g+FMs zq`vcrWnhw6X}1ag&{_`qvZ7R0k#l{hY7ZQHSNm&ZT0VlU8~49nfYq+WDcnI|wvgBP zp{|;WS~?P}4P*U&MCEUg7LdsJ_nr1spq6F?lQLZP!fLVs-c^&wB#@HTA!|I{`=sYD znJ^OW^n>e^{jd#(`>9kAsjO;8wrVGgn#IRKqpt!q-V8Nj{DONN%n^K@yaR}~Kthgjd(BkfP*8cwUU!0r6^Ah7>al@K2#+Y-s z5$CPBAX)G+2W90j3{s*alYA&r0id*l6TbAd(P%tIa62!{qhh6wd(S2zxY94^^nWeJ z(*PG{UL^%2*hDgzoxnwoHfrh)IZs7R3Bgs5dC@WvYfz?8{ORB9Tyx91gpg%o5z(Uw z&uw~u;{K%TpXO1xV4Wk{*ix`jq||%1&bD7zH}NXOfn^uQodD0RG`=DukCMRI1hAwoPIcYlul^Dql%qM25^D8ZA0;=MUzEyjM} z3}mxMHix9Tt{a+y%9OBX^61Gf10dr9U#=;!9i?jdi09oq-J~Gj6&965W*Tj?wtQBa zDHP#cb~e|_?_4`y#fbKKPXA1^pG6kz8+IK=&~AQRc-m}nF6TSZ-8C%HvBH=Rtmc-= zUj7Gg*e#n1>qGUgDL#foETNQi2D4%X&P8|~Q>pv1BNxbsc&C*6<@?F@Y5pxPNWN4U zt>a@xT^{za^W}659xVES=4Rc>iqf*`hm0%B^79)qBNrWirNBH2>tctQ3XNIcuN(Tl z(i{HWr2kpf#8d*CD79p7`wa6Z;G8~mLbzdT?Y{NLV)<_F=(Mc^Fp9k?HrsRxK9366 zIqMjpd0IX?wR^h2z1ac=2zQPGIv3h@QmB6C+v^DkONtDh938Q2ui$8%Kd6#FuJc_1 zbAp9ORE7I_xL~gV18Qr%sc)K!n^6ndD|s?IcRQa0!6})z@$Q#q5b&1hk%!ZjLH`?2 ze&vz8M?0pM3CZp)=eZtQ)lx?1+;{oElk0nbPlxx&FcO51FEXkir61}? zEe^ALkY!zBKh+LBMDt}t3uVMBEI?XaBPpRxWUoren8+gta-<_nOZxwvG@s4*KsJ&d z*HG-Ur%bI!WooQWgVVy|g*Z4zd7&Tsz63<(L9Td}3Y~iklhVR?%f9YJ~bUE@{H5y@D-^)r{eAkNA z7gAP@#XpS%me%Ue5M$N)c~1GA^P&MS%Gn47>hX)mLgzMU&97*MTCXXo#RT*ST=N=K zFZ}~$>3OR4W9|8rWz(V+Ct#s%u!uRmoH^_~S3lFM-g_I=U$35nt&`2E(^Ax>+||mP z;qjJn*V}Frj^<-6fK0zDHG7)FZb2O1Ii7vLL5zFculO0gme<-Q&f3-(7cE{CYxJE$ z2~eutkF;{!w;#?uk@yC;Lf4;w>tEjQq$X6lcCKAkVuJEuc@YHemiP`q)DA(9tc%Pj z-R0+vk2lzc@^-=oLAl&vImh%bzpK2?_YLTtsu#-pGDXqp?43VJ#=VgJQko!$`&9Kg z9rUB3^y}dg=fH%)i5t7ljk%LYpC#Xg8%?q1k7CWoBgQPg%XzAQXr$iACyMh(g(a+J zhyCmx{VH!RLt>$XZ*IU^Q-oCwoKidk-{z-1phHP*q8+XsN^2M&2Hy0s(x@a$==Qgj zaO4W}UjHBa^$L|o7+wbB- z`D=$~Zh!N?kVV4^N5g&@g%#Z+zhS{%Z9y^IgQF|I&w-232et|BO%NXH;_rSY+?m0n z;7cSG01_x2E?G2A7BoIHI?fQ9V5As}$e?NDk+h~;E@qg_mv_!$nl7b93MjzUGMcgK z$LJeI@SStzoiiAwMO1#6L`>&1Pgv1U*xBTd%YPqNE+0@V9~ca%%;*bZhvK|HfnZnb z5>*epvAnW_F6GFAG8vJ4k@w(C{j$&qb!?R-5#pA*p*<>c;Hlg*@VtKX4N|sIpos<4 z5hB}>>ywan!-)-yGXCY3fsq+{f;E(?T8Z+@U*)$FRsV|Vy};L{8Ig*jzI_ka>>6ZL z)$*)c0{RIZ3hSA-whIIneQedX3AGk6VdBqbg*0M$oH9STSE4fhDf@~yJVozB_$(dI zym#2KBdkzDG=?F5L!##vuPpu@`yt~9=p~5{Jx3LBbS<&5xlXnnlhC;1hc4iJ#nZ4c zh^{4#<)w*Dd<{DErqFnpI68YA-1PMy3v&F9IjFTp=syQqTG7Q)ei`vvn)Y5bRJ!IL z>DThF6)eXopCp2ek+;UdboxP~AMU=l?%%I^jX#-Qth@FcaA7nWm0d|t1HMC38@&!y zYk!QYcH`3P*!X@c6&0b8lI{Il-Kv0aGnUGA~R$NwXm@@Mb7D3j$#w+s1KUwI+|yDfGm; zvbwnYBgBy&X6h+{d3Be`+M=rt3gjFZPH_Lu6SH4~Rr4FyqmDjj|2LNUEOp`PqJiTf zOndpW`p$tCo2!nNS8e8`ip_=|k!E0i8ihA`My9sK5^(>23l}8q-yuAPCITec`$(f= z!7sxstJiPgOXUsxMwF!3x}JtpykJpr@!{(~q%wgI=MCPIH&q$4Mb>2-cd*Kd&%x0C zW=!O-ifvsJDnTbFhyNJ;qR29S9pkc+HAlHuddk3#U*n{11bd;4F$ddLK+rRiH!(j) zM+>%$IWJyC7{BBA4!j}~E@qWXmD!4?+W+6IWMjwZ)8p;j%`jIG^yxBBa$N6mYWrrF zEalFZx1EhTD_a$bwvoHP={7bDWY4n=zo>H==ZOyzVQNCQns`fp9kVd!qA zG(A&%amOE_^W}8Yr83TQ3=ncW|53#robLskKP=GOO&P{;__xv=Mh{M%QIO49L)ie0ZYHR(67QH_3Xe}UD&%p)GQ9B(io zh1hvxAuHwsuI>zrt+L1=<&`QUS@2yoMa8_DfH96>sAM#w9JG&Ma6$+beLs18^*?sT zjI+`ouCWOgr zi<|9GM8#1-1-KfJ15qN2Boa_UTJO{cSqL$Ep-qh4A~b8|F+cxwg)cPG zI=xAp0Um3mbnRa17QHA}d!+>%)(%Q5zUNR2PKi+BiXk*j8xSkUYSIUi(4vcNVb7pp z*|S@!@}&$0tqG;$X>m&h3IpMQtkfL6=ynqo@c65Ms7gE$57^Bv=N1<(?W{NIr%!m( z2K90?L|X4QdYN1bM9Jjtnmt&+8a|MGeVDM;B%!#vNSnXM(3@GLh|Hn$bB#RiAqyR? zed*8l(vSc8mhbwmKK#~G_702VoZR4$zgo=PGJoY`xltIhgnqI_c2|q;$^nY~7karD z4Lo9#N8^$yVP&P$aMyltv~Zj5?*2CsNCS#3&#P@BKb>Kr(iZFp9CM`t#B!A3Hff4` zlv-I|ePAIzjTykvhe7R&shd^1R&f6!iJn0&dt zTZ})0eX%n?UKGyTdox?4!(QBSAR1^L_c+{)1zpy%{ymzjsedTz_tiJ)nvBQ*#SV_Z=(Z z7FY$Us^ahzkV@I4%UfmIf=iQcvvjO;5ek0GraUp1$vW;|{v-A^Go;kjhzHmwhu$F- z{G?9r6uwR=a?PtOF68V>+;Fz2w@&+qXE%UP<^KELo?rg6GL=WIqis>Ds@muWkq_PGt~BBM3u4G;)qD)7}_*dzwyN&Q18+((X?$~D1vJ6NbO#yOfy^R~xdG&aBbVFlyL->dYetd3rj|^T@ z$-5H^K8Z5hx(mL-{n2(I0ptpSm7B7T_27V;@taG%$E3!mJISP*jv&9H|YTj5+rx&N1%cA}XZbyYpIckunNq63+`!*qXGh^~DjGOK*1SB&N{%vTg|5W7@Mik|XU zVcLFx?;VTIh>02Ek%sKL5gHA zf8P6P#)Jd~#%HBBV!%=6Dd}8NgUtADLyD#uUt}0Ja0!#QF%+zU3$iZo7+}c(vc1+^ zS~}Nv^;|B~T!oiKOR;aiB|dk51MYdWXS4h$jra2TGn$Yu37_7{eolf8Xq)0J?e1ig>11a22&0cQa_(V!&o6@a`(WxxqNxL zWIa=Hbtu$6Yk+jAg^O;1y+`ov_3%J?bd6=uMyK?n3H+l8f&(oEuXh;U@3f$vY>9sS zgMo|N&kwt!Gk}`k9+n9^&;9q4qC6ljXj zMUb|B52LXZIEjn(vZ5D5jtGGZmQ{fXz7Ql|ZYbgg2Y3fzUj}s_NH?bSQJc6+B2C4I z!{mwYF3PXS{vF3^Blan`J=w*xlw%K>9FTPsHE0zWIbCAa%_J(XD@%S~s=!gME~1|s zXy{UgS>^b;+7Vjim~2ozTrNxq99Fmque{{5MoeCM_NnK4$Yjhr6uDZ>;&5zDIi>MMa ziS)c>TOwtc%Bj0p+1v^{`)tO}*m(L<;S49y%~n!jjEWWr?&?G|`Q@B>WpUdMhphvv ziY$c5VXA7lEL?U9pBz{w4Bn3H3^?qxsc0SuPpa>mk3+A7QW~@NYh(bje&h26zPn?M zkZw?VYcF4+5+0J z-&YZ8zzGVtI~8$GrmAu;C9om zW7r}J5UNBy2g5-UW`anOwrBg)k^p3uHGGGK1Rc6K@i8G7ou<)J-ni5(LX^8UHu!o1 zWzM~?{wyu3Z}-?P9*X_Dd1*o|h}`H(MLRTU?Owu!Ih1SYE}547+ETV*B4Pgx*EhYz zLYe}7fTbok?5m2_LV2rrp4qqCARx}yH~CI)ZUSIh%5CU#Hg|U+SngPt_wuH~)3rvx zo|D-&Mew~%`+3v&nZncd(dqWn9L?E7#~nK4;n-#Q5k_-dA^GIge(C>|`gGG`X1l!- z0K50b)ox{piKS^9xO%*Gz1eoX*O0hAyb?}^q{lSLA>VOq-=7$BQn9a^f~XD(=l+(# z`}8kl`1J0M1=uraAT<*2tN3;pM64D5aVVq|jUyvVr?tvjC9~#uH zob$Tp#bYc!LP7cwwyID|=^^Bgqy>jfUT~SV{U7%F^prfD#w?vibpQ(6sq>e3*4SQb ze`gSa_=3kw|F8?xAmjWIekdUfi^Ojx@~6GguePDDdGNXAIhsGpex+AfS3I4{BT-*w zp;X2@AATv0PoI0N4Nr}}wXqDbLqVLZxg#l60l^m|ox1Edj8{F;-xc4zRc_!;TkqWv zsv%`sgC$*E3`E1}0kN)>(d!9vCCgeFX-Ie?mBsh5*KUof-6VFV(aEnFfhz_;fE)AU z9~wG>uSLxJz{t-3Pe9+&V^3Va; zJfG1QD8x`VD^t!U;{X5>2L_hAGU|h^!q%4CGowcI<4r2Y!bq z)GJ9kB?k#G-Mig`++z-E}q*UQ8QgmnOT81??vz z1xr;DX1)!NF~qNN#UBS*KCWVicv}l6U{Q{y?!e}t2GzlQ-Y4N6zpPegF6|X z%y|>Qr{kWKaYKy4qOS(9Vg zasnAtEZ2*f&X;x0kn#~rRX(10+ubwtcK!`6OL8NPIzfExK$AE%s67Ay#sPxf6sE<3|}6Ud0_u&=Hzf` z|9CUqU^8oXvzqNFwapBEAR1`y{e;~r1ekKs#J9DOxArwO4-^?(OotWHvBX%Z14Auh z)pA`OFB6G!71?PkKRRPuveR-^b8^)Zo7k!WW>J8$t)^Gr2VXkIIXu~bXxjj*ABvuo zvue$qS=t=91O#~|L)ovz{bhg(xizl|yHWD#!R+GxNJsKf0NMUen(0e<*7CsHqvR`+ zss(4E97wAK%j3Tk!GEBmRv&?)+fY>Xu2Vd7@fWzdI`nJV&BojYxOD$r@$Y!IhTXRr zc2hz+0pX=FeMpCP^%X_*_1dtJcm3&_vE0R(A1kt?Tr*|zvwrx)BUAwKFF?JEE3DWk z%oOtn!YLwt0n@~T>BWjRMLK?Dzf4Q~K*k(>c#)Lk|AwF2r?EKYrLoA~4%#UZ)&qtY$%sZsg7nF*Y@M5Sk&Xt-$l% z)rwzUE;3;e7=EP1AbTclZ!>}O{QZ)l-^64^;7(gvX^Y=Xd%(6_2?fS*zks=-dWR3r z_sm~x%1akU5*K0}>)Y`jd{^&InofS?Xl#F$LNkbHGH!-M7{y)S!{a&+6uJ+>`^M52 zE}y}%VT#n`JwhL9id5abVYxWuav)2VO!*=FVG9xS+DwBzo@)6sV2ae-@F=hHP( z@A?2!(sJ%-g&s1+iQ_Uq;?xlkVfJ)AaDV3-G}^9~HK?YtuIm0qLBM6Z(gt(mIz(E}nJIY~^Zh89qYAy$eJ-Xfz8|$iD-fU=7KzHYXIs+W!89 z55?CRgGSw2hSWJ$l|wyc-U``I+1(uk z0G-{2Lz6UGkfIK0#?K-6uHDV#cdRVYnq(GY8b#B=`(=f?*Xd%N`zDbk(1+#zn)$`G zn$!k9*;RD7zpOO1$2vFbHe*&Bd;~;ENFS=x&2)VNf9@l$?Xy7(60RahKnvEOuw?+> z*`L(0NHBmYLJ+T!@~Z*_dB1`$svZ#o4jp<|CE1~(Vq>@$J@o(mTv6=)7BIpZgDxn5 z%<_P}S7|6+90^L0)3o23$Jq|40G%qAr5Czew8YDavq3OL^OG{Ct4}Lg2ts2{BWbCu zzkm+T-;y}WbNVxS+ODgDdwp&peL^^W>Ycu52iw-?*$=avb%y%RwKacA@5NRuZ6AL@ zo3@l}k5u0|CC*}Tdsuxj_vH#9c;6o5xPj>ce`5$Hs{43=S2zE!Md-r4ZuWq(8#S9e z(kR@;iMl_o`0q;g(8pj*VPIqz>@4_7&w7}3b*>!~2rr~U& zZaNS)vT8wo_Pq(Vz4145EmeBn<`th=_hx79@%KF8MkdNYopW=k?oNfN@AEXGo zXceri+n)XN&mR1KgyVb52(%KdgtAg}y9gWwIl=g^pm4VLmi0JCqts%8=hvlP7I5qo zZ+!SH^vDq1U5+JpkNi2m_|-7o+$BNz0X9q{_t%kKQCFvGn8hon)O6PmHPhzdMRfL* z);E5*+OS1%o>OnCb_{!Q+D9qgT9^)p&YnT(fnD{)V89ve@Giz51B1ir+Uafcp?6h6 z9Mycg77obaweW-pC7PI`RdRR^&GCnoBU>r1r6{9{-g0^Kb|Z6j8=F#_B!~KpChBL* z540m8V&mWK;^oFUhTDCQ$E)`nxEdZ8pM^%=3LQ%$SJ&48xM zR?Vv77op62*Q!ARk~#AO-AEvRMGesq(U;gIB&HA!oa`4cZuKWaBqGvN0x2cQ z)YQ9_*ql@V#|<@aSJCEW9M3i?EUc>!VzV0KA4#yiUA4f%u-;hx?`x2n%~iyHv_I@` zvVXKBA))+Y+mO*hUPGA75kSrNOI$L#pt!h$*K%GwwWEOqDgELq6jrQ<69wlzuirPY zIHOjFUi4b`Rk7QUxKjCvV>OBr3e>D$x9rEP^c~Kd$PUnK_GWP0_D5xa7wl&n0XLPT zpFbWbRmDGk{w)Dv0a*>4bX1ADVct!86L|PZVr*L}b)?H`b#cdU^?v)DE{j|cTJu;} z8kg+a`Oe|KGQO^SqvM!KP7l5dM_pP}-2wy6@P!66kOIqltb|IoL@}YST|%uuSl27Y zsV}8SEnSyEUCN&j0c)sAI0Ev%hSL86wk9UQ2Ktc3oYppp!6ISzBie6mt-+|z{h8$m z4~HF8&EWQwM))v&lroDQ5Y>tDIx{xj@~o{5eobHzWQ8JsFuD^Y4@Qg1celU80WFT~ zRX&;pT}|bkb+n&Qn%%TKjd(m=4BxNy!LDI>kGvhXT?xLZ7_)7Evulyc)@vSgK@jsv z=duJLe{zvank&C`K!P!n-TZtvYkrDf)3?~{N@}Kg-Pr*gxwzT2YLb# zeDPic%f-(RadH0B(_Y8WGv^A`pn+&X14Z4UNxTKg__T=JLE7Ahf}Oy7?swGe$e@j; zrWZox)beQW(^;~8Hg-NZ`UPtL{j8UweQ49|gR71!zV62wp)6p(c3()NhxIefysEYa<$c<1|n0(Zd39>wCN z5Q{BMQ(zz(_`)E{NSM?(1hGQ|&yl(0qJ0GetH0Mqbt|K0@2D*=M6tg>`w-H2* zlnVU7w=+7=n?O0#eXGJF4WXQBQ3x9zy^s@|A&OY~Bku;={YHnM^ zjq!VF3&OPs1WIdYZARB74#CFXFiAYEbTkEn5S?X^xAs-MRGIeStfx0=jruhCwavK8 z&?A)q2wd4t*X z{PAaKA)C(81u`4n9&9s z>CmO|Ngvqoi;^N1)1U(B=~3ucwi)8uOAcQiD6KqE*9RZh-34p-J>kP2Qot0Zg@0Ga%1{b>efdjxC;Y7; z@9))j=&+dbJ~WI{lBj1V^y(+zL1#2a#TUrthrL9K<^_0S^8!H}_=wYZi~-e)Z<+L6 z2pk}Yz;)gDbPI~lmH23UNe9pZqrbvO_m$^WKkwrF_ilN^#aZ%_^GN;)>W$MnCW>xq zx1KNPD|oBXN>P!byc}@t)zIJGlRKS5DdP3*=hgT5w5m97tEZ8M-nf0?>WqgSM9SoF z$sJT(Saz$4((!P~cEmwmaFJxJK|F<6&GS|Y(&uWY*RA_q%lp4@-lE;$#&}1|O0uTZ zgg1WDIuE$l!iW?CAkT+{S+hrmHzw=Z`IepH|GRl52|xp?y7Fqe{km&XaDJTFKdz*P z+RRP0GBKrXF_#ej3U5Pukn{Hw-S-zdfq_AxR$Va^(rM-a=h@zOgx&fy5OKf2yu-*FvFnq3oj+-~R9+>BSAExMX*vTy|@tUOFfR->+-`VR%4RDUnq z6Ew)3E$3Qgi@PTcJNO!pzehndi7H@wpHgQFI3512tqVDvM0mmkCcWx0Toznz%N9xD zg_i&36Uu0_^lyRCjJ!yJ2wp-2I01Y8ZAtk%bN;8XroG~MWB&&v4sLu!2m-eUfsUGW zgxsrjRV)D;sP4L%ZmH3cLFd+XUrx9w#Kjq~urt2>_=j#fMV!4b+(d#=O1`EU46J@q zqkiSAAP$dOQtaV0W*|6CNB5l!o1^TsJ6W&2J~4a%V)gaDR4argNv@xp&XT-_$1>f# z%KL3WP&)oPX&Sz0=upJ)ZkN@?di|?ogJQ7SH8|n!o5I5&gM@LIglqwN7cIkO6aF1i z$p00kxVm#2WFL)1px}$w$4;@;kEF0fXNlIex+F~wjdh3y3OJ_$ty*96&Tl1DPU7Le>M8^#zcKdAp1|?haeK-?b;rmoD!k}pQtY%S(e)+UchhX(16KAO6sTQ zTHt5f(*#~Q;*7cPe>jbV^R-3moJOE#S>b@ZDBW3Io_XY)6pf5pFpw5;*|Vyfau{W# zTQde+d+1J~Y@i@%IEK;B4a1Z%8S^R}({~VBHV|9RO*p-n;*7w-e2lcP&FW9@aI!3! zd2;|sLpXCZ=<7Gz>3(16)tY*Fc2O__lWpt`zlkFgSgD?hpwfFJH{SLC01^ew^cH)8gA*#QU>0bv5+)N z;P0R|vS5hER8xj-+@n#FWP)K0ygCJTrTMtQ6}hNd!3k#K0%6nM-krTclEby;Ke3;u zDaV?zQ5E%CHwGMf3^4Ci&ZADv+4utKxKA@BDf~EHPCDq9%KQy%{Fl2p*@De@t`6N9 zjro&9zapu7o9{MLWl%qNJ9YEly!cg6ZW4lU`Yo(PLC%{0ad%M=Smdf6enPYya;shLEE3k<)L2u2qVJ|INTG)QT z+&2@E-Q<}$^4(LNq%g^gJ7)u_A8$*!VZKOx$#h^oP<`MmT$Ax$p`nTaB09hm55E75 zMYcWFL_*te?vDye#g)GNtIH~W$P1(R_MW01*ILvnMQi<0LMzn;IRy@zK|>3n zK$ZC6dz**F*aulVN=v=poDEFQR(iVv4ZR&bzv?=w1Z{ZzlN)Qef=JK_uC(>t6Ca^; z{n^RWWtq{#(RK>^>T5h!!tOkgIVVO!K9+(}yx-@O>rzdIjG&`&%=Pa=euP@}<_Jq8 zGZ-j`Mdej>u_lh>Jl?&}lo^`n%~M@ln^8gP)XS|3Ja44IXe>xh!;L_6<#RJ3AVkQ> z-;9!2ph~k=)y;^Q&y}k#z7}+Ir)N#sFoly0-nW~!+9}C>O@u7nV55{oGS0YGk-di1 zw&b_DVn7*!ovIcjdB$g_tu>^ghH1AJ`SB{?7DJsTVH+t=N}*9ooHaUI(^lJ~g>6py`J!Iv_*cZ&@@da3PQnZQ_DG}X>YrFJV(FN48>3j7;eZ2|Ihv691OV4Ze&d15-g#bAIU$Po~d8!9t%XTkayZ)u2$c=Wwk{o z6Kq*fFa)ljJE89!@crv@)b%e}FQ2)5HkiREz~{Y`*w#NlO}-XQ;xI^vW@OiaZkIsO zqTc-rAK%|P+Yi5G7HV?TIlI?8%VNGm^5FvE7T<(l5!AZIXX?v|)tE&2A6W7L{lC!~ zDA0RvPYgO;UYjkQ2EywX`u<<2W%d7yr$A5w@aK&|0gr%P2j8Y)k)zn8IkLZi!-U4BB z8@X7QmcvT4#HaK;Ut&(H=IC(;7R8lJd7l)`(J`6~xVL6k!?j}FV0dGE(xU+Of{J`L zo+0mCLiD;MH9h_M2dJF9dgg2I4_T z0MQbBn1687Z^K<&s|g3SXbAVxb4o0$r}=^?ao-%jSQYp*Rm+Lw6u_yP<{Q-N`I6+) z657Bk_dYs9&@H>XKgVdmQxh|$(1b(RF{5&l$6IDRpdh3$E%DC2tdVEMswtttiboZg znLe+z#;Gzlfa-unB^fJ25U<+m&_LUD^x9Oq0SC-Qo)BXB*46A+0 zdgg|l-NISsy#m{&ku6foGnA)*_t0kx9#*?GArM1@n@VS%io z3prIW;?Nf0DJ#cKRPnd4y5phSq&vaTh@{lch00IQs}J#)mZUotlM-K*r=+(sJlC`= zqm>rN$NrA?{@7;`7EHU&W{@pBG{39%UhuqjY3K*h-fo!U*vVD{QQB3ZjaVK56yoh@ zZh|zvSsk(+{b>xYRqPgonk<)isqG0lL!t{n1x__&G*9q^bJX9~H5MM{EZLB_W` zKVsQBm-?>0kLoOWLHS#(cVeWV*M^$mLY3SXcG_g>o$S90X}$=IRX41P0ljP_$@<&> zK}_CTL-IkU0QfMyYQ9>im!Fnm_nid58h^AqCG6bxOTYbzOB_JX_{fMW5I)9z-eej$ zGDC=0hJVp@)ISihbn)R*69t*HzWYNeh#<}Qz$+v$bPR{O)y7RIVZLBcE;{I3efJPa zcP@^0-u!q>-be@6DHCl%%#Y+m$^(-RQ$7#GUYj#cv+xR2gYC=RCJ*D^qlNE8v#vbc z;XVSe;q5Uk0L$6THvW|(IzChDi^4+06xaFy2|*aDw2|k-m7VA>z{Hg*olcYYUaCm(guPe<+bA9?gkXvWIv{2KR3u0Uw0D`H7@ju5xGCk`;uWUv!qoyKg zf7AGw%iwK-l}bJh99RtCVn^B}BrQ>pkHjQJO>pz(WCn@w$;&ezC@woN3V&f_r(%X} z^f`E-(mgF{8mwqMX>p?Aw{o&=Uu3KXimEMkGp%c;!j+u*Cyrz(-RW?ez*x}1WC<~1 z8dIZx8W&=`rn?kZgaS?EJxfjbuFlWvu6Tctbvait#5TLd`Qs^A_ezmPNp&wA^)DPr z?Vr(J`X>6Nf-n4L!{7eyy$1eU}mv_&Cej)iKE zu6jj~DxL+qRzo!R{6_Ks8e$i?M(-Jmezci?cjI^UFf$OOf7j?|1~dXQ%pW8yx~v<5 z%TG-HhBW_iv(YeLQfkof52T(A5@&0bV7muqV-(<{MoU2fp#nZ_7$X{|H*UjMbBUM- z+XhcT;$wSv4yM8LCz8X^C3Kbsnt|R^JK>WDT0F6M{x>w2cQLKF{#BOn1V;(HM1^YiZ+^pPVM1EbYjqGQi9$7;Y)p@=rPj^!mtu`)RE{GP zo0{>{GS$H2&#yQ*mNkFVkI%$a%?pj4doesZ`E9Y?Vi?cT=D7A{t;Fx0yKHEy`Akt9 zGtSYoEPoU+jX2YPmA1Z#MagO_v_oESq=RCEV+vw_S_orr!BKH1%heV<*`DUr@qv}7 zxLm6&x|z7husO&9htr|Q!1L}gvk`WL`t^z7^Uo?XC!1gSdFJ(KCziZnJB9X^nCXM% z-QFccCD)t{YobDx^>m-TSIf25Ib0RkwBu3m01_jm7_EM|bX-Nb$Puv|?58OtbuN(8Jtd(=dzFM!8+ssMl1Mpj)in@UuS^I;?PKmvH zM&L)8V{Z~pcoHXYob^PiOhE$>xd@=MDbb4gG%NLQ5w2@0@lGkZt1ruAje08++beM8 zUV3whU2_pEV=}c@Ye}Wib6eE&6|;BaYc47toP}n~&L6%lrf7 zVm-0mX~N@Jn9Bxf;#10lwR`=$sz|)mF^p$h;s5aB&`6cVIwyivOk3Ma`1M8k#WiS! z%3{YQ(2&iHTPQo6NK4sxGYn0D{#18M)!>&qa tDg%=)x2NjH6a0c786OHd`X85`(38fDvD^{IAUOhsz^n72?SVN*iWB6AxKGzDu4O}ZU5=hmnax0NXs3q&)}y|#Gj-@g;YJW z&o(t2v#tEW9usGdVOHrs#F-IYs&-H#1HKU?0*MNeYV_#MUZ)0n9j<55aX(x z3FtmTPh?pA|EuR8^QoxOZ%pJA|B*MLi1+EpR~O^DkI0qikHDh_K`P7_x`Mh|&&O+w zk4N&MT0)7ZYcF7}F-v#U&?6@%C`+^Rqr(!oJz)H*!ak%?M{NLzx#BVqdpe(|o`ziI z_nf^A@EvK;VDiF=zUF^Uq+-&)JX)2>?F3%mngNHI3i)G)JW->s$ZeFS+`}G}t4`a7q|Mkk7+LOa*){QUG_{;0e+f&W*!1d#a&l~mqeOJKp zd!>QHwwpn~ky{)8ea%xq-r~z^_X9Xf?a7UFd->W2><9ih@u`2-?3sS*d5X>JJz0L` z1Iw}3Ij|1}Yef3?ziC|gLcUb+zU#r{0=(=naie$hk^cs{_9kH4C&26JR1??}H~1*V z{tkZZw@lWUHXa}ZP(7cc85;cMP40QVmoxQslZ+DX4yCtu1 zMc!=>B>qSIX$>Sm{tt;OkVkNzbvW>TylP_rAh|ysb}|4+-J+TFc*~xBJcX@n^OHY& z#6`THgFUZX46ZMU0)`u?6udBEu8(HP2n9SxK+s5D*Z)uyz=FH0Z=L{uD;U9RTup(UnzFn{o_jN?QY=pdF3NGe_Z`Tzva21(ZR$fphsU|8G05wu7D+1 zypZ1qWq+_Rty7zd?c>C^$_2m8$g;r zDBV9k$nVbsB3_<9i0?Z-ex9B75W9cWMhLv>7{~cbo%ISL``p?XZ@+WY)qbGWg$Kx; zjc%j*Kn7BP^zJZ4_}%422t0nTvoJvQd#0ET?;(Bu2aW{1bIf8Hpv3@od*1^7o!0vI zg0On_t!_!;3Z@_JZfQP{ea4tfrXOEcWc&$y2Gi<1Gi!hwQ~ zH~~=QipDGD{R8BH>yCQkKr#-1{8t|d+e7bU2E*@gkTMs#Zu^qiJuke@f*;tmYh?V9 z%;JG4^0{lI`a*MfghZQV52mNg$>;5^AZPo}d&kI<$`WLKfD zDb*|}k(~P(Sd_va8S7h@tK1feni1<<4&`F-Yc|wJwB!IgC&S3wC^o;&C`g2a|NRrA z!KXCAkaeQoeWH?SqM?h2dC<)~=xX-dd43UGFwgTd+~t#t0+Cz^qv)i#bTI>ZMCNFc z%K>}{_q4w@aH6%vH)~ks`^y@qDjP}$u3Eq z^AT;I1S{_Z8;G8b==j7pxs%Pi4*u6trgp?z`@}b{CO~ZS>T*2!kSXu5bd8xoia?~V z+}cvGF8HU>k>04;_}l*Z*2Y8ly~dGG0^Y9akp5of2z+cx^2s@*Xu3r#g5qQC`kGRM zRlF4_z1<;P?ow4$Fd3_S=sAAfD!m;o-QxbSXmS?@Sa{Z72ntk#{6iig!&T2j2y2vv+7kC8-dIkhY?!J%rfZl80aTf4$$`Je@_R6d< z$vYUWsSYV+G;)mp*W5zf82@DSXO|JqHMn$i~4o`P#=12M4#IuW9JyA6VR`vyss;IJd!IKfS%X^vZyV zxogj`vAb0Lf0*tCxt5-uo>@?EdS#Eh5M%-`M*2-Sxb^jOHld&&p`gH5f7>obTR*}o zKYiIQeP9;=9uW+ivl%mWA?)Ch-_kM5x9jST#oGZVQfm=fH;uP^8uQ>IpoyV7+8b^3eWyky+Epx^ed^@7pTu$G*-Ehb%atiA31=PE?5C4gY_JMvN> z34IL;{e{v*rRGMV=4O9mNBGet{OmDK!6sYCAX~&Fn`kMQa2l7e!UwT?M_ji(R*p6s zZeV)zSk{sBO=M#m3FLys4r#ON=D0w60TMm8S&SK${X#ndFzAGBs`qo#+0I>n3U9$n6jlp4KEL)a! z{c1deUwopXp5_q}yU?;f$SdUk;HTgzrI{8G_j1QAUWKM+;+J+?la&Kn=?%q5T@Qm=2kaxV? zqnMl8_@^q4b9nPjmoe43T6OA<^?O=0dG=_{?!uiiVs2~iMWc)Dx=*%T$J|QiDY1?U zQoYXy$~`{+P#_rQ#Rj6=HIIbZEjZZ+1LF!Xsfa)Zyw5)O%UV2Fiz2N( zNsqjYe03_n5Z#ko3_8rh9^B&I58M$H&LoC8r>=^O%6;jYw9(P_@}J8fBje*kAQL@H z+n>K1=Q=?7STsVMK0Nr{YiOLyaK|U8;|By2k8n$m_M;;YlT#O?b2sDj=!BaL5%cHz(@POPg1R*#?GX^D?Zuf%CkC5xk5Uo(e>xngkie zw66zoVMDcHL#xr@IMBN+FyYomYG)HP3aM&KVm8{gxBLbCnGznk+ibDdSwx4Wf6E~ zktIZScVo5nM#^r-ZTu6pKQbVhAAW%a{gobKVB%B4enEZWgrH%H*QchzrvCt>w2B~X zAzE?y2Lo*34d25Dpz`6VrXY6?pU8o|!%}ju9%}xt^b+2S6*EGonc2o!!B%H>4ToP7 zPj}85`_C>bLpe_Jdjr32kIDSeUH#F;)ZxtP+!Wnr@7GBau5>;2%-v;O2PY*5w?g^7 z9?GUgv0x4sg;OwJ0M{KRlXYddcXXQfXRxXy`hQUo)7(X6~~kr}-U&L8bXIB%xtWT6AcMoRs9= zLq+D|6qw>gl;WmP;>FtHX1GJeS9eLqBK#C#|MRxLqZz;9f=CGk!tJsmk4lmX3+>sso1;c zTA+s=zlk3s0Ot;g@~7D%T>dH;ziq1xr3+GU~I>CM~iIL|h7 zxO3#Q-x#y)iQcw|{oY~x0#Uq0Ot|}!R{Ggi`Wv|W*lrQzLHOC`hL*6)Gw6OIAZ}7J zZgFv^SlNHLnL~K#y@$9|?9B4DQ?cFRVejS?VY~Qi(Y3qO0tx}EKc1tJSQUMd6|Rgn z2E!e(N?GD(3|x^dW-gq7~n_h!BpEl2R#mSsnd0y^-9KrSZG4i`tFq$Wuyaue*c5qlH7i02 zCb+RnXt&l=bBnHsIv}$X8wEuT&xq@@ujm^PvhWPJW6Zs9a$1UBAO5i~}pWQ0CwrW$9(=!#?2g_P9h(4ZGKEJBy(LT!!&Eh%4 z>@$1}D>p|#SW3q&?_v4nBryfB+CUwB3}B8D zezA$TMpXF5`7$oW@&y&z7A0cVM4e^f+&_`NLi5tIoH9jZdWOUb=J^%n(Z*JI#i$79 z7bKYPM?FT~SA=A24YHHdESwyp|3+Z84AVaw#QQtIlv2so(g8OKhIWVscHrhgh_eF! zN;|eC(&lAK=c5;Q@&`9$^tvKn*Th-vmy(p`g;Re@q>lV-UJ=b*k=z2OP+kvsUyIu9 zMY@3{ipVso3V#+ADnj(JdyN|Xhz31_23eaLIdc>ZX9UA$B&9Kt%8o*!D8C{<9M+60 z<(iRJ6!V&HfxXdHNy4B4q`CsU8ZK5dAFisE$9`^=s?xN^}|@{~AdOKG9{+|EHFzOV?(5*XmnL ze5SpB_tu z^!%Cl9l>B1xIq{BwPttcp&o+t&$}-S({}_nwOm7owek}>Z$qzYlw8))5GoM8w)=85 z0Z=t(vTlg;t|V$2ROoVR`db0tSvS?=PNee-sxlAC#xTXx!0xJ$(?=;IZ5n5qn~661 zgKz4?yQ&vc6GC8};C^%mhTJB6NkNcDy`buY*>8*^ES0;deV!ZMLc>+VV@>6i~Gqe&C zaGdZOj2Ui(3E;kby%8pZ6aES(Y@!U2IR#UFLqmwx$WPnmFxIFK%gU`s9a}T7ao9~P zov2SN9;a8zm05x8b0U3=;Tn|LM5M`r+Yu>s{p}Sd9l={&k4f@3a2vS>hE9O@BD-s= z_5ZCqc5p4~0&X3DMs6p*6oTeM!iFxtleNBzaKDLg`=OlW!U*KTo51)1&i)I%zF(Uu`AYL&+GT==&>ltd^tPp+|iru!s(a&L`gT z=i0*=0(d-a9%MKf5@qqa#T6uYfh8f#wU-lkNA+-^1Be{X)dr1LgPCy|W&67Vrx-e1fJ*k~HzAXQ;WO{+xZn`2IpYu_Y(u zPWzq5XLNE^Mtn&A8tz_M*ZEiCwTNnzJel3t&tfL=3c8}2rugjk%ItB$!Gvgu6(3Wk za_IXyj}H>WGr_T5zhUk_V3?N&0;BDBvNOI%oEM}#vhxA8*u3fe$IvhJ(kaP58W*T1 zMsPb4xZKE+v&zft@>_+cp6Gb+1-xSY!ei?M+yvL%!6rT@{_f{8WOsj!=3;YpFD)#1 ze0TZ76?AtmN5}C6++s{D=6L)$lh`cacsxo%8Z4xFe3~QJu%fsFszczkFm%T{Mw?ha zuQoYLf{3OV)iUc5 z4AUevj||}_3j1c=f|7IAre`=+n`y;$cfxXt;GqlHTgLC_p9Q*5_`Vhb&PW6W0+DHM z?%DslVVd}kJh3{T4(1ujenVyx7{;~|oH9H_5a(w-6PR2W+cQ-gX;YdN^-c+^;ziJM zlQV_G9YyC%B(dBN`#J5F9|<3rz@MKxG4?!w)}l|D=0A0L%ilf1jMl(5K|g_lgV#?) z*msV^_783zj5BZ?IkQOAcjjo~)XMVE%IwC&;(lvn2^O<(F+6cDY-&U1)TTjijMrL~ zG;d0^4b0GW;?p8!%W&hZ|Mt9{6iA;ROE09;iTz4u2J31H=eoCWJc4mFQtfA8x3_dW zTEmv0Wd(~!;hEi{ z8naJE(QraGf(7bW!ZC1lL!pvw;aqCD$<& z+c7IGT5KX+vY)EhZ=4fbto>Dn0~6DxiheOutAe9mb9qQPCzUVq&chnGQO@C5x|E&_ zky|wF3YI^rH_zMa#o8jf+g4wr7rikn@95S$t?IO=m78*l>(w#Gv~j8}`!wc5T6+Kf z@%xoAg6%TjFd;w9%*HW!w!rQ(&o-ej&CJKqKd}HmKkvi_IiL8yfK&3W!sgV(1WV7K zf!hg&u;G#)h_N8J*ndA_cM)UR{t*rD;0#?56tDA%r&(mnPjeIGI@#trt#zTfhFToK zDp1H$4ZP&!)2zLLoB|_To`&l@hwHqD{@fuMyLqyB+#0j4GvnN*H!)!2E?}SRV=th> z)1sKCeA6k+zBi{3Xcvd#b#3KEXg%lLkmtJy^w+f~l6QcyF#Kj=ncaQ)&2Ojt5v@gJ zo;%#!QQX`SK5hpaufT)9@9z=!)(Cp{UvmFL7?fdVLOUdaMP*(YnWKrGAhHka+`g{I z=oVz^_w?Q%1mK>X3A+a#S=&1H=&CTe1zSS40?x#0pW&1`X1+GrAix?Zeau6 zGM<`YL=98an1O2?BN-Ep+x-lk&;8u=ZAd{<>ggBcofP#Kl^)|&2CPYrwafYbxljST zdh!YC^aSVGtw0!wM}s{G;BLn^oqMja((p!G&d1n5b%*+bs7rai;)a;p-Wz!;mOWm( zCte-3D^BK?s=wFu8Fz!M(Np3WMu9xHm7ti6SvcGQX8c!Lb1q>fUsbYnvQhD&4{ZdcI4vC6diC!ErCg&M?c~Fd<^XwMD+l z|GnrWkMlD$@9dt5f^azp3PD({pq?q?BT5;N_bULez63Msdo{XL6?%l-9xTFMl-pjE z&S-+=NaD$8yml*z6_t*0v8WNmX)jhS$RFn#+Z22Ox8B_dnwvW%w5>-2A#9tQ6-b3# zu#HwUO;F%q7;kTZ98MKvrKIg)qI*;vX2tut*7NM zRXrZ9;z-c4AQ3SnQ86Xev80rF^v|GSPaxw=B4bIS^ZJ-b(i}m{8b#BgM%Eg^>QcxY z#nKu@X-=YPOrU6tr(jK>u_se0pirqI6DceGxhj`il%(92!|H|gy{Vc#6DnQz*#z@r zv&X{u9dmyEW@2K)*wz=<0ODSK7TiP>)bk_p*6qLQs}=|vMCqO53#y|Mj^>CE28$Ot zk<56bSo^^=>5FO$_Hi=pax#(TV3lu05Bw9Wcpzc%MAemqw=eSMVhu)W>y6U|OW0o) zYKql7H@DW!TGw+; z@KU?Sw?qejrJ5xi8KmhbH#Gc4edn(#PDC3_l(OSSi*V)C#1b)fBw+{toAX(zTDo{N zd}2@HIW`&ZO>z>Dd_e5nKorXJhccyv7&b}JKX?D88W3Qte^-KRt@6veS@JFM|K$Rx z#6OExXw1cpA?HnBzb*{@9rINa|IiusyLq&B+4WCf-ufUK+s{+zq6k^TFWN$7ig-`g z-O{&%t=dqy!z*VUTCVQi;#hWoFXa5Llo4DeN3w80q+q5!MNF&GS<6~mEDK!J=_{Ks zI$?0Kmcee~kvBsm;|fE3LH)y`?q%PvgLUxXgdpjG>cL z!r-8o{kFcbxqCw0s7?s!eCr$8tykC)PDDe8gwr?5KQEjg<0JQo6`uJRDfBjEoo8sEnGcjd@gFdqIc730CY4kza2h)p1+MYa2)*)K6Vx_ z^EVfNr~rSopCzG$>F41Y{QD8|`vjC{aS11cI1mngKR6EA6$-n~2gdr2`=sKSVLHF| zA9_vD*Kg78th${U2?cRDbdMqBuX3`7_U5!6Xi05Z=@Y91qEnPZE?g|BZIQE8)v|jR z<~5JZEp+lOrPp6PDj6G8-9q`Aj(r)Y_Tj8Z3`S(ysF+NIbSE_35c9|I+npKbT;G|S zBs`MZPEDo)GW(7hh#ZZ;P>lHR$rG<+dvuKP+m4YzC6%Vj278%jkx1St`vFz+dIGAi2lS1c`U9<1I7AD}ibWQTol$F}6hYnR=?J zcEx3mY+j*Rqjam{y_1{hs>O*qO<5abn|rF~l%?)WgHa&WX1)BSY@tw+oQ>!4+&W^t)r$}(n0q31Q)0FIgWU(wz;ru7 zMz>Q*+&>|rVhsx2nc$9A0M?4F3Bz~{maf(5iL_LnVE133-q}ibhFlisAE$Xr&Vcru zNgelkvlsp5ii*@x}#mAG0r646QL@aFwr*|8@pi+cC>hh4vu4Gcd_wHskntpnShh~Vh$cN zmK^!a?1@YxR2>Jjt4)U^X}JZWZb9`!pkxk$BF(Pw#1etz7Q!O&0NBVosF-`!Tl??L zzY=QVzrOrN8dgkC*4gZk{J)UIpP8;`olQQiqqRX@1zfaE3v8!7<`a$C`9r z{lP$p|JL9boe)VQoS@X14|DMshH)F_Yc~t;i!gS_W_o)UHs2;TpDuRQ+Y!Ay`vG7= z?=w)3gnZIndO*Csa!s<9HD2HDK)X2OR+~=C7%#)vCg@zEBn7@M#WpeqzdQy17@Tyz zCuO@Ay*`@ONmUo)D+RsU$H*FzV;Z$Kik>l=j6D*6G#ZaR8lOIb-r`a{CaPW?Q$JWeOI&v$t7xq_r48frYfXwvTEz(Ji|I-SVG(ciU!w7Z&uI~UDRt343CRsD> zhziy+O6_~`K55bhwy05*3QkWYGls9ntW`?N`Bt`$@fMgiw~G<@Jt6bU$b?W)i6Q^w zI8Fo`RD9+ZCEND|oVO8IK#@05J(r~0l`8g^kvki>6IhW~ixTF?@)r04d35Y;#@A5w z8c_8q+t4uRC4Bkp1F*&auztFX$)_=W{&KIiC2sXv(`VwFqkAZkk3{*+-*wFG^IjOT zv8616{!GXo8b$jZ`BS+l2b|0mxR!lxY)Ys*}{?WzDfdx$Q_DS zkbm044#!#G3Y&TP#d1wQb(gaat60I3aeY(57NG{(u)V({6f#34;BD#mWJ{}1I|T?w z`k)D00k_#gNr2i!qLl={8_Mx&=O!XV$FqN@6t7`ks98OBDi3!_qvdV0-*^=#Ojq9e z>X+|CSEzTFEnIu0#7@)Q`Rcc2|97)h5J7K4j=;mA*{QZ5rsIbPZQ};b@*mZb9r=u~ zj{P<8@0}ZG29NPZS&c?k`UTdKbK_pVk(^O2%)^6>+-zfOZEGrMs=>^eh2E$ zyfNJ8o7_2HxuJYreV~r75$AXC`VaE@Fw=){(+6?0`*Ab-F*8f(*kc9w!`Rq?>qLLS zxWtw%EE}ssij~-D#Aq5%R=Qq3SNpam%nop5Pk1=v2E(3Pyd};{Y&i{q$7cw#7IucL zHUc26Jm%b{+*u$3u*AWX)d$+;3A$C!IlH)io<23lr0$H=Ma&|DntRf8R*O=GiCNt_ zQnB~@GpoX^(;Ip6&w_ zm9887a-S(D;&Xn9SiRkqQM&AQ$KZzLhPFfvVfUDLXEiqCu9Rna=xRs;!yCX>p2=K7 z@VSOiyGng8)4U=@SbC6RPtAa;_5$^LfeZS$V4l4tvwS2~JMSVgGvsE3w;Te+2v@C(?&>IFnJ;NwB3V_a zTT$9CFxEHyp;LkhW&w2kJ*$S$=A9j-&Ojk3)NP0L!>E7Q*nJncLl-!M7dZJo#KLJV z5jEXHygvPne0?k4P*x3337ikgq^wDL)nt`Rvg&qxI2@dF-_K29?24kRAl5Wui$TRS z8p|$?P3i9>^7;sbi6Cd7J(2xjD2kRfg{e0EVQacfaV-(yU_qf`NG38P7WO*{-iYtm z812}Y?AZA0F)A6CC}ll`UeWUE2#R|G!ym`4Dio`%;NB;u^rzQ2oSX~`W9!)Raxc=t zB+u6b$WNI1wD~pI6$yU+7-;AYZ*&r4=pJi)Mj$j#C~S18w0u%1j`mv}uSgxQKpszY z2J?3fgVMkvH1csU41&L?I8i~$EhXzOQ6kZ`)DboE_D{-w$QdM!iFE4EpG~0xNDZQ~ zeBQ3UR64cI;ChEYKJSyB;nIN|z*JnJsA5Gkr=^r=OX&Bv{^((Uby9~l96oAHIvKeU zDRb)~v;ZAUH@V}Pu!JgXjX20Al!&d-j6~9cP+&)Vu8R7JJjfScO;v z38oqnXpfpz4sW~J2_8IdTX?-Ji=AJ3ct5-c(>>hk-56BQVtUC0b0nm~SgVA1-@GVg zg_UthC}xDkx3z4k~t*kkd9PGf-(#a$Gl{(Tq+p)>7KT#`WJLSZJA@J`CGieIrfMNWTuI+ZDO_% z^^0ETZm$5yz%d6T@K8(wnfhN4&Vh9B8;O=}R7*}R(&IT!}xyT>*Avj2ha=kkrV@)$u5JxH#u)W!f>(*v#BRjG|erEF_CXu3k~ zRVpSUR9irW6^+fD%0sx&7a%ZwzUpN^J?Y}(AGi*81#Z)O*I#ebX-V(Gn10f!?KySd z+5Y=LO!?pJXd|t6|8*TWxCw?0b6e}k5$D+@F7Z4I_)-u2QU_QIL)?x4+zy9K`)&H1 zZXVvQ8&}W6Ikzf?Te4ErSLHlbAdD&Z4m#?`nSF@`|v#J}PFt zC|Rv5v0KJV?Mr^=7_k{IuVpAKZ-$Z6`|NGRqHe__P$B)CdE#hYe4BNG^QZCO3G+X9 z*MG<0{`0F@Fi{Z`cN7`Bn1^Lp%_ToUaLX~ab`e{>sD)`{Zazh}NOUV%!(+HO4!jr6 zy*umNa$l85Ul}Ew#^mP>igiabzYwlBk-lRhmh3B*{^L{Z?kkc)E`Z_fGc-_N#%NC) zHsO>8UQfa3Xbl=(?;~UuI0-yFGcEZ?3`ddY)N#h%GCl<<_-~32Gw1}ybqBwjJLnr1 z?6U6c%G~Z}7n8lfBS5yTB-iDKYTUBd())H0Xz({P`vyg_+Pq0pCdTGXIdmzyj%m4Y z8J)GfgKmOEbgTG&rXGF5!N^P0yZ+&(mN!SbDxYRe_4Op@@w5e1(V@3+O+L>W8gbvg zJ-K{k&xcv+p)jRnmYfeLoGq@m`I*)lNs&^zQ27nVE%OEjAq_dJR&mZb8~^UJGwwX~ zLhkPc-&oeu@7K47t!3Q8zy!b+1y*KI^RRKDL7E2h=8Zxf@;d?ra@G%+*AGy#7E{g@W7bIV zwNW-Dk(>}KSdw>Cgm#`#0%MWqJwB4Jo_ydHrdYciqeoY@`Vy2jx|taru+s#C*14p6 zEYQP!LhP4eHoua&-o?!9z?hu=Fg!;b$ZI}_F+76LpWz;@wkHFXq<(Rt;t7&xwOJoU zcZ(;nrBay@3cExIa%T-CFooqCL3K-HxQHq(ipH1X;+d1LFD5XRS{qGu?#i0kMg`B)czuJ+ZuM{ia56_DBIzJUT6YS zXoB5klAb!nj9Lwsu%w`;la8yGuB{iZZAW_NZ|&;;ZHQP{^>OCYl|esPGSbS{3RmixiPsxT*usUQHud zl7=vptbWO=?Os&x=oNg044#lNbp0E2u+5HIz{UN;gGmiI&*Rl2jtMIa6uNqe7rK8b z{SF8&;k?aa%^(jVVN5j-k%v?^xnH49D3#i!?_{|C`U6>bidPoEcg zF)P0ap_QIt=5HR`rehye6~T~(9ke3wP}36M1+FV5i=|(-(vyv-~Lwf7ro{m zyL|qP8+?;6#P`{q=4yeq`1Aen zPbj7(k#3R8BVktp(`8tIJhyLF?>}ZC4XR#78X*hVFzc&0x*tDv&d0SMhZ zRpG8bBx5w#>W>*~(A6-Y>Y@m~EveK^%-Ip%WSLUG*q7bGWZbKvDm4^n;%b>8-4Y8o z=0aRWd=||*u73L#?uh4pOxSMva-3Xhltd&<#Uq<^#OypvGSJtrs!CM!+gWfh(L|L! zr?B7{pF*ybdNDU&(I<#>(;``0Ud38KB=?RNvt$}!06l)nGSD#J=+ZU)gO-Ncx{Qx#h6PD zUh^8OuT@k@j%+0*@{;?3uq&OpPnxObyvO<@B?V(|&(wMUM2k`P2^h@<0C`_n>?P;? z{(VADv5S^W6Q@!mT`1cXj(W!kySPqcFI!x+kG!8buXaymiT3`NEIS2#Pid2bRzV<_P*0aD=x} zM7K`JYsDqZi&K4-pjX{;Oc%&uo4?>?^trQscR*enL2XK+u%_}U_FNZgCf7HeOm&SX zyCBxFCDYlEPi=kcVwHeY7ldNVlCo1?o$4X0MRfZJx_c7I8KuaARM?7e`@#T1WCETt z+A%6z#x7#bvgQb;YoeY7$l8glFV+4FTOOO&;Wi7v2eN#9r?hZj;b#fv;s^F){B|Lh zjPr?@3M5&BCe?hFVCEq`@{wS^jh&gp5uQ5`|9z*jj9JjkAi5d#$*uiUlbwG^*e6mG z1=rXQNJWSNm1A(Y$RYS4F_6-l@T}*FKO~AV>WK#pM*L5 z&`acQ^#;DMJuIYFYPv1q+d~ZN;z@yV;3=eO583t)Rm$uy177V`TZ>t$y~i)E_kgeu z!10es?GV4XUy{KAc5wcgQ_5J^{zoBe_vwbhd-MfqQHs#AMKlJ%o7DEJj8+4BP84*^fNgP5Et@~d|_iaoV%SHQNV zxh)%}b2vTA*r)Cf{3MeYK-O>bLtM%iT&P1_@nKx?Lk;+;yy<|u3=zc~8-!|^83(ab zZIOp)KYy^+hdq42-`cHE6NF$BHBW0^5WVn0feG32+N^S}-~M zGu#`v0oh>abDCx*@($xpjB_l*2K}_(QDhm)?@J^Vi$bS)C({fF-+t1y--onI+V7Yg zV&}EfpSdD56t~(U+r7h}F+n&?b~EoC6sv0`l+F*XmY+NNF2aK6tV zZe227#4D1n5=4Qtfgo7QVIvZ$)7T3TL?bCL2T(mtpgjvBYo*p_2xH^p8wqm#hu8nI z`sETsouXH8A+~dTZS<(HaQi+W_^7&FL_zZ2$&z7h|j!Y zVFTThlyte9Q+}P8oMi36Hll3obA1#@nw1+eSqCzmvvzk54~zlODu0wLA!_M94LF}c zZ;63Ak-{{y2+bGQCo&7um=`~gY$czn`jB6zZ^iOeiV>DJPWh_b$81Z(qs+Mw1 zwCIhGL$p!qtWkPlQF_N3L@R4iE89k$^`O9~4Xd`^ed;bKr!itxW6lv$4KPxy8Rg^T zibIC~a|!O4{%76&F~lcN!{p&0%Bj z&iYnSGzo`Fa|xr-2kg1g(<(|XvF590?B~lk$89kx{&+pRoS&cMUb{T5D%hN?>;IHD zU>{Ew7$k(sUqx)?N{pmDHQpYODDju*Cn>lDu*f;&&2y^?SKeVH?tCF9Yh!QAojYPI z7)q3RlElO?X&cdHD)ZkoJeb>Lui2d3JIImH?QlyQ=c;wO8WLmN z>>Q~E(wXjW?}%w}s<|mxT6xKP48y@kEd!5i9Peash^!6WTO->N%)h*GtTYxMW!<1) zZ4#fRM%Y-0>hc7{W^v86LZa!*H5QIf&jO6PQimIZr`c_eDK1zw&KF|{Q=60jUi+bS z$Grc>NIZ;=jQyJh!AD(RT(w_*o;zG^>>3kOQVXfM=Q(&*-r`haUSl+u-TK*6fFY;B zmJ`!7QemK|l&PR)#fhP|x*%C^bwOJorX*Qe@k`wfaq^iy^Y+1tbF;AcgM`7M-im;> z$fgQCv>Gv{fuLdg?`7ln^*-)yOY{I+1SR90AJA}5MeM~NjBj+=B*ipx#~;(K-SJ&* zsGL|uwuA5!)15*!YNV%r(W;pjy^a`T+l|)(Y zQ^wi{g%_Rr3yMvM@~Ck&LETcArU{m;b5mLrAr)#dkyLHg^}%P=V96D(N!?;=!X{&G8F=iY?QT=+bOAd~*O=t#_jA4xt}pmNeI2)?hbt5BD;r8x z)J|23VW42W=lJ6Qd1T*?k>sexQyQLixGYuNNt% zG^T;?d!5@|!g)4N9@{;$bs?i|*=KYeiDx_Q&eq*gt8G!M-9f9}!rNTN&9#QjKdhar z3|(ss9bv6q{qVw6Dm;EX;K|>{N$Qt=3<9>F&pvo#F>Y(jWT!A>n=!V43`ThR#Fy?t zhI!F$Z`e+Y%;953vFL^PcbeR1?vBJB&NC)d`G1^e`16 ztuOwScSaY#5+0=CjKIxXj&w_j9dP7s_sCx4+?bX`k4T~=BruXPfpLo$S5?Ohl#ObN ztba#2tI#m1DtK+>jNjbLM&ZqQY5PSUVpx<{@XENHe}^DE&i}{MR|Yk@Y+c_G90qqA z+}(X}x53?AgFAz}y9NmEE`ts3?moC{aQ$-bxo_3iwJT5ONm9v=^y<}XuikChIbrFI zw>ZhC*?!5op478ejW|w-Yq`dDWH**qaYs~Dg>0F0IJf-rwT={~juyMD40dJB*p!T- zk$W^g8sjHdwqz&hKN$`2c&8?#Lqy7EV?{GBpUXPGmK9;tl|@q}^3OWWwfQl{;JaTq z-AV9b*XZx>EP!=8+){0<4u^+3M1+-jF&DJvxejJmlO;8D1b^p}hPoC#ZZ0xAB%n66 z)b7}uEX>KxZ~pkB8=!rko)*UhIE)O(Pn&c+mB4GUH+KZ9Q!Y7}0rm$481>sG+GLm7 z9FOrJ-y@#v_C<$%^7iJ@4XIN9D+yv|L<-id3}3vTooeMs4wuwdN~` zr%gS?WDSU_9HOj0P&V86(xwT7By#HQM=`LH3ALQ#-JF|#`?&$P2cH}W@99X^h^r2iC2==T^kGT&b+fj0bseZ)NnamEC>B8zN+tP}y2(>#ASUi3ZDch^# zNj4EyO~o0VDYW9l66e5@FoVk{K*+BXpIIfdJPXvKOK&k^zh}ntmeOp1-1`bvw~6x= zZsiJ{th*J5QW%^eM{T@^<&`AY+T@Px!R-6Xt9SGGGQ&eUf;Lje^lY}Zm$`xqnnLZ{ zi=KIiNl$!8Kkt3?X3qWDNf)}EoGZ9>32~5vL^b(3Fa6;`WT7jlps8G+un*($Z^AI^ zVa{LCNy4v9WEvI7A&E|t?3dghicaEH^MRlcB$$uV-em=I8h@u(w$ z^DUBh?GYpezJ2q~Cb(ag9!3^2KS*8PT@8$PPP54%=`JyV9987t=(O(~Q;A->R>^ zT}(6PPBU&^5p50=bx9Ezu*VAhjuS!~Lf;%fU+*DYA8e})F}oKa+Z{vnz+#Dx0eRY# z=K6Eom7%&Vrbcs;1&5*JU(X`F5bct}}7V!Wi4BvhpdzV(|G zV#=vw4%YGKP4$cR-p$}I^hpmdD2U8-ceXnb*8Lp=sGwS?D<+HTUwAMFmsIalz}g?# zhc`aCuKWjDr@pxy#b7z79JFi9QENuB>NYXib2E&3og@4?mZo*#t;EpZ$IzWfTu0U2 z!rpK4+IaS}^DZ!2rvj!owx*-HWzMCn{KEW7!7h!#<{G$ni^k+2C@Be`lEp~L zWUgWk9dSg-FRx2B@>Ehh`Xcsk>OU8?k;Zl#zznCs}QRVx+m}O(^@@WNZnZ( zlTv(RdJEQ)Q!JEp9)3xzi1OmI&A1(~7BUWg6bIIV0_6R%U*_Pyng0$~Y(Z@p!?~a- zJ~(zI(nSaCc7)?=R42IcCEfC^6mCsyn|om`*>CQSE@bJpImL`=K)Cjx*<_Ky!EyBri7P?D;QDV|?IqXO8W9aHfIUsB9;a>v7M`&CKGtKr-6% z+9$4Vqes;wnh+e)#!S*zLiTN5|Qa6w46s{m+tuWz|zDX}Qg zfA7tW70~Yd=jH^f=Sq9FRnKC(5zyW`*xw5u&}R0^rreQa#J@|Ti%voi0Ly8Bu{+Gp z`oz3bZG^|pc#>@250C6hi|i^x^|OeqOo7~BK0tL}tlWuIrR{5j+IfNgZn5xgzCI+* zC5qjC*0_-`JlT~yDFNj+7U|yRD?ZOxDBJ?cRG{K%z6`4h7Rm^@$`Civ_TXTjR?b_~ z&z}U(+f}WKyT%7fY`KtA12Lhr2W{s(ysvwei5UMIjc^+gmpNeu)hXS!nE@+}uF+@)i3ELon z8p5VmdXH>{*<;0B?ol8_yGc}P*P0*!n6FT6l{3TioH9&ETTUxp?#^wc^mQUwuunbz}UU)@b9FH>>(W3)9O8nFuI{Pk|}347(CNPlacpV zM0*rF7pY(Rt1EJd^^A17u@%}wv2Nl>@j}p^%IpX8yyr_b#o5~Rw({YcxV3Q%&-mS&i4ME9F4V$BwlKMA`mjP@DAGu`q~Zy=Z5xjMtR?z z-slb2)3G5RtC-kIv&;F90Q2*eZ&{IiISyg)+@8Ou{oJ?LhHqSKF+H}D6I$#>QYdY0%6T0OpxWzH71@N^65Yh~QalZ;~z7B1<4spK{ce|2wyOwl^>%WH; zbH9c>4Q+O0vft5N{=?cidgYPKRqZK9CfN9f_1i0^vC(yQdHP3#s$5tjp13c?YAAfP zJZ6Vgg>j`$v@8W#o`d=N{9r#mPZG$BlHqN1*M#ZbhAVm(^65eIkQ z$qqT4v!Ahwy~rng;Y$?Z_K3eq$UUEMg~4LcHCT8w>x59g$&Yt9~hTs-+Sl7@@_Fs1xgLA4}ClhB@)H}q7dy~?ah)@M9wJ_*qTs7FU`ZBJI4O8>hvCTSDa^aZu(cKpnYMp$J9 zT3utH29xZtced<7khiIz92Fg1&e@sEO>W`!nHFA+ezEfX2{h|9;p)j{zO`pRzUL<* zXIv5;be-K!pX?@r`)(Mr-d|d&|gFhp5(t03JMBLK^?zEpJxcC>6I2{MDj>k?wOa zoR;A3EdQX{(^our0GGhf=FeWsUFY#c{$w@eW9oKU@TrTb*|AIW-tW zS_r#M?red-u#Ev!WZk!UH$w9d9q1B*=n459*w8D9C0Kd~RLxaNlr`~NE6%Y0E?N_I z{J#)eI6tx{O$@E@bCwv?H5Hg!d45ePOA6H|{Mnf$bN3Z9)00+pZoYIV{U z*=nrVexdq#z5;~#x{(~?%HOxjQ`#pLCAuRE)^|GpnO&ufN^qzDy2V25H)U*@wKBj^ zjJ3(q)jA46_Fb^-qXo#LM8tzKuyrtq`&HQXojG(yx-e4M`gd6A((iccoOxPZsbofS z8JK!~s#*O*ruhK5W3ghFpEWMZHBNJRPBVFKbEWswd2Ta#XmV@NDM?-_;I)4sfB#3Z zn@Y`%a?QO;jo^%sL@`En8jY`%nqVOk)dUkNH;X;?=61G!oU0e+Saf_VAtG#q z&V&?-E2~ij5kfu@0;u_`avT&yI>~Daou-&;=G8&TF+t4{2wx-;JJl51g@v=ym8=i0 zC%b`)k!QAdoutNV&-#tr$cXI0?BQNiIJGYi<$T}wtO0hR> z7U96(VUK0b$;5p0J|`}Y>*sr=l1KmG`hgTne}FD^kq^00Pv*bscpw3U%-?HrC+mcd zF`SiFc5tn(fG4l#%(IarzUr*$oDmV$I;R`H7y{4x-{lX_1@0f02@ET(_31y zci5mwp6EXN`2!=~eZ0)fRm)@XHm?lA}p!SV1#Lk`CzPk^+=pv&%=ed%opk>0VChs2KC|H=!fMB)z#ro8qteQtr zz6rKYQ>iZv?EB>FRnbdUG;XeL;@(DvW>c5OkXZ}Q|c~MvhtB={y=A% zian2n{k;ie8p}g^$`+R}i79^B*{X3LCtv2ZFtIEn)?|Mtuv5IR0kOj%6IXG_jLNR9Z^-YYW zwfUb@K3Ta_Pk8-eKSUJ}=Si2j!S#ImDk=VH^F(CO1|cJ!-$*2Js+AnOn?CJ_=%;|< zlCPOj*Nqr#i%LHX>?k`iaa~jk=QQ22VngY9b)2j&>GRayqs`Ues-9VSpDT|2)}lA9 zde54e`Oo{BnZwv{2GF(o@Ha?NqITop!~N1d|1TMoW`6HJ*!>qgPUe?BxdWE_hOa_l z+ck%(S2ta4Exc;;!~9mcI6F^HKr(~ZYQ20zYTnJ%8i6$h0+1xhC$pMkQTK623KWht#(0x2sl1O>?C#)1^*+Gn7qy z5m6E;K@v?l5>2~HrSEVuFi5mqG1g2mw8$~Emo>^Cnb1vFTAiyws{7&vx8Id{%2ag9 z7NV6)2#XX*+Lvsx;Ao22WJn6s|8irGHfN7^V-I(8QJzlto>>QV z+l&IOgVO1W8sw{tvxd#Ac{sCzHM1;QYA3Q{I+2Dp`q}zLLq!9OprXO-39>vVX`B>i zkA-Ti7H^#V&g+g6L>1hFE^_!S-<6@j8OA^4-Sq6)4)W@4HHw!aY$sn?$sn`_Yy+DZ zkS&;|%s+Sqw>P_EY7f!K1@6TsjW@}}0=7YPdFYieU17t5yJ^cmdhXEO@8hZa98wXZ zT?Da}?6$2B^7v1u9TI)FR7)|F-=DXq`zmX{zI7nT9^`_q4ci-Qh(q<2;E5|Yd9PK_1m6bwf6xoOb`arU1q>Dz=>&OXn9SUo(Vu;{B_&aCjqG= z0cm|367uWY35Ao#RM!aN4fHIpzh`g2oqqsq4P|*%G~29Qmj`QC}v;aji4d(^!f; zMpPA1(FKsN9&{Oh^Nb=SQ9Y+HXnSoL-~I1O z=n|+e5~wiHsFKjA#4lp6xA*k^#J~S224O!g`v-jKgK}FqTv5ulr~;GHRi%Y<8cpQ_?bR`?yAML0Kr9M_5jvkhDWq2N&Wpm-@xG!gw{rLWT4XsF)#b9gIG5fO~;l zi>;#D717Zmtz?>dkCm(uaCJLI^Lk$GKJ*lyJ-C1@2K)TD!@674Z0U>XDF5o+)G=#E zp7;}nv<;S86LuL!6v~*`JZEl6^*Q`(HNMndO9C|;_2qAQ&r8Do14-3;Gv!U7bQMJ! zv;*qIF2%6zfRsdJf>xxJTgo)cdt~*9M&om2{EAa4@mT(xcHpeKyt_Zg`Hjr#YI!NP zhLX0X)Ki0Txj|=PbtOhdYc!=a4MRPe_6dSjs@dE^a#R5ijGFVe;zb{cy@9XMYQYlP zTJDVv`;|sx*MZAQEDGY^a?Dz2{2T+?H71?*U!m-E$Nt_|4Ha&TP`ud_Ssf#{y1ij( zRO{}H4j}M%xCHf9xO@7(e3}hgaWOy4XQDTJG((-Nw`d&$Zr9Ko7c_@UOMgn5rTS{B zc*TW0cZXr{{DdX}g zQ++B^QdB9OkG3vJR8;w3JOI~% z6AW4rcEqf(SrqDdUf4p8=zXkEJ*JQ$o!=j~*Z76=nuxU@^+Q$eewYuve7X%HJByIC z=c)8R(m6XQ%5sR*axl z?Di}y&qOlzlLVU$yjOF_L(s-}4@tGXVRP8RCsDDYxgo*|U-Tv}Dq71V^YfN+4qfne z%VLf&;v_7z2Dg^P!=bfHXh>rzS+?9}XwtsdM_VSL(fB=t&vR#Vy!mnPk)~%GjWZe% zH-KN})8&dXby1_MKRPlAdwHI-4Vo?uN+HZ&P=j2Hh-dVdtQ6!Iyy&q!E252cJ1Zpd z-B4t_$ez11%^XI;!L430q@1D5@1da;ZY8A(v z@g{94yF>_K0$6UCSc?l-n@HR|>G0sV z4bgAAFdbW)rVo$t=cYSuOm$2+jn_5Ds~)6gtN+UK{)F8rtpZw6L%U~}mksEOC^}mv z0JEsFVLbG04ocF?j7U3X+>JlPo^f0qv0NQAJ*L7h{dZoXE#?P zcybb*FlL>+D2go2iqf;jJlB-_(nSJA=fZWi0=L#D=MA~$`UL1T_kycB`)xbvb=tL> z-0Jz~rG{0dr8Gv39Z(zeR>qsnS>~L8#|JLOYt_sffY4)g)F?Yrb+5@1&@)Om`O373e8iiL=e1f96-XZ&J8kXSiNYxNm3pt{|!qV&vo6m6jjg?>~nD z4X;=Cq(a~H50`ynS})M}%4I9*80%+UV=c#c0%Hy{uz*ANH;AD=s5!{u?CV0J6K@sC zTZ$$8bYYR}q_pt*N-DY{`*WXVoQRYXlO`)HT4*X{OFCY@ncc9<@H$*I?z0XsqcKhz|)AM(X|^FM{mqZ%S0k zfh2sxGz7S4)Jl{WfYJ+D^ySbEr49RYM|1_AuM`|0#WGwU84xIV@%rZ~rHth_4CPBN zkxmAf6(vpv2ZUp0p^~z8ln8d>2yS4ehA016o2VH;FmZ{=60N(Sp$tR(&?Z@+sC1uc zhB_B?;T8J(jV5#PGa>^NqMP7AzSl@&TjY@v$7w1nC;b#$H^X3&M_|V@QH^tTlIJNJ z7n8yEeas6)Ti@Lb61foa8SV7uDJ0#1U|CY{mva_$W`Lr1<2UJQPaml!UAKeM z%mm}uj!3ShN7b{WO%{J%)sD0}r7c-giZg0V`}FW#G-)?_BE&I7?uayD^NZ zIgBaw5B|y!egxSwcbe#b*Qrw1OQbr}D+Ge$W?;ZOD)9laQ==nr_en1HfXJC2I5rd_ zA~=bC1GtAHKD>Ek2d5Jsus$+>{Ccyb%dbu2T2xLx5H^kcL<^Bo7G6r{A8F3-l+4l# zwWU^YfdA(O!2VHrr&4nFeSzCbX~jwj0lHfCw4m5M`u8TP?VOE)EQJH*vZ4=pm-ldc z6B6k*CKfgX@M{`S)(yRka>|}KC=b*#()EmdI4PMid$@21*>HP!hq&oyy!D1s-^-UHp}gE!H745RW|B$zeHaBPi? zY@_lTLRnVHjtG?zsZPTE)V#lf$Rc}iU&==c^YWB$V{xFvrrGW+P99Ab__$Sfua3cn#(>0tDK!}{qCIJM;Eo7@Ev8A3}KDz=hXS!5YAE@SSu_tFP z^--U@ey1I~e;m5}Nl|@Z{qiAvu4oPP);jWkkvw!|K)5`_=KZTHebIEYaoete;|RBU zh}yUX&Uwx7R+vdsb#{6s)_8!Ye1Mm@gr}U+;Al@ed3svk)9U%FCw!?RacGb~h2O)& zJCMC1I)1d1GdY>NI$GB|cnE>|`{?VowO$D5huyHC!6U%HBZNW1iH`X95O*SiNxtrl ze>aBZzgmjjw|(_*-oZpI_#2|OmQ@7Y=1-EgN!{lJ@yi<~-VP9?CsA%sTecADQZ!}~ zCe1~0VY1q}_z3L&L;Uft-Q|N{VSL4de{yDKW=ilMxWBk?a&-K2-^0RIhg6*Amae;M zMB3cvVVd>B1Hs<|!NC&!VTbo(0BOAki9ZV81B(j)6Vm1l_%hYY`yS%@IqEbThASP` z4ncbDhzLDFpd;UoKc7Jt0iXMjt9GKAjlXLgUn86gOX$l1m!-G&v88=sS#>BSfWoc` z(?xbHVN5?izC%pw176RB#>U>89Cx_pE%I5v9LqH|V>^xTCIga1K#JxIW-4Dz!>ntH5*QcjR9q}myyFtJu0~)e z;rcW1h3TfHC+d~kL&8w1A6b<2+l!d3jkv9)m@Tf@*?k1J2iZ>FnzIic|I}d*7;+gJ z;<9*pJRl(6%01lu>lq8V{GHI+d9w)5nyM{At0Td#t8N{)-Q|&+5|d&TOD@tYV5Li2 z?ZqRfu#=MIOX#pJEO^AEfYM6lZ_6~U&A3!C8qFKM z{RI#HGAf5$>XjuL1PWjLL#O?vsL?~V43D59g9$k}w4$ugTJ-}9bl0)5I7fJy4! z@q(z{#Ez|^@@+AfVDPR@4!>TD&~vhV=BKfP0b8|iMBOo5ePS4fd66@dK+NgV zY^yg@TwuvQKNG5os;Y##`lsXL2kCCND2tX^lr8BJ9`H9k&j%%;&bZ?z-%x!sV}^-d zJ>?&H_2Ffi##rP`u%j}tTwUL1Z+eNsb;VhK?bIkAw*MuI378 zE#L~d@hX&b9a3g|3TDhfKHOe`e^|WNIoL@@Sudq{)Tt?_; z(X^0y`7PP;9f{g=nFdr>sT^jWKH-mI!J=}5@g!Qcr!tMWxzdcs0;J4{LTJnRXoS$} z!L<1r_R^3huO{S-(X2Cn?@=6e&(gU^l+$(9)9m@994QXYLOg_@RWV*MIlN6#+EqZ- zlql`DuT9q2W`vZDqD1QM=x4;lb(mWge13n_U*p}gM*7bKA@aO|E(LRUq{BO5^$KJy zuU;$PJ;c($NNz8whz4=PnB<%8aNa^qXrgp-MEBr{JHVOLinC~faBP)t7pc8uF*+F_ zX)iZORomJymSwW^MDvOf)VIJM)PX&eah)8t(9Hz;r_BC%v5%=*h-wZ>&ymF;oVk=? zz)Ol4n1dS?O8Whp+jvlOFLeU!*+c1i_+^vPRe0a7{%*2*sgE^2mh{vu-HlV!&90EN z`k^@aG&Qj_claUrbxwOaKnUOuw8`)*$un=s^S!tPeRLNd>@DwU4IXI^?&%Ny)f@Z^ z>0=#q7fC#@dQGu*^r{O234JAn78Uwqh+^Gur;u(H!b-jTLGY{@yz9 zD1F1(5##_+VfH>;tefiUw@Pc=wvR~1fURlOB_%~`oUb5ODBLd*7asindB_+0>FNNH zcq{VpO5*RX4k{2@oZucZ)5uqa%Xfy`C56BFp-MVT-fUMHE)yYVZ<~DJ3f=*?`+kM* zej+K$@*pF7OY46!dl9{1sYH8vDwv=iE*dlFjtxZhIo(zC6=7E zJ8LW-Qf4pcKqJaBpoZk)AGi#2MU9gw)4UpTr~N9t*-)jGOw(Nq!bLtJ8hxUfwDzRF zu5cq`&QkjNh4)V!SzSnuWV zDW1W-;JC6jaZ0jFxc=sArt`mXIqA*4k6#U35N5*K2>$0z>_!B)`J_)h^G-cSK{c>$$VNli9rxo|tupuWdgKu|4^uk8OiRC?&yK6mCXJ=gmWwgU z74=FWx9^KErL!?ARatr3e6gCRAcbAwayR9g=DECP61BCmm#Tid9m!3H^9JDK51-3; zcbhD+-U@nX2>=_5-`x)D@MeiNO+?l%jQzY+vye|0H~C4g zFIxK~({0Qj50%YjE36Zt2=SWp3Yyy4Txvw<__G2|GkwGCoW!NpC+(RrG==$i z)8y7e{e=KF0x7LcZv>qjfjzl$J-J6TkO^eabZ0SLZq<(>lie01GJDTA!$*pf!y?C+ ze^@ed=bL?tbne`r7_sVbxYy-yEc>jJz5dcU^>*{Rm*Jn=`Zjev(DBLyct-TUc>T!i zKL;N8r!SxL6@4I$Utr2rV@8jVS8bC6PM^hZIC;3d)R{dXkvik8apW%P7#H2JY+zU(j912KChnE4VLg_t|;y!p}v_vTCo!r+?)~IoRN=) z7ywHQfFWAK5qiQAHh|kB6}b=l(P$4(2yxSV$}y{LF)Cd~Y?xJCRiHy*B8jwrfVH2= z8>L(Qr`qbom<7k4(B#4Oo6Y(ZNDW*-8hFI}0qer)Ca{~JEQ({OPD*G-9-37kC(-%iRuXeV%tk$!v=CU&1M*H2N zBQhW>Lqtf>D?dYx7<(562~Ah<-T+c2tplk;M~Idu@|q#hZfqJoG`SpKp=Qkf5uWog ztztOe=dFF4qC84WseqE2QL!%x7~JlM`Om3AOo@w5wMu7ONKG#DoM{KYf}h zpa!_3HM2xfX4vmG_$)dsSzx%3hAwIHHEbBTDf#e9Zv8SigFHj-CoBbsi)aD~Nap=gNCh4O#e~M00HF4DcTqyUJg(@hd5#}N^W1G7%-a$_^!fJI!6(svk%*x zQ8Re{yeJr9fYZ|Rm$v7U)jla=jcM@QakkY}xynhosC&@Yvnx98 zJ^vgn%9HBc%WYKKvlsnY`j-=Q0*G9R^e{U}UI}__q4R-jlKb!_4XjHa0NB6KYp?LS zbY&R=-4&E4?z8wP&w)MPvRu40U~gmV&Kw(7AlS4Zzx+LN4LndqZI9kmC7j$srHu__ zH&}9bUlI9l+gajyljStZNs4>+`vytI@z;%htia#&83j8sk1JF68UILve3Gbg0prEAm1Ky228)!1WV+?lBMWZU0d# z{(Y6US}C>#zCR19Ks}&T{JS+4Yz9=Ic|ab=^=2$aYPh9Kv?@|MQ1Wd_jfdkQ^p=6*&V@;Uq}E8`p+0%TE$vDQ z*Ra}pVe7p&E#9Tlic1*n9U;c5_k23hjHNVaBvGPs8!koOy{vW})VTXeobW+x^+GwF z+8%-6VYq24zxIwqMuSqm@2ON0UMUVE50^%aOFz=80C7$XZWVGW;ZS`kzNc``B~46F z-1MzL;l|TvcYo+02BzaBp?uJRx2+lW3?^);6BNcu8MRZjvW^R8=M7#?DBolItmaj> zg}cn)b8U7)v+h~Fwc>UV#QSM(>A&c>ZK2sZ(q;s`smw9Hxih;`Vf{yQT z;~HA)T~FcdEe7%L^kFR-1A83|+jRao3=1+)B4rO$d*NNV~O0UaELE5Vs zcdjh92H6xpmEc44vJc)+!*Txs5WxSCoRm>QFjWj-rK|oanBgbwb3ieZf!%Mej|%jj z7+FU!cFrKMXJ_MOlW)o=Y-^6;ZO6}85G@)At2B#_JOId4fs(Z(%W7k@>FmQwIguj= z&VjV{Uxww#c5>>9QTGnxal;a_B>ESIBA(*DbH(H}Ml0J93S}Aa_!1SZ^3q4>Kz`wl z`i_4`tAPL1xhILY_9ExU(d3$gjP4fYw=L*zAC!8zm=a!tnt;}o=Jw^5)(E@}pV{`O zLg#Do(*sR1tY+oTs9JrDmXd;dvC|z*Z`v>KJ~Sl%wCl0#cP+x1wnsxJv@_se2e8iT zp?>&Om=S3{bB|+skYl(D$({Vw~*FUV-*7Z+qmWGor~1y==C2iyD|>cbxQ19zJ)IDa67W z;qsQV>)7sfPUmZJ3+%WpGk@pc@H}2XgxM<@81cCn7l$Cf!6N)%QGc8gfme-VHPZ>t zbbx(0QfVx5dN^uk6dn@HwD8Py2(?RCbLF(4in>7ks_0Lhh;jMBsJl9p(YWL3`m7E< zy#*JHWAaOyRf=W}j8Afl7r6y8#*!)Hsk9*sYP9$qH1ry9^y;vcG*E)&PzB9VKKAXs z5xbwS%>&TG{*-VAOhFF6nWvqUiuy54iDHjcvAT;DkYpZ^F85Z_+0MdC|&boLVbrWv)z zT}ONgvH{@orG34_FCuG;${8$-=AK)8^|&CezvnZwmY9V>bNO@T@fY5l$;r8*m1E(| z@-v3o7#T+DnkufnQhBFL*_(GHWb9A7r3E%aGVU9o((_LPcE~i=*d>*GIg|#B#SuT{ z(2I^F5oY4BjPRHSShXTO`H9~wIpzCsOMRxSuK2|d{leQW1%2PF9=(Aqn+cPxZ!~`A zgwWR2f2q-#A!mejE9M`(xtB&VnI!5JOL_;@-Ah(_H*jatoB3A;woU4;rXVYIc8lrV zn>Av(14<31?IwG-w0kwP0%u}*JM3ayaBNCzX!p-6ApYy&AJ^3@=^>MgO6@tRIU-v;RnELjFzOD)5opIl60Ef=Jk;oshhL?phl`Fxc|XTR?+1;}b$x|duyCuXpxJ2O#D z@7xMsQ{tcWyILAJA6{RqiPRbU)4P(>%z1eHD%oGv%D8f&&x771l-o^hAEy4n4>;9& z(c8IKjep;CmR^64+B@vNu6e2ky!`M<>1a(V|;y!8aJVSefFo1Xs@; ztmUmWj9WfXpH48|S1Np)C`cE8fIubYWt+g_@9>kHU?fHn-s?la`O?mPk_5(QmI)ve z1v#X>x1cZa`e*b{k$F+IV_|Ri(7Zd}efc>2F2j#QNdOPP_~wiPhaMe_Zj%Th3r0J_ z%Il$`#&-Dd{wXa#0d)VxoGB;$bs|E-oE$aS#%n!2g3Cg{Wsj-MS%)Lf>9$W&%)a>Ri8#)?)nR>+AyyocGrF$GqyNY2#!^s*F z;tv{PiyS)#wG4&y%|tBNN^Z^n02L%lcnTt^J+Y6%Lm*?CHgaYZ0d1!lMa30$qKTrh zeDv75G*3|_LPaA)F>S1sGso)O>95Ek~LkRYS5zFv}#vjs;xjyex74SQM}~=$vf2{Mq`N^C!jT z^O6JHx_{#MnEO_OfhVv$l!|>--{{OQ%IrH#1sj6A1|Iw=;pp8G&7yw(vQyIMA-fwi zjOI;H>l;Z?P8`jtS75;hMa-rx1T2;7p<=gdHaQuyk8#*W~oozI=+ zW6>*@wfjB_9^`RHmbmzDPl(oYb*UR7danXro_JNy54W5ee^1LzDkUd0YchJikzu(K zQnX!q`dq@Lsn`P`dsLAxEp86XP>Y}z=G8dz6FEqkN(<=O;_43_;)VQUPVNxcGpy1# z1$q;Fft#l4T4eUq3&m8Th4h*-)(6q zR!PYgm1R35<>#%w?^$hI_K(cmGQUJQpE1M3xu`&SGS0W;WjVaM43`47n()a^3c-)uWf3SFHikwd zkJ9GbeCGS_Y`kU6zm*%Km8^*K`}aV-yb!zymI1@6VF@`kAQz2@HhG5Ag1=*`Bbz<@ z(IR%X7B_Q0-+tV%ynbmX7JY4P)ze%yHL?n88xSZ)+i~-8ORCF2lCW6B$l;)av?^y6U|I<+f<7_%j6OG-z!`_b0DDtkgDQ?Ftf9w{S(gz|zP(|ans+sLI ze)QH4d>+i!^UWB4{M8QpM(_TW6LgELOM@YYh!r4utI+%5nlJtq>^jy~+w5XX1lg4< z$4yzQ9oR1N0nMB97+>3{-X=N*i;LKnF;>pr*sHGft$43%JzNn4^)+~WnS1=4^yp*a0sW;F8v6M3qNt(? zvwbE!zb=8&jN%Tnt(3Ojs&rhKVM?-sUQ9h*!Wi^tY`yaAoO0m!rgaq`&9OS*eMyfZ}K zIKH_ot*Gc3=|N0O4H7W_=LIm%pmyL&{_KrZU??yR9~}Kz*#?cJz4e{j7&T($>(0HH z*(u87d}jY)D!HHz)DCn&xcc`3)bLU$k(kdt5&?0vbT9tAVv<~-m2VlrJ6C*8l95b3o~Y|w38zZI!g7gGXw z#Q)wv1+2Av)$i(%0j!{(WU@|cZy6nrgC?{@vMO-wUhvCZ9;hqZCtp_S_VDblHvOUq zUgS4h)(i6Ph$sl-N>6-4JD3RV{t7IX{mitea2y{2j1Skwq#5DU_3^7mx|SoZ$>AOx zlSc18;e5Vi@v653bQiB>O#V0}e2rZjZ{DzI+GU}uLe5~{?AJs{0s^_8~-K?wh7?W|Ov}vl*s_-1K7v=Phxm;P= z1DMj28Z+!JlN_p85K?to$LeAA=Bmd^Y!JxD-2jYoH;OnoHJY{b*G!!5$Uqe@(UpYZ z1^3zg0(?pTBmdoKB~9mLjWP86B%BY)yBXL7Q(b$e&lE#!OxzjrRD$5-$8nRL2E~ZU zV$=*@aZ|>yBOjK!eJ`xyRTfw7vZi(=P3Tf)-ZJ)YKj-)*Qe1=4Kxr~#)R?J8<>P(B z6Mh(!#0wI{9F)lQ-C}@KNqf0*=i%rb45%vZDKa5%0U!HZ^vdG@$c!;BEG9HOHAoFq zsjkaFmQ|#-AB0ctO!kTuYn;GG!LW~tR=aQHeN6L^M|v0 z_v-Gowqvt0L?7>KNc03Q-rpIYH;em-?r?J(KvKLp#vLX3k3{qWXFhU=?sb>{lSruc zqd}^4l0u}kgt5@Lf*2b<6=7^cXJ_B=j?h|{-k%pF8+RIOFVn=c9*W#jn_wx7cZ%G= z%Z{P$@0@iJjBN3OY-6UTX$3u8r0;yj8_*j;!jZM+?F0ND-vbvuTi)!t3Zfb9F}pG* zNv%8W-$L0mdMt!eb5?RHW&_LN3&)_K4?xw|wgEkrxb;KI6FQmZu;HRO(8tB;s-mKYAv zuB+)OP0X6x8RfkqYH=P_$aA)ltqeXD*sqfGPcsxZT`-Cg{L4=!b8ELbBG32U)w~%l z{!{ux0owXxY-U}tjb|Jasq`76HKug0s1h@9RZ=jW9KmW6Ry?bu=z(`;U<#$!3ziF?fKN~+4DZkmAL_SYmvJTjMUdBQ2O zT~$5R=<oWDzA51XJP4|my7r0$(kYchWL9Cs2hGjzqC#7>TxN@Qm+dG|4!`hm^#8rV zC)>kaF$9}B*kupwq7}Bj{)F6}DE^n|$om_BOE7YS#N9<=AM6E&8f*D7CpWKe7)7Q! zzKA?VB>$9ose6ej8VS#->Y(Pz9$NQif4?mF`FI$(vx@sIt5XvsMCTxq!XxSm_$M;} zJJTUlzA;}O@V!E^pn}a$EvsW5KRh8@c=$wQG)B2X@gwrY8T!*z5P!s5F4`wGibSk9 zR0?~Cv-*aPf!SFe1x7z6rgP3@bfCtypdyPsr%3nThjD>zjY{aC8uSdqzr0boL?)Od_M>ffY<5JJzg-(PV7{;Si!1QQtS*%$4ZbqtaC#f1V)u&HZ}# zvX;kzXNL*V&iy+m>Cw7VLsSwOt)fiH6vF0iF*_$Sqs6DhkG{M-NFO-upXKRm%toF% zN6&bV@RCkxk>DgdAOZFAu*LhBesFt-S^Q96^Xg&+Ix#M`az3@sn-$97BQqS_Gw$8f z7htrXN^cRxZGl#Ne{uAM09<}cc9&H%5To~STM=fPsfi6{N35S`Q=faTaY`+mZ*2w+ z4$Mf>?gWd_=lrG); zc1VO?o8eDRRbun5!~RvDC-*<#khtcI@hz87v;xW>-lyxx}z%3@bgJ6O}qanueAxmx`Cd|#>N*1;+#zIB98aMj;HNO0F5P##kSYRcg1N7 zRO1p0pxh1mDmEj!H*jQ)UfVK_6xMS^4>s5nGP>C%?G|Za7ipvw>ZBFu;F^^)52~3+ z>qzjwDitG_DLC`suq{61qz(e?xqdgSWQ;0nF!;sFos>(e`HgzU4m;-dbP4>Fc%_E+ zY7v*QHWpy(CL>j8ey(D~{8=N26jNWKS^Q}#6Ii){Xc~gv59;EUwQYMaW2tspS zahhFCG|{t*U(lBjLbYJ(rGuxQu)FYUFG3CpX$LEbxr-aLnCny->a-c^49M#=s1f%_ zZmrU|b?~)~3)^onpQ@rYMU=PJZmEn7l_3jWcq1JFsa5SdK5oy5tTm+BQDn;2G?to3$|CmGb<#aN+pV=!03vz zA-Yd_MOT*Q_!E5`dXmpcIg_d11k%18=vMp{(Tbc*R!A27lw14Hnl5{DmpwE^P)<55 zbeR>iDK3+4atilbL4yL@68fpY`c%VS!!Og? z6l`T3J-_!DkOt57>;ij|w&~}X2_Ed7>=t%^l}}03>dda2S-FG9uCACE8IfT9KV)Tt z>}=W8jrCTN^|Yd6{ZcBcrK0|zB%I7^~U*mdr*q#lVDzj5kmSk*6N3>a&mJ}b4sazBPD4oFtx z^c(E-gN`HIxiJobn1m-(Tt}3Ayc2I%0)ha+s@ee4z*|ZUz;jG~a`QHkOpFse!3Hu% zi%WmMcEreO9o7F9jRM3|#cmwWIooafPB8gIAv3*c3^+6zRDC-Q8CzZ(6Qy@h zd31tmQSUYH@-Cn~z4t=~Q2)v~z2j8(`_yJoCEuIZ8~3{koueQojzhRjh^G^z3nb|R zK(jYTvX1~He}p`*c4oVyI!tdHmkzbXwFgD6EMj;vv&6+HQ}|v6g0QNirwCmJ-C25l zX~{dI6aGq3se$vN49Z(m6A}_0j-9(|V(s83CC_}~Za$ve#-baq@0=Il=NGx4ihmW6 z{&6zY=a2k}A2GU;(V~Fua#P2J2sLu{|DcJg6v9Ioiy14;FCajHjfn9%JTp7HsIw^j z&KT`9z*ykP-~HzKkPyEFBrFc})9mM#pNfZ`GD?ka*0VcwddJCy-@|z@BzQ2ePuMHC zXG9vsKxd!oG>L#WSnyL^O`k+N&ch@_ToJ*WASR+0qdO5LBu+PDamb(MIx5^V$5Z2>PAq)i`MF5WT9v29V3}0 z%qJy!;&1Bwv&Ik$3kE?CIr}A=dX4n)@GwnOZan^ZL-SJQO$!Uep+!J{^#%sen95w4 z!X8(LCcla5viKB6w5jw;;u$W`wzCJ%50h3p*dkV}N$txjm2;uOR^t|?iJ}fayD@cH zTaRaTk84|xbz4uktJ?Y*1DvNO43W}^;*v>EWory2YwFWJ4D~(ix)GkY7h@#U2BY_O zk9--z8}ai_JZY!51Y>$%cZzK_9?#>53~8H40^71s-MFjw2z~WYymO5nzyW;rxTDeX z-VYZ%yv8(_b>f@3TY?n=WNQ1qKLe@ohWz2yDiM7bj}P=}i~OqN&K7+2_i^xLqGuki zW?&K76w_w7v}Gq$MU?W?tNOT?gX8>IyKK9fz@die?yc+2b%=6`d9saOI} zY*hUq12fJ#$#+TYltne{G>pqhoozObYc^Mle~MQWnrBpEXX3#-uM?2Fj@DO;XalFh*4tlo$mBq8 z)t8UM6B2aQ#uW}-jgRg1zTLRM_gKhXQ>!oz5L!TOU;?oeOa@L_aey09pxwsD=V*`# zF0fkV z&p{Ri8iE5Xlhd}C^`SPoH_ss<_}5ai@_Ua!UKcekF{M9O8v;R&q(@=Z>u-z!2Sdgh zX;dOfJ0h;A+tWzpl$Ia>whlvd!{!to?te^hlS+_9ZZuZs^9fT4!Iu&b*I#6tJ)BaO z7U`^s_%pJhXfoj^QgIK?#CsOzTCQB=j#Jvyp9XM7{;P${TyATPl-d-iM(8pP&dgv? zQWhRTgN^b-!&rIP;hT@ya@FdvICik`ilh^D&qV@j(VSFx&;ErN8i80s;v<2RTUVw99Q=wXwe;N?&7{~r zJ0w|2Ubds_Mb%7Vw5-xaOi~&eaW#LCEj&Ii{=p=UrFQ4V;rKN{lWqlJH}q*2A)!m!5< zN4~-2$KpMjclAc@B9c2G3VOg)YQYfg!n9k#fQn%Zv>?8F6Y#-5pDYKDYo-m7qR2Vn zr1UYN7$Z+wqI&y+$n8|Co*j^ybpp_|GA!D8l#(|#6i*EJ6mr6S`Umsrr1@s~$d0$% zmiO4j!xI8MqhxG7wy-IU7A@cP-U^Y`5=JU5d;Yex=zf1QgT5%J6L-oOYmynq2*B-L zy*S&fF9UK#DH&1E^7r9-x|)u`nP$sT$bA;pS0P}26VP9iKe;1jioLIAWSOnTzTl=| zcl^_z^2#%JdZ_5J&$i2CRzaJO;RioCIOIOuRa*1{pS#O@P|+c6FhK2F;WVugl)BPjNsu*43Uz*daI9`(vNt}0UKRe^N*{$U@`u=^_GIGxnx zeGn;cedNpOB;)LP7tOUCYH_A(#k!Wpbyv=l*SW2Cau~}tOSK;GaH_3Ob_5(gUWd9H^M^SiZ?u8^S{R|_kTg90@8EwuAHr@S%)pKqR6bU{NFoQ04BPk7 z*;5wUa^&Y5@jRCEJSJvBE5>zEIk0b8gE!W0)u*in7y$bEbB=nz(5YKf_H!mM1)xI12J&gW){gIZe>zIZayYU_hHh4>E?{}YD^ z;#aO*wOG@!^LrDj@wl2{6SFt}`LIqtw1rS0o3S=c-o7Ov(l34@6%tBezKe|#7D*Cd z049~D`d?FQ2p#cfS0XS`Hngu#0&1w|iv*Z^d8G#j2gbltdRC&eFGxpE#PzK!`bCGt zE%FF}Ru8|O|EjIb?m8pQ5$@#kdv?CR<>cG!-*(^fXuG(*hn$~NPj3u42eAfsk#?-* zdJC>P16L0@><*^OZS7RetIPYTSfzCILjT+d9~BZeN%0@ZuNN^-Nf@YwYHLF&2NVo2 zjg;U9S6%IIsrd*I4;@D>#9s5hdhi%~z-z?buc#WCwj1*$1KTV5*IFVWoRvCW1XKl6|T_4)FLErm=Yh7Q5UX=l8FmWXXv}DoYi(9adJ=_cy}T*=&65 zjiSmwu@yTsQQ*qqb(7+*9hQsGEbWV zcahSHXN-nBF2Z)VI#kV>S*_r;2YA0zqtzWe{4!j8N6ZYKQjX)+G5>Q$T;YMLxcLTB zRcPW;w&yBr{fTSU3eAqbJ(~QT5anFmc37dHo-VcI>KI>Zs_qb}jtJnwWpHqC(0fc~ zZTSsmW0WSq6Wxq*4Hr7~Qxij=+Ut+|e5 z1Nr|5##DK0>{KyUwx7KBmPq2yp?+%H3c1L)+x)TwkC~r zoI?E{aJbyZT#5|38*GkTvax|OpjPdUZYajM7J9jvx?cLYWG|aV$kL5}`xCy)EywD{ zgl-Vt_D7?bTOjA^QdoB-fm1t*S9Bz4a+b1@a2z~!OO`y-s4KG8fUW%XOv+9H74@HQ1W#EEiXJ%2no>=?xU-d$L&ZMf2G{T=b4VqGXLZJ`QJ~W& zsunE@!CN_qUM`)pXc;W(0=*=1Iv7fi`x$Ix1+FlF6ehlkJ8-1jQ2gCLi5^@Ta#W1?65Js6lh3cE8 zSej38SW@LdDldDbV}Z_^baBVe!WV|ChV!!I4e_OnxPc4QY<{%x&L1s%gaWHvH=ZkY z4$TD>wUoT23A8Gt$wqGp0z(>15>AI1bR}*LDK&?#0yc~X8I}DaMqw^h=%>yitMwE& zSkzo`JCt5FYTOr5Nohpb2g!7^#?p4)5$kC`CvM`bwFprkQF2B#rH|pP-C-2&G_?iK z8_ojz7RzEf^_Zb^6zm@vGaaY;iYE#?X+CO52{iL>XuNRz?AV8Cn}WMqN6<`L7q1>2 ztkRe^=bk;X?c+cAyL&ym2$C=g$?Evwy57l1ajitoI@{RhwGYRd*IimwmiH|aIzG{t z!+7WV#thdEtuXE58>$bKtn<2-cpwNuBO(l+`Xk z`-oH5$(J(9AmD>cn7Md~I>ntlq!KcGmXsD-(4V(HUF6uTZ($S-Ck4j#3)&|C>uTMjF4 zfmhXqp;Hn`p%Gn(Ea!q#CHzRI6liHp#*v+`UX(oA2)TRT{_?~tLM#~(suB$n)=q2D z)dySKS*8Ch4zS*X=90j6F71;KP0+j!t@ecq(>9TbnX_fA^*$_z1n=&u2sRHZ4(_=V zE)asayP*cwf2CvYa-%+l@(AOdymX*^C0X%=OtV$Sw`)52;|t(GwGW>f7(Rh0sHBw} zzN`tB4){pd>_gXxM&5`@!6}%iw?@YV4H^k+u1M2!`E)Zo2JMpovASJ{PMsnRvH@_F zZUpUqse6B$8-1bzE^Z$0*Ib@AC>(_WL2@pjK*yG69?WZ#i9z1{Z8W^nAPi_O8XZXT znf$4CPqXK34sxgRFm406%|{2Gb}_HQK+c0oWjcT@eT{OJP9eDOVRQ~MJoT`PcBB~R zZ4UPi(}!!nY@9;^_XR$_9zXb|={k^Z4R2DExVaX-GFXaMN)ezhM)uwf)78kw9U2k? zx{Xr(8PMMBBmWZ=>JHZU>gTV#N($(9?fN4ev~*fOIbgGm{&nn2kjb+w6+Q(%BDD9| zoR!d=7T27X)SMNU!u<~eKmOhW-T0+isH`~D7OW11Uj65^ihN&ph#`8Rs(gxc#5DNG zuI}zoU(O~dC?ATCmzV4o+gJx40!^_Vx`cpwUah&pngT5YnRa8T^zul@#w_DX-1NTC z_JwiPb{rEO&c4p-7!-H5tuyn{wTY(6WC9&p&Kl2>+*8FnLHy$uPO#a~+_#dc!V-nr z!s-G-KZn#-20iVVKTKpEE-X(FA!KSee0lk4t(2lBV8T`BAnd9djqT0tq9r zS{}Son&ht&j2%Z@G{;U2+Frrc0&264l}VDp2I>9Uxjov|P|<}>3N0(?^Dzr1ry*61 z3V8*_awUc?J(ey#&Po~fvKm!=k*sy4yeW%{DU*UJkBVut;ig5dm}L5RJ^fD$H$-*? z4mCfHnLTXtJEVRG`u^$>;_OgP7a~qX|CZv55Xw~6xafX+xf3GT7D6~409*^8U;g0~ zX^{NCS%8o`3bL3bJvEad9iPM&;^3?y7`P22Y%m_3oQim!TVmKK!1k!N0MHTEatP0` zpkz79s5#6^S=$v?arlAo)vYNEISV=Sp!#RieZ_&7fr~qS0=Td%BN?GfMHJ zNXgq$Q|!*1h`uaH7bEV{{A627R~pIg%39-e^7mr0(wr^^%J$D;;g#V}oOBLdigL+f zF1cb_uU@u#mvd#prCO1l^<2E24n_&k@{hi~{$F;bRk{P&=>tMO8A>j3S%1`#RuM^_ z)CvCNDBcjD*-ku>+DsY^Mw4+GWepmxxZyHD`Bv`Vs3R1BQl|a420k`i7fS|eOJ>?x zb*ZY(tmHgtos~RE^F!?24aly|JrptO?ixt7AIt{zAl17?Q*7p z&(PQr;9Y3%&1d`-Nf$b34u#1~4tfS60jLLaqDD&}46wOQvA#!S4go+F>t(RQvY~>_ z)t$S55J0rtNyUy-AL`=$+$+#JS@*~a*S1sEZ0g2q_sYd}5{LB*Vh9h4ottuJFqv}m zUEI?fVsDi{o?cbq6F$Fij5xn{%(1vWzHy+*dmqSo^_mLG6V3B9F@Hnif6w)LYMI>Y zMt*O5RGB{8D4b)QZ28Uy`uHxe`a)#WxX`Yg9TdW|0c`SJvb%Pm(xz~FDQjIrr>^q~ zi7W6B5F%>w;jO1#q%sKStwVM)C0p-dXOiDko}v*x^T_!KXnk75KQlI;5K&ZReVcm4 z%59~19BYH{Tp0{hOJjfjH`vMfpJ3;Z8;wm6{MzAhEg*3_>qFsDU}09E@{MCxMrY^= z>6_bef-_rx;6+4y{TH%0%9C8l<>;Re=qQ*`u#us?#AHAD_=SKB{LsCL60*9J@V|CP zU?N-Mh0f$#uL_^*8IvR*(_%|_cz8}ujx&^f@)6VEMnf)l5UW2H>i zym+T_eytJ<0RRUXv@|cV>@BhUk!C5rh)uDGZN7-q&m`AB4#S>I=deu^%z9_}wwN`F z=1|_Boy^bn*}f8P5h{J%%Gp=2)RnjOmfXQ}qAVRU%1Nb@tGcRu*-sPun@q*9ZdBX? z;ZeHvnl5viEo=KB@0Ck<%FJ-wUDR=hnR=_E_U%m7##=IXi=8`+i?B*hw|&gct(>ii zfiB7F;^0=P28`#OmaHf>=iyFb*Mzz|&0{DAk|nP$l3E@@tdGGdyt6KHw^H98DX}ZW zpHQSnNgm*e*_)mAiuSD(^GFtRc$I2u2G-M^&l>wA2ah5tE+AC_U`2G{;sjXGUDv3& za-?jfmE9M_Yzrc*zvmpDse{un1-N(dD-`Ia0tPB?vccV~&aYuT#g#C?v(J{+;KB~B zXkR_**ae28V=cO)lpWkXxBV>%7UQnbV#cL5&s$O*mbKljR~_s&9r9?U= zFX4qKI+Aj>;aIo|_U?FQl%KL`2x649P(oH#0RL?&`3Y?**|((0eE_>b-0URx$*^*R zKFV@Si7vG-{2QyR?Tn`N#gP=gxXAO*r(W zU%D%-gDb0hpyzxpYj}89fFksfgxNhM@KIIwb@((8`?Fl-gNq9QV+z0&_>DR6+l0vF z_?`+j@IwXG^^Klk?1@C;!yC3WG{dT5m~M}%YDZ84-YcDjNLiCg+Iea?xE8VblyN-w zLlzI-t+g7OMWJB;h=0m|oVtG>uR1uuU}gd3jeXGX3C0?EM<|OtTI<;Y{aWb`X0DTK z42n+c;i>Lo76@xO@N!^V?vClUi7b!fZ>b8T@Wpe*>))dW@9m3v z#vz3Fo_va5jt}MIi*t4+-m>5t4}^BZVN$p|YPmAulP94!7eqkQXa8v-G7hY6MG4XX zlai8N9nR6BqM=1f_DWKI&3WydU!r3#KdztGnXRhmnbDOqNRCmiP9hCJ=`0a|XF~Bl zA?!dU2}Z@T5aywIHpp;k<`kWu_)!{8t%9bI=ZGu3#)Rz2acpnV0L+|mM0)f5s0^U& z9Msp(-dX-O#!e4qk~p)PNeUV+HLWylP5&54k%v`aA~$d#kIKhzYvCU=)NyG}gQ0^| z1oA~r4TS!rKX9wyt8JK-YzZzNCofmvO`f%_l`ELH^JJc`TDDXq{~KKx8))$8{`%!N z#x6jY@j{Kdt^j?x2A8i)g`%Q;F!BW_6<(n>9}Sf$#@j)=-3HxBig#%^uJ2Q9Yt)zB zGtF3vd?#6SjtL}5IZO-l`aLU%^ zgoTCI=0vW+WOq+`aNZkmfJ6P}m8ILHvn^NO!OBCorRn3!Vv9n|eN8xhl@C#g`&{0} zg(ggYo3w+?iZT1dKhu~9JO$%tkzjBU6xq&zr9s5e&Fo=k@E>aBO$WZzImB-UI1%Sd z&wWkLfw(3m!VW z#NH7tDrqH_YmONmB}5#PAMuCItbFi85XYWj_loFF?pi!ZcWu2&>8Vewj{Q8p`c-q0ey@FmY-VkS zv@uR|mWd+7X%M60uuW|E+xWatpM=5jm`UUtlkrh?S3cAgnA5ezZkX_MV+d^O(>A|W zcS0kt_bCVZB(93jYU8H0av10?X7!aWC?r!$%C7q+taKFQ0(n>wLGe>gkAK#yfr{#Y zOfhrR)CrV97eW*Zx|lrZ!J@eZt3r|e{Nep)MTQHJZ5w^-rT@G|BgMUTe{s~g&(vSB zaot6qn#HiVevTO@3&a3QFfNC0m=mq_3p7MJxPJs4SRY&-(4-}zR25|}54Jc?*4D>4 zZV|V$=ms&^)K-FOr4G;KK+Ai)Nw*seXtlL?xOyh%=%)yxXBTI)XDcOr?axm8Pk&4{ zrp~2Xv0tkpSNC8HzW}oLN%Pxd^}9bguM@TV$3N~jBy}FTYP+3`)=l0U&k=%@+HJyl zHb^HU16Bk4-2GY(J)CB?*9$?N3gP?zl-`qgp0g`Y`TZG0BOqKITwlqej@L?@}k}PQ5>kEe@^m>zVes!wz%utxXv-5i$x6{a?c+}E*mgJFAp(QOTUIBv)K5&X}aX+*Nvca`92A7-16f9o=CKYf0Z*q_+$ z$!CW7_e&+ag2c6|MGY6>Kj!nH_*39NNPaPz zuQm0Bah-hqNm}UHXf!IDbD`!9H^YOZ*fQBbxZh9>=Ib{8b4%UmxxVLvXjQ`6J-jXcA=cXp8Ax zi|btrJ?#MDAr>Yuq$g5DvWLnU+7F#kzkBm! zQ-u@tWiYw-V0T)=4}49`4n`yjg2dGvgnlmEmjS$ECNsk4j3wKvQ+V76JT2&z-3U%k zahlp0*pYY0&*h88eZm{!_^A3uniMU6Wlu_rz7n5~Q#LiCO;6Aist4*OT&4r{<8)$~6pslA>ysRNmP{P7~-JCoH{iYFy946ayaO5RtxBAgW3IdZ`iPGg? za=AG2I!an)rQM>jq64t2XQYbzd**bw!G0ME;CVIs|GaCaWP z`b*CkZd2Hbg8{uB16vW6TGFF4{f)hGF`J_a{EdBw7hDN-qE#Nv&ftQwC$^p3SRX** z0y<;&2sMM3j?BquGSX>FC29mTcI>Q0b&BMTioX!X^nY>-9W4n&f;occcciRQmx_2P zgKDDW zo+h+4f85jAU)T;cMDnG;x~`NZp) z&kOYLGxUwV68E;Z#vzv*LdBILWak_63u4mUiV?j zQ|XP{Dh!Ubwa>S&FOJ^g1H1WpVB`3Zvzs^mfm09q=UQA~5PU(tQETg~VDstHi@M8k z244^E+rW3yd(@gsCHTRXLxPQhzJQ26x0tnijPU1=Yuhr&XpZc2?c<<3JJb`>m#~?H zUkk{AlmOPIji?{lBvD)YfiFJhE{xC(`^rfS>*@YZ9SdS8s3;~FV}eJ)ML^!v_#)5W zQ~d2a<1504K6I$H^~ORbI__}!_$v3HGY1=$icKYQcB#ARj$iYSQkO z*2<1=VIi}41=uHvpERfwN4cITE%2p!G?iBz&ZctynzAu`PN7%AY^-LlYDPF|2?c;k z&}C3y&at6mt|i^5qAk0PO-*PnYN&r;1t9OY807FnVRvW~D0%gj(YXrs@+0ZS^N&CH2QEwJm$m~>5RrTu~V@-`IQ4w15;WZN@EnYn9Z zi*v@N)0Hx&sTn;tXZKXI#&mOaoL{N?GwQENX`?!}N7pkvozlf4QWXJ;kvwsD48iu* zJw$%k3!Pqegg&98*8LAuQ=x&UH6~77v^3(YVehbS(&T>Kh zl4}spaT3Tjrd(_OXh^?1W-@7VQqou7C$~K7orKK9vF)bx-&9tKcXa6;OU=VLxbsgU z*rTY34Ek~-4Aggjksw$N!^6X+H%cfC9G{h_7iu^$MH4J0g3o}M4{L{W&tt9Na zEvHP;-V(t)!Tbml|ItFIOrowVn9X;(gh|YEZ3iClGa-9U4zX8k_Yo8vTfGvfJpNSW z_^7ugV&Sl#w42MA<~gam{5cxb`47@Flm%m3TZs-IbdH!c=S9;epU+gB(8 zaL2#fyD*}i*QM%96g%YhDXe+;0AAI>#?c`7V>~;M3&Jr{{r}(-z@I$qyWXC9Zj=g(h=>?|$L@M6&K$eQ?@?8g+x_KmeM&mkIkf2t> zR5rl3SA_9+Fz06Z`g(A{$Hc~D7!UxHp`q4ce zKi$B5DC&t++su_VtyD9um+mp3Vl$#()1hZmqh~Xuo;G6KOc^p=1j_(?A}W}3_a>2# z1oKrFE+4|8TDV4u%R5?xz6|-t3tbCeG2hcQtd))@ih1~9dXS88-3XO5-_uvrC?Z2= zdc~x%^HJN_m;4;@A#rff;#%k|yz>yC&Xh~B7Aa()4LRy9O-cQIRkA0-O3nUT0XFFf zj+6&MXbv%@iTaC6F*%t+!OZ3Oo*Y7?zk*j4;Yp;oKe6bXU)( z*HdLpObGiz^kQOnXL!}6pPiXc`)-@i6b?!4O1u;$HX`!=su2-}qzKrtJ0ZGxCtXH_ zhDw?{4PlYs$b_Qzoi6+J(^4g;-NkftU@|aTYHAISjM3A+&M=ZviEO(J5+Ne)YAyii zD;KUBRHfyu*}alXF!D3xR{QXFy6Fm9>at28g!59n_(;(%*x1tshCQ}=q;t(qx*FK^ zwM@IZI)jmInBB!u-!Tnxx?fzUx2v8^b1*N4gZov%d+t!v9xR>%5aQVyW!aPO+%o(@`&G}w_-q>~62 zXc7ey7=z_bi`<}cv}!q)zZ>)3fxf(3(8Goz435(wEnAh4mcK7ncs0FO$G=bG2deuy zK`pIoMSbldb6(Drj(&kmj>4b#I?i1l#EX*rq|pf695^-_hpj zpJ+BWTwngpr3_%VG(S_EI$fI1Y5UE5zOdh6jsuD%EuhI>(@&M#0abosD;dOAZoV-S z1ZW1FB0QzSRVr~8p5_s$mm=1mavyw=W11^nGKmi6=gk0gL#igBT_xxaS|5(CmdZx2 zRhPP?4ekk{l&NZ#ciBpc567yBTN`3uUSvdFBtcm$qcfJ!g&oflE_Z8Tof^r+XtAt{ zXy1Zp4@5ZOLOS7=Y1qIX`Kp2aDGK3^x*&0AXp|1-3168R$k#jwrA-%KX`O##^VwtY zeZ%3?mb#E58EMB2W|oWaQi6d(iAeUjtJR;ravs8<%J1D;o5}hJIPLnuD*C~k*UW*= z;9b@@T@et41Y{APF!hA@r-)O#nrXRoj}Fr&Bi4l$Qp`NU%@U&fFl9aCHX8vJJ0I!X z>|5wli#r2JdCIbSmuZkJG_mNf0mDD|yhC(;z3Li|=|_R%Ff#8cB)OU?tucj_<;P)r z8W?4DfI@kV!gLPOU2SG>{PwkyxkTuk9Zp4kIN;$sZ#f#hqRRfn9G9^bb&|o$cbz0y zj^Aoji-`SNh+rr}R{R+ND8Qr|Maq6Uo8e27ji!y%R)JCKtCxMIEI-F6JI6?H|12v= zkq*{K?*A52q~_rfX_~t86!JQwPRx7D=`EDUcIA#mWVWJK&$GdC7JXyCywAH}<4zyP z!`Z>%O)y!NT_pMp1jQ)+Hw$n$r63ph@S|zo-dJd)U`LDn*2il2D#~`!Czgd5%`cFp zbKtQRfT(LrXCa|A(p3=Wh5LC3m7lCV>v6dh;w?6IS(g}sfn-p`lQu*=9@oOYO=Rl3 zI(7m9A0ct!IFR% z;ZBR^)=!IiM|n0whr1yjF&f)!`>W0_&m;(+|1G!^O*ShbcfOXdDxTn@ur^h+^$3v0 z8v6O|#}2O;*DbxhZqK;Kmn~m^E3yC8PJ__9#lgnsEw}lu5K(G$WLFp8!I?Lnv#r1r zcxqgakJ`<|*?&;O|D>TR39kvzzrw>w>{$;oF@QapIgNPsd`Xy4J?eSZr^38Ks}I>* ztOr-JZX1LJNA_aUCnD9>eLv}u9-CSB!~r#iB8pN2J7Z9-aBzJ-4?gkYSC|yl2F8|f zgw}NZ)A{?KVl`EN{=vUMiL2$M zryn}&WfYuyIs-z=^lD~KPwihGuHY3wu(;g6V@X0UX6G*rO*S*t(<%PV$@0^uaI&6jqZ|6@u!CcS0rg=k!XQ znN4@r=7b}~UL|2|!dQNPMYK_Kz4zwlm#i)+PDN^yl7|%nCC%jFosu}bQ&Z#@izL^v zMN3o@<&@nR%9Csh6<{e8V9yp2gv#)S7Y5W9NW-hnMNs-i=%g{rkK>Cw6n;(9tFBV3 zu3~-t3hX&n4u0_r&S7giRZD56B|i>~vu;Ib1R_?JqF#FoFJ8j0t`Q1=;a9_A@CE0a z@CnNjwGs^y6pprKz+Han2d(Y>;5Hd^c|um#byb}uS&5LW3VDJy{$e3nZ~5_4>_Q85 zS=qqJ=ofv4qvjO3TWn3Pj~z=OVA_w!+85P7EJKD3OLYcZM2$PkMVQ<5`_-#-q1jGFCk$z zu`ltu1>o7r?s*&V-Uw+K_3zwX^lIGpJf|8S8Q>qH4R-23U7f^eWXx7%eGi1(?Nik_ zxFZcMt9XImj3IYq0TZ#U9`D!xkEW}PYHMwmrxaSC6n8D|6nANHrx4uT-JMcOad&rj z4GzWKJ!r7v?sj+2ckWty6pIs~$+ zcm3eE@A7nu1?F>hzxCBziS(njZC!b+_lUB0U!U0&%=L4|iL#2=8TYt3#z;?=;Nd_D z3e}P;o_?4q`1$Yi|Fh$z45tvCZNRVSe1Vyd4kdWdIzStLhW9=GC+NX9l6OU0zJ2GF z@UHm*mjZRohCWgd`(J&}=C>#kQi!$-G^`7Og4uHpGv?zFls>j{sglr%%D<&pkg z__C8X*b*(t2V7exlg#Eexe}nTx@MTVa$F;wH~q_~52-ND9D%s`V#&s0i#uZVw4r}2 z>GE0<yb1bPnFN)Q>suYyRQlWHF50V2fv~7%@|P4mWW@A4#QAorAHW^LH_UO=FC) z28&ih2#0iyV7(Ci1p>Q#MI`Hq%itn8U`}UY-jBgR9R1}|y5s}8_!7Q!;mS;62I&#> zNVs5+D9GyiBpGUZ2hj*?Qohs~z5Oc$+*d!h+6s1UfudEeE1EvHSOXW^J zeJ7Ja$GTB2C5$R|5X>D-6wcvD5%xkX7!Oi*%O~CUl{M1Ct_WDFN8*>@id9(9{E>P}X5S>{5i&{ed<&`V#J`lJZ&YM#{7O`)OGM}N zf#ZTsx6SwK@D`@wNk5tcU!>Ogt(4pZ#j6}bLIS#UXc=$-p`@ja(_$HdN4sryIz?D& zo>P`~Rv!5nKTqqCsnfd^Z$>RPGHYS!_STswhNUq)HO1j~5+Pq-wz5U7do>ruG7{lqr);c#gMYfwd_Z36 zL5Vd{<Wzp%Dvo^+!$=SaICSj)R7M&}l{ z7uuE;zMR8mw{9}KJ%Z-B&821@$STCy-Sy>ITkrPp@&1&;){jB3^WMYbM!0qjqXT6E z7{K)PSv~Xd_VHUUtA2j&J!U#y(@9@@ONbE!VA%e(^~~W~?nJxT?VY^j$^){)!`jro zprO8dQb-55+-20k_!gZ#!oHFK%HOuG%J8oM*5UU8w7Iu53Cw+T%E5z53w0+r#G^dC zxj}j+bZu_dUfh0tv>)!1LhXF@?5t4#AM1NUdwNhD^539+`GV^AX>c#>L*rWIq%E7l z6z3Luy`iGCy(MM6#Q}iO-%I?_tjs$r7D`aCzyiqFLA)AHw{`mj23D5gV<`@$})Af+uliA3*h$SC}vMeO&Cngyx#zU3k zr>B&q6`bJOhw(keEtEMMsu`*=-vo)D=l2cDLZLA=E;4T?)Ns1L26u&GI&!<#k zD^t|?%+fF}q0B>~c;YSUp@lz36jgFMB)aJ-Ke9ouOx|4l%dzHu7+2G-x3$RRVzR5d zCZa?@K*UMT+?i5&SBRWzpS1Z_iB@Vb_s$pl9szH=Krn~-70={CdpN?QZQ3k4H+Zk| z3cDs&@+Z2#79|YIA*^nR5si&Ze(C3wix-N}hm+WK0y%j%iqD>8gC|iNDfF?Ug8o;; z{`vC$6h&V`r9MHhWi zXiw|qqorXg^k#6Ao%T9#ZN9OHVjJ?j2`wKb%*^ln^fE4zn}-n+EKR{A7;!ZU;}}M< zjV&`cUbcO{rN%ESxwqNQo=IhP!OjyP;TG%R$d$qsRa@+v8Aew1kDLYEZm6a89EY*o9VZ$NKW^nS&@-ZYB|N04Qjmzll z4FU+_YwGsa&rkW{g?8k<8N(@@26kV?zfW|x0Yj?2k%=blVW=f3oA#36mLW^pWuG-u zVy08WT|7x5>s{MZd|aRz;W#!LzonVMlvv$w;kZ?a_MxzDUOXmS>em5G@Iqc}mD}ua z#X6!!$~6RfGeClJe%n_L+&q229rPmDeM1r^0d(Q9^&TfdZ@wcd6gM4TT2GTO+42b( z)Eo-r&Ny{#oN>;yms!_O*ju|e*&-c-1!j;Pa)@??|GRCyd~FA8CYfcw0h;IpM}YQ$ zL=$tQW4T+6m1E8N-j=sX+UtXJf1r@$hN-gS|0h2D{(04Q@PeYCa({4i@g0Zkz#UN$ zsoH$7c}Hnl02`z#44J?N1LvsA_VLMLV>cl!j67?Fs5*{AQ?K!!lk%Wr3$DWs1J!=d z6cT6X;WV4EUE##191)Gcyc*1~`hP&r1hUtG>J*gf1t#hyChAxwiv+_Kb_{uC&EbM3 zSkDK%5B02`&SO`&>{s{=NU1L2TFSD?SfhBQ>hst&&{ zidL^OR4*{tFQWhU4X_8T5wi!~EOmf>i5}ZJnV%lX=XLR^VES$m$&a0$(*4x*Y1dq^y+9(;Y#uBndFS8Q=9jpG|$T z&yUcrqy2HO=|9El?`i?-DaTItY!hF|SFe6DW35nF^Nbc+iDbDvL;LZxjR!Rf~S{ZNg{eZoAL0@qxTWqXr9%TYV8g`So5;;np zw9$b1N6`f_^mFk~h2K7j(Vca>2jz}qhCUK2Exvw-SrE{@S%HcvV1CwSX(MbBYot#d zU6UksfzRiLLwAO;=$F*JrBXZ|5fdzK_t@!^TDZ_jUe{y3fKsQGAY{$6Y9h9(C0 zaInlnO7lbnI)mPnk^DvWNyiX+>PUV51_6aQ)?O&^u2o7@VwF;?1<7E)!2quketFN~t@lwL_Ixqhi=vrA-qJ5|*3y}Kpfs)ED>;@3 zI1?HfE9Qj}3oF}xlNq+j9J6c*3BRn!Ncdd7Q8|a!v+$8Xwe-)s_8oVzVFe6KNz?a- z%NR^*nT{JH6xC~8Q>O1Lb2v3^hz6}~wJuN`g!FNJkqDG&W z4shCsmm84)3HcU(Bj+tQh}9t>qzw(I$Ii~w;q5kCaKC$^{&QD4`K;EfHXuaX@j`yb z6%3KTMP6MK@brG<+T&R5Xiuw~x#e5v?bOu&RSEdtD=X`2w?5Cj9n`)G4u@xfp%CH; zWSPE8b9z^r!4FisH_`kOR(v2$nXxV5o=_CiMZ0eEpR7q}YW#$xtP0ELI?D zsm%x2Q5Tr87V}gFH}m>F^19Wc`9#SIfsmGQ=i!VJOid*kc50BhbpB$zWb^%-xtpLt zUJ{UvLf&v@WE*wbuZ|>klpb!%$ktP(Y_+g8Zm205 z`<*&jQneajgqy#li*D4ACaN7HY+v(dyK@Krc!AZu9k}dwiTdI1zSeXSy+AN>8EKx$ zOD0u^n7@=abkZiF>qplYkOC|`E?T+%F`Y>`+&$Ptg26XXFP>G-bt#9X&hS z4hWHPa;7}Gfh6T+sjq(<#hwa~o!cTJxW!2|rHStL$kxu(dEDQ@d8F{fx6|am$WbyT zAkNlOAq|^`w}_9#U5w`OZG6~FoCE6u@yZnY|*!OLzAm8$D!E_7|5`*35+Edq+ zZS+2o&0op51Tv9hX`rVmhVmBrR)E9`$;IIY}q&Oiqd%!eb z18px^tp1~fyq!$8l)s4kcimp9p{k`M`KnxZt=Qnutj)t=)f=Zp5kE5#^#jhQLa1w~ z=OMe&2*pQiln7HUIV!FQDnJLJP=YWdP?0n=;*~O<0KLTudwXqEjTEhw6@3OWv`kJeArC3J>54^bhfW2g9f+A$C(*IHBGC} zDnP~P*uw4QI?%KZFzeP^A58F?p6~N(NuN!t8%ojbKaahn$7?>GtB|XR)5*QH{DF44 zATyLAJCY)|tdkmnUqPJ7$GZ9hn>}{8+tQGMg#Nxj+hDf;Jv;90e#<$O-8cSw^eOxp z(J2IK=AJ=8V@Gz}IJ*y;I66IIWt|M0G3+X}`JHRqRj9ZzIlHC2FkM-h$Hrj${;z$kX%FETz2;W` zV`pZPpX74d716YsPGn|fn!akm1&PZm_tIgAaAsb$G9Aq^?qbN30Eu~l5NzZqxv~1V zv4B?-XLi-;8D){G+DzSsaNmgVuMs~_&uMaD@zy6iZ_ zSu64qmes<3?;tuE{+-0fc)r*YONG2#feb@4e99YT>0{b>jkuC(Dv*g(VSlP@3T=v` z4Bbbc&r^{&Mw#WkJbDU{A3$gD$H*m5PgQ(}3h>6Vd5)9DFPlR2Eo0jG5Jyjmoq8>b z`uJU?%!lCEJ7r7s+Gs(~knJHEx=ewBe3}6CB~WNR9_DhE;^OmMx_H^;5YKBDDdih7ea6713S-C*$hazW8tK~cl{58Gm#y=`l&m3wXe?~6#Rx3Oc4q)>Jig- zlXNoKP^x~ub_J4xI3Z&)?PFoHyI*Z@bK#R3LbGUXUje1UEEGZ#204V@SOMXa6<=~& zzal{U?XB?fel+VlK2=<4jIeudfzCfq;DGhQAbv%64^bQIfLY|=@W>~#ugAzNvhXYc z^i>r$t>*O91@(ZVdfdJQaq-hF5iL7Gw*JPgWm?^`I8T9KFkkq`%DP2?fy~vO6yNWi zrJncY4y#8^?USMZ8tmI%d)i#1DV)8)AUY|Nvxs)_`=&{hEv^WAef;h05jlN>fRS5j zZP*{MZ*!g-U+f(SQ2(PYr{h&53Eof?N8obs7N69mieQiGPR^FZRTX|XCnck6_CTaYM7s_Djg_DVAD4@9GvV;{`$K~@fU=~Xq3im zkfvy2Q4(B}Vhf`8p~A{j<%nyfGG)AG_#>n7P0*y{99t$rk%3F>ypbhztWXjVH+ak= zwli2`jZ`QGh9%d)zlI@z4&2D!tJ&UV*wE#e(Pb(Ed&=&1m)$wQ=R(LA3ZGa8yE_7_ z3e477iNLtk$?L0O|8Ctihk4*;vN_jYI(4#;gNnut`a_vory)nuMvJPVb#s_Qs!p&3 zjA-TT;>_e>y;=l)UtHK*`pqrFS(MeG#nt^F+jfO!Mt?^MR;-NucsIeq@@Ez-AY})n zn)f9Orc;FjY5fs}y!%Kia%) zT*7BR5sp9cc0Pge6max};D1x;$e|O+7=E;nBsQK&&r}$xTbLE{6Td&Cj-TZ(%%==s zef&_WeII|b7rk(u4(kG=_>o1Fjx5A7cw05^OStwYaVpe>PiNm4&qQ&)77G5b7NOwj z$8|(v+5VF|I4>Sk7(p?IE@Em%c3(-28Nr|DPLbB_zt?s$lv~Ud6q~6n&3j36=q_g> zL8@{rhN*Q)!`eob#~zSxhSHqi{C?AwLRc0y2AmfX(K@nv2Wz_?NlkabiH26w+q<%* zdi0je@Pt%!?IW5)5?{?wet{r0br1sc8&qxlb#^05BCmQ@Q6# zXT(I+9^Q1`LBO$+O0VGGn1LDzGO9t>k4z0LG2_|^LTYdQGMgHg@%Pc1;npfE|gxiq)`LZ1hI-N1Owj%t>66)~I(@cbNY=#4~7p$FIPB zN1SjZ(6uj+Khvs^OMYh>w1-n_l2Ol!Z=r|EB_czbpTz0CgK8dYP z1e(%l+W`~Uf5T&5d$L@k%~T9_EQItsZ=g|I$l~vk7-pV!ab@y{5a*0x_KABM$nR4fQh&?MCt9g z3El&+g+Ri|9N#CT|2dT@Dm;@DF7-gzk}Xr|af5b@*26ptGsjC+cI#5R)RC2jQ7*5Z zG{AC%p5j?dxfPN2V2E@zcAQ9u3>@zkY}+g*E5i;>B@b5oNw?w^0Yf_m6Qv2q8V{pU z3ZGdt$aA8TlaTrkeH&9NP)aS_{F9wbV+A{-n+b|H`Cb~XrQ4LP0juB)qL`gsotN<7&LQY@%a(9M!0_lY6XR^EY_w z+@_v;7*4I!qo)rdKl_dy)mJKyvTEBtpZurER5oFQ|7xfkm)%B{*mce7?mhR0Z;E7i z(kt?vI$X16=3wQqvryH`_O@EWhHB7ef9W2`GErpM9zeV$D==tA^3*GklpDY^jTD?tHx*2zFcQKT6G1w>5a*6Q&%GWI_%P8pqLu4R3#jt$YRy zsCY?v=6{c6o75URmT(rL^A@(;w<_C2N z>MUFZOSJAqbFTC8w!QzGTy;798LH(5eV_$ zwc27*757YbYG9cvFGhILtLnz|)h(*@)ly}FYm=-Se_iULk9M#plWQkF_`SS504=zCu5Wx$mCZF#XNMt z9)vq6--;@hc!`_rIhD2;#y}i#S5+@|^8(?L5Jp;Hwj4j~&T&3)?p)aoO;&N`>e3XN z@W<^AIb*UlCl?+3S>T${1%*W^!hRdXd&7Fg(!S{!a=mNg6SY>|- z+P6~5u+fuf(!zGIRih5uNCnYWGUN+4q3OSsYainVnW>{KJf#w8Ll{KRH6Dy>uZOl% zm1sE4Kx>L$6`k;g?yKMxg1@+9e@DgtvRG%IYnU4n98N*Oo&HZJ>eI9E+3g3hvk!ej z+&`*=-E(tegCpfPJ)G&L9PrvChe??@vT%l)Mf=TA(_$rLm5^D^c_=8bqBB&)qzo`j z#Kz*c7vi#X#2mhU{OD3K7?1BPPSoD08;Q=+g!Tz7L4K6e}hm^ldzC=BhZkEKn= zS=xR|E4=2c3^Uoc*kH!?%ldup~}Rbv9)(cnix11tONGZnC7yV{Dh_s;P| z7{s(LU{~<{m?$6ILZ3~V#}vI;RwyJZBMV|$PtL(KZRsu&w*L{m$7)-=RbhoG zdy=mWI)9b8tQ(}TGX6N;q|@thUB_l?cf!-|e0g#f&!y$nw#KW!^UOkzVzy!nyyH3q zQiDakyX2N!v~HBTdKt3x-r;cp<`xH-0N~!b0S80YFFeAYC+RJGE@@G2pYx#e2XPvm zVRqUpFEbMj&(vX%&fD}(dRwASxfMZy!`mp`!*x$Tn~u`~J|FJ%sLKUlAvkI4t6s2H zm>n_`FP?q+2xzqMAD+Z&Fvw}PjZ-eUK=E!LFV8zk?%KZbuTAchL@ zinl>kxfuWbFUHuVOBg`TK@MJJUg~j2Sl}$)qPtm^A)N)xq}7@9tBErQgN##orh9L< ziN0$rHDaz40u*Afoz6w)Q_|zV>hkN%*-Dd-kl9Mps@jT*{w!9ht0_NME_PJsFJQx5LSEWg5(G zwY)2PI!XK{CSJDj8TSZ{I8=+8xMo(a;Ssb1R$Fh|8uvB+EU@M!u~k}`Hnn4Gd2!?s zafG|gv&_s5dfU;5QNdL`E^F+c8oN{{amWZ+VY68!63@SDD8HgtXO&6el1X81Fko}X zW2tAch-R*;8d%f#C6Y20%AV;~VQ>WgWj~8OT*Lp9&4if*fW}goCgpplg7dvnf$ver z{^=G!xE0?y(tOxx7u7El({E7JZ&%cBU81**n$6)>$vKjGTC_o1OuFl>n5MVYsr_`L z1>1NCy9S0QEP3Kl4m`_YjIU_XPn3Dqpg~O@!AYh^Q!hqUFUC%;Kua!0!z}?`QA~vK zMf}$3XW91IBPbQELW**Q5|uyzN zTHGm^g%Wj&NK9J~W@!u0II1AlJe;DDI(#vc8QRhlvJi;AjwY?`#mrKwpPS$>TJ|Gk z>L*5(mwYWCIqxRrUsK1}`bxF%#KdRf89a&B%|V2DnL6yC4%8_Zks;9%)bEIeuT^<=TJ zmm#5Y)C_cilf{_bThs2D@qJ;l{7M(YQscDb=PGD5AGV2iri(l5mQ{D{xlgOp|kQ6it3Hqahn`gK5d$6C+)K#JSRIk?2c`S8i ztYv2G0mGs77z2D7dAjJh`ai`&bQ`icqsp7b#oDwE(6gS>?Q6o5h2dts&pr&cr)v@$ z9=GX-73?c~j@pNya1@1{Ke!^6sd*0Ok-ReuN;4OLMXh!9p&oaaI1I8h7of*r80Ob*-C7| z7Tx}r%RM{KL`5W3_wLX6O#-hX|R9i71Kio92eb8?Sq8t2Vn0-~~U-S4&GHe7b zY##&Ei8}7-4Sn3FuDSit!4gq3P;O)M^TX5Ah2HDWx+Bo_CcE=s(k#Lko1*Tvtpe;!4G^_u$idT%?_2_=xYBlq3XS&iKc8c0}K{kjI9 z1XTy#1aznjVLzg6)sa*yv~4|aASOL%`2NA&c`XjQQ~aN)@T$79|I*UrlkXHekpWt< zpl&)$g_fG7#`$YhCW7x?y2p|fvbbA2wug^>wd0Ne_WZ9Am(>kCxXK2g^IOgR$Ia&z zQa6dun#$0-k2f9i zYshIDMEgcYmcbQEXpMXQi>V|=Mz-4<1HrHT;WXKcsq$qrzEq;_NsaIpUTr z3!Se=uN$k)6YHj{492E^|7r-5OAGl3`9vV{Y^{z|{_&4G-nZJ>h5mGn?tI1W>aRb> zKK(Y0W-YWcEG$ZGjx^lev1p5F)34$P&znb$EXYY85^h$8btpjEklvptn2wT3AW^gQ zV}iVGHb;RfV-3dee-|hr;X@Z{)P&?+W3M z2Z`ZUHhuxNp6e#Tw=vVmY&rXqX1UtLbOpIn*el@s#&Bgd`^&%wPVzV%Z4Ew$1-iA>)& zLb;wQ^TRQbdCkz=S{NOvw~6RLw^Vz$iJPHxVzzv7HZNUZc`^J&t)WFUPA;LjsDV|k zM^k2P4Px!Ur3X*+@CPHp&+m0(x#C35y@`1+sw8WAZPjj)(+D2ccI)e(GRL-ClE_mXk96*hc0?6X1L)Q~Mr7gEvv&NEa15h2;27H`XGO zyzZ9LrO@&KLO@&0NF~S?ll=$v=chNn6~3I|z#}4)e)Lb3{PWBp zV{vwNapX!He(X$G2ym`p2cR_>lPs<-WQ>NQJwGwM_Fe4fEs{jfn|DCde7_#-Kt(cx!kOMpu&wFifXT}pPi|gX9EoQuE zO!Q>EeZ!M4CQ3`pd*#@`%_#AAj)QRv0)>w&{`=ixuJQX&hzUi1fuEv-SNB2VrCKP& zXIBmRPu9wpX^u^;gf`JQhnRPHTTxixsKeM}y$pv(`^Mv*B{2GW=yuS(`pS(!Ja`SN zx(p7Ub(^nnv$?RNwZ&=ctFTDH-XfqVq_lG=1Lqw*YdApajsV7{hXZz7gWh!ej1)X( z&V1l%4Jv9|T{bc~{63cf(9AwLJBQW{U|-D|_kJ37m=+LIdK(OgXh0F_+-9q55JuQ) z-v+ei_K=YqPnX;C;{C@p=zPnDv88F!P7R~$dp)Outlfb~#TOZ)9ijTX|1}!ib8UW| z_dQ781qI!10W7)DDphM0^ELzIeUc1qbP64*q-A=y*R0_&5k(^4{qmFox}{9YteW^c z=kYJX2oX$-jm2fL5wCD9G}*OH-}F1}Fxm-p&@K3kTpv>-M@`g3%H=9se6yN$b}qJ1 z8=9m^{iDP&Q)Vq%Wtpom6RJXQ(5Ce}UU%$Aa{yMFKe&f#o{FJd;bV=UjfqSDFhqmi zuIQbIfVJV$a#(w399}?d2or5yMnt&zA@0;X^W0LGvm3^TcL*{*h^ma5oaMZYzpkyL zk{9vu^hY?m3g-qNzTwaZSYki!jHWFov(~d#+L_3HHjrKK&hJQR&eYtkHyItS^I#0w z3826%q6m&_)Mwfz)uwsd^zHsqk=9-D(V^sguXZ&n>i8wS)ZGNoID5mUO8Hc1ad|FVNPn*4A(03`dhf>Uo=jyN5U_YeGigAr{7w z;3qDqmvB``L)+@C zG=xJ1&biV2R@jtV9_$RNlTR(bJiXvdKpvRkg&^i+`GAH@ut*5+u4&Kevd2h>c*?uv7G9@G4aL~ChKbzb&uxi)>*{|i?uRo~Mna=*eu ze8H@yEz{WEA`+0}O#c>bybcaeeJmR%n9m^QOef~dO1F7D+0MM}fVx6x|Lbd5N7c1R z>n|EZI^l9`hR{HL1+q>#r|%6eDTQo1Hd-sx0kGM2q{mrMr8ldTS}Px$nKu!&NdLMF z{-QI18TuQG!t=dNzfdEchNY&cW#ddXK~8}e?qgxt;pt0S+z6liI8$>=$L7-$%)&XI z*CW%~G0)P9Q|-&<&xUr8>UyjCs^f(#q;Ghhl%C+Ry!@o5ttHIJC8}>u1b{5&h^kNf z#CZ*7p^Y74e|JOU6V~J6Se&Hf6)ezOYkBTP<6^fpl-s>{0tkaui2`k~L$g>XLtnS{ z`LRvATV)5nvjq!!oCHkzxZ9-sZvCNQdX`aE2A(mspS0A@?Q09~{qw~(9hlg-6bjMW z!oO~>ve?(lYqm?VjQH5|2Yq~mZ{>E~V}U|%{o?!~awg15kb7d$-EVL?GVXd6q}r&% zU`Jx4CuCqd7HD)xIM6CnxJGQ0y3){UE}j?~|L&{a`f2b;%Q=9cIzZcVW7NNg z0>s!hkI(2HpOGuQ3frKKK0jZrNpSuJ&B0CtH=-GD0Cb%O*!Ajl9S*1DwoX!aTfFcU zZrQ;^aZhHaFt&5>W^@F%-;=hHw1TZo&N&xD+96W zg%|%?7Eclvm-d=_Q%5tj|2c;57Vh@s!%1b;nfpmo$73Y8mC0D(?V#8DZ_Whf=Ahhz z*&JnhMOw(8Z;ew0mOa^tEQ_RO>P7mw5`E!cduj{POk}vi5^aw}1V$mA$s{Kxw)IK( zF~rym8KcP@;kSd;F6>4&cE(NZF*T7?R4!wqw~`LH#%(8{8qV3@H}+ho16N0KxJwyF zW@eV(GfLhxQa>!=vQ@L@_e>R;u6;5pl;{>!!@$sylXc}_TY&t~S^v>qgy&_(L2$sH z9{Nol>m{A`Ew>t+ec{EPEaTnTmiE?wM{5^wrATkclG;~da;qQ`j=)8lz!Y8R%VYf} z1mAC2W7#(%rb|C@Tb%dIQP@+VHO1dMF`{gjj%8h%`ft7SU*+}B5cfx!)<<5>teHU{ zb}SIWxQBVG0rPeVMkEj>k?f63NSA(z&|8x?NbzvfS`3r)VfpK+{w6KobMBQqsSu;D zij<}Z6dV*7C<|eSALH7Rw`jR~mF6+zq|CS}iAcBUo}`ixjV0k6cl_hsL_w<=!YL1w z8rO;xI6*O*m{JBNtk-hQG}}Ao33K%$bQX3cxjYrYjdzysYU@X_P|jM6e->!d&y<*2 z53T+&TsDs=DIhD1Uirg*5jRsp%aq%YlfL}RdzhVPJ7s#1rITzXT{x8|#94;!K8{DZ zqcYpMB>pMT`(p2cHuZD9aZd2l5Mk`txoEKnyxj*jN<2F9JI*{< zpaM+fJw^6dg+5uHYncZ2PK$h#f{=PW5{JIJ%dRWaDgk(;6sNLRuHu}sz zP=&vvibt=r{dgvaM|KxiA9TvigNB4DkkNy~>yM-jL5S{|(Q?|Bf+=uw##nRF={nN3 z9&eWl8rp{GsRbF6&XO^IkZnoHf6gsb^q*oL`SObXZi}$g^+Tx>o?nDci;0QJx_%RB?H?M`Z;uH51|H)+AEkR6?g0=?ecL8<-}|_wa74I%`Er-J zy5+UjdIAid{}q@nj_o@We(yy%pMY7LAftP(?cozva8K2l-G0`+7h9$jLe_o2JBF8B zY2Tl+6B3Ovzq7@&gfrNetv21tJpqI*LqaruqnH@qENUyaPkq73t8GsXf%C~eo0ngS~d6# ztYA02D`~l&Z~p)gy855J#(-$q&lCSEFiVv(O||4uqj0HBK5qY`3O;>*jY+!Nt+wC8 z=+4|nHMI`t&C1x?CM^Nq`|=Jx!{cWJdaZ%BC0+xEt@yw>qay+{1{*(P$G$)h&r2zX z)<=Lkt3f^Y6ps8jNDv`G_g!{OmN>|`n%v&$etkw3j|+Vjx0h=!btso$)~h+2J(Atm z5$Fvw5!>;!apx7hJ(udF#ac!fcn#v=B9v>vjZR8BOx=s`Q0 z_n?m>ak9*={ZxVUCRe7EFd;a#vmU(z zRL8k;4ZbDf{mthlf0Q_?o5BYVE`hF_tADiOe99y6J&ca~r`E^QrG7hu<4Yn7C3aiV zY7Vt(Zl$Z;xM~Z>pkMHQ$m|T%EJtBPZ1hBdBDzZYfvvh6y5qBg9%TSj!lw_zjc>oC zj|6bX!8tOV4=j;wSYJ4(VQlSBdqE=G8XxGCNav%`0e`qo$B^>El zO89x!BCcO6sn0B-{|UJCvOB+IcS>egEuuKp2<;mBd4@et&B5h?BxY9Ae)@jGSk=e2 z@v)dC02Q-RfNUjmN0UWMXhW2IUlC7xF%oL6Gt zkTOOirhq_*<+3h2h*(3|)t#5;^EA!GXkjHy)(VWlBm2LYjeNy1w#s^ z0=AMtRsM+!(VU%Sv3hBCx1xApUU=<28KQXIAg&};4Sl4j4u91Z?KZM0h*ej3&Kiru zX>N8@CC+Y)dOcNP$Q=QT4NG}K4OI6{WKNqSVJ3lnbpD$VNG78qwEKh%N*{X`_3;b* zRj8IwsK2?w|7QV60qrsT3u*d4q)2|G@c@VI?jZ{a4y7dHObBj5%50aUW)%$EE@wrg z*P^LP0x6MGR+Y!Zrz_>^nxX@p;O5S(n>8gArkJsM%Ri;rWF__(j)}G;=iW+kh}S=3 zzcVYu)lD~X_aHu;CTtYr+p1cxtv>e$d*N7n5?J-m>DZ1K7F zvi(=JL@6kskpTEG1FN32S@RcnzT^ocT+lm*OCG&OU3+jw|Gg=X1myV0FWInLP)=*& zAJ#1-^t=GmXF}FX0*YUhRpHO?Lm}@Stk#{MbDMlLR|JE#>>Lg;z(8?`+6q(E32>AK zYU+@g75*xYxY*|Gyyh&t!~pz-G(D&F9mlB*O&3A0_e_pI&oy>#vQ%{Z03Ta8SUG?4 zQy;Rv$}9p57B67o2VTgK|4P&MZssVZS7(*ls-|PDyrrj9fMsqiqK}sWEK{#-52E{8 zPj}xl1xQ~;x^`I`i`*u@$G8K#JYgNsdH#lLHRwFO)vd1<5IdVEdrfV6mg_sNN^A;x z1rAYuWKm__om0@8ocL#8o9h-B3#`z03{3J6btFe zB8{vgL0N4AM(&$Gr{HivbtLxTb^u=WD6YetoY49n;cog_1>JXu{3qlw@#`c!iSdo; z?6GsTWR+^UEnsrB&~}_=_N@x`yX9Cw>9@|b?lBm$9UcH+@3hCWLj0)b=o^#3N#ilS~ff@yCHpB z=aH;vNlHW(7^7okO~4M64v?-W1m*Q+D^6Fb7#=G#FBjc}F_Tc=XS6r8BB<{T<0Tawn}AXwZ)(aUCv%RCzW73T&nJVa#r{~u zZcVp0r;x0gb>hJe&gdRjzx3mmCU)QSQn+z;7#w^drdi+gGFW+)wdottlOP%3LhDLl z1q>Ek>I>A!e1AfAgrkKI-o+U9jqlDB@rDcNkQBUNxt1mQkI}SCgn5$SoaV8+nn$yu zhEbW6HwlM-Xq4R=6^eGHGEOE@P9~A-4`VU!BH&)YUfsh8+{0vez|@lY?^^n4YG&n3 zQe>aViCB#0FC|OKozjr_`Sw*#=`Q=8R$zvYo!bS`;GX5LCs`$Prj|m3W?5Hw`OG{zP_^rw_ zhjF7Z+5;UrDH(icH8V^AIXt4LynUAw%yaiSjxcb+!y{4Bu)~m2Ad<2tW)CKbc8-#j z6=(8FQQI7wE-#N^sz^ym(vxwshI}_e5bZ69OV$;&bmg(&X;4jY`4M?pc0}@8MiA{0Sfc8e+Vn4F1ME=|2R?DDi7O$6mDHDxrf2dePKU!gI0q{U zgY;JohsRI03l^N6=OKUb?d2+PaSYV<{AAiK~XO@|(|%4+%%@yHZQ=J~iBd4Caqu8z;Z z)X(#K&k`x}uFVnC;$jN8md(h(DK{!%Q#bJ)p9XVT%D#4lrW{W=HQ6J+FIlTzWClqa}BKhG4= zzH99S6$yN|viUR+`lT@y7JC@3y!rolI?JfG)25AYDYUq|7I)X;rMSDhI|K<1#ogVD zyGw9)x1zzVxI^(byU*@>&V7=6$jQls*3NaURHh+@SCD*$`Z^PKXEiONjRUz~GC8{O@r!`wM5+RjO!5G~ZKzJO< zPRrygWp4%5suqsPQKXzdQk-8Ax9ab7EKy;VVVCdQ98-U#91(&*LrnkEsV(TZ)yW#C zoFW#D*rS&hC4Q~f~6y3@3(m9Pa(S`xG{c? zJR+CQK{J{GxzremNpe7dz@0LY^!k@_CIm4xcqj@vh&wIRFu%kA{&E09dWwetvI51G~p2iuxE z*QtftER7rw;d(~Gq;H640#eiqK89Ptg&U=F^|K{x>aIb0wSSu&y)OQPr@c4sEDndQ z50<`$p|xKKK97}?me1IKrnyP})R=H@>aAa1J!RbRfofXr z!v1UQ4SfeZ*U~+XIgcj~M-Sh`>r6|W^B;me1)Y4H`v=!iDv7+}Zsn9#?Tb|TWUZc2 zle538Ha)0R&CQn{6=|)DRn#YP1!FgfNTn*r=&yt*tpsSTNaoi23#t+Ml=Ds;Ys+Tv z%C36K9`njx)5+G;P1IXIVR9liakDK_8ntOmWho6_3xBR*zh`U{%s=$PYZu;8-iWfD6&=Cm^BuJZ{L3!;=|XR0bO|t_lKyB zA1Hn#@UgPZM0Z~z=zp$e5p?;qvjCsf&`sXwFCv*r) z%j7C)RCIVK776Q=p#n+N?IiiU^!&85d#A6k%lNGJjK-4ZQ&V_0^wCLa3U2QB zjycQ-d^TDQY~@)k*q-JfpO0y&_nNnQZBKzWmlp@bUdd9{MtNb@tfhL(I!Q(O= z>!0R%Ib-R(V^kG1cr}GR>e4wyVPJotqK}~syxeAhnCB4}Ie?PCUK=IVZy_gu#5%2Rx5kfMaIo1oruMf&QN$bxz=`-;Wl( zCpEyDv2M}1#=zO#s|8by!&`BSPs9Gs-J-(IVi#Ztq83nTKyn73EdxsX_v#4<%$4T{ zxu-hQKVO@MUpo)|o_7`>YcN1E?-v7S%v}$gKU!XkPM+jq8`^7`JQ3C)^@9n*#!X07 zBvWOKNr?9nhoIlc>8ap2#>Gl~Rh>}nK&w$qW;Jcs3E{2~@6exWlPs@)5m(T5Sx4u^ zZNwViItNH^9(+u7il{mXXm8Y{P8e15nFNM@OM|V3X?YTyG6t6K?P?|5H zE)`pd*jY#z*qGpJ#;6W?%&#k(-$JqkBnJjw^~!bIC_E4DU(*{M$={!0hhqR)G8lwR z3U%H5qd6v7*{w#4)Sul2z>y}ki5`g=qvu>hyxO?49Bk!w#`4T2W{TrOlH6+rPR+JO z9Rw3b!%2Pe7YO&Rc`d82EtgVj^uaw%eSFNA{#kT=j&!-sg%Q1FQG2pjBf-3J2x?!3 z+57|5{ZSb8kqe=i#Qqw-{wpiuub3o%LfSw_xSg+dz_Yec-^LF0L_g_ z(Ko|-*`GohKe<(Y@{Q}PHd{R9OtJD7-M{LtNJT|Ip%T)eqB5Z35(*0&qWZq| z{(*#!Eu5Gy(B!b+py7Li;7Nnv@`50r5g^A%^ieE+i$um#7%KSN(Sj(pGKq$`jW|&P z*z?$#zI0@wgr7ZfwSzDt!pV|pr1(hzCx}Lz@-XbS(RRPLp#k1_K5xf>^s@gM2f6>_0eH45_%VI5 z;=Llf-99PWwH9_buTFPfWh~!J!SfJW*PSC=e)6rHM8aCLu*nTgY*RGO9cG`(%~TvPwe#a>z1k4L)fGM^@$gC<$2B}aCq=ICGl@z z;dsLU3sfA=4SBtLdUWV$X@aO67tfaL%kf8Njd-WABr-@4sLQXjCHbwg#g47BSlVuo zrEOq#{{jLGoKR2Hv_VX=Klt-=c`1n&>l~pv5@HqAjod?j;9-sP!MqBXw<-0$J-Hb2{Lx& z@tJmhDtxW!rpA8W-u1e=^nlbnFKPfAXC8>8>wDX7@P07{vAzet=}riCc6HMNNg{O| ztoXS6PLo@aaZVLDMWUqCFx%;kp5Y-B`-GvJzlohxBlG{Gd*~zyEV1K1Juj76>e8zY?InH4| z*AZ-kpkuoS$3yMS5S!Wm1vBiN%-lE0k+VlBuqPOzy@PTPsvVfVc6ScCzJJ_Z8{RAX zOv^o`V&9lpfS=c4lTZ(&$2!9<=k!@9k6xhnvPyEBqf;YK9h;HVnU%&rvMkSUC<~}Q zaB9nxIkILfQc;#JDGXw=f?H=CylqY~wynrF&6kE-{^qnhXS>rRAli!FVMvxi+bjKKi4DRMH#Wdz7RPVj zQ<;12cM#9ju@+lc)F)=c(em{-o!;Wq&u2nPADS3We{WSd-3n;1(}!3vA2SxzA-o^N zrj6&t^(URH?gASs#(7@JY> zG7wrP|A<>0TFVf_-u{@e|7y30jI!dGQ@h({dNI)dJWsHZ4X$%`ntq=DEC_jjA89xF zueFh~Jh3&e-sWa+3V_JE5WF4&4_zf(a2Z@fp!<_aHu+{XLZ384Pv59TWOBAw4!b8Y z?K>Ho33^D$>m9vtIXv*UrPx2NNC2Z}2@+~-kTKwynbw}9%V79B;KX=fd!YWevExx% zFC{hCGpWiAiDri9^w4jr=M+#@T1v}#_HMOJ1aljpYd-o)i<|U+oWwg7e=^7|TVKm- z>FZ=wEZ;ijl7LEd+G5_EA%zjxd1AM;p z_1IKwBMGrMJ#O4^b(BQbUJqyDJqPG z)k3QZ(nt02oW-#ae6-bVJ0X3T<&4wA*UD&=dsgJsVgS?hws!h(llgGd!PeF!f4fYg z?PPR4ui(gBSa@)+J=LAHcw3R?S|;8s7kiaPEywccQ(Cy2iaD^PZG}jwmQQoInlv|X zDwWVC2atEWt4+EU@6np#Rk6mNtkJ`(1{tJzZHYthR{gU`OAkF|24%tKuhQC+KIbN1 zJrwKQv{j_HC2}%s7AgcHQW&U`-zw${ny;2@PDbO&$Tgxx5KX0?NymxerN;CC;@aUE zNzRE_N+T6>aYkJ)I9_9XmyARYL%?w-ra&d8LB*#*#iT*S{hi!mWaKL<{t4}dKWMpB zai^ePGA!oHn-(;)NbVIsMb=21Bbf+!7;GdN*$WKXv@sk?Bq`08EMd|#VbZWKq;ZP9 zxv0G;LPA2&e$4)F-$b8+<8e{N)J4(70C-6h`-V>a)VeS^yR-R?S8g56Z@DE zt!n%#-7QxdR3ne9D&*{nY8!xxfNY?MQrH{3VaXYUzJ5{Txe{ZgSfWmt%Mi`j!5WRA z7_&9w;K7gYu=?Iwo%foJyspoj-R`*x@=~g_jAyX1%+gT)N}K215}uIfDb0X{sdY?S z|4Y%3zQm;^B}EJ7xRoh`k*)p&Azae;o4YOIwi0WQm?#D|o{Z>(44Fw{SeOjesTkP@ zw7Q^SDvSrZ)V)(ml}7A3J}SFd*^{rLAZl+`aMreUn|Xuiy3(P%OAlv%uHq ze^T5aibWRx7GzMxHuB#(pL@{!(?jNw_lE4DFL`GBovxsR`OW$hJ*2kT88>HhBUs6* zNx1=Zr@pRBxr8w7b*eAC%8W$S#2;^dInx(kJ;7>D5Ne@o{Z%Vm0mwPX0cd-Pr|Iww zysrB>Z@={&J!08E5T&Lr5t8IyZEvMzqcAl;#IAsaOq|~XAY{(sCQ-w^D!BThp`||5 zWM2Tm;XcjatEr(mlGHSAbQ^$zif^)5>^K@Z;}&7Fv_%in@oK}VmEpeM0INdb!p|Li;qlh}agovihQHorqSoO}JqKQ6t=o&eOpArykH_ATQwU=h1(+kENlZ(c<9H*)56lUm`mHcqDsAFwLl;vE<#> zy**!*8B3zj+V-&ZIR0*YcA7C}Pyg%n29w}`_IGwksaML*loVa#uBx@IDxI7vEz$z5 zmzC;oOFI>Eo5TWpyS&b(4`+!x&Ep#2V~V2R6oa>tGAtuwtfTa}ifSgmxL6h$%~nf| zy9^@x=LXl5*eiBlZKs!)8x$OGJyUko_)2VKvMQOK8|wyUhtQ|)%#asPPno7`1-Sd3 z8k3g_d?xNr(zvYfE|gd{=7$Qug|E+zt|^i8B?b~sAv$xcOwZP0TNr$-&Vh<)g3F={ ze5Ao>vBhYKgZEB?9E7arfir*I9$FlpR0Q2INZzt8{Q)Gsbv(M#qJa-dPkN%|d)7%I z%YYoK(OMSa-B)4k7dCF}9NJ&6a3Lm4!}UecCR*uXMO^4|_Ndocs2S`cma;eT__97u zEXkv!nB9n!&thMsw)@`AF8Fg-$L2+SMqu+qr&bJYdkmfA(edIbdiJuMlc34y7p97T^pM0YNxmLaN>7Rv|p zujqcXZ-Q@sJl(e$Vcij+hy%6+KQHMBU*7l3k0XR{MURpHNc(}RUuHZKCcUkv%e!)Q zgjr<%b84)Bye6m`OvXEhUFeMg=2Co)$~ReQNYCFvN|LdtMOh)!7p}@a zekbCCz6Dp}Q*-zdUKJ*`@6X1@*y{-W2)b2T8i$|4>%wxODaCJ0t3zH#dXA7KI411k znbFzv2>0^Yr@0%(^=&L2J(jLUjqARz9w!66i{bxvSRvapL!gP}0Q~sq?qKTHDxe;U zl;*X_bD}#`rni^p8Zw+BMXWvSz7TUY!#4E&CaAr|F8xpc;Q#!v6`VJ(?F6p%BA;c~ zo=Y0+g#;&`Q{e1Zsp=Y|owzzCI*-zrQ{@G}+5&6BHvHic zE8GJgAEDM``Rj!<%<`tB1r8M@HHot&wNWvS| zt1bEZ^7C<>8X zy`evsf@7HvN*jCP9*G3oV(LN6Rz`0W(2wYNzolwxe)Q=GpHqH$xE4R&|NbMDS((Jo z)b|4o)E+bp9b8HUtOhh%o+3Iru4J5Ogff{J6P)M{dGGLA?qA_qe}y9&7{Cc`2)cWC zZc)Oz!$AouT&rJVqUJ2JA`s_DLX(Je6jIQVjfP1Uf1yp>Npi!aGE>eUU*P!=TFu}PCZGotj0O72ifftS#vBQfgeNUiP=m)75p!^IDtnEtF_@ZsA*3W(SU zN+j*aPIf>N1R{*aR1wsYpLK+z+{Lm?$*|lw&i_>^0clPGL8;<_$dlsKoHl1k6N`zQ zy3)!D*t9-crm>hxTzWF=vIrU5;!f5#VUp3k8l;0NJFy^xzns*d>)>iU?zmEuK&=Bs zW@v)44L?!La)OV|nV`%e{b!j^O#Sf(HYaT<>G`-g z-O0=-s``4Jkx2*2nwIdFh))qG1T()^Es5r4Ss(qoiU8(O6_vTCMzz|kE6gmpyeoX2 z!-@~@Pzi8cf+C#kumb+?+ za%f?}HrZUNYh@KzDapyWhg)bvqFY;6b*pTRT$@rW=gmEEzywVXo;9?*c0v|t4W2mz zo*C?ATxB*}TV6Q_&lDopj!DATNN_;i;$T4>5HsZBV}YjU{`OnTt$Ec2JgXc=`Chzq zstqyMyl1t%G7X+G)7e+~=>pncgfzgu7Z8Ib$ow%jNIe9*Dr#y4H&e*WaaMdfBKn*Y zLBK`=k@1{esA2qI3p;cj0<1ARZL&?599Ri*D_oWm9ah^#Jud=?wW-!m{%slWweOn& zPONkKe(hkl#7?Ss+h^^l6g)?*ois}^WMgE>R|7x}yYo$npGy!*=EM7sUbL5Zv*mTC zNOF*ns^>D=+P**N|A={qf~_o081G76-@UQlDw1qv_nWjrwvu$8-QU}qnDo5Q3& zLC^%H)DbN5aN0SwwFggj1lze`WCD^4CdGiM7A#D%wXB>YFTywto!V4w_;@F_hSEy| z%6bsR^XC3H;&3=f%2Ov4SynGR^M9Pw5Boi`xpD4tbQchGIpKAMq}EP8`JagUXNrH2 zi0qN8_*^o%LCE=NRGG@Afi)894HvD24v*2{j=^-vE4!r@)^nn$uo2`Dk9Iz~#-cFS z*C7diL#n0@v#H#~`uso)#*lVsfEC$fjsyd*j$m~zF@09Ykx3^I+M zNz#gvlp}>7Bq^0UI(@EgFMEfn|MHXi@`g_9+x7Ox-D`K3c59b(>kx7tT|%l;hnE`c zivmcLy1sS5Nl^$f1s;RM7CIPa>_`0HwTm(Y$#bT_ZHSwc0 zb)uKsWYZdDCKeE9)3n6YRq>5JNP7#wKpTAMH4uhHMJQ|T@$a1xVwlSQie?Cc?Mnd25HmK39*B(x^m z?~d?@6gk}AYzhI=LDFfzhK#a|KdWzB(gjf7>zVWqisxqiLgtlMnOcf9#^>b2o4 zMXn-Ju0rO&5P}ms1WgV$bl&dN!)AFU@MB5ELdg>1aSG{7(Z1Kz53VqPn$bx{Baf(Bnl@lcR)K=L@qspCG?XR(j{ zB*&3|4<5XDJW|=~RZ9?ZyMcKx0Bu=3y2ykiBwvATxGSrqH8wvU^e{|;vT=Dt)D?iV zthR60oSm3fZ8X(3MXK|%t!?qvt^%%2oE%H4c~x{JRpntZW8S><&PSD=3Kn->yf#i& zHIqehuQ|wfUY@^NZ>^m0Y-vmji;}`)@Xgy!(ogKnJ!%6duTX5|kZakwhu*F^s0ku9 zn>Fh2xN0x#o!Tt6Y&S<%y3pD^2r2;4fp;Dg^z63NF?Aes<1asAj?UGoT;*hsGqng$ zO-(9OvyT8V7C2wib@~LmM~?b9N*X?D4mW9r+VGrD_7}?aEu;JA>4)TPkT@4GKg$Uc za(Fo}6OI5(aH;R|2!DMBsFv(V7Hnyf4=Pg+YBTq0Uqn}JL^gP$OcB5^Wk54!LJmx| zcIVf5=@kb=!>ZNTaASkE4G)#OvBXnLP-V0V+yKq`z-PEZXoSLG*uqZ;6rT_VLfldD z_N3DK61RjERMDA}-nvF!DIq}k$gA1N>;4EOJfJB)D-3B{qIQrm{fLUgq_sD8 z`_Qwj-$)GB;#T7eaX61DG*UDlh`ZdqJlizbpIZm3zTjNOT#``;q_uSL^lb)Xq|uR+ zF=u2=d2=*Oa#Xv_v@A-kdwxE?11@Bqsn*!gYL!#F)klD@*x-l8%QEI>+I|+fmPhA@ zkmb*tT;1M?qC!Ldt(7n;D{GDWP4f>B-e92xW&xsHpAL3NEJMJ|@)AWiBiWH0DJiSN zW#aG-7OIq@DetJmm`7#>)vgawO@pTz4q6jUSMdi?{M?4ySvqt{}z?f zN5Oe>4Bi+*vIE-q=^+Y1yWwjqz6=Qyj@V)fUA`6Y=@P(lj-7u|Mo)r-lgL@s%}!~f zOG+-)f3mDwD-R|X3}5RMB2|>CLuOxh53VRLN5{AsFbjXnU%@6|Bq8+3g9c6D0v7`MrX86Uo z5V_OYOB|dMzuzP3&f6G!}Fcgys>dY^DW_U{htQf zdBWTy&(*B;yhEeb1e7IKaW7AT5evN1zwDB%GRl;>6|2fh>3D6%W_~5* z*U*X>sQjp=LeaA$=5-a!&Vb@QfuH%cKd+HGE$k!MFGm?=HJ*N2Y1Ulg|A@j^i3qIc zoQ*ZIPJ>v3+-n^0Z0Pn{gL~{(4_uZ;R(hEZL(QjRC$i2j4A)n79BqO-?_i>25-a79 z>p52YWeq+j3TPL5u4xi3Gzf0Q8kq-mKH?!`AAZ%>8>+7ha5ecbzKWTWj23fnn!Dc+RT$@}%$ z6+PzowT|lvu(&fURzZTJ?I*uxO2|R0S(U(+a2Uw79$4@04?=@th4+Uo5*CdUZW)tP ztra#7`#hQlCDjX6*9(P43YFIj)l299rRcMCIyZb7Gg~+bTR3Jq1!}rzh;F$kaj6Is zf(R*!cp2=sYFLqKMRY8z?(z##xiVsHZ5vAD{{9K z?gq&H)P=lo20^%)REpRY7n{YZroyyAa%#_Xzldy9U8*3vT*o8U#;VQe_|(gewTnA! za;{5unoq?5UfVAtM}wU5!vaeh+{<={goJA=0*&>~dxE?7?X>oH5O1IqH)f?gKhG)y z&$elFGliN8eZ?xB{NizeTmy|GY}%z7#p36x!87tDZYFzs`&K7@N6+oOtv$km$Fxa3 z1RbxEN<6ztd<88w{n}bHiw(#7es+651pwazh3#R?QMU6m$@Rl@=j)&a7!t(%sg0hK zg%rVW1yiN3CIeM>gD+O#hnLqEw+B4UdX^Sjv)@P4tc|wMt_-au&z0H)-|4#pQge0c zh1Tca=>Oce=03gknw=~?Ci=Zoo`BeW-z@>{w>l9z2;U>Q#1G~1viTtMS->iy0v$d> zORLZ#t&e;kZL(aaZt6U8{A|(=HVLR7W#%c|RsmUd7?Awua)xct5G1ImSbcaCM$0H4ak64G-vfg0~2)X?z)8+>(KZ*6hnbp*Gyw72)~yVsFD zYHhu3qul?quKF#irKk!c^@KR}1c947mdF0Q6#(98>mIz@C)eSkpG=&`JP93HioNWz z$;xU*yUu*3wf|itJ1-V2F4NSOquul=T3jx%ID<=$GdlzR_E@>?*Wm2}cAFB;oSsHl zbr-DOceLzivEKxdza1D%OY7p|5739!=+cgr**Dh)L~>J-^O%~cKCk2u_cgMN_8#*O z>r^a95iGkQW}T<=2(dW>I)(?Yh#^7F)|`Ae#1)w^Il$u+_YJRUBBuN?M<`q^e~Mq$}y@<4HdWunp^ zaAs^P{b!X!uV&txmER*K1)Pz;id|ATr6x4Q*i?#*yJUN9{!2L-`Hhr&UJy8nc~7RkF5C%q$`*-RDo^Mm?W2rX>}EsZr|`i%y&mnMmHL@jS5 zKqUTiCBgo_B>?3Gn%U!r0VB^u^qMB&n7VJ9OQ>k(1>Hf`x%JoFPi+-(BJZ_577 z?-4a$D23zD=%C|wNWSY!@+Px-a8RTw5vT}TNg^kcdNfiluqABt+P1|s-J+yzDj3h= z@?10n_`Li3OCyH?IBq7Xgs%8$^hCvMbh%4iS3z*_g#jq&y`TMhar{Vxpv;s_ooJQQ zNj|U%K_$Jx`YUi&>-O*s#k$B*?UQqIR5s7H{POoKNFIx(vPP`31g@5{H>!YE>2B2T3b{Bo+1NJQBJi5jd&k}MxCac?_wA$yg08> zf~sES|EqbJV~2PIGj<-0W%n9LQxrmI1nq|}4JEgM+$2i?f_9xwOV_Fe>(8aTC$^scZHbn0pdLIPqerd=&&dn}qAEGzp6>K_zD+sJcw5 znK+KVA(w&(Z)s)tJ>o={r=JJU%16f{ zM&FuRve~oP9a;>%C-opO%A||j#r)SMiKSb?r`qF}eO}qQm->OsyyD0DT?QC}v+is- zDB!0Cc;0cIet4AdeeX#)J2^FId^_u&&5wR7`PyjcIxTkcP7{cL4UvcJzddvK)wSp~ zviza2AI?#yJXwnT zTsv2K?Lg{(&o1xb4hDOoszhBI>QS3lwb0A443M=sk=>&{-!>6s_7U@+Ku*Kxtp)#9LnVVl$>f#HG0Quh0(8vjHacxm-eF$;+F<)7gjaUIBAyoOE*cPJh%6XPS zcbnnlc_RJzlQvI5Wg@hV%=0AjcNuejdmXNx3Ts=jvS)@2t}T;!OHtbFA{*5zefpwR z+J%*Ap2GNXZOmC2DdK$pDT6GawrynefLDE&i|YpYzEf`s`QfV&@7BxZkA^^jN^^3F zA*6fm6xJF>L+vbc6VJ5ZZGH2nwzQ)YV?beO)2MGVPRPm%?r?U=|VL1V#_!g^{(T#QG2tk_{d^eSh+ZoPLncwH555#=@0q_75)thK$;^e z@d=fvfPz$oV;Mz> zq!~h$LCNBn$$Yq|$HY@J1ruiNL48o9oW-{17W&}~XZ5y?eTV|94L2_RA7KwmVylfS zQMhlV(6mmZf0ar6<=@4I=`S6CMW^cYRk;jWNXUWzl^+#~A2o>>wil`#WK_s)ro_G` zxvP%TWHXt>u&7wCD)VSfq-GPX%FLz2uBR|5N_4jy&4J9NxS=be{*70PmNh6C2IDt% z?^-{K5DAR`hizzSva2h&egkYdLr19I*&4WLpFjoRvM?Ntp1*4v7k8COq0k z9qa;ObED$D!BX4664YV;oU=P4{8hd(Ymx%xZjn~sz=SDIYZo0$UQn66L6I~_)@%t~ zO>bQF6~gr2oxM&E+5y&Z_g9U~n;F2~Z_G^DxnDaSw_LygpZx)IzQaGuLmPS7*@4co zp@+E0Q{Ay@qumWHKG;oI3JLeE^^lqq8-zXlG3Hr87u*6FICR4SrOG2S9NK19*`8~! z51z$D7iFuY$XZO;t)*`YnoPO(4zvyGf#uKM?$t(}&sX>!kRVvnKaNEhI3NUtiUb^R zMS?`G24#)bOclvogSolO?7;B?S13se!1C~q%r4=3yM4%eW$poUbRyWQq~$1W=oiQ$N^cVwi7uo5uN(e2M(ydBtfdn)mF1hP6tAtp`$6TGuF(T+Qtv?}>t4 z?8CD&ln9-}Np8T&f4=8JXl{1T-a}`Bd^C<=C)eGc$0KrX13~s~KViA|FJ_$|G2Kv< zz?`B|Izs!50;-(ApVjlqHC8|Knlpx0>9iNr8q4U97F2&$RQzo3ipqIX_B;XKE~Mty zFpF(!ifgER)nnYh6+OL_bhG@>quZDQXk@0Ev4CVr^z$15-qb{5INVj#}1nI zwKa`i9g~Hg$Pn7s7;fkew6G1X-u~4Pc!p?6f24jmla?ziRvwkH@YnJD$KUQal79XP zv&L8^l;04sL+4TmME2?7F8Tx{l|4{N_N2U%g8o2b0Y-a8sY6lYD=FBt#BJ-Nf(rji z*x{Fo!VU|=gpF{-Alw#HEaiqz=JsbJd3o))dbs&c2KVKQu=o#Ef7N0#MZ754eaLPJ zHZ1gXcr8bY@-Uvgyes!{@+-us0S)3vI=1YeBcKtrQOTm&KhGgs7eyjFWx~gKUlbL| za74l}^QCSSiiICzR%giY`(&&T=?mDkDcdw zzBBQifqzds-sU*}vKd~k9Wso`sgHx2drb&K7lA|DqY*Hr=`^Ex-77Vv6G7%H!tn^J^ z4{b2Rcme5`<*_vlGb5D{U+BVsMi5>9B0B%ye`J;CA|<7m z$rzp(uj8QeF*g48GWsTlG5CvdFL^2PsXA?>5Yku&W7)r)5Tb9IUh^Ibz^LsnG;_}j z7Jlb`{P3zObcWH1Sf#*j1~xqV4O{SzsHjCcJ&1v{`GPUgUT$%O*nqSO{ z%Us{A)@bI})a?ad4W_dFwr~4_cMoz-5U7DCloG>0WMqXEK7JF6cf#Ebn4wn$L@x{5 zi|l%<=6a+0+B%c@YU#}D+1IA-!WPC8 z$hzJ~!8Qj~H=pO2)Xm3_c@;YO%H5LbzQOg?o0?!j@4c6?!NEI$)EJ3V9H#qN=H*oZ zqji_QgX(D48(R8yAT}bjR!miUw+djy`@+O!kr8|eFk?K1R#*GqsS%B>))pU2;CtU>=c3P9 zwG}uT7%?7W1#AlR=E!k$__}-W5|Ei`L&yZt>K;~_r%nj|)h}L9E_K)19C-+N2sOOl zuG3{w1KC4A9=<w#+PJrxH$57x_IdFIOy_ABu9f(>5o@;sat0xKVntIgdI8R z!=U%#MRN6VL5#6EgSGergxcp89jdm74p`%4CMrxMyIa!6AxkyS& zPQg*YWHy_j1gRkxG~rQ{9$EfTp8mcr`P_v5>p)6(B%@#Ie7z47CpMuSkZHBbR=w(y zR7F9`l9aYfDhO8EG+-cF<1aP?zr7FWm>-;=UiSWY%3R*x4-YSqbpM6-2LJVqj`Bku zok)VQ>a^7(MNkpoxruSLJk zR4v~{$rjd;Tx4(aa|!ajeA8mmjl`Rm z($?0@){RXbZZlrlsXqg8Bo=j$tK3et^v(^KYBvn)d02A5hWvo;jk>Qa+F7^^|38Z+ z(LrM`l%f2mC38$d1dgjyHJCI}&>E5${b49XqRft@q{Az`4+R0!SMz71g+JXo zT}F)D0+EdZ))~K=9)hYXeb+R{4me{7B*`8`^a_7```3#I5e2C2a{JysX zyaM5X6zW0J7uZe7PbAW-B;%`xbIngh;8&u-DlfHba-1bM-3@-nZ5JHSL83F)B=#b( zvhrd@YptoF!^C96eGHrut+h*g!-pelt2r}?J2Rd3eh{^0;qmN7d0q+mg@(qnY`)@) z;lZ<0G@qN{+v!~IY$3z*v^N+~hffak(fiZtlkpp)-vI<(`13k=Hk#P;O8QY|dZ~)} zfO&uIuxtIW4q1YCWYu|-klb5>HT_Bt^i*fOttMitH8wW~BJ3{H0blvuKC z)Yko~;w*VNJiB9bZhUT{I|!_<`qQRdbW?XQw3zNwW(D4CdHQclL-7)`ypqIUD0-DB zx3vO-K~~n7H+_hq6_9@DQti3DbDPD^sbgy7t^lY*KyYj4H|lfmhv5UC7~uWN`i7aw zWY1WHe`_!!mBmtemX?LFd181vBUP$fI;&nGb0tsB^Braa}uJ=ySTFh)JIC8sheHY}*(lhb=DK=A`zaAYsh0kyI) z+bi(-o1Rv(PvWk3A>;2;g#7>w z|0W4-@WS75`EWlty+%TU;@1HU(eH#_UOvW;1uBLF6~IP*VPg#*;C7Il8lxaP!+P7! zb1#RA9}KBr{i{q!iACcx_2>U1X$IB-zHOh6T`o+ys0~{Ryx++zO|$rJr(~BQm>I!kVF^Ns~(J2Ym@20uY??x!3wwi zjxjoNMo>i5j&(gfJdG{Q&+3wxdno~doBms-n7IZH`NJ3Jf+3`Xhll0boH{Sh!QQgO z@0pR`DH!i|(cJ32t(!F^z2 zIn8}19XwkSxwjg;x`CvM?sC_WSfkSq9<){!`e9&_n=^rKmA|vYou`y>0ylt{=aKQn zUI1f5@Es8Xf%!9NXYuctm;AN=NCjZ?O~~#~C>Dsse7(N;0+I{9ztQa(XoG!YU+OAi z{Fu9S!EG>w`x@c15WNm!7D90T9=rX>=O=UZRG;)(W2ncFhE9P(!zOLp_%=7@@f zzdH_Z|Hso;Mzz&%Pu~_Rw79#wyF+nzic4`1CAb%NcP|db-JwWucc-|!`+J_}fA4$N zZ=IDdS^1Eh$=)-w_hA0OZbBE}Q2Md3vzO~0KQK>A)G))dT*R}W;P5Nw?{#OE5;phh z2G1(;sJ(vk8OVWGAFz{dI(7MAHB|~fZFc^QGyvL);32@8)Ss(yZc+CWXj)0y^ku2AW!F)-R< zwy=Hv$jx~(8MIdKm4;?%q z$pia`j;X|^(o)k3{?xQWLqqcp3%{nK8&4U;5$+*-fk(QPLZu*8CKaJeAWMSDQw~PK zA`(+~`Z&cJ7AV=5hk!)QqOAD!r||TDXxSuCNKskEsf$`BzK=0cF$fVFN>C61(<*L5 z7k3DM7S#M_)kLdPGEJ@6+<%K&li65>+2=7w|S!;lI(UL0|) z#=u|l?HW33RdM-3AdYIDa<~JQ72Y7AhkfL9oWW|Xvq)feFr^3?2sm)MR(tFEJjBDkr zX;o}WtxkW5R7vo!N}k&azmAaKFh)(+@yOn9(X2%z$e-EPxw-u*IwiPXLVVt5LON+8 zSO)P{uh&>Ow??cK8#1tHXItx*C9Dl6^Ck-CU3D>mZGP_eL98 z)A)p4=HON1TGPZQZev63+=@$g6Oni`uJU4(T)Xc6+ljtpg}d}rtN4nT3`9-q%>>Hn zJ6#I;Jg~5JH?6-))JX%nXL?6*(0$B{f9)uX_YEs~-3J1!96S$SYML8rYwk@PY)r-< zL|4ag4zeE!w_M(2=HCMA|LggBrp9QJ19-EXh!skFpssn+VE9r_z}9MMZsdVKGl*xQ z|5<=z?DE{1{e}3J<6VWjH>Dp}uVO~em+^n2C{=%Y6Usa6@b(+6G6#}rg&M{#CIO4Y z3Wdd!6$6yx%kGZLH)#n*J{ENF!e@1V+i55cO z^oWSSEaWgpdgbFetHOVb}TH2~Y3W{gctOGeGf8nVbG_pLXPZ6814ew|DBDrsqXN-{d4Z$EgzL1=06(Rx%;xEQjQ>I_q1rG16wahY*S z((-hjwV%A8dSazTYQ#{F9V&a01G8{d9Sv4Ox-(SC<1IU@caG4RKzF{LV+Il z5Iz}5fuX|s5EQtHjiq={rrBpdua|w3JsoxR@j%kQ_OZjE5#Jwi?4VY;b>g%{S5KXp#w!}Tt@z1rGE}@@-e2!jR^75i-XFs zD{FAgg~C@bY``pZ$4f8?E+TvE@dI84U+K)4+Ej91GFfnm8UpaA?g^zI$G@AU7&f(9(s+PmN_^U9%NBTK#4;7)s5VX57y zm`$cD(~k{-fi4^Khm9kvHyz>L{eE1KZfBV8f0>Nm>x{bmTU3Ys+OlFazmO~?Ib5&)TTA`i&Xl%hXlG3-^4RW8lLp&t zrBQQ!bl5m-(JkYsb5qUa%8;=kHa(OFmlPa}JQA?{8uIp!tASq2g{$Timv?Pr)7m%Y z_|>}-8L3%7;P1=dPseYlA#GBruE?yZciQYHb@dGcC&6il&g?VC&+_(!EH*rkfU|yq zqKcS*v6hE*N&jRq>tu0tKd2LA2M!MHU<(iS(1*j!* zyC^GH7X51We_0g`U*A`|dlO7*;Z@(?RgQg49*yKcaI7m~WG?uoCQ?=u8GdD3TZ=9; z`iYv4JT-KbgsfIw+>ADK>=Om4zARYhKQg6g#;O#31<)uNIMV9vk)f8nxu{^#o^OLm zU{f&f?_VrEYODoTRD=b+8ojGPRiY{n5742qd>`Q?&Tl`e7r8zS>uHcuhQ==O@=570D z?XjFa>AJCR*B^=-sE`nnSvoSh6M2IwEHg5O(Fr&;m}apQXP<2~%BNG7l+2tM52wHM z2%5wp(0Reo`Vg^Eydflt7>N(`C8Wkm%HPoY12zL`|BG9dzo+EABbt6GT_2gl(3HZ^ zNWc1_{Q9GY8c895@Xd>j6uxSx%&JgESh3g#);TEpp0;qO4@)_#P{i=rFF9N>yw*lW z&O^yqm20TAl{t`l}GbkJlV`xTCA$uhUu`6TaV!Og(6lm2F`2NmwgRZ@dUQ+iuplJ z$nt>klU$BJ2Vz$zD%Bw`RpE528Mcx$eY9q`a^&4LCM&1_o~T?gluKw@ePxGK03+Xa z$|uvm7GL6;8#zxgsrfE-QDQsIH+pLZzX*!YPQlCb`Si=3zsT)AxM(qEsrN&M?YO8MxDc zV4$I)-{=Hx-OE-wB{Jh-R^wrWkSu@PFdAbjIkFc)Dus8>=i!6|7abN)7YSU52#{=Z zeBICfJRWqP{n)DJhjE}M0j>+`iz`x6exwk@`)$I?0Z$@gTOPd$En6i9JECcJA*uaA z2Er>|KGQlUq_TrEVhM(1(nH)|RcbxorHYH2fyMPD6@DTrgiwqPH=LSN3ojpJ)L`O^ zz!VC*H{2=gvl@QoWq4-xj3(ZQC9o2s!>wrvx79S*`5Je*gt(^8wm564i4E{DE9~1R z<4WM__CJ?TY!>`BnZzI?zNKEU$KdNBZKE0#S3q1yog?T=Hqb+Qj9(7HJP%McMl($k zXXY=l=dA-r7>KzwejKb@xw}o>u}jG6pbwE+)ggSZZ(eI@H|cfiZ9PnGh|s;U;4aVB zNnPhLxAaIeuZau~R;05|r>!a}$~%GLG~1m`Nt#wR7!H{hm6iKk@|&ipr7^y8Pp37# z%(8^3poAsu=EX8TB436Efx43>@?q;c8p21JA!G`{iJ1D;|EM|!NDm=W@$v`ujk2Jr z_Jqkrk}#2`SBL)i7!UvtA4MTRmONMjO_sj}j~LNEAsqPkmvWD2?>afU3YLlAh4>s8H~-<+a2SjN-xq z#VOEGGenI&kkTF{Oj8o$lT(yLHDI+VB{-a$@>A2kTj@ubOHI7YvnAL>(9F(!k&l^X zCzTT5jn=CRv{sntZwd1rVJzlG`r-;2KhNgv^69a3a0Gd8&AtrgK8pO`a|8V*N>Fg= z72AI;LPvbB_E?`1?8%KfAVR<-CUh5}@uf|*h?*J&d2EVy?JLE?Oo93gPpkCIAR1Xq zG}j>)*&)@KDk0et0^{^I9n-QLiBqK@U?{CZDx6EYfn!h;7(hGfpeGW3Q(j%ReJ^i* zO(Se-lbm-QpFG9WUg9%xzwS|6MH*FI;J(k_YV>gn3hp+;3rV(0wzeYBd5i0NRdrZ- zLf>3IVYHAK_Wf|~Ts6S-jtj91aC(*kJnr`xwM))S#A^aV-aC8iL#F{5D+AOFO)iQ| zphaG;8h5v$`LMJKbb1>pbB#MjhI74|b|7AD#SR^OyPl)78f_g3JQP`z2JOJUBi~lj ztV#VhqsXfC)Jc7haIy2pp5tdjqWdbncTMajx{kwZ-rTmYh1{=D%=cYB?IfTsBnSS| zwkNOO8q8_4`rdwW>aFzWAxI4Jhsh)!c0ZkUpyW-ZFuE>qp&~;P*p~>-&_g zM#CuYuK{IBC`})M%NLg-qM0(n>qPUK!k~}Q;II4Fs0#b+k#(6$sRn^_yvGbk|I90S zOboD?hp5GM(fx;;BnAH|kvl!czwiI(OShiG>JkDK@){S@2$xMHur+`9h7@rc=DtR> zHmu!>@tJ6c-3eJ~ik&4`oJ?w3aPYg7aKP!>7uR~$*{RX*p6IU?&NmISWT2;?%{B4s z!E7G*!zh3wX;H7gx`er5jdyl9vpvK;C{-c|dQ4h)d5Tm+s_ux;GH7gP|bm0PO(T?86R;)xr_C7D2&<`B1PA7axx; zE^F|Kw#A6TObR6jRYng?Q8QE%C?&N;Oc3e&gXV*u5wL<39R(-2%82S@4qJ;RErd`R z_FG@#w1P30uVk=B)a6s6^Xc$Rio8DR_oBf8qZ6+7)oM+HvfZEPdD-T#rC4VVY8tb^ zE3QLhe=+x8VdqyC;!@~J!^_C|>qDFWeDU8H*nDRCm~(IR04<4vl^_l_Cz627?d)ox z;3xEZZv0sHLjRLt|M6j-+W-DdC2+tDB_&Xe)E!!~@Pdf~YvV%P-6qQtk|og{44IlYm;izuI;VCr>sk{jzInI}l~)AQ`j2`*=O zyl3bVN36}8xTgpRYF*8CC&4kB^FvD=_}gpf{kq(e$L#wH6WPD-hWAQA%;&rufvy}j0(bXkM)cKw2gAa35@hisJJz6#Xh#QC8;!Be2cDDWQzSi?eR_vu3}D;BUlVl6 zfJ%AhmtTmHXSAOxOf6JnRVwz%R$Tg`@7LWt{XZ{&7(0;zy~gAM`{>vG{{&=pd~vB~ zon*@Es(=YA$zI>n@xU)TuzUGxF9susXm-Pu3@}YeS#y!Mv#d;)7){s123V354AD2< zSWWaMz2(tzQ&A&Jsdz??Ab-MJf)GB=fs8VoyLnb3kfU?`#On|(axpB?m;F^-rfNJU z7F>B8MTN{v4@ku(!s`&_$N+Xpj6#W0r80h{HrHx3*x0*a<1Qs)C4a;-THcjFf4#=l zd18K75O~hHn9dfPn@z^t2701VA=6Y90d#cfeTnmpDq03oMh=ugFq9a3n5wY}az-LV zlx7l%Nm#1-I`U#>v6mNc0fzbWv=!xQBOIYn(ZH%B@wH)O!WgqT3m|n|k z(*vL+q0jnWXp7){NWl(4FA49*8B1Z;=L&8FMJKgdVTJFGn%>sL&J9@CWNrsz%IiyM z!7(?-8G>_pOvGya@;oA+BC!zAg<|p4q}_g?z4=T%JV^ZACYDha7nlk=G~G=~NLP{8 zGDX{X3cMOy`P%7@9cllS!!P%eq6k}6dHt(|J~idHioRm(YatFl`;YmTh;n2!Tq%7g zc(U}Zw9JPj+?P;?xh)ud$*Nf^(#{U-kM6|MvWygLv;lupO+WUSz<&akG6^J49zcuc zZ(Sfq{nhOv>Ad|+!9x~a->x@&Y-4!<)H@y7t#=-LaQwJg_#$;Rf#!~3xTjyHwJ~4W ziD385arL#$K{gpl3FurC@&u{pJdHvgE-UN84nEJLkEaPztLr{Hi(5MvW{LOM;Va~I z0Z?_ys|cTf%S(Zv;L0nu=h}#l*frtNM>y#`hP|4w0PLz0c5951-5h}$<^$22RFc38J3hq&dxtz-WV-!3y1(6zTJE4Fg8FP zB;b|T%s|2klsbt zw5)#kcHQQtE8URZ$~UIjE)FzFu~Fz@8Nj#1<$Q(s+oM>S31sBswby;ymo+x_y3Kwc z9iz9w&#Jdpt-{ggy$aXu%^?FB?wpqN z4=!FkTEy{Jc3dQSl@S^7S9U$=oxjEb<;`0F_{L@r*b3l_2<`CfxOJCv*~@88HP0AX zrJFjfo4R07T`pwixc76rhLOpPj|jG2K(5|vqioZD&ARh^?xIw)H$glqe}W$LjOC8S zy!nPu5cn@T35(PYCb;=o43QB7DMV%Ve$Q|2<-ONDv-~d;5W02C$nt(%(cfO;P3K zD+tMDI0Z-N(zZSipvWcO+{)q}5SdoXiTX;xdE1eB=%gQ5SLT=11XuQ3w`P49lW;q)nyWT}wJXpf!Kr=3su zGbXl7@^y6r6MhE0myOXg9f(XwE-gX=TYCqo$N6du1F%d=Q8-HDyn-EnC%+pn{1{5! z4Cf3;n`8exVu8hBvA}?9KZSQbi4W3dU+qL|iaF8eSc?#Xp06RG^^)H@EQzo6cVZ z+i%HfND@OYEXjII0Bw&F7^1i+aq}0=ySzmt9~2H&e%BJ+kVJdr3LgC_Z@n!vnYHA{ zpxGmTMl!ObssY9*-;2p*%of*YgV^SV5BaMU;6h2W!{N}!vZ?U&NxLAE<7SOwg--b> z|ClV=EO3R}{)37gt`?mXQXc9&h~IC?c$Uj&DDKk_x0S~R|0xo}%#!}6nnyGb4L(ek zgn`cQ&!nZ-OYa5zmjPxTy!XF2A4Rv}!=$MMo8o^5gIb>?txl5?beE;So8sBO7`x%8 z{%Nb`*qWvKc5VVue<@4BIHKM>4YAFO1}M^)wn*$*0p~E0@EA%rO#g zgowE7HNx$FR0n$fHsQT*R@ZGq<`)LkxdRDXh84$al^vR#HKG*9~B}S}pAdgS8 zRDT87pRwwBKsNVLU+uhj;(R|D+{f;wU+@)r|MsR21b%ykcmN5sT8l4_fJUXZ3L?%} z;%%sPHa6Q{^nW{8R$C)7@MQu?)rY(%Z{0Oi17x-5V+te4@S$+)4wyX#8m+3TXUf2> zJ0Rz$Dq@BCtZB~OWmT~}4R_^2z(vJIw8`?j{ZVXPoLzaZ2hpibA_@u4&NwU0|VBf*@W0&BtND)it}r zA6b##6$BhOu41U--c8IV(f_eQCa%W!(XuW}gaRvs0_(zmUA(utALANc*@G=K4pf;) z;>V`xa`M0N$vwx0kNdHDP>_du?%cQ{O)b#o7I!36&TH`Lq+8lp|ElOrZVa~O!z(+m zEGfwE%shKSpcqT~((sM^ywXH{`Y&#h!0K?O>S(*_Rw+p8c`~vibcM8jTh)mU=IKyn zevf)-dbFlk)3LgtXX*^Lze9giN=hp_nw1!zB?qU4r{nMF_pO`RzTC}t!GJV{0GPEj z%!=;t{vT0$C$LeM(U|!b%%{ssjQIVYjZC&DdVGuA{5;h>JhedE+hG!K7$djd)oO7+ z+@E~tHx>cMrNDL54~KQfq;jZqkfB#t=^7{-7Z|_Hg&@okud6EK;sej?4%xxRRMXK` zR5*oOPRBpMY#_nnoLX0w5VM0XOj_DWq)t$Yla|$HpeNEDCN!BEsup|OJGQltdN zY2ip3i}1+6Oi^I>B_w7@ixx?(O7{1op<>EOTXF!s)x%@R-(&Q?XV(wVaKY$AcnVrt z9Gie>E#8kxguCxv?#uH*$OzgSU-4muCVrh#6(v*2#EUTgMlo>-YSav|E|b=bQf^3g zoQEEUZWbnCbWe#Tjepp(k-#h(!)*OOz1nLxR9ur8S`iGIeR{VfWsEbnPRw=O)#H9% z8Mm99Mf~Q6rANhFT|v_)9&Bo|p^?%MW)ifVpVI#SV4w^c6=_uLpw>EE@YOtb>^)Ei zO7x+jrG2$jC(Bi#?JLGq)|wJ`96(_t4A{ZqM!`rL$KSwNf9ONO%TY3SU`J$B_282{ z1Q8Tf)TU&&3YiL$e+iR1j2lF~y-{14QwS;v$_w^Du%;U-V<4}pO&rY=*kVrzlMW}P z<4qpT)3aVVI!uzmF~qR|nMD^iz+h>Zr_IT;c5sX@*86wH2|ZEuiUhd&;-%5>xvUzJ-c^dh6YLrk>78czNcjRqM63d2Wi#@KtZMGjt_o z>rP_z&DO!@0;36Fm;ov`DPjfCqXB_?0i#K{tIRb?qb1rUEt~87(Z(v_&?=>K*`EH{ zvF}vQ;TfoNu$#E@6V7fLe${i}?x7c{n$|};K!(GJ%!~B(gRq%PoKks+Gw{nYTa7U=D`YQQP z<@xF5qk;BuTvPVdJd^g{PG3L%T{fn*5ASw9e`f-q+Iq*cM#jey0)U*u(}b}@%qB(P zQ-MAY<>C5A`%C7f&yT^)zPsbbI6pTty9oJ9y(al_ zsfGIVXx~@*-C@&R~8Xe6-m;-hI_dk}R25kD91cZ6_Qnp!`H%4mAM=q3S>*ou$87;X@Ts=aS z?cbN-_5_*19f#u2u8R?3Dm1kb1%Ua`GTiRF^NX^RIJ3?jM zeyg8NQqfKl^O2xi!jvh{q=?nQ60_E(u%bjQzzj*yAW#I$@W?>X%Wdj=ZRskc;2iGgK{1*^oV=?jc|$HlJ=e z4{`#B=UQRL525lU1#lp`s4#=_e^*4uKY_u+*V2sA)O8dY!+UgnV0iQhI*rEq z^3wzD6@9U`Tr(s0=%Ggk)BIj1#Jfp;q4A6O^usYhr{K?bl^~w_WuBHsN0;qBx6>X= zX9tk8NxO?lv-{S~UVaMo|9OI6SXFPV3kGt;a?OgM(_EKeO|FPB%keafDT*Mrw(-cjPV^ zpw!;X7atigK+K`A7Lo-DggULUgdI4C=T*S(@-JB=XnbyE0!&sWb6WpRU&!3e@@QjT598FHslO%bS zm2s`hut(N5mL+9HHI?DXt+LBU^oLfJc~uq3n`e@ePrA6oN8d%4hZ5UEtR$H0!VUI- zXPf>>OZhHe1IZ1CP?DY0!p!5#>of*F{k3gH+0v5U?sr%8-pvmdQc{^&I4s$CteM%4 z#?62K0P`McK^=8ATu}@E5T-e6dHih_w=aHkpYfj}q~<5=Y_nGuTdQmAJWTJ0hx{Or zxH(7-K)C`da0NUrhF9{-JdsAZ?i9FOb;rs#~ZhvHjoo}2yM~8dF+^V!C3Cr_OVszv)Y==<@Q|GJ1x;fa%l* zUt)oc=LCnltOY3&aVmH+I#v`zg{Txs;<3sEGR6)-WM>$~E_GaLf~YN+Ebh`l972hL znjkIi#z5K~2MrUveT**t{VPr`sS0$6I0_n`jHMQa(dHDek_deV8^~TVeA#$Ff43tD z%6;UZo}I~A4j?m$y_Ba-pcNY}{8E=#^fgN;n97^L`G_Z?6n(T$Vten}C zoU=@^=TT5I6uw%reb}TGr`V6v(*icQQ!5~%=~#QBd~=>&p)qfk3YO;z*W(;2@$hq4 zBO|AG{4yFd$+{jRy)0p850zw>gfWL1r;^v;ObO<>d|+4v_~gL zFDE~)KuVl6#W@+`CK{w(VFucdjdG+9(ZDZmQk+m+(dFLP;I_a@!R9X3;4Yr0RxF<& zFl^&(Y~`)-0pbo&{w<|H_*KOK|JNjQx~o)Iha_1U`5(ulvJQ~?0c{-MKccXfX!ABr zmJ9KnhW8GY6{mk^=4qGSVl-XZO_Uf0jgw;lWCvlYnCC^z*4^8UcE_?nyW1VZXaE055KrCxU(JlT*K|`{G5uWrkII7VqP#_tGILM z3O>#eND|2LUHneH-J2yZ-KIR$nwIR$PJV8rNNQv-H4vY-(L0E8j)0iZ!OLrS=n$7W*bxa4`vh11Br9!+Q)h|Ipw6h>Y|JfW{o&_Z zPw={_#p`r;(a?DEp~N!ZB0K+5Q!`IJ4{xUn7!1rVEq9mh#;J{vQ)A%|nBx!Z!6A)t zAu$mzb=22*TUk6$5A6j(-CiR8j`|#&a(94dC_<5w@2)JNwt>S*7=Xd;q^z|fYNWs@ zK|D%?coY6866|*A!M#-C)Vy>o|CbJ%*Ui&*{is$rg+&7sr+@FzOT@38_cr zz(r>${;j2W70(9&_j8Q6&x~S6la8UP5$eiLKjZkXKWyIjr~Kvi5q}Df$H9`4bz-}W zgBK4JM@7R>l>PxN(vAA?1b4ZY;o9zgoowHAOUb~Ixl`bD1^zt5I7rUQo>u)p<8ML+ zA05^sOcr@hO4|MzVN+ijXYhu&^=M_$67g!o@Z6NJM`v4 z#t$1Z>N2P!HMk|~KIbomb)WQn_t}~~+3VZdTin_kJlY!sUL4)Lyw`gSP#Ctg`!A@i zo*D8&|F^HkbclW0-g4phi+Q%vBgS?#KQXehPmE^8bPhPKr-=*=R~E_R2aRft9kqGGr%~MzrHlwcTVh=sSJ^&Wn;DMzohh4$j3<6 z9MOWzJkoc|*0)?92lxRPB5Yzik6u}q!T7AJCn#j%DD3e3_wJb6EwX4S*71I?-dRz2bLSWitGwb@^$PW#^Z)3wvr1qvLYNe2yQ`1@oZJmmKjnp7N+)J zMeQAyKrzIkxOJ`W_-=i3XMWfGe%fEOqS!`OVPO=ZLT#iz(#jH7zu=pY(#i#eT|mB* zG=|gNmzjA%aWPNf+X^)6bk7p2gI~XMla5-=kB;!IEG>W4@Ng>i(f^iEfoMRdTe&;lxmWc>XHK!8QxG2`EYYE^jco{?XEW0t(>i$ z<`D zYrwbI>QwD`_`qOy&%lIK4pMUPJl%O%R$I;1Ar?#}HjGm6F?~OZBb*`UPf>KK)U!>? zv{VG8Ewho%5KIR!duc87yTqMxGUEg2U z;ZPo^e)8ntgp*%e$=Mmx$c;+RljN6*MfM}JB(n^v|Mo8&h1aMp(pJclOyLOhjmwN0{~{5HyNKv5`E8t&G`9xi`k$?tP85(If=@^niXq3=~!@ejh{tbVNZz zmH8@7bN=$`{(L5A-|0Tm=6Vi~2v1H+8kSjZ3r47w1}Y0a#^k{Q%bu_EXL@9jb8YretLbhD)`-aEk(y~n0b)~YG@8lpA z#zx1E4l4zdDuVU$V;2aBs)A8sI_bd;RnTX{F$V7=3-7=JMA_-aA;TrkARRArI{a}-zrj5^;$$5tc~@2cjKBx9iHvCLbfyt zyB-*<4cY(o!mu{@+&;dze|X%#q%3_IxF9QHd{JJ1)2TGbD%yBhmlp-1R|fdD}91yZLTu)c>%# zPuHN8m@P^n1js-7_aDRXl-I_yGwpwBu-T?SeSwMBNwSHEwwJ2S;P;8Wy`?jNO71%a zoP_)N=xx2^KmO)B203bkgw; zZS4w*>(YE`K3N&!U-=;=_GU%ObnKq~z*d_EnVWVPxYL^}t`FpaLkk^nkAM;kn@U?Z z+eEF(+{Q8Jw8Git&UHzU=ll6V>T819ozlc2yI!>oON|{%on5>6irY47(>}7To%D8bKYW-tjQH!WqV?{w8*-& z$i=(Z2{!cnl=eR_K#lXE@#9YR;VFH=k#{SVvs2{nLmce_eO9HJzc}9rq13}YXzXl@ zN}iw!lgt1?T}@kE+F3-16UN<(21x$piHHxE2h*z!mCKV=kY)daYQuRl^ifn50_i)$ zG-$)*G7n+R3gb%TOpI}%4?I0U>w^$M#==723m}-c*u_0O)ueFduRotYeiVhjKqmbo z9Qfxa%EuS~3tw#M#Wt2{QPomehGOnwD6@4G6Ybte3PiF9EcSGcKJ}t_$O)}R?Y@>m zhC~ieujCfNij}p?b;C&_L!GKnMEUoh$Tent50I_r@tCIbjqCLZxSV^TcHjGG`;D&c ztSV$5zYowsA!tPS3P03&K9F`lz&>5CFTfcZ8jAY+%Y=qeGE%19WOArpsY(yak&;rU zmF#G}kc+w#qy4nkqVd_>4D6?hO^lOM)gkKMl<_*o?{4ZueF*MH&5RY%b75TqtTsD| z30OHYl6tUn5X>7Vm)vv})+$3&Bj2ezYSsDDt$$P)6aaB4#xzfYRUv|xD zACdxV3Q^7LXGSYWYYH^ki?zQi=9@cvM`W#$&vUtG>&>$AcKNGz^gld(INFwLWFqFd z!m6{Fr;ePD$utyla5?P%ak#fLJQlVzRh z$z>3}@`};95wUIGHs!TCv31w%H-k<&Q^w9QLRAW^v}Xg0CfLSkEb*Pznk{3<)eomw zsxZv(;50FUECyFp0>R{x8BVq!sp;N z<`~&G+3*!?Ui$cBE0u!|^1}DHiK{z9w5GC93>%K2d8+4>WyY`$GT6ay=|N z$YDLwXz!GICM$W%3EVO}(5LNcw2UUarFLbUJ=kYt6iZRZxWFMRPNbS<%#d4UA;q*i zFaQ5e5OQ`St=rbyo!{#>cG$D$(SPJ-{Mr}jq!ME4k|cCXC3tO9uTVM3m78m48`l`8 ztz$-~6Vh*atVwpHro55=t5Qx;Atdo={=;uwO7)1=QdDOZ>Z4zs4FUc08q0h-hX>aA z#Z3X7Z;G&Rt#ODh>}<1R2g=AMVjc2d?(^cq(-QAlX^BmBg!)cWBOhfbXemS&8g zY+y*PuZ5l-QI%$tC8cBzT8xAyL*IsviKb-XKojml@$weExP^zDd*gKbp$0-r{Uyfn z_x;N9;R7i&Y#{0hvE*bEY2PCx9y?7=Ulwue1!M{XHCP81TNsKPc`BL4F(^OJBiF)i zdA+ASlrEMb6vSi_9OVzgHH@Xrlw;nmCF^NTzGS2w_#C)>jxYUH8O5)=8(IQz0AKjz;3t1ku}=s{WIPmsC4)3u=v&ewij);3Q8!y( z*kswlCZx$&=mPIa-`bJk$ymt3Q+GJnz!5{Ej8uF==o^2uyk7Dz;3KKH7;{!@J?MT* zBqlG!WoUm@G$*>{Z1^%1lB%B#j01)hLUGPKUrTFZ)R(rF;8hm3H~9llWZg!Gf;c-P zJT-CCWKM&cpCfuFU^ze3(QI&t9>^_aUraUBuxw+@FgbQnycegQbcraREswFW=oZ ziYh1?>k*Ia5UZk=QM?vW9D#A{A2Z)vy@#1?nejhk3Bk5mx$LJ&Oxi$4<65-(SsyQ%r>;OO!t z;!`jFja1V?G)Q}qi#3n;YpIZtxMQ%YWB*`nT%1|HRA1+(rKAYv{MStaZ7#N>4qvai zzK7q3j;BvxpPJBDeTj-8PlI36Ii3^5?795+ScOFs#Xm#fv-Y1auZ{0g-1H;gF8Ou7 zc}zHt+ZwQU7@3)0KOt}LJ{ED8m)vw!xV$RmPaD1-czYebb_ks1gs*AtSBW&7#WkTH zo9|?B4>p0)=Jj)Rc{ZKAGVqt^#@{G~!muAI7uboG)|w*o4I}E50?K^jV!W@tFeWZf zlA4s_gWj8C|546R9`*%fu-uawu2xxlH{j}dV6k|ymB9R6-L4iIoo$VmFBhTDQ+^|7 ze{K(e6W74pqY>NquMzYei2zUniY>Y-*3Np)Jo+CGyIR_vYulYiQ#}Gu$GBu~k)W=R zZ{&{;(sT;t8srC>)9>PVb#~Q43()Jolvxs_=H>c^^M!?5U((F!gRNT&)Lju(SLUR| zl!&8@SsCLE#N&zhC)W}c+#+otKCr0Emr=J3`Cxi|al^*#CTcd8wu4`A7Q+c-Ozx`2V>w!3pN zJf8dL2UQm(SeBJ#gMF+)jW+{zZNVK0%9-NtQam0c8w*gYM^u<%7f{em$sGQTg+M1u zTQXEw!WU5+&hUGVqy~oyi_`0-|=~q2lNM0>NxGXyj)7Y;(hKS{1J=x)z zAzDR>VvexYT8t|?)uB>p@(!M~f>pOIwyjXbFiHkKw2faVo!;1gnl=Ee%TV@O4+e%P zB)?0u2#I`nfPn?RTG1b0p^e_A0)6mhWG!I};mu|XXQ#3$0bL?1`vj>E*G^h>Iks3j zRfbqfxB8EDY5MM#JJ#o7Ertx^LL1c(mBQzuG$z zi`I2usXWpQ2rV3Jq6@R!_qfc{X2)1s1;SL>!$bv#F51KW0Ojsb2G+a?H#N&hwJFHs zIq+7E-Sb~x7}&DW@rT*|-=nyIGO4?&6TnEe*a5Eb+%+FKG2S1B+$BW-5kq76)EP}k zTxSHfs{q^KQ0-~A|HpX$qNjUvDgVFvRVNves{2*;24Vk|l`zJD0a8pc7>SEhIw>L) zcHc^cX-1$`v^O-F3c|-&t1sT`Sug8qsZu$~#us2|+O4)SeACs^Y^QNh0<^ego(qdz zKu=}d(rekeck_~NvW*D0?|OoFwkX(Ue%|*~2dMx(XC~R91A}86h@;BXY5Cf@`36PL zdaE9?E12nKK;+QM6PYQdhxk9^V}en@J)GF`MITZzuC_YNZJB64&9HWH(wtN|&HB>X zyq4#or4#@Tfep$=?x5Sb_NXKxTwEn?@%(Y|>OwJ9imKo!Mad#&{t7MvS(bku%9xXEPi zPuK}2l1?yAJ<#mFRfLoXKV>%%gZV^?ghaD>MH_9z8f{F(JV*Bjd-g8P-Sw8O1TkE_ zdcrkV+tP)_Va-=+_3h0KobKXf2Ou~6+sCHQ*mn@+N7*L_h_#RN3&brzLM#+b+g_mA%GeU~!q%98+gm zItgHauRpHx0tL}6kzpg=!u?pMW2WL7h<@{m9sW~fpJ_gTVfTMM=b<}(!qYPA(AtM2 zcOtEIqi+O9lT?a(IGOgg0)mT>CE^BR)MXb0MJ@o-Y`z4>%yn1#P$=elRaOP*oP<5}iVJ4;CTwEuXw|9Er%Fy`&0;G-E~^RA>zc}A&@9z&W9L;4C^leJh& zt@P47#)xQKEsDY}yu*?SmEl2(B&Y^t4)jlx&aUi_|tvjC>RZ@7`yM zzht&4;-$iV=&7%?-s0b;Uw(h>cL!0hl+$S*AG(~ilI-5q;%FNU%$p%oUEV6|D$5wE zqlzbhrA)zU@n))ev7++QBz3V~fKtDx_>-!Ja!6^*e~K7DDGW(6mQ0+J0w%Exh+$JS zGzz&&u~AxyB8Fh91(;=Cc%0N=C^Z#hqLebl8CmE35O?;|j_}vJAz!gSH^OA@k6aP< zUtc<3FHf1D`qH>t+%YBYnrU*@dN7|sAM=9DNu!vv8R{Z}j`>m@2rNb|e{nWv)<<{* zu{VK-vy5cxgPN=|uosAGV3@<|3e}TrV^(u-awEH@w>4u466Ef<4FkL{qbj3a#R38W zD|=}-3kv(SfXk%zfIt6y-01P3$4qqhQhvh3l(cCH$*Wb1otl!8k|FyCYDvZ;GcpR1 zmH*629a#HQZW6KPlPT;|Li`suF9AaU#qFm2EHm(#9v*Pqf+04r5Fk#0j*}?mrbR|u z6o`d2qXb_1>MY7`T2~j(Jv+{KmsynnNxZ=Ub1+wZ)BYwQ+!dnT^LTG}D1ohZqp3Qh zE`Iclocz+8Vc$%Po3YAF-^|B6DzuEYw>}?FKO@K7E}}lvP`g*cA_Fhi+AguJhZ4ti zr0|w`Jd2;VvXRHhjo0aJ9_~I5Z(;=tCYS0*Xn;O63xBru_w~I!_PI$%JJu7fcHEM5 zJrZ>#jD|}TK)nmHM2FrY?ET9T#6I6(A^$DHw?<3>h)+Je`mnn8$=pm2A=7DE5U>8S zl#}0@|8Q}Rf>lhMnjn!XDaS#N(y{3hlV3ISdtN^wDA9n{E^EiOhE1uFE7Gd)L?@q> zhi>8WZgiyL4D8t5#)V6@ZNsb}?))Bmj2V8t;} z1Jq+6QoCCVwKgU@xG=pPp}I$Luv5pT27o0zoC|mZ3;eBBY%DljXp|A23@yV$wZ&5; zIwt0w2js+a|4owvJa_5!h0owva9?BqF(vOlIb#MAPm+e1uy``fs zC1F6s?PJ;sgr&flrFH9@&28$$3Sr_j*G*znWAfsbeq)F6E8^NU!=>#Q9msRmeSfKY zsXegWH!k=EMd+sVLT`)=L%BcX;M)(QN^ono_YTJ8S3|@5WJx&a@tV@x; z78-PZ`#jWq#dJ1alb34^NxNkybdoEZ6si&%x?_{yI--%_woogZU}+KS`XhiMTEl@V zPYy~KV`Y(;`VqEEN?Fz=vzS2cR4lQtLVKW2hp$wOrxL|hN@Qx{M6`4FE_Z4wVq}=D zvGRB4B40QmVX2LMOc#7pL?_p*4%YOHpfGV7DI8kR<(>1w5 zH@VC%LIX{rgjtD!kA#(%WWiMcvhB7xf8HIs6^glspkUzkP*qze{4Vh1tt8hgu;cJ< zCamcSr=^*!w;|COJ4@!$!JB89WUccv`W}_o0bWIuo4W7`I9%lF-cfNFs-dMB5>rW) z220~`QZ7s%+sLCFK&qrlVQc45m(c|RRt@H)z$vcwj_b|q-pI$h*hnk3}KrYC*Tm0+lno)GI6`$T{v(ci4}bu|d{g6n5=G|Os$PZ#%D+r~&U zJRl$d6PrZTMhx%^52Xl##o}j(ihL!V#QKO`1XF`0sHBnR3bjVGwYcn>#@WnPR8txl zXFH^_9(>wLARmS+RE=|r`g$|NQYgEFdoeDOJ^{bw6A6xtn-<>226{lC#Kny~o_*WL zoe}Qr7EeM2F*oEYNT`^Y1SUSVyow59ktKd!UOpzZ3>h626AK?NS88GWJB%6?>5&mC zR(k*BcoVX%&CrlYYBIXa4(P&B@q=0g~bD%*Tw`#Zb$}4m7m-95w;X@I&7Fyg{m5xSTCXGAer@P}D zJHJnRY@ChT91NQrjGHdLwOklgKCoy#Uy^AbnhB1d3EHRhVZVi zPAwX%Eg>M=C*x^zvsGICvNui2e9x%onC3KMH!f5oeHovc{}CnZ+;-cTuwT8TUtJbB z93{J!%JNe=srk-MvA4!?P6~44oI)bEckjG0es?2_syaptGqKcH4&QAe zs+JHk*ja*Aj^#7n{h#OL4<#d&?ZgnYYn zuyA!;|8DHy#;PY=>3SKmxNCZ{nYr+mzDvi9FP}RGZDgE-MRe&m$4G{Z6~Q8HF%7w5 zqG&cp_-3r!U>I8w6Jp4chcxN63M(hJQE`cEVG%v7O+J%hj0If7>nUa{5{u^5Gd3S*rCLu`NNsb~0Jw{9{023WwK}(G$8~yC>$iFGc z*uwS;c{X#!Da0r-Kulz;WHGhL91a+hv{J)g($fPeI1wzhnNBt(s7fTXRE8__l10E1 ziss7fXR@gW6-Q=YCj50Z6zv?iCbE^q0)jBHu|=GmC=AgJMPi6Xo8cQR-k7~h_Fvs^ zsUj-JX>tJD0HpBG3=BW#=iS6|Ok(3yq~&Btg%rfpY=}rFSj9pxq(=uxn;SxGAglx6 z#_o{VkC9=N9At@rtc5HG5RZiHo-|9Xwnb8qk!8*YU~Q^QNsW$CRLTELWNq`ZB3%Lc82aF!s!ftj zy{zN?dPoU^vPM{i@(aSp}}m;W2~y{lFU|KlSwYo zGXjUZcRj?ubp|)OP6X0yjxwl|1{G{h(v$pDfY7?)zp&fowjttsi1UBy&^ggx^&{(D zK2(aqMFK?mo4n;6Mg-=Tc0r>r?^mIgmiTM=b|%<8cM{(ewPCbc%ZHW(>bZCZIhJ0G zEOcPl{S1H-KJL!y}}w+5V7E`^j>o{{qR;l<-z|oNq?>{1?cXJtWyeJ)K5PoLLw?IEt=Nt zx%Gt_e!|Mepkqf}XV>SSu;5>9|L4Lnwq4h7{QztN+q+y|f4A-6T)$9S2RY(g?+u@1 zvKH|h$~kuK-;fT%N~_RC8p@5<~z~kbI?%1mE`Qk1sWxW zwh7AON}S{vfq)gMxoNVMDWt2B;VEHu#n<6C-t6I5BjqeC@ZR+&K5|*BUJXvU(u3rM z$(lm;n%bH%z^gDVpS>Q9@tA07Jd2MdotITl*SM|49lahQQ3ti+lm}=eD;pQ!jc*?V z7N3)e(T@2^=HZXPqyBx}YkU78H1~))sv?W0?f&=q2tri3aE7pxK+E^_KaSsgsdy%5 zcTut63e3A{l2_b{7RN%f%zDG11!Y^%Bx|$y^EyZ5vuZ7>!o(yjr@WC+TAuTM=Y7b~ zMRfc&8Rni6-CU)R-N4+p~wOK4$jRS^>IykQS)+t`%TvOWD_)dORSY*YD>`epMDORYNODHf%&YEqY;hR<^746~1w&IiF`5R`@Cpy| z;Q7Rj4XM?&MtS%~bcnJ=bW8;_713DAWD^s>)X*0l9s5Ps;mt-B@UTmM!od*PZ~hy2 z@6S)=@y=EQFdvwHRz^#8ekJ>e5=z0q5mwmGgRvPajRA{ckP(fK{;Fm}2BBTp#u|!N zn88Z%4GaLc}ZJXTZ|n zU|73s+|ttZ{h;$3Bp2>B-+WQ+x`R}z0kpk7H|0-wrTWMkXr5eX{9Mey@#IqcH7t0W z!w>oRf24z>jRTfAXz+m-PyhPHXW}(wuG2UwgqZ{Z9d{Wv=JlO_wyY9hYwg3ji6?)@Aeg&bPtEJN&ZOzwfgDxeT}Y zIT0y5ZVGAd3a8=kQ@U5t({G-a24 z6B;sRp8(-#`^~f0fxEBR@`szOI<}G;){>g`{*J8JfObuymt~Uj_P{L6G+}Bx-xKfG ziKEw$hUdwwv7^g&Cs6zK3!vJV;-hxdMo1&XO~xIb@2hhQo_(`f@9B5uk$68}(<}P= zVbxE*<*m-$BllgsYretZnjnho@aJ6df3> zntfLv>VIIu)RCZqj|}glYE5QU+wd5VICadvV5b@*G#AVrXRH`CG;}$+hc5sP!A_!o z2|sGtEzyE5(RSYY>l<(1!*eCmjavXxi-M=pD%#U>VB z-DF}Cxj8gEyUg)LZyT*;1|ohXOH`n$<(2yqNpUIs%LNDvYLiYypt3w5%&jtxzL4Oh zDw@Ua!toG6qhl*Pm)G15MT((ndNU%5@P8A*?YkdpHUm8Ro`T};yA;;N9x zC@JfHH8jJ)mk!Mf!;n&xreJ4Jn7*Re6ld+G?u|~)l#+3w3k8REQ}v-^6U&RaVWDp* z2LuKIMI}8Nz9HgAC@~Kdo3#(4fx!~!AaXKryi74oWcMAG(WZ*D)DU$=URZT14xP0Q zZQ@LHEclC7d`QUtJ2GQ&u^x&~*qD-DU&#(qQn0YG$!VEk#budIq`YD08ru1bN)g=3 z+`6JOzaqlgRIGvq3pLdz1i)jD_Zm$&O9$!p1>X4?vjbEFk}@$R6i%aR>@5?$d3Mns zPgvg4zpYhtQC=Z0$f-#Is!FOlT~Oj&^4wVs#KiD%I*65L^zrxZ<~RwBElQH>KC|6~ z!Kz`Um&o!5&=I2$G7hsxIKp#6uwEKM#z*#xvnY)57p@vD*gmaM2HX)Fm?O+kJJK&ruF;h!(T}y|;QF6r*X-5t+5Mgb5c?@4d zzb+88^GveX*YTpY%eVyrR>b-MVg?C6IL4V;;M~Qe&c{RuGNym#u%p=OPSnJ(8=6mnk!4PXhZAW}vVRNg;Sj)&jaK^Ri^I5Mo>+^60 zdb6(?|k&2x$8{t=$nGMv4*udWGTq( z`Dd3qd(=n9mu&2|qm(`Sl}oR+n*QL`nWW8GTn4-L6Y$njCicI4qjnT%E4{#V`Ne!| zM7w>$Q3qxD-n5tN?sj_%$nDDQtuTe}pRH@p^9L`#POgww@bZJOw64hi91EWC@19=1 z*&g*Ad2Wxs5}TuPds1^vBj9kMRcHxUR+&_@nOCwISF#kfn|R%(v#zk_roNS^my58$ z!_(rPY_!Vv-uZE}SXy9h2`#52UXj)Iz=0p=s7eGV?()Gf|?ucjVSRLqoJFY#5+ zl(r5gu7-`Rq|T79s}drX9@+3Yva^!|k8^d_>)Ve6c`ZQLQ^dvfQtsQQ@DdNMq;kq>RL4DDrxuV~Hg_MBd;BLQF!) zrEw*rm9a!L3>kO>L$||K`xyaKRPM~YD;f-yoKG+@Qkh69CdSnHX`0O`W2sSTGD_iu z?dA9%E!aKi#F+9&Zcz*GXXG6WL)%}T32mr;LQ4aHiJ$dBdmVn~%kj4-6JVKEp< zUv*917;cb}ZL&#^#42g2h*p*QEqAg3OVAdia8kewEu^1^EXOD$G@O!AF!C$pFYFyQ zI_n`NWLk@ivtOQNNvGHPd^p;cL=`Zzyoh2$+Us0w8Y*kcthlL~WrZ~vT*0BUgLKgaT4@CvymU&>)FRb}6h!IN99hH2pwzis|1K_sP4*1mo0|7wVkzF)+6ab#> zu%$KU*Cxf8la|?z>IcM=LE7M&59!8MBp)>I%I!1TZ-&pk$1oJVt=%5E{~+6JoUCnT z+xtU-m@=h#z+mtn5$n-z5pyNzUiFMl(YvJKA*l+5!J)Zj=r&R3<6oT$0#p*Dq3qEZkqSg5wW7RS6p2EJ^kvud%N0Xzh8Jdt3tSEdqV80vD>ia@KM# zuXBy#so`xWbak`CX~%5s5HUiczS*F6l!U*Ph_{u9&xgkLnFzp0BuD%HQ_)M_p6)2* zueZsYKd{Tlk6OL+TlBB6VQ^Gy38qS^)?MQ)~#uuJ45!Rxh`p+2 znH>5mog@*fParB`$#6i)nujeJr~66X$cG|lS!&afEOaF7GZ+2OhGQBG$1UkW+?e<* zDF-_YND-tv)F>1RC8eT@?eAyl>{>-9xQKGKU&SCH_}bm9)VUUffsY~mH9jQ1!9+}% zjO=U9-L5=`eWyx@bUzhmZt_*BO6=4{XqfzltrP{|lmSc|fNovd<|{J(K@k@Ao+_9U zR;(XnBqp+?LbyVx=Vb3R(e&$=UCvK!SiCkYApd}FagT5xY?<#{=I?h6Y!90E^)2?E zb=mb~Ii1SXCY!ap)-{ldPxRvteVTAREi?CX3=88P{Pa`f={)u{k|*#N`0A@%cX}-@ z4G~|S0UU$HV8yVZ#rW(gvGsE4oAc4vSHOU?W3$Wc0GK}v&jx|MAo6C=e|Io^cW`Vs zC20rq-!?eR4IPe<;ueM2*le-B=@!s)uj~n2<*DO8&4;+D~Sj zR$bV|JA&J9kvNb`$v`to?6u+|*nvsu|+rRRmo$MF1i}=~Fu`7G1U~*WSBR)~zPv_$FhI8R{#Wtceod0!2rK_T7lTPVhxjRfFJ)coRgq z(?o2=ye4vv{rfk6p=x>dKX0Ig-se&Au z9Zh%LG~%8FW@QW^+%Q1#N_}old{BQn+|=a>IthH=z5+~8cD5J$2I`0OifHJw%fAM-RR7#Pq)RQPD`bpQQU@lW;*iBAqvAtEnzF$!DhW}wRK#Fg zI#^wiRB`O5B&ulDPvT|@JfXDNA+cYj6~f6F=`;UXyCB8(Gs#hjri&$VB&1((IMBuR z7h%Nc5zD&BbAan&OlAY)z=R5Bwpc0ZtR`w=aT+A@+F&f&Y6}$^V=0CxDiI?2pFAI8 zcoGACHhey(*rkq6CRQ}kCOXftATtKE<8HE2^V|UeKB7|lgq>ZYf1@E$3UCDUkFywc zl7*r`$@n;aMgypBKsP#0iiC|9S5BT6MjTQIrYQz-9FX}z6!QqGQ1|g&FPSaX^na!uj;VA4;-_OF)q$ z{)?L;-Uo&!^Ie@W|9{Hy;u+rF68WI`2zHAKhv?UTcVij6dcw*Om93?{Rf;%Pu2}vm z1fU=`DH=0Wwu5@w@gAva5~*tZ{e4_Y5%v=TP4eMZkKAEPW8q6de(KwAhip=g-GpC2 zcFSuUE$8bF_l-z6@I9P9dnUU&2_&FI<Yocf0eXECg0BaW{}l7usW)~Z|%jh=@`W>bPs96^gn!c9X6E{ssTauU{sH`vD= z^r*x>{|q7NLQxq)3P02J5qKaTyufL?`LJEG0$n&ok^=X2jjaQAiQdV_B*Un<62VBh zEB+G)eQwX)Q7h2dL*tX}pn(ikk0e(MwGkjbP{On#EL8;CVTS_6pU#T!u~4H{RT-=Z z4n+owkXHZn8brLHiQ87zPlVRC{KwLrbTW*LjvmG_tuZx0Q=pT*?ky_FSeL+|ku<4A zp50a+P@F1|hkX#QmZzeU5SGV>E$xg*nJ|DQExsLUJTMSWM$esk+`{94B({wUQ_)I| zY9I^G8MNtE=fzUXk26S-(|2ZbcMjd=?2V&`l4_!hE2vWNhDlX#$Cz-6#ehNL9=2GP zoalLK;xXFz^3@!vV$u|$v3Ri*RTMItQnB4JYO!A&LPNISpbzk#Qtj26YMgnQonjJ@s4 zjrGQ3dYc=IlB9pbpkJ%0Kdr%hD2qmzq_3giHB9{Q?*Ejf*MBzt*_r~(0B^D$pM}5) zj^6!k3fs4USP{=s?XU=>o}0Y9Jj31|o`q zl$D;7vb{$j#(hnB8E``n@|#iI$%+j9>~>nIVrU& zwW-K3PUdtF%HOp!NwG)3z0)}(@;%DjeOz@1K+^N;iY=1)&Z&akY}asmPp-Q*&y$3P z=Q-K`iPD)br*ZEn)B0AiNhGf&?~6;D(68%$5vQy09cr_2ad z^Xc;=lH>@O@TLsdTC5G-ZeurEWhJg~;yrQHJdlh%lOoRa*i0)~%GymNd^<{Ce%`M* z;<${Ztnr&`07J}1tYvN>eoaE-TmEoK1q}r|uwbk4)^X;DBW~KB-SnOvN0NRm4ycJ< z*mD*Ec@{ygKKRSW$A~RI@4YQ*OV5+7tHq&|t}fsdO#xpF6_G0~6PyS|pbAs%v7@zr zS$CIc2IY2zPe4GQ;88%gCsb{Hn_KgsCERN2arU!=Q&4_uNbLryI#G~kr6ir23f|{ds-WpX3l(}JX<8^bOdvD<;@#w+cwQ29EU7G64MmDmRmgUW z1qK^gh&(DKA8SD2oohF>cyu(Dysj<A&sfp5FMsISu->Il#4h$&d7Sg0$Tzow|lyzUz5Oq}qvMNwGBGgm`KZ{Pr zD2h1py&oCCa?Mj+&63^HVwG2A(>AByPp*JDR%M=2@~#XaHfe4u^GP^DTbwH6pQBvH-q5UYmMXu4|63rc!>b(Qz{cO3RvT((CnuEJN1tCx*xm)njZ z&7LkJr}xCoz_g&>G~eh{<9P6~+^_Ee3GHF%$M}q%yONHejkchTu7_6hRkhQm@xzyY zWd!JetO+6<{crm*a|G}ADX^*d{EuVC%4 z>)XqxR{PX;*Rel(V{f3(^lpz_f36V1mipS{+m66{6?!F|B>#1td8HD#1`v#zUgI^y zmknndf7ymam;14BotMLl4M$IZAj7WZTHqZ;*)4#6{{PN>@49f?bB#QaU$}Qjr?yXl zgIb|p@eC~7XnwMtIfIFdBzem~w8HM|*0sFBS%ctWc4Ir7TmcY-@Y(fQty+wxO-z?f zOgn8%2fcb~@5At?urD9EaBj;OPL{OTbinQ#Vc3`0LuT|tk1iUhM5V;Mz>hXOI*vL) z!cCQR{ZBYyS&#qeVEE{v@!YQY*si3#=Wh$&ZY&0)TYn-R0EKt}m>2#Rvj;oF2Rp~W zEuHEDP7J%!a%v{9xnZz-J5zS>9!;W8@WZ3vhi1auDd@m`!0P$$sFAVW1!6}DByyd{ z+R;)~P7Y~sd)S2^da;B=5pl||a@X|Ko4@D|b!eGOV7g?vK=duRC|Skwuh@$>GS*?V zWsI;qnXi`WwAaqpPR>p_$0w$>M}q!k@=jbc?o8{fV`sIIBGWz|TeTS$mwmrBtP!1(8VTy`Kb(<`~l&Vmm zD4_~XPsO^hQXMFfp@fqKma?HAP@YrlNsL>Xd3w9xt>rNDUFYNNSP2aDOD*j0L(F^X5=8+#)r0f=yN7$cFR8k+XJW zW}M9+(5UTaZ;H$zm31MZb)H>qWbcH~whSe4T=*5U9eb7Y@34umo8iEhLFm8(-W}!J zlHlhO&wrR}3~=BPo^&}oPF+!@<}ctrPXEVFNYv8@db5nJdp42TIM3@^<+&kY4aseE zsIk1Rw1d>RY?$qIc5Q}2rT<-vck#NBxTg>F`A4indZE1i>s=j}mp|u-O#lLAMu9)W zsbVn?Kgh(?I^wo#i{=BD1qpw?f@O|EU7(TG+xu>eGGpu7;@VoeTMK0Zr9zizXt6=q z(w?AQn!iz%G|U~0J!qS%mI|tTJ~Uq9KrPL|(=r<}>AEC`9DNMa;V-~NjbgUvX=yQj z-Hdv^Bt#u8Ul4XS;;S+gs5M${HyQH^9d+`XH8C9eX6SSeUM~NIx03JT7S5LtB#{u* zyTQ0kZUr2yv8^=U^A}E~YHAt)-PoOPXZ%MeCf9(#{Nyt1TWxUSyI8;ylUAR3%Y?Fzg z3kCgSdUb{g*QRH0$}-dN?1?xHTUd*@p0Rp9cH0FfzpS4pWxkdGT=|=7q05J-h}|&o zNx?0D3HCouH^S{cE`1&8r;cXMF1s!n!)JQ!rI(%^6-TF>0Kd9^TH}hInn>;p0$c26 zuN}U9c6`ztLw;T0?7D450_xQI$=YvXqJ*dM<{no;!lyFF$g}@h0j`(q6`cVS&3JQ| zxdnFLA3C(O$ES7|Zr|414QJ0kLJy7J7m&y8t(T7AB~Yo|^S`d8m*@A-cTYlI9cO~8 znwvMn2O_>cBS7xS^*QHZjVG6aUTH>?mf$r|#?8*VM><2p1LHh#qU^PJ9N2s<%umNh zhy5ap-V&+;6%Osq-Y)cb7_1<`KpG6k5NG@%@>vC*VX2i*>GUf@;Jdy!txIhGn0iki-kXH z-WAxFdOgW4XX-!lI6m;WdhoQnKz5xVr%sULKOZDXUbz64+&;mH-BlF-4Uy~df?jgE z&+r^*oF6m+_O{7ftEsg&R&(use9u`oh;Q;NWAfakhFnsJpOWYDE$r~NE1uKkb4j5j z6{93w!sj?_Qbu|)74?w3^5j^)kAVq2Aw%Isg~d72t6~P8{N%*8$Q(llHl;Z*1sU(U zZI?aAoceB}orY_KbxX=_pZEl}L#B^Kl4EH%ku70@Zq#Ifqa zX{=;(e(}Z#h`-^D{Ae;m84V^>)W`@)55l@2RHcnBP@z$TRkB7t1vxpCsP-pPMr#ns zI*1@kH%?HPipRy1MAA^E&)+E-8Ht8QqEK^jrPp3juw7QuG5~^dbqQ}{MwBqVV(Y=^ z1Z-usczI>z4;a#@>gwXPb!x2hbKTuq+*9mtBSx<#U^cMq=G5xluM}Z6GCI{o`~CUF z)JcP@Hgp~}MMT3e4e*y|H*^$C3<7GIqO52YZd#a!ip;ebw)&Q{8nj-ia2oRdH-A6$a(K-6;JxQ zesAH1KDLl}`HVmVPJKQ=5x~otYL0Gf{mY9qWzU%X2%NR@`bq_Cs_fOFUJk@PcVvvY z*0r?GwNd+)_^h8nD=>%?()~V;JRKwBKjmx@bb_>$w=BV$<3kJ1Ql^<%elziTig4I`4o~p}FUkgQqyvZy@*8yv z)bfuuj2lB^G32$?NRQ_?-!-& z(Uvy-$NR06&ozs4754{q214aXr*J}(UDG-rKjyOq{@hk0ZR3wEvkL3?j{IC^u5Z3x z?`WBuKH!EeEeJE%WkFAvkEs3b7@U1+a8HEK&&TecnzCZ!gqZ^X-$B{Un?56Npr#&2 zJ1CRcd4nA(x{4JYS=T zw}bz~RnSQsAxGbwMO4KEG5yG&iL8P9FgL$~M?`{*isq>R z@>CH1;91$^EcBu0TQ|?C1DoCZJhsf zeCcd_Ne_=$NN$uG8IVsrPL3SL#D%V?HYGVvLr2MpmB@(ka%{AuXZo=?-?FPY)6uFr zk(R`g$0d*_NJl4z)0WWy6!9OMe5~*5D6!PARkf6V=H;Xp4-#lw5$=~)6qJ;Q%@WW? zCWxygVJlG$<)|e_X~oLf#e^K^xK($bn_!0lz%Z3TdXQGENH#^v8)=UBlNN|3kdPrv z+9DYdm9)@WR>Bm4U=?>R*adPJb`cggrRrpCKrJ~w*qqIDWg!0cU9>YLnRix59=Tu6 z&AYHgu@D^$TBVSF+X(7rq0G`Ip6bJ`0b4mT#TYq5N5supwJ_}|TDyU~LfW{_CN&2- zjDh$tDf%$-GM3DUpYPZ%Hl;@*C}}x^^5XGgRgL;bWhpCY5TsL*n|fsy`LLXv;N#0G zl6wAFDGX>u97(B%WT|QN`$y`(2oAn^m4=_6+Xbm*)ZTI{&uNQ*Rnbku-q0-}7M?Qv z%IAkxkII?o;m6;aD)Ajk_hM#{A35BtyK2j+opN$JSi?go$qzI8`X~0F1OW`Z1O||@9+jFAM>-6TZDVe zoi1LNKdT}gd%2mD)pYb{vtr>D@6RspeN7;b4|PJ2o@tl$^U_nghLjVa_GM((CUoT2?5GIMz_Ac?FyYbITqh{t-6w*a|NrDVi+`|7= z5gCxN9Nt~uBCa6`wV%~M@Ab>iz4ezpyzg54HgEP1NmfGr%iaH z7jLV$qlf>^RZvC^p^IYq1c;x7Xo)qQhb5DjHDm2tQ%jFcW0#jRbYi#D!u9=ajI*&* z6D!ZkeudzEMJpZ=6pz?%arW5FWbIsc`GLn{Ve1A!^c;Lnc9#!!I}bMJ4|=z~R?}v2 zwJJb9e}O&}fc&R|I}XgoTnK-k0?l2CFed?}zt?TNXmBuvK+=Qv4|-3% zdh#qYqGGT;%xsVuvL<-pikDYh8J9~}!?qLr&0RHMq%kuafwYBO&smwdmXuL<_6$ce zzH;bZq={u;`hC93@F~GH*FkIff?noGOSX5n*zFzPZtkbU$Jexmn@}ma*JV0hqMkF{ zKM(H|ywDZAly&#eqgpY{N&Mn!K9x^>mb4QNRsf+Ej9DZcBmTKz`F$))4q4)RiLF22 z=1^?SHZ@DCZ`9K^U!4@Hk$pVo-*Sc-=?T$wX>byr49$PYQa1T<2PLtsiLgw7D4USxVdl8G*NY@W7QM`mFml}(E$46()T$2Fst?wxMgZ5p2iJYjs(R3>y9d|Z+iBI@Yt=k}YhYCm;5y)&nKf3| z1%a09NchdM3Nz(-ri;~_!zvGT%sLTbr6M%)pIcE0t!3wb(^VRAQXCYkf9s*DG{e?{ zBPN%U%FVJIC4PUH*Q$VJUFNG_$g|zKY;s+p$t=I9IdH`_JR6WgtRKiA^sBWptCeBB z?FF@;3|26~3vpVDxZu?!tp!YQoupQcrBIy{D$|k! zg5u1tGt5fYNMwWWgWK>DYiOFO$;=dy!xeWk6b<_dE_w?tW-BgxvrPI52t0iPxrG8V z98)qb-z~NA00+1c_D>&Op4rS^uf4SK(}bf&%)bdkjfJ6x!qBR{Nc@jF_5pA01N<*( z5PZmOJ@G;u@#MZ^#quK46a9^dkkgr+=R*~%Fn~xK^-grYDS*O`bs#i;Q%uf*OrP4$ zc~mTtUAc$6Na8|6EmC73Clg4oxtXJ|>#?48TI3pS`-RVLM=tTW`&=2t`Rk$=(|D_Y zY&*(7swZhWYD|@tOZ>VU8D&bAL!nGbm`Buk&XF!{sj##Jkc`AuH?d`MB`8m-D2T|u zf6q9BRX2NCTjy7uFEMyzRan9RgSGsay%0#HzpyCn&u-iNSceUsR@+ljP7#-0Fbv+ zqB@Z%sjl-^Lgf2+^}RoUWl8m*fYo89%AA(8sx_maw=FXCik*w=_wR3Lf`Yaj)0z{L zN8Vvmky?hbv@Ggy&eZgR==8a{pu672?z#@>}g+`wCaQ|oS_gMd5gCa^BEXnJ@`JMF}Lek|z(z6@-?K~uTOl;U3W4Gq0 z+csdO=I^snvKIdEi(Q7^dg_jPO~XswjRfuvS^J;Yswp$ZDU_~1i@L-lmd*O3fpRST zNs}q5ud&6|^l~C)2rc;Di*IntpFVtg!1$^LVc#50I#XzKlOpMM^bHg7|KsT@fZAHS z?X6I(xE3w$?q1y83GVK$#R={%E$+n=yoKOaEJ%>z?#1op{{MS#X3xo-D7GrK`aG_?p)9WX`?r*PFYII{*|Q#@X;Hck6FHNC2)t>LchhqySeC^8p ze*r``YpZj_9-PJgJNK8$j>nj9F9%Vi>@)X zXOT;;F?@zU7H<3a_JStXJJ@W`fLcO$W#U>U>S8!z>D zwZzp5NoA6}y-H;Fczo;eNO^^xLIa4vb4XWihDpFeACRUWkp8V=NlnW$RO;Hb zH;)@@RA!Y0f#IHXd(UVLDp(*PN9jq$2Fu#Ig4eU|Sp2^Le|Pp%x}&GJwTBS4>khGv z&L`pm6T)w>%)2eIlWDtW?;6;-EKx!QKifQD_Y2b zu=Lz*2_Ab5Wsm|i_0#{7n_$Quq%JCRPCbobZX3a#GcuFg;4_`qz!y!mj0m^-aw;al zrr^;02RZKhlq=s@qojy?;m{r7Q223)4Q`dudpl|qc9`|vc|)_|4!1TK5Ael;t#Sj& z{y5qby-yI)ETKPn)J$%do}Rdv5p(Z1fyFxc5SG#(q>9vep_2~n5e^O;6U$E{jIbrzj#*x#o%bz#eurFJ0~m= zKNgV3;8b5xTotwaV4hn|Hmh}?92FZqmm&78?deS`9!6DFpoEt+J|3QadZs9C?>U9Q zJ;v~8_b!G00LDmFpp^5q(chTWr|6jw73y(6N_xBSJJ(_?x>>dG*|4v~abg>lQ0xs;Sa1Q`W+TL3wJl z(ut|OttvZe*WCa{Z0qDw+}@f3ZKLhz5IQ(IvHIgD)*t@vZwqL4b!O1jgsrBTt4p8n z!u}qixg=cp%+c&ybHYZUcT{2P^a4!jw)unL!{Gr*eMLZZPUeWeK{>HqkxPX|RdoH1 zs9@%UUC^}Z)iGDDvFB{dqVm`bSMF|rUH(ahopXBO4#I~8lSb1uo7Ih-lg5bEia$t) z$B5iF?-(D0GoHTJD*`?7Q{1gmgqa{Af}^9vOjFk0wxs%H z0f#(6%`neIm){&cD!1EA{^iEAJomAM2Md3dddmYIcvdwBgZJj}S!Q7^laAAZ-O5Mf zs*Tq>{{C^9IZg)Uynei$13!rh0#XEwo66+!;wzONpC-A>6=$zLYq8J z-7K43L6Gv;U)qVZJZ@FuA&_06Km6b0J2k`jTAjS}+H#zh;X~o`mcBbZusCsbwoGKZ z%$saJbb(qXx=NgO6Wpe9_Q5MCB2S}V5jPpdy*5iE}{(p}j8 zV5CXx8DICCx9R7~uBggI>eoxYQpjU3jPZWhqGh)cEY0kUd?f$zNIrfd{7(`NNGzrP znFk1S_!Yns(3{!*S_wJvdNu+A9KPZKVrT%_2%SH}SjLM*hGzB-> zu%Do2lbAtCDN0U(*(5TZ8?D`*M+Tk4xjcQ<+LrT-jgA?59C5X|2vC-{Y%FHR2Jd-m zqq2=aQF^^W`I)T?wM(K4ueO^vxl@k|LxUm)e zcK<#;x$H;%$NqEtqA1Y4nXORTf1m1C%U}k#04jG`w44Ah7AM(%R|0waz_?~)9QB&G zULdEKly&zjien?zNBKOeAYk6g@}Qa84t+L0C^$zlB&`2y zN`u#XToQ3SSvlo6fMhTk(nAt|S4IpE#0eYp&7DL?Kz?i~tzoh%yK6)0w*Z#tSwW1v z%6p6TAR)WQJZ#W|O&?LT*(%(yG8vj}Y4UrC!1LHF5@Za_I{l})Gg=t1RvP?-Fi+L2 zl{7xX-Y7M@&572JGk0^Nu{td!t%zndk&(`;tFdUPY#i{;k91<&t0j4TO+g*NRaSSc z#jCBMnWZW@|Bk4J?6;m@(L?OxoVM_{`b&z|jHJr?KqbF>90dh(O|`qP$4`isJF8So zd!nlDr&p!>qN;^!bTv;D0vSoOO}u$w%Z`^0O`>rt+>zJqxbu7JbIG#m7UIPuH>+Cl4@Vt=#C8x4tMJgPp87YEZPJ^Xr0^bluv%2v|)BdmPVJ=b8&)~Tkr zt}byG`XLuUWar>iUQvk=4urLeg>+*hE=#5EZRF3&^wZkb-534 zkV@;h$>gjM5Uvq${Wpc?dP;`4_{(I^ytl0E}3)|@NI0Liql26)}3JPZQ2q}i(w#7DVC>H z$J6fqqOvbV#kt`cZ_2Ll8Fz?Wt^UOZVDq01zey7e=Om0Lc|1me{Og3VbKC%sPrpM{)eyK<1@)%=*u@ijOLdZT&!Iz*DVWV6EO$t-*7);~VJ72im+M?J)uP(W^5B!m|Xw zD5%x|enmGkKt+#(yxGya;^-68E?1^ccWriewxcMt79MYupkGr`TR(83uH9Jx~K9D0S|L!jLkFn`FH>)bKA zF|EwOyL5|rb^p3HrgeJ^zy{IEQWtEUa%&UvnHOmEK{_yYYr#$KquCrHZTcKYAZRMn{#&sQ8~d?4m-DG zEYN?%nxZ~c8t2|@uRQ0tz!cG*m*?kTh;2qb$$FpIBazj5|2lP~s`|CgrjE1~U} zScvy-7%UdX%1@Tgv83iJENJizG^Y141V-MCt>AY@hZWL}d{5r~qU8Shkfam`bT(Pi zC5q1B;x^OUp*#zr00>-jo(D9f!aQrdX=1`Q9R@`taS(SYP3Be|ybMMP86 z5S)$|f7^$9Ki99QZ_(ihea^p!o`iC$x4<>IZmc2_kW z-?pwzib;XAxH2yS&k`u+6hZ@#8}1 zlITqB_mjxL#4UqU`_wE{HoaA>xND2d>SX=0+*!gitJkD^xV_W#NzGP*!KEVVk zGE&72_`)Ol8}r|^OwH{*?#)}|o3|zkfM&YBPR$EcKL={3*_j)uKPSN98~OOUwD$ly zPQVan-YGv@0S6SFikVD0dogQ&J&W`IQ96*q+2anTPF9rf*X3j5;r8_Y`50?tc8FTF z2`oIhQNopUi|7|9NWYoZ95Gg6&TS*wQIVS6@KyKR!Ukdj}4ISR@tLP#mlpz|T{ZO#&~= zXGF?I+zTmeqh5)WGzcY17$zM_B2^40g**kly&P78trRWgh!iDCaU~`S9TE!Xi(1&% z(v383!(W7mdz9!&KiAra*V-c{m^RN*ND355{1X3oasCt&5{~*qNJ8t7r+V!y*9E4@KhkfdSeA_-e zE&tD6Rp`ln{Or}|CjZFXCpj$@im{MhZFiZK;8n(@?8gpA)J9v>CR>aKOH`sh=&8*T zzUdN?=>U=G^#?JB%ztP-{GDqDZ1*}HksIuJcQ@;opR#LZI=8)G0<$v7eNet>6Ih?CQ!mJ8coQHr=0eJBbhZ0+2ZYGnBVc}Tf<-&V;joJX9UsbOhTmob zkJ_9mc70*T#iv@pTSq;~T0l4-10anjp5eKx{OI;KDtF(;E@hKbqxDP{bkA?@%HsOJEB(vWow@gk?om;Jn~?R>OHU?v8G^sD!)JT?&nwyd z9igt@4_m`SIOi3YKOC;2zKl%Fe`0pl?3kv#*O-Wb{Z}#{d(vAmE~aI3fjDW*%9qc! z$tz1Q;CdQ~YkQg7V+-7q30#LZ1cn0C8uEwO*HxAu@M=S+!k|QIjR>veZY*vmZxXt{ zP8zEXVa+6@I~kahAq&cyk=p3>#*{peIv?KQc0P&S?0MiZK<>^CNI5I_(9F*hYiE{9fD;~n>%+M++qd704<7|acxq<~F3J3!Xdn|{@agEt)cjjo<9C%P znPtLkTN~51@L!S69~K@y8IqftT4e9B$?n4l_j2sw>oYi(Go$PPMBkjOk`w2#1a)L= zO>#>Eyh5kzl&x93p#^aNTr_(TT>~Ny2?eRFTK}o;5^Ck*Gm3X_{6yAIf3l&?1hX5% zsiq8P8b`6K8>#Jy#-Di>p#@t=upy4Nq%Fq|i!OH=c2WgqQn_(bDMEqx-)a9P0?8W~ zJ8)h5YUE$Kx_i;D{-464YGJbQgoId-(&1lZ0=lI@SL>?{_AFId=|InnWI;x0uZ(X2 z#A>BHl(AC$-zgXbQ*)(~y(Ex7i9<2*3L0uDhKa&z*XJ5)DTj$PBxtbHfHHWL9FhA! zK4WXfNLdwgWT;V(`29sOITkS%my9u?I1>9Tod($?%JsIRcBaW`Ae6+!k;6jc$drgF zj~Qf3(CGzIU--uAG0RhzQw?}RDiyfh#FhM#vgNQ;sF7(rCEQa@CFn3`F}DQaO{tjc zUu4ofm9gV0da8RNCs)_&O5F80aR*XcMAN?5422R(rODXxlo#B{1#(I>6m&o-97r+p zCP$8`+Gi4cxoUY&9%;(&R*;hrdN*QIyQ!hg!X&HCA{vJnJO_hu`E*!!!idN}o4da8v@>4O6FK?O}+%~Q*rLA>LLU2UY7)>8wpcXXYID&81L zzI*N$r^5rC{Wxo+?S6ZnSEu{gKC%^dlfE9VeQo^{<*Or#S6D}9=%io5`rX*`fz9?w}6zj^2J38O~E+C}Ni6H2B7odJg&_;)7mky}}&suiTn zo&myid8xb}M_C)4lNws+*2cj>jciSp1nm0#j@by~E^mFaNU6)c7^!8240BfeDc|#LpWVn!EY}ae1g?Xv&>y6 zmuBg(P9eOAq--;mpBqELGijC8vAJ{V8uHi&b9Jc?`QUE3DX_A=%;VVqNnv6`Kkz^u z<*9Qm#K4+r!HX8Ka;Ye`QmN~Qt;Ik$M^S;*Q@vlOx{Zi)c^y8=YL9ONK0jZ7n>3cQ z5GyUSStgo+GEloA%ddn@x(VVPp)-N|kqzwPv3cVCNhMb>bW6K0aOU2b-12w z>T^pfZn8{PP6=8(3u?M1N}68y6Z5LJ)&5ErJ5)rB$(s87$`T{uv4Wr6_w79)9qJG2RfiCw`{_(dHeY|-zcuN?9-!pgVdsDgD za3W`Y{^^P;ND1AOYjIY_M3yRuG~uH+AD6(~M4vBtjYs%+f;Sfw_VbG@-a99}k8RrL zU1bq_EHoc|bU2sRN9WWCW=lkr62vS#i{ri@utx26d@?*VGd&S_cN8wXPFViBgVcRg z;#rq4(xSi-qfAmozR>(zrdyu?Xe(!HQWN4WKr3 zsN48Z4~QRI4CI7*e2U{s9Kabm2AYY+H3r~st=dI^=&)T>>uVr+7Ad5l;Y5HORpUvf z?@6k!A9bUCYcflrCUU$jNE-_!vnI36dg(L=lX8h_$nz%&Zc}ytc7H$ zPvS9Dv78!Obg5v6j(L?z7yu5Li)n6A7js@zDp6KrCNcJwjP_m$mJFJsq=2JvHB&Yjr@<1; z&N2J8%+FQR*%u`C65<~tkr5^78~K5HVZKVzDu&p)tXL(>KXTpv-4se-z4S7@d6Q*% z3eUFd%Wyz7(0|5w#T32Q>q?!H@c_x%HLh2JQ0BL^&Ayt-)}hy)M#^GG)dJbhR>v0o zyH@?)gG_mOXjg9lZSTBqlN#C$NeT<$drkS#{P|G}wvr+*q!FIfu|hf?C@EiT-kewG4RAC-_p=jI4iRHJ(t!v05%h~c)EOyFWVo7TylFyC zk+q`iq{)bLyH1;Z^1i^Fm&*C|HF|`iv60}{U+GO91v+P{t`^1Y8%k!u_r}N3`mPcB zu1L%MJu!d?aJ=vLIvRN!jwA!x5r?J+)^;f((YCR zh0Bk@wsyk%9|WKNYkCk8!)^jWbxj%u=J$0B7MgZdM~=Ix&UAs{&L|;z8FiWJ2$3T>(Z0 zlsD8s0hPKjALhph4iyhJesd+!agDZIG5chrXDya|2gk;}oJJE5YU*BlK>pJbQ%>#$5)`7`X(@Tv0l{Tuu+qBdlY3iXbAE~{*!CsNXAPUCAy}I6+(SVrVrM9%TF@I*zJr+>SVDD1=tt7H9Q72Xq#^B^q z(p45(4X^nhD%w^}mea7f5Z92+s$CC%d%$Ytfh(GRU!>=Q3Nu4gH)eZN0ha_#sINJ6 z_aU3clSOx|k45*ak5hqJY4~8j*TL{U7hk<6(j>)Rx|(CMrG@l$x=vvhHzu-Vz(w*( ztn9Wn91;cd`f^E796Vfx>w+azb}ZZ($j=1xnJ1gLU-GL$(PfHw zxaPEnTy;fof+og4wz7*YkB)zNw86Q& zc4);=Y}VsBzI)%ovnnZNKKR2z;j9Z$X-H7^+BHRoGL>h2!c30JqIYflOe1G*W*d$t z>(nfKn$2G!uA1nfE_cKwfw+dFw8r;Z<8LyIipJ~te%14ZE~T+cop>pu!d5jUmwSW~ z&u{cPHWC1v2>{EXoI$HO7MpC{Np^?mw{eJXX9M0+p{I~VOO>#s{y!0f6r`!F>|XxL z7^^5T6zy=o`!h+gGfCr@D|yMCH#dT_*4cdbC%6wjOk1@5^8Qb7th=6gpMKowk!(^I z1vVZU7I9jNIp=hQg3>gQTB|f$0{%+NZQkUZtOjJ1QHEG!khB_k!$Vt(XEdZspsnuyoR6Zl2q}ayVZi=YyP^sUCyXAuw zJjA(ED6tn(%o$U%6{zdWi{z zP*2otOr}hB2kR7`W(tRe2@OFjCevlKD^3=7-Enap7I7$Zuo5ph?bRpZOdMYCBws7h zKfkwz4zAtt&o@wua1!s5H{X~ei>cFm(L%-1mNvJ~&Su2aq$!S-(^96A#oVIYsFeGH zw2Ah>f9=OFdh6cks5@J*{SeG-;bI(KdC_HJE4V zH7PQ~-s?DRysB;9*sNRBTyXtsNqBpcd(=8Y)+2BRGAzOZ^%i+WLpmfaS6Lf(G1&$B z99LQt63=Jwt@{5Zo=sr7%RY*RKS+(17){ow=gXTGdnW>qLdI|7yyxVp%<}RVIhLtZ zk6k$$Ck7y1HQUNtNv{?#6KWT@1Mfd*IMu)Z)ih9T*BlP3*}n#c+onJG9s8f2;GfN2 zjiA|eP7EyKk8oJ@I9YD;T&z;9$yx^gW(CKLmSUqYhybezfdHNisc9Z9Bfe6n8O)Zd z|F1PE1b2hAKf2}3$kDduLEuF7%jPCkPt0JbuH_V+#qHSQ^XQ(Z)0Y9PIp@XRf$Ozv zzekFKa5Z=pX;NKo=#$DOwnn}jgGFI&sRylHz5-E2@nF?ASE5V-v@tM3WKc+0P%p>c z&F4y2Of7+rb|jJUOJI-y3Z0AfbO+=JQa9?RwQ9*s!WL`_Us zarHNIYdF{3Uv$m+HF;@G(j7Fsbe?o|_{Ll}54?es3EXlRHGxmtRZDk5Y@19qz~0W5 z{(JlG5#+>zsG4j>?K$~jIeKnxwW9h)6i?fSq5dxFsp3_^dAi6~<4$#D>YlD=>;Y%p z`uPgY$NeR;(@*B%#%+YOsc`L?*?H_V#mKwpxan~_Q|xoiUozF$vs5F0_*A^;?F=!> z-c79gjHD68G{Ak#%BZZ&(N482E_CO-r7XD#YHkp4w14VU+T0m>x@P@BrsGo)iKV%H z%*6#o;qCSB>18=tO_q{wqpo0%xUKmQh(DA_x(qk2$LZrNR>wcKuwT?BHWu0s7HV^@ z0Y;=;1h%F|2~U|Vzp-Sc+yu%9p?o@GHm|P8Cy+#AR`qJ+To^j+^S~!S%my6V1Xg8D zmjy@Z6mfxh<$CR6dafx7%LbgX?9%J!IRtfwW~yKulFRib zj(v-}u4oponYykm~BP*0)d{^ zS8D}h18$-Z@?=%BBpPt9FR9pW$sji_sYJTg7Cs8wYC#|@cwyHuuTXG+;!j2Cy4P&%H`nB6CLzj-lr$Re zv31{P-1@%Hais+MUjVZM#f9s?4>N44XT+3#j=+g24#Snl0)~994x}u9`eOJPntch3 zxC{k9z@rfCZnq+-LOCXnJ7C*iZi^CI{EZQ%y1KY(d8&8vZ%;jq%OM)y5vu3)Xyx+G z*`Gr`lM=hE{X>LYe`$#TRl`R)!&f=x`%v&pXv9q@_=Zfsmy*^56B`FEfHtK{q;4Xa zf7F)$PS3E3Oe)}Z5eEbuHKxORgJ^9+Pp#l4t|kA%LOWvfdCCTR^k!=;eGr6QpHgNM zN@BfA*M=eDnQ5g`*^nR28Y3&7I3q1Kscc7-F`t7xqd z#B)=}astabNOil+XftENHml1l$#gjmo}%k7;^?oSHalW8nO!woh}zuNMfXo=hN1Gd z0G%|p0MvAC@@2DaRsWWGW{XW7kA|ADXTv^IIsKc;Y=|YrH9E1%eq^0FN&2y{z~zY6 zHbY*!L@CfFZ{N3H{Y}XcD`#0s==_}G`=z>aN-R^UWyV|`q%Kpb`0ybC++6@xt{!~- z#bx)uGUe?Z+$UkwEx$54atlc%KS$zxBtw4md)uk1G6j3mSPN!wP0%`7Ac>fT!voyU8T}@w|7+jB75Gwj+!=m_^)rX~fC^{VIQhg7 zxZnBuVgU%4s)L;5r1xECcs{opg2F`cHA&(aR?JaAo}qxQp9Lx#WKmwnZ$8Db4VE+g ze1g3zWOJGkZj*zf-@m)iZdKLix#X+>LU;*YT64N;#wIfI&zcIk)%4B|#rp;;-YuHT zYYKh4!#rh0WqcO9P?+9x1iXkdS25t^v?^JBc&cuEEkcvAuBP_Fww>_= ztlbRRGgGzUDmMzYdoCo2Ngqs4AQ$Yd?rAsh*{3 zdQW}Z4see>BTNreot!-zVd<4M9tgS|JxkNQ_}VoZ{XrXJs`3WU$L`|`=4AEgy&4|4JJ1)z z|Lfr|7rsnx&S8yNF(@8rQx<=V%Q=%VB&SOzSs?JS)rxB-Wk}EG&6bF?(rpHpnBmZ- z7L#JL5p(zc#()GHS6p{I+cjs`+|VC;v3CyPe{-VtdC;bAU&vL{=yI-oKKoC)xp zTxIVN*QjRJvu=F0yJP%kjq+|SVs^eLuPRNOh}&8|o$pbapGTqTEV0cPvBe|v=%ju; zUxk~uiurLq;gE}p=ntPn3rBLyAq@dvwrqU9U5@M*B!#R^L+XmBIY+9 zV1s`cOcC3RHNhpf!ly`WN`a*v6H6dfhO0hOiN%pq&p<6Mi~TpRyE2`U)(A7MG)7A6 zy}C>?u9WeLu#OLCTgnh6i@=7qWeEaA77Z=Dj^)xuD*f2T9 zPKt_ALXVbE3G*Yv`$$~#zbF*`((L}Bn4MqZi9B2)D-#L13~1uiKQU0^0BK{SO6;VH z)kAHyq+$m#OHjQoGEr_n!njac(LrW5<;9CmH>T zGjb#Agb;N9Bv9N)GQy0Zy^!_lD!vd!q(Y(Fqul#W*z^*b?Jq9uCQj)l&s|8(%#e?` zMH28nzk*WM1{;x%GP)2cz=p$-PMvv3-4Xsf7!)9>8Knu=eos zoy+luCRmKcIt2I%1{*aZ=>4xTcGqGao85ZZpkHPNN_nx&YQd>k+lAKLM!cH=_Y(0y z9!>=uT&DCu{(7rk%@4aV$~DA8^2r_?;!^X;nsDWpnier;Occ9`Kwnf`T~%$zLTd+C z`a1ddWU@9!lXq0DpIoIe?u4R*2wfpRU#as`zTS!=_bvs|EoOor5YjJoP5qJ`HpXV^ z;kV>Xay7bZ+3z1V;y)U@gF9PTbREv_kjNef#YD}-tO-z8dQ{hO>^p;N6b9kFpLJfR zE#aLUBsmReU^Gw?N{2*D;s6TcWocs=WmlVgEzF|!WI%5%O%JXCoJ8t3BP=x`G-L-Y zuI0Of-K1RC;zfG~1{P_nE?6`y{sr53T-}ZdYx|XC1YJ9ISAhp@hsj0&&%c`{IG-fJ ztN8bEkdu90U8*A3QZM=1<}=(RMZ4}U(3ZgYl)C+wxFv@VGH8NTu)Y!U9w$&O&2WTB zH+C{Im%5B7L~6lHa?}_Vz>|>4eUrA}l*$tx-}PU=pxD3}7O1-VTP0B}-2d7ok*=8^ zWquq`HZ=pK3!!lRvFBn8lJ9YjbZn7SaicHg$JQV*qBHLolnqM+a4%DJBCOh4Ff)== zXtvRPci4pAoBw_bEXi2!=|4{jbwib3k-*lKWwU?c)ulC?-;6@t5HyehZr@GToyduYOJ+(Z%nu zR@M?LDz5fP&0UkP?nJC|J}T{~Dy)uT93>uQsADTBZA{&4lR<&yF*v$>FYV5lf#Q$m z9aTA3m-p1iWag3>IC$9BaM{+6l{fBkT+d@v*7$uPw}ALyS|+|;?96)5XG;yrOhna=Bsi$jvY(Uz$I~z_+ z-@}?M7In(qoLSAe5}E}T`e)=sX1lGFZZp|ub^AO+-dL=v5*`JQ>-oTi$|a@0+Z@w? zajo90tBn8i0)%|xdZ#`9QHM)NXKGvuhijH)eB6t(`*;7GJGn*8yN^H6IBkiFeS%^p zGsKrO;pOwY{I+?s4(QOnpMdmPjetKN{=Pn-)W!+8$7aI$0v(SN;bW2wmi%2f=IDpx z=ns$0u1kpD4)Agr$Eu&DX(QeDApU&j(?$kUF72Sh?bOvM=~k=I=u!VaY`0VTUir=Y zNbE;Q93AB4L#)4T@#wiww@;A%&kFMLWo79=XJjeR)9PX*V?fphouEDt4$h@3(uUxx zc6XbLwddrd)5j;*%dZ&qbhgpb5F?i1LUqbLraKj8ehd*3(hmZHA4`w+w)*@3iAD@Y z$9NiCQ^(v>$E@IrIHDi^&h)cqHoAYu=2dso^?u3c!3`XEO#0YZ6xGlXv}kDK8%gMP z(q{`JNdeM%7Gp)K(Z>!^{qaT=aQ`6SjtW+_AR&$8Hx$1y5=UQobF(Ubvl@)PDw??R zN*-`_y(*KtvviYt0Mne+p3le`Rq`{CFQtxM)5I>=@0R-HuTlI4=?v@5*&Cv4Bti`h z9p&5HN7vWUAaY9E((&qX=GmR|h6Ugms?_^`SS~{IdOalg-;1$MM=So_z?XV24q*Yi zp{l(9m7w|8oIqkR0?C^q-Y6yz19rBgYfS!(1AKObH!|+T9N0}X!^PeopcYg`3D5pX zPt6|Vreyv$4HMqT$HFtRA%>%Njqro)KhbP5!bX&ChMS)?snZzT(^-@Ghq2;GDDF1- zMUY8)sL@?eI@uzZ0%FvK`Bhg=1-F===r( zwb_BSxe~QRR0?s%lKEcGp)-v76%F-CjbqJfVE0dK?fHldM>3Ph+ca46mz45kcx)PzNz{HR9>MMcVoNPa zj(qB1 zpQ+sfARYJFR!47Km`5F9ULM&-7Dy$mU%eK>8_cLKBxHkSTyHTp#5k=Z7a)^?v`biH?b>bHFJyv{b>A{#$q8EY^~CnxT8*~W9bZ<<>Ta= zHXwybMLCVceCo6ml+qn+peL4#aKdU)pL-@4&8i`SQ?E~-IZLXZhte!=bg@{WLq~pb zR~sb@yAit{TsoPrZL>`4;hQQTJaSxyKVsL_DA_eFDLiel(nwOD9l=CfFlKP8@2@K& zO3(=umMH!5|qO7+h z129K3c#anmS}aj>Hdk#O^f6A9Tycx#Rd{U+IQ46`Tw}~E!=yEBxRREMeShC1KTOIT z1_-t8?0$KsQO>m+R-s=x45)scgL>Q%{T3 z@7KtMwF$EzL7B5r!lVV-{q=n7^OLvzXKUw<9+4Xfcu{;%!u2&P?{x@qUNnzxx=#;P z+w+j)<4o68nctC^`IrwR^Xx0j`WxcDH%F(qN2mR&ichGI3hocBOAoapW1G&EGA|SIQ{#;r{8lG(>kk0psaN=-O;aX zhIfXgsws+tW!H>k#la;pMjJ%rkRSJTX8@H*V!6pq%LviLXH@EE7c5d4Pk%bWaE$I> zH9F*i-M3wbo@AaMyqwO>*dL~Av~6xmTJL`A1=+F$w?NNI8XtZeOITcgSN}1sCt`bS z?9JkQInOjy+eHa3XlT4e5i!KXoHxJ^BNi zX6uZ_%}D#>Z~bdfOD2H74u4vDnYJx*=sRUQ=_u(C``7&JnMi`}+Pq>L)SPwMGaFxb zzn<@P{=DTnFKP9kC+gA)AxYqgff9YOKyI=?yP720sAGY&@r)s~fw-0_ z=4-MXXWAF)>Cd>A!Lj%MAP9U-SGRH=lx5wb$`b9LaufV=`C00af70wGIeZ)|r60FY z4mXbQ%h`FO6aL)ax+E{nWG{~hZI65_$#|L|sRBA;i;1VJ?UN)BCo7%vE3bSN^%D2c zQiIe|3uK9tZi$n$!A{V8Hs5+8)q2T&xQS+@T3|3!AOcGGv+1nAaci*Ip7z>MQoJBi zFT33~$uRd`bYSdgDh(X+PNPH#{*1k(+zY$q74@XUyVtjo(|X^tH}*dQNku1Z>6M+* z^8BNp3?;3Dqx&OC-On5Yl`QGynl8sY!6uJelVx#eYfY`g2b z3*@vIZtF2(iA`<+NjH#68zMRNB=niTGeceR9r&Yp@;h6y`teg5q%Du9g>P)hWNW`t z>HPdOR-*y$$5yCWR!8YDpoPwn(@!w9p}Kue$9cCobZ0JmR}7D6Ukh3A)=WjJj+1y` zPeuJIuxln!&ne|t=l(n7#L6we@62$K7S%URT6m-xIw%d9o062nKc`0Z)uaiOM{qfO zfA$NxPz!lV9NDMot4MA?iAo99RxOdpxZ|N;Q-i|TFbNA4s%K(vv4dx3{RUP?;mtI3 zRz=f>3Ij$AUZ0jSQl;|==xm3V0SJZ710= zCxcw)=|#_i!QCV7wv|6-SK5cfy&I?fY*qEIXc=C;8{VrfV6QVVu-l%lVa>fyPu&B; zy4EvWPyHQV{mM%S*!|JuzWg%8t!_8ODw@AC<)odrXSXIf6JXf8npk2ta zqU@`tAmWDuGNSSj&#(=kym61;#ONWhP8Pmiu;^q>RYe!c(VuxeCKp-*KasVcaW+0V zc4k`;)=E~ihsco~zPG2`#!jn&z4Im;uSOS-tt9f~ks{ah6nPuVOFt{9 zGiBy4s=)?>C&GB+kLCZ+I=oL43HwFXXNh6j6wSUAPDuJjDe)gT>n!PyUfTF|jL9J+ zJ+AU5O%u%TeaFt%7?8NBx9vAn6SIq!((>8+w00 zdQbpi0##o<)nFpmXdzYXAerPAQuAK?H@ElG%kPeJMQoWxTX@M~GJNteFERqbI)IcE>^~<6knw6xgFHx>8Sm-lic(Sdx{$ z(HITjXYdzbxZ`K|z|Zg?!0^C;_ck9_G95+yQb6oJpIqQba`GXC^G)l+h*j9Id%Pp> zpqZe;A-fXyCraET>=?RpDQv>k(I*&M_i*f5e=f(*4u;Wcj=ormVui(h@&YhR9ITg5 zV-E;JQ;hd=h+t8S0PVhaQATvkL0{q~Z?+$4uvdofQ81my-m7DXpTzvxb~bQ5ndmY< zyb%`F_m{P-$|-g>_A5)Z#Epl7m}?Jr9a6aaX4`*YwaE}46nS8@{YiVJdT$CFL_Xw` z4mtTtHgG`dJ_}RG+m3WfG(L8-KR>_ttZ1B>e5p{a)01BLY;or>7W(hf&u|4AQpE!` zrBksf4!h&ak5bC}ak{6J7>4efp>w!@70K=+8#UK%jPzLS!)|LRJ!NnRkQyXQag(~@ zFZRo?ZV^#j>ev#{UfE5D4v#RC;h9j@$iW~N@LoAG7#A`a=a4y_kw(S3)GfaVU*n}X zquNMcG7fdMcH5%Bl$PiAO`VP7!a~b8NsJyLDCWgq>D1Lqoetx1wAYNOT}U~Q75T%V zX{Hm~X5N}pv-jG$(KdE|ZC`G;9sCFP4v0U&tqBZ9K?N<|e6znVVjd=Gtp=S``ELFF zE00cg%v3RwCb8i?pElbn%EH#5DEk|)nhT4G=ctLJ~orW>p4kA)|V6mUlGAK0jgYwJUZNB2$EO4pSG<6+OY z!x!B-VQ^pfgG=R)-qGg=2X5gmc@Iq*mXp>N@0IWE-I=?I1_m9czh{E7GKa2PMB7yX zukV&Wkj?Pk#bmzd7(58s5&J4V{?S}UMBFDNE52PqdM+tZ5-Bp<*kPV3O1cVcD{2R# zTg#Gh@)-{GH4E-W*JP7+4IKYOvyQIk5_2!uv*7a;^-jo1amgX?{MF}+hl1F0&@EtQy}b-9D{5~wD_@ZPw4QD1YZ3O6fNa%va>yTa zv?aWhU;2828-BL?Y020uFdz=-155Z)6~AU?poh6|kJ}7_QE? z)K_Yv9@NL)>T;*`J&?_=EXZhs;2t!be_wz`H2ZG{pzMmreC0$xE zLfRtcljK)7$z*YhbZ3kBsAqnjTtZ!F(3AT-03Y-^oFAi|ADi*-5lLGCMP)~8=SdG7 z7VDvWR`;~n|bo!y1)Q>f+ zzRJ@Bk~b|X%NK!|#M6p0iN-4g~|3lMTK(+BWUBkaZjTVZ#6?gYy#T|;f zy95aCw8h=sio3g)LU4DQ5ZoaY_wsF@|M#9VXGy~Do}3Wo&fK{(6C)FC-u#lCple@A zOmXq8l`l>bSM&ZfwHwGD z|AV5BK1L4DSKy6A|13U~ak?>{C+`R5Ltii~=}GKYn_jkH_~_r# z{^1_7;u$(4K)Ii7dYuzVz}NBJrrPMzgY8pRnsCzlEP~ySzVfWk`mtP6vqK@G$}q(9 zMI;nADYFgmwS4!0yVc>7T%LyLa#8Ed(JfEYdHF7q>7JTP?3vA(SS}%c0ultJm$Iby za-~m2b1!1!x=G01k&t@Fy9CIGus7iR`1p!`^xFkBs2rmx9bJv_R)FRHpOA+h$?6x2< z@EM&(Q`-CR+56CVcba}^tO;;B+9fzDS-z{%4_T%&$kvXF;aF6%1V7w_-5X}8JLnWT zEdO%QD{#n2s%R57lTZRk;#l2gk_M~TMi6Q~-)+79t6&zUZ^ix}@=jH=e{Wd0ge8qc zQG;v`DgE^|c7Cq3KUS%|=duLrmjGV(+0ZYsE$8os*2up=mcPC~3`GitXXO!ZGm$^8dn$t#h+g(G~3H ztdS+trj8TT`w~9ZX2yxo`9P5?rf7kIJ*ud0EEFV~k0D!hMl*Z6DRW!+#*3=l6?_!2 zi&4NSt|%Qn5?(K4#$0_6hSKOG11#WKbi@N&Ehq#I|r#2c`;1bDe}$slnCS?AED4aR4Zt)AlM4H^pN_04Vaq27Y=T=_Hxqx)R zPKp|*u-l!;;ofd=8stQjac}n8z(T7+O-eYhC6LyJEl&`?!TP4nFON|Eh65h!*p9-Q*uOOKyM{BPmMRvL0H))a zSXT|TqoF55JNXwkKIhGvEy=R=!dsp-@4$XfI2%KR_6Q34@U67$y%xr?FTuDpz$IKC zlX3H6#;gVnB1~0;;f)c;dLb9hgR}+BzSI0d$AVqQP@&^2DK}cS2P^bXjW;qYe7-Xo zz)Qk5)nrYqz?CtRh(U4{7iL@m{z++kcdZ+6GfZ@>VK8AJycerLIyRLfIsa30&(mYtug`P7Kw0JCKef@*WcbShN&vI>B z%pPln&zlw8f;VrT;NR%u@E0Y!*XRqv{JO#EQ~yn&&BBtMk`XX9P_Ht4aZ}9v>PK_< z=w5xe4GYri&M^PR_d$@5kwbC&Iy3x760$K17n<1v$_zl^%Ij=9ctW?i=zBR54Hee@ zPLs1I4ntIKdWgDA5`)q$4U=*GkGqVlbZ<%lJ^WoOKvA4s+|LOl^#oS5q18E}*4c&E zmBiK8DAd)cG~`D$nuga~hBw&0ZLs`vK6xy@(BH%ez6zkreVF7^M(;x?&8vSG}1{XxU3@6lJuI63OQjkuG1V zP2Z^nf5)L^3mLW!+WxRAYn$M=7?+HeI1wx$^bSiQ^exS=m)HzIpPRI2IB8UzQehri zVIGTXyplpNkGUjngWcgG&hy4SVPy%u{cc+(OtH?E0f@2DlTYpX6D{Vj%vbSD$FO!z z=&BRrbeoHG8%uOsNg7O*>&#Kj*}cFv2H{RDw`trYB5V2V-Tth|lWNUrbIrvEQ7yxe z1H*TX72N4S%>IAG*y$$FXKYL3uAlvT$3o3Eu44hH`j?%;yFBV5^o5j z61hn&q+xmHa~>XwR@6!z*|l`JJDsY3@^5soyerUb@UwkdN=5!(8t8=1Q2V$s1sT7@ z(ruSio}?PVy2~yaZ=KkSFJ?|m7E5d#zN6G_mt|zZRxARCCGtPYWv5wGb5U+Y59gVn z@6?4YJlT+0bH_22xWG4W#bG{Jx&a>7%iPyIEJL=>t?>Tw)N*#SsG^UrrNqhL!X{oQQWl=3 zrupf4H3f5Z7Br=1Ztlg|X|J%*!A>E&>J3$yR{+V-w&oKA@VYSjuF+MQHRsX|VmmUU z{KLO#8ViAPma9%0JwF=$zPCdJO8Gx2WgebRFD%Ojs?Ze%Jw=NWudl4Dlij$_uFff2 zI|=6ale!5X6#4!LtLby>cpWGO_ zM7v>Uhxau`;7QYwadH@q&3nD#!p0p(H8!`pwYLiEwFS4cH{cD*;^lJ>vye zYkFR}RX|DX-NEZ!I>GcjzwwK53OuXVfOm(CrA;vR*zG{FSa(y&xf(ftE+4+7vfmOi zBr0~Y4er_D@X-dw6%dy?`F|hM$G+^%v9z&|n3?cY>{>PVnEKfTA7N^Yqmc>L)c$U% zok(LH$v643){w(Uz`V;%TE{KadjplrK8n*eg55TPF`X(pOFWubBAO^D`uKrh)`xJ> zhY)^a_~YtK@yJqf%hF=0|7S}Y0>s85_~OvxI}CPyaTS_p%pCD}WS`IM_?*x#3#&j` zx}Y{Frqm9ORH3d;tkaAOVU%~|;n^$Kk{qY`=1ZwjvBzdnM(M@Grq+7sKbgm*l_UD> z_x#v(et)xfel_baqHvlUaGu@ht6_NW5cqW3qnHtB#7cMMbYaw$5A5PzE8Oo<>09_2 z(V466iAx^hbeFTI0PrA@*k_E1UU|`h(ZNp0rS9a_eZ#q{eJv9sv49zxLU;LVPphsk zu3}e5YWg9-F}EMmGXd$*{p^G{leYxOWrE?%X6y{LOM0s|B$S<6bPv4vJzkOK<)07v z$H02xY7mf+PxMsMPsjJ>?6)gRZlx8UB|hzn}pnI zxCHR)LK%t){aZq38rO3J)qEkVNsrWEdyF`CpV;N@0?!RKQcx=tt+-$=n;H+@fQ5l9&Mzv%$ zR!NGJ{B+D=YoYB~vId!e*bh(CNn&Or?D-boO*lg^l+7^BkM)oph`QvzFBcU#YAb?X-4U?&hxU_s*eZ#~{5VhxD-sXfL^l0!**pA&15>hM^@o%prZYDub(Pg|kXG zZnL3J$d-VH_1e zkRE2<=z6xsn#7%RCP{Zn(5ngx{2~vuTT#nrljl3haNDN2T>&$FwIps>)X*2S>kBM4^0}7_|D_4_^}Tw z#bAo{U6TAJ?~hG|ls}{f;~ltI-p2{d54qHpuhHj@e8{F4suRhtROa~Em7vqq!u{s| zfM97&LPmuN?If;k4L2)n>`IFpBd%Kn-I`%Vr8~6U)vX7h%A(rt zOn59&2h@Jwu2(|;!7wxHbb4B+KS-uo$fip{;=(^uk8FBYSH@lijb(L#+g?(Ke)i)`A;peId9dvOR) zZ5|`dVXLE}qs>8=WUP(RbNv0?guN9#pVd3w*zT+FzNJE!PX@Lf43UP+kuSyvVWB5l<54-J&9 z(#W{FVN=Va?Elcfh$#Qz>g}qN^u7^Uv9)_L{0i*DH{{*G)Bp3HIJX+a+0#5UUi0l$ zPEZ;xc`YC>JqD+eqQLpFy3};tq;=f}betstOK*@OY?LP8lOf;=BjgGt;CSs_g3exr z&R$1%?xyl1@Si;fe-lo~H$+E5Hz_Jlw|NqCeZO^glC4K?4m~ z6=oB^NU4^U&}*q(!b+%(_68n!N;j9Xy=q(-{S-#LQxct{)aw%yD-#pH^!u&}N1E{@ zK7FFOK@+)U^geA@8u1Uh$$i&zvGfP7E;r*IguTR~3}F-r*YtDKzJMF{`)c!$!7FHzl- z=5$pvyQ9+Uv}UurGZEX9rxal)wcSyv(dS$K)c8di_&2{;3;hBq*8!is!4*$A=aQ|W zWt&%XUfY`2oO-h)EYiVvSAE1-ieO_vF{XMzxNeivZF`47j?Jb%{;2O*X%<*%>{w}R zUk0pO!?Q}+qiXV^TR1Dqu=89m1`@MK{e!DxCgbI`lA{}Kt6EIO&!#f9B}$_o@^JsG zH`Q}fHBz6=!5dMe@d*kf77azQjoU7-W{0pM1~3BxNy3<-`>;M+zx%;)yUgP?L-6W4 z8p*e!ZI#PsnTKK1W9k@41{$od>j49j1<-i|=(557I-kRLhUnFG4AO)28J9->gD>WE z#!ELVe4j@B>R)u4)*glGQiz*M{q~`i?!W7eBEB`MlGYmAwSC85B&%0K;G5#s;Ko`J zs0p~f(Mj66&aCCr%+WZ14&^~1YKD2nR+Ho>!`nh&!rAXY_`pe~suCD3qT#ls@a8y;3iMr8|6))&$slL4!09i##xElt}o^PgzpLBVM2`QMf^M{9QKQ zV>TXA_BL|%wnX-@SmYf>v3R-~$Ee&tE2z2Ie1F zFnU>2d6#5$h5=uOpK^-|8_Pj%)bVmCB;-E)A|G75aA*_XVkkl0(qe}v5a4ly57O3I zIycnZ)LBK>*#V)ee1lzVqgh0w*}r3h9SYL|iRy30EUK!E{;DiW2cj*9^icp(L|L&~ ziBk!(Qr~8!4%0zSV z<;Z<6S2;pg{r3&~2PC;u`ZRf5%@4Mf+x4UYg6(5rBZiSlg2S$zK*mAyxXCgE#rwOK zJn&%fE&K9mp!yOy0_r;N&rmzM`v24VqmOU*suOpnIt9yY^%;EOth$LVqwT*?hR#uD zs0f{eg1G#GS=@q!fvP>#+Rz{}FFit@>>7)#tu z-QaY2p%{X(j{^;d&54=G*N6u96Z8f)58S9DsT3^ zU@9`t|D7NQHKBi);ow#r`or}*G|ZOJTXD>byc#>sHpfqXPEs_E_THArSN>>O{kOC) zu%ybwq$?$1gJ#b{au{NE&^VhF!K4xX(ohuk9)oAhD ztS0nM&a&rZd|AS3P%nf0)YP;fZ%f0GW6T6*S4&b)RX?q_5~;lfJ@xW^iOOv%i%>Gfu3Zy>$ID z>N@xn5FuoLOYH?^uRw!D+Z!~niMd3#)-F1AYmw&ICe?IHDrTn9TA~C9eY}XWgT%`0yeDtmy z_N`U_<1aPxtf1`wJo#pd?QZ=JtrStq@4mL(4K&@>Ql9pVofd$$g>PgDdnr!4Mtx7w zl!cZU+Iowr;p^S4-xHnRuLPuge|k+0TX%PCQj>uL&!a@8tP4k6l_Lf??gWm5)7RzOF2dV;24}v7q($> zY_fV$Ep;34MAGC9#}7em8t;>hW?$_vx6Z`^PE8k~B@9BrmzzJIp5!?B}qJH5};(m%j@Vz?!)0@b)E0TQAQg-jSx?3(A z1C&&5N`>G5jXhwda$~06^fTL2?J?W_sydd@U4Tp;(E&e&v0Fs-VbZ!B^zIWlsz+1i z5DZo8ropKr6|sytBI^kf%LP0OV7d?l%VdJYY?Z{cpTug8z@&fO5;QfLD>blzju9Cq zOY)kZABUg6!PW1W(tlf8-Z!4hXgfQu0O!lzQYigy5DvBG?@_VHJd7XouL4a(B~`Vk z9nTtFBd5`FTa`spkdqq%lsN%=5lKkyqDP%|9WUq0FLWI*^an%bKD-1eI7!T}{^N(d zuY*>WhECSrqQj9QlbLs4H5DRp?X!XPiMaZ~n!drfzUi9!!94ouXjznZEzFqkOml|} zbBD|%2OVsO%(2buQ{8M!nA=*hRB4YV9|-YFLx9c>2^~ER3dc^2_G! zt`4fNthu9@GM~7ge0ZIBD?UnElGF>udXeqX9CO@}DDX$oWJ8E1OrzwM&9JW1gQ;jY z!pD}eIj@6*sVKG-x4|^;+Y-HD41^R66x1$nBTx|*uRYZ=@|dU_!Xr?{DTA0&HH&MD zWVhSS11441@`UqEl(y?>FLbauTY{sxQif7Sx8y6PlyQ?Yhp7NT4!V3Ae_z@sRkh}F ztXvBe&#JFnMnB2M%;R?IA@6m}y{qbxcD-ImFi!>W4+*YuC|naH39^35J9W0+7g$iC zEkDgG$`8z5q$_m0M4MZAN{+oY%GA@dJ+>*VuMK+RPdb0qth%%`7=+*@^Jtn`hKt)P zu$;uz%+9!_OzuM6nl)w@^py1N(O5v9HV)nW{i%ZUt*{NpBT_qk`!d_|l8)xc(bRW( z9pvn{MKSqwC#b@XJ964o!YAna_JN-RwW*K|m4rb4lExRv9mI$kaBphtz1}Cp((K(j zD@Y05_SA0gVEw;B^(4i~DGm|7p`QcPh7$d5sAx01+>+2g?A24bGv^M$sR*=^-M2o#Q8CbUbo8mm@xMrlE2dJb6PdNm%MqvByM$vx# zo5N}2q7R8HGqvfYoxdIj_=NJh`l8D9nU%HwxRiwACpC}9&a=afCziMLXmjVe1eXV* zW>}4)J|VOuue@zz{`?{`hhv!!l9DjehttH1RjR#8 ziR;CLn|Z4D?#aPEBH>qEo~t`Sm7!}WJddS1{ig=4w>F)lZ-&r->;%X52*`DS#HYp% z-dTzB?Wks_yE60!@$VUs%fG`Fjqd_n!niT2ScX&OKoO9^FykG>!j2*x!6OWhE zE04z+e#Zn-a6&@|V%RakOOF^b57Yv+7|PDq3BuiPVrHTS_a*Ev3wds5i2RNZ0Ltz0 zm=HKVrypwTab*GLi+%-Yw~ux9ZjJWN&nBx}k;mod4||J-g+F^{LMGQu*7n8i-5AW4 zs2e~~Ijkh>T9V;8?qY*5gp#BXEA#-10=NyTzP$dzIDKy?3FOb(Xme{f3Y z*eogv?mV|vfJrahUwpARB?sqZwi$9r>D0g0)q()~1b${R3}?{ia59kNO633kZhw zM7jwi+hhgHd<4&Qgv@G%%yb0PY=z8f70+yf$ZCwla*o7w4998=hXGJ(B5s+%_Azy~ z5ll$%WQ&PxvjxB5$enl^0FPY1w}xWq#o#}*Wc|!c8Bh=&awR(FO2cZM%bTncHdcAA z`@v#}hY|?NQ2oEE_Ih#&n;uP`GU7bICG95dB_blT?a9$E>^XCJtAAJ@uHulCw?@O; zDd(mc#TN-c`!Vb~I)U;p$a1XK}z@gtl`b0CL#T^a9BQKZ)t!-i7opYn2jAm<6k2UAD# zW4$7Y0NxU&e%Dt4qk&|4(`ft|NlW-0C$qq&BBK2upjl>h-yVTF=@RH1IrvTP_dVUd zAE&(b&3~jh{@krCbIUV>g>VldA86UBeQ{51%p1cKp<{Qytx z{L-L_%KIQ;7Sx+&uK88zK$-V(`dRz-c0X!2Uc?a-?>pI=)fL9{)O_f8=r|xgw6<|b z-Y7?TO-r{=N}3O{iErr>(|Z$ULr9cw>6M&nZO$DRJ;(h?Y;O7GggNp*MB!bO0TLk= zAQ2)8l%E?g*Q52Z&D$@s?uz+)_F8)Alv7x1D+WmQ!hX)UZ7eGRibmqWgo`t8N>d+^+kO923t?&ZO; zw5KjF;mPAH!a<`+08}7J5LL2XzriHFe$=v)B)XQ8bRWT~Lmn)B`>K$U-sYgKXtqWOoc}^7a`@rkB1$#s^rvP2nv(fDwgS`ZLcTGe+ z=Kt>cgZwY`hS;Hjm>lW}Lz3kVIi26(8T$OrZt-WA;Nz2>FZ&y^e&UmSpY^=NVY71c z(}VftZ$<<@!#NZuf2)knD-T@8hwo5;U6JJ!kQty7u?}b?P_o2k(a#?937)Wx0nIVr z{K&XXkVr=@`0zIKX42lzd2O@XIV%n!5AS5W-Ph2kd#@?4V3nVVE{;ncOay-~&v_&H zrT5K^@$(uW;0`33gn(#hJXz=vKJwx$ucnkDHo)7Hldl8zdKBOuG1(79 zwrf+PZr09uS?URuX$whIDl$ z;D%y%%9rXSax`i~gjiu=MXtKD8QehLqw+CY;;k9@)eQ8}W*ktsQ9?h_L4EL{KERO= z>hsO>6Y!Yt^m?^x?%nae(D7mSKM(-`W#6xB&TIKM_R9QQ2b+|Ra@>{qzh0};;SP3E zyiKf&JRZDFvE)@pdT)sH)*p);?Q$Ft&jut8HiixeL9f#03uW`2>cPRqo*b5|T;fmo z_Ih+sT2XtVH~J6C*NR9-(ATI|-wNGw`>7&=BqH2^om>wQZQa>znvfHqc#zR%2#>2P z(!_3kNN`PUGSzZZ)zXyftcdfEM5xHY2IqmUC057h<$;q5hS3IrvbXyB;XDfQ?n!w( zL2*1mVM>L>IsI`H!~^7Lm?|Os{O7J-)bS!72?8F83Q-nu!m@<5jG(7H*+oCr&tmr% ziBqo_WCP^eKNc&7CuX)x00kBlk%ID%8y0V!2BP|z3Os#u z=U(Z|$mq_<=9)xHvwA7rMoHaPK>D9e!%gLoSs2;Y4Crvz(5)k& z)LE(g`iu0$smtD*9;<#oGk3x*k1!Q>aVksronlOz^vJJ09Um*THrcL7rtIUbMR8ku zRq*^+UD-~bnl1m=T{Y*-0P?MH$!*iLL=2sg{&h7=LoYn#Ck+e}YL#&K%M!tYO%s@n zZX02ymBB(kl9(CHsIdG$sVe?wCFp3PqLJ215C@%VybF#i;XAe0x|8Lu&KI&F*bO1* z)D5NKBP5H?S`>_?QL@XFx(+h{wjfBXsiU}D652G?TD%8z$W*xF=oq(RNA~3ATsOTP z{^cpuVKj;TL?bz4&@rT?)M3-8y}F^4mo;2Kj zpCaLTW}q5FeV|%6U)J8YE1V~HC~??4c8_D=oehAktn{bHw}1no0J&P z)`gZ6X$FQ;l=dizNknCrSP^m_yw8N>%~Jkt(tv4AQ&vi|`hJttijvhEBDN)UZ@}-0 zU;M&ST_Ue1S6r1SuZxS;pqIIG)zr#617(p}nTzgdeWm2Y)Y0=nBZuX(MgBlbc0WGy zAUW~?lu&r&VEuU^N_s&it|E@CIT0}B=0uN_L@P`3S-6pfzyGiXqlFzBXAEAsblfGd zjy0ahC*hzY{-`saumi9J0-yLxPYSN4IR~5K{*Q%I)8UhU5-B8bw?e1V7XyZ)uX_oW z{^C>pjw6@}7*F5eqP@@K;Q0c%oPKW=YRpkmncv&`&i%;MXJ_gQ?~=)Wm9->;xgwRN zsln)GQ}~^&02i0A;shZ<4*4KEm-uPXw_FBN;YOnS-31#(z5D7Q)Y@pyo==d0d&(qx zV#S*Fbb}j?W>OO$x`Al_INPBYNt0Bep0NbWBERbVgRLG27IsnmvxeN9NamUY6d!(5 zfGQuFs*h(nu<{{zC4jBqiJPKPa=nQsdXkL^pq3`zlwwngB9naYNVI3jJ=y8qy}kkI zN}ICw_v7E%(pEPTNxwWt-!jUL_VVI9W{iU7F}4;TUh?Wp#QaHQ+CbCp(>4gRYeNy) z!&B_=SaB@j9)NBeoVj0Vyzdigp~6B29>z$M0Kl*VVIU@If#l|k=4 ziPLiNW{m`Njj;tz?Oovb+kR8+@B9Xp{$RsH1N!whxDel`yqIt*p%4D8P9gH}ceurd ztv9b6ulf=HUfTJmXz%@q-W-VADvrkYOQ9yH8HW#nv`n)UIfZCCCyhfBgm>{OZH<)p6s_ zZ)*_W_<3yJ4oGwiDw5iYyxfAM!xvTM5T*lNF?SdIb&v38@cnssEwXs^adF~pOAa!# z;Db&pdL7~~#&y)q+R9KvXP6~jv?X7(JKs6(xZp;Zy<1>FPOa!}80KJux)7)nX-x1% zYOBPuhq#VMf4V1NH|(I(`a^-fE^JdE_MgBsooN|s;Zo#ul{r7pjEeHB|JP7J&g__$ zt*Us=SvqHtHLiw;_3k&mU4-kmkM{| z{7j2Wt)JL(Hx36@yFYMV|GjwD1^a%%YJFo+ir%h#;+hisWmuBFNWy~4wBZ2bKqEZL zB782&3`{HvrSl2+rTQ2@JVS;U#?*SCp!JQ0oKWF;pzFGkHEu^VYzug^fmT&hVXBG< zdaWfCEp42rBZ9`GA|M<>@b@1BV%IGl*o+M1giv}(K%rQ5J?6nQiMbksnXPYC^8pPro>G0&@bF7A2Ww8 z+|BN4HCiUOP$#z(&wPa$orLR!a=pkrg`x!i%ED9M=|0=Wex}qXygKaTJJ(*j^_LR3e3B+tM-x41R8xRa8YzK@X;Hn}PNsDtZ-Ti5;? zR&?iJ;)1`rlA&Pg4%O`nF};qfCJ%aB$CJ+$Hqx`d71d?9Vn`!z3KJC|pd|4~11)`+ z6O*@m<)uJ%@un7SwHT$Z*w$0Jg)IxuEKx<#f`)u$S-h4SMP-qefmC7J>+)mVY7k{d z=g#F7Z{e}MRPphTN<-zWf(R{L>}o8`6HX4{>UWpIhNyNa1gM`hUXu#z@tjnMWIp(O zx%8kqJrP@kMk$s{R%lUZ+Q*kS%kq3G(i6tYc@d!;r?D2Mu@s@WbQfUIkpDg+AG^FK z1yACA&J(9bsPtuM8tRQU9;6yUW!2PcrTAbU+T3d@d4pnpU#dvJm`+q>>Qfe*k?%9u z?YKtHO!Llk8m@HnE?bp*In$%3*Ovx}GL&&oEN(j#y?b49 zkhy;sa#%TeDJa>$H6tpB^xa-Sjha{@n9j5ov)48Dhjl`{{Wt915MV?>E11s{jKA`P z2A6KV4OCO^5n5f3TIO_$n}Cr_x;BbJR{Q8%eSK=Ex(&kgM_v(+yflhO6QaX^jL!OF z4GYc%Q{l*v_2M$Nz1RA~tJ5c#|Go8>EBuuLRdP@YBra&7_`D_3^BWN&n9=b&E(`@C zepCCm6KIAj9e>KA`JPhT%g3ewIcc2Dg}y_4=jpoW-H!TcA3)c&%X*twDU7-2yL#K* z&+Me5s}oaK7cl%wI{psrTgb#Zxy%7aR91f2Mea~5o8OcDT3~O?$M;8KyGt)iSXfiF zR$s;?Z6kW94cj)DQ#Lr00N1XZjVTh1^_F}S^8?rmeFaQj=ZKzS2Q>rRL(kK;tG~J{ znYfqgEbH-oC(uSF(0(M)Mq*}p$Y}OTZ@kOUN9X9oGeg9g1PBit>!sgaZBFs^8r^%7 zarBazfVqZewc6Z5$#m#fMS$lX6H|{qU)#w?^}e>di@Mq)UD%7@Ep?680{1~<@1$jK zq+stPGqYkDc+^TSw`6mz6v5N#R%CXlL%dC5eB@jCm1aO)I|@0;Q-w{g0RA;a`h_66 zPJ;})pm{^b{a z{q#q0dM(f7;#GeYht-beN^XIGAgIznL1?o)wVZav^FL z81SsSbW{bmbV%bO^{ufAnMM*XqG@El@8p$B*V;R6)HR0% z(dPebc5nO;^7KD1KS!-n6HjM6tWIw+vKQ$N5=q-()Mj>kU%bhi#TL&BiyvPDyLc;o zO#S7Z{>wX=_1!{0cTFJWl3@|O)hQFy zX{)}=eaNNFjL@JSHCM-0(N!pnEulYe7?c0$1DKdC5(w%0JQD{!)o|K+Y-~MG)02ZmGKtL;Q zHobpOu`_mt#dkkjUxv3O*un-Y!!+CKik(H+2bf&&rOAU5WGgmX@p&GuC=vF3DaXag zbJ%;XP%!$!P+p>@ zHsLCVi`&3hk(sLwy^X#vA5|lm0FlIA4l?iP#hpt=y2vKj z%KjeGZe+E0rO1rR$uAh}BOm9Z6=$Uywpdjd=>0XJnS++EBx5z(I$&({F*a#s71+!s zX5}HFcp93%jKgOw|}AfQ%!51JR%ss>!N$N`kBTFxfyVM>!2U0SwD## z{ncu^3=Mws9LLJeEIo(bkr95kd_D9?4|SCozhScVR#$Lp#2Gv0m!aUJdw78a2mKPG z3s|G=)Rz{AyBC-Wj!?0!l;u^X=Vj@9Z3T-O55Qo@P6;2D`CZ3d8iapsbbR~c!nfy0 z>KR4_Be7}!eM*U+nurUJM_EinTln&J!5Q1n7;`Nc0h9z=`}QE`ygJ)CU+%uF!%-Hx zaP8zFASrJPmkiE8l;Dc6XD7aY-o3-@j@)Nb^HyM~m@l~tt!ulwHdS8*ZRrLPrsxZOybo-tqvKGXm-Ml^-}oN6Nu{c`DEjI=%zPtyetNR$<$pq zb{WGuXR9MA=xDVRIIwf&B!`O#H#TrdkWZ4g42MjGlVoGOC11ymb-s(O^Zl?4O!QvG z)d6e;r7Nu^>jg9M3x_PRXeJ}t-PY+i=yYuQOx*Hx%xZSx)T%hQOoHYRE+x=i}dF!iH%*eQQ!*Y5dw<;C+(&HMjA! z7edY#y(3rLLm}YUk(7b`9+MGOW=Cz$*t%M&x4K9Jdxi$ej_L%!?&30o{|Thlux|n@ zPeT{UBoXem2ItUkn((XIbE#)WzI)4eL1RVIsS#5(>VFUyy>r?C5scGN{M2%1p!gg(oU z&ITqe{ukosS^N=VbPUmnHQ|=or_%F=bHvFpejTR_$#BPM=q%Nmtt`FMZJYnCPXuMIB$+m4+)p(M_^axHBL7vEw#{n72>g!{+^3DOy-@o+x z{Re@o6PH6MId1E0T9aJf46Q#9!xL7|%Hz!1S zIdLmbcC+Jdsz~O(xhmK{5rZ!U8LVi-z?E7Q>gDk^+_Fu2MK}9yvhI4+9c0uU%0(R? zsN>=ff5+S7x)E$&UMoyr^07}F5AA=Z!3L-q4!`lLzY>Go7|~laL-`3JX{`i4Mba^R`zoLo~7<4_;*0e0`Mr%EtEL z_S`QHN`-zm%*rsucy{vYdTH>j-aQI|=5cL>9RFnz60!j)s!MY%1-9K5=f^$Hj}&zC zuA~(^(q$X8Iuq`74fHM&G!(>D+W^DTX#!3@H~bOl*~f@LV)LTIiGo7aUg)qojwRnE zFyOXANLv@sQ=Xr)SZjWzz+N)7zt?g-sxDct*=1#>B0c=sx&qmk6+B0XNRBcTeZn?d zK*CxO!n*o}E^W}!s{>5;cfzZ8K@j6OQhtRJ*<#KCZ0q9_8BFo8+h8i#Un-JZ3EmvcMG_?YSQ9z;J7%Z%kf-)6q||DR zi!r0it+A%c(ge@A!u^b*W~WfR9n{$#-OS`hZiYRDsfVx}CGM6Q$J8g5(vc%4@)Q#Jb*SKzJh+o8+Z^5aaedRnackcfaO>4c zr!0=-Q7|Vg%Y178m{^;G#{jWTi@1Og$SQW~@yzD!*6iI7UTajWd34QY`ZkU4%ej^~ zO>GR7+pqn=G7ieogB6aEC@R*en|A*92|aD(ab3?JLGM>?$VF>F+vo^hGx#rBPS{d1wg=GQ&ktNPIb~RNjP?U{(x4G)#cO@$mV~T|Xqo9O>-R z*MiY+wbtK8+_(K{zinizbII$1JVq^}9X?U5{)hbh;TLIZJ5q>4tT?X< zYaY`H>ElsvoAJK{!7?Cnn|yeuQOa9?IE4|)eFxBB6FZGXuHI^Q_R1H0$8_(#;*yTZ zsO!l~oJoqoBt_07)a2VI+R`+E*5E8Uwcp?)A;m4B(XKuFf@|n@wV+;wE3oU&oCfUM zYu-w&=O4lRSCpGkAhpjo`MiW|isO+7j7FS}MI*Dyn&>M1%EQBGmS~VH~qaq)oQ7m1d zO0`gta5yjPPE_QB#u!57l1OQs*I>!w?rcRIlWIja_(pVEk)vdp@4k8@&wPCic0t(O=H^ zC19FVIkZJvn#%X2Rm?o*TrH-&*Yy@eCW}J9hG#J{1%y8(y$EW~3(yx0s+5SXiQ#JJ z7#lB%SgGbIX(5evdLV>;U~eHcanm=kVfy?W`Za(m+=?gMMe~OzjqHs}_y_%PUWItP z#;-7v&yFY`dEUrxF2*e%7mjQfgGZFM60`2T>1y|myK);Z>^xfOLDn8+St}(zc3Gud zWFom}f5_Ee{I!Hlu}S+sIxLSR%uMBr zX^I+f8_Ckm&Y>Yet!pKxCAb7TV^CtoID0T-;CcvLS0(t&5J}geZg3I3)p0wnMssf98ZNj0`hM-djA{0a;g9$|BC{d_+W9_?-)q~^dNye_ z^b0bNe*S+neRWJ+53u#GEmGW}xVyVUao6Hn+!q##ON+a^7cUOQy|}xxxGnC*<-2|F zd&%S``_E=?HkmVX=FAxv(EG_|loV+?q-3-w&;}xRJ62f>%A6CW23Wi5Uv3|D5-k(f z8O~N6SE?z#f8*8}c5Tk*Liric_L+OJQ=ke4_Tk0PNASZZIPbWdUl=x)@i+SM1Y<+4 zxP@Lw&K>vj^BM6+iW`!4(q&IaFQlSI#dSZYbgdVd$d3pLG`agTymMFE zHWJ%j5@tu4hBZP)N4aY6@t@$;#Jefq`+r#Nl*r1FXf(v&$r4-0CSPz1tT=;F5Cp-F z0cAYIB#Q9;%NM))GRru36|(bev1#5w1O8A&Gs!Ye@@c=(>o=0KbJppMcL;Oq2X@Hrh+{&`Zjm zS{DOvcAoa9B?FAHsuxq=69LO<*MRBlKL-N+2g*q!D=?Ps$mN0&{ltSeIN^FgasHHL z;+%`8V53d6;|o4!z-_XG@>|MaMqa;9d_jgN2aJzXu8x}AM*B?^XYT?h-U*jB-M&U= z=FQ)+KE9#IhW{_MvgV@?c#bZcPxpRx^nXIdAh={{aV{rJ%bv_*KxmSE)(^ zk|IN$3M@YW<$3yGze80V^DsnayHS-12LWJ^ZEKABeLW< z@|5;Mv8xDeCD(TJMRn%VB6S0a;N}pkZQC5VvR?_BYRuL7;_70-g#ipUIIJ1R9?Mq| zsS%6qAW&gm1A(3~G+8ZxY|I|g=l{@O#E}d(RbDq`G>+{ITXC#-v(=jwxQ=;R3o=Ou}<-tdB zQ9C5th3M>xG<{tjcN6w<-FjpW3ldW&n~&pJsHX|2*}AdoJbyMv*m}#cqN>L^YC)FH zzR9&H@RXTGA-pfhjt}_jH?v*%e`;8M8si=4qfWJ*lz3BrPUZgGrulQ8V#*ZtC)-ne z`im@+NFOe#XD;dbgZkfWEp!p(X&LO6}f__%A~XZsB*K_)R!Uyq%)A_S5tOR zHGk<0ZNTI@<5lHvdJngJk-zSO>>BD{x(dQd_=C`$M!pi2@^zB?AuzSC8& zxQD;zxJ`FgKXh_T8>SJAe*ir)NCQ_Km<4WaQ9Ab(q^s0B0b`EZGMc_ zp&v$~AC7)Z9~J&xn%_KLydJACkt|IMo!Rh(pl$g%o;7KIF^KD$$lJ8&qFXHusEgM$a52Ot0EjX#l3|7&AW zB2%U6Q=rO{ORGPWz-&Ie=e&ER>l|zf&K$KG!g1bpJZ~N{cJaxfMsMr$^zq-h#~l2} zjmN&wMPJkXC37$Yt~U(7S_7#b?hTBwMJKVz_VVM6E%=U26SL_Mpvs=q#x^>SZ#zz0 z2WI#R4!0d>Z49O<&Jq=bXj5UfZQfsE``=RoA zw64=AoBsoPgJ>l*c`KI^-HW|&LGN-VG2kv?o#JkzUo#`bA8YDF6m0op-w5Suf+Ryv z-^SLlxU@VtYg{U-cf07q;`~NrFi+MPDKAxT|JnF}*NUkmi|7s%ytFR_?iWJIIb0j0C%ZE$qVmGQsBbMp~ z-y5ylCWXy2^c{&vW`GE|iMh)3tW_DTHAXP#ErvAJ^|&d#ZYbtLypTf#;85nH4n(aC z-Vm@>V$-IcGt~adAeRGG{dE+E15Uw;-hiuP+7vIlO&ptrDjV;Tzo+={QC1G~4!Ynz zxf`>@iO!9^o|jIOYn|zFul+2C)tQyO&5zdyKaFbvKsa;5Vyl{ta!}cO1EIk;$gx9Em2}iRtHN`2VBugTvBEl zQq06qnz~GyM8f##VC!MI-u%E2Si!$YZtG*G7ha&y#X3lP#@hb;2`;NulLvo;*xwse z(s91~RC=^GuCsl-0+64`(O#gMs3bE(K{O%de zak}zu7vFkHx*q?Vj!pH{x!0r(({%F+AOfL^;p`nQS^UW zfUglrCCORFViT<7v|)5G$1Mn5`=B>!_pOYXgL%Yt#7R#^jSHYRG5lG~N25pg3Q_u1 z2HfdNdQc$KaK>VIeeopxMW^}NunJ?W`cWH<^N^K!LAwf*n|RknL3!iEGFEGwlmDei zrYybCW~h&_1EY2#Lc>fdzmDQ1&w3*l)8X*C`qJrX=P5PLnyDYcrG-s^w7t%ceZ;So zEn|N6YRqzdE}Lc5qKGF;14x6dPR`fxnnLe=Wjuu7m$ES$v&ea}$QRBdA*cT>pol6E zzAqj}S2#9-vuaYMgT~WCZGe8_mYM7e3&o;doGsINZtQJnHc+^iE(8?bxV-ZFY;Zrb z^cB^~*+~@YixnC&=R9gkKH^BW;t;qp%HEWRB`FNKT4Eo00uDHfbrwC3Nz^Z;Y;6H0%gcBM(-}a*|1+vkK3nf&<`cY zxX-&k5)a6&!hI*q-mzf4Q%4Xz{Nit4+B{w;-^0}*!$SO;xO;+z(X^qtifgw4po7Fr z`iI}?9qKlOG}%CLk66h0epus2?Td6l!dBZz;}82l}sJ_1tUav~#lGL1Z8jXP+92sJ6I-?_Exci>XkER?qpD2 z6BlME$|YF5!xdlQ;&)N1`>KCob>-_B$P_il$jdQLQgI96XkWDyCRkm`=L|D?&{S`> zv}Z)@6WHn*eSxgV8fFIZ5+fc7X8v0hD=okRYvXNKu}BgdhPAd@ADl_g%_@8`CdDkm z43`hS$G~hr3@;AS3f3r>%%`6zJQXWEl`I5F724*Ns>DcA7fCVa8P3Y)c4Aa+p?nC@ z3qjG0!p~vPdrOi#l~J@6HJ5xLmpD@SG$Ul8qu(8N3v0HrsCXc$c+dwN#H;0-iMCMh zUulnVnEg*M<(*q4oLhy!LZxtpPFu}N(x*x<%kjV{g3u|}n*sy2DdFloZ#9W(wb&7% zpaqWLZVr{M`LQ1s!LK-it=woKuB1RbqKLLe=htgi!yX#l&Ny7pSX@urT+V=ie;v0j z*0K(-bUAS8M9ltb%G`Ojem5UHEVl#XWhwZ-E^Y1UkiGE})M_ht58=A;(R5}bWk+@4 zj(!@{|sV9*D-;<&wNYEA|Nb{ka`gWIbtVkq2VdNZ?NDuQ@rmb2_lipvA?ir+pz9pxTYJi^Yz z=3YE*}3MqWKXGY5Ma^pke3%A#~(Ano(mG-dF$__W_)pQu^WoDXY*Z#WE^p7xq&=nfIOP|X zseDdKH5Ljr{P@EPfHUb^$!~rwn97J3GN|j?Y?xhptFjN{X5_Nb#yHfnnX8`qWn3WE zC12o&67L3E3WALv2@|&y&(r;x=NcBDt`sx5o-qEFQwMM2B0hvh%g2~~%dTrCv;flvjAQhi#iFloP!dGODF(?&cNAih z%#?_5So!_NBma$u!I27YKKo?OLTNrr{=4)7P`r$8FFsdo^W=udDV!&E3T<+9s4x(d zCnLnmhc=JFw2Z+tD{e&U`(Ka#XNBjdJo%nV8Fo9IY+5HRa7iTofV}hNL*oaN6hrc{ z+mAGZ;7fs)Nj3piw$@4ZmWfWi)z+Of13;E_*XIkiW58*O%%M{#ieI$URy)ebmSc)R zvTuV{IAog|3->u9f;o;Ux%W3u|M0w3ZtO*NO=CPOK{RTc_MxsI)oeX_e)Fj|KxBEQQQad zEwL35lH@GL-62DZVWXnq*?`#zaP#@wpiP^LmNc%6#Cjj^u$`OM*-mrstp-Yewmx4s)RP|a=Ruh&dD07Q8RA(PE@ElO)+`>H9N;j2c7*U9cx!l|+j*i6V=A(br zWrj?U5O{gnoM=+0mszWqVw7`-&D-`dSYR|D))u3MH{t^%^Gj zmloM3hrOcIQsX)T>_EArhv6b|+K(~JY0H!H?L-IpMDM8B*?g?&fDh9F zfg#I=1eWflxyyNemZ7|}koKJQ{l9ZGti_EF9xL5lir)7n2)tdNTrMNkNV`5ETy(4c z$VIvL%y+$%Jf#CPDNNlF@SayZ_fbHe^l0bh{gTFl9Vp4)I`8BB_XYM{Pd^RLjm6sPWRZL|bA6ZVp53v@Ba_FR z->rGuNUKYn%*pVEa@1-(^Y;WH0WJ4pUt7icIrjVK=Pmg5*HpA$FHp2!Pte?HR=?r> zd$QXH1PVgj?K6k%b;H|6?IpucQZ)p!C%^dJZ{l$3S5Hb?P@CehBzHelH={1#9-HO` zWKOx91<7}Q)VPrP8PO!}TH0I*7#9JqqL?3xS`B~g8gB9%!-zr+e`YlGD1ZW30UE^_ z=OHPx!#EMiPo76-@^AOY?!WwS4ZU=&w5rIurKIea>RlR44&06Ee{G&3$)?*y_f{}gwc%7@xmyzjkoN81#e)Q7M1dOHP_QN@`c>PtFLV6 zKYOMqP@h~GpFP@C$~G{DHI#GNELzXu1Xs#7DHphXhzBLpjB}{JFer^sXK>SG%wKag zqH+jybPpfu|Gw*Y_zeiJt%=xEh!9eUteBQ}(%jH=Tu!%eZ~6I<6T^aK`#%&a8x-y+ zb0F}hbCR|o`71i-Dqe*d9R0AjjWswLWCV3xf(67yaA-2uDHHk0l2>WdS9UmX_Bn`m zIdFD4n4QwET+%NS6`$mapZkw)dj=2Fb0vFJgtll2(45gxu=tlLoti@_>jztD1LkW( zm;IuK)Bl_ZSPi@SPrLdLyTXXrG%Kx|OY}@K=?0C_0(Ensqz}7x8 zf5D*r!c!%!B^O&2Z?L*$$TpIi>UovUlrEk#rs;pudq48~|8glRT0w$KYy?ES>KmX@ zuhZ83y|~!Np-WLBw@M4;Q=V8Bma8Qk|0+71Buz~V(2MYq5OKBj9Ndqzza_VAdM>{m zdKMuJaNL{Xx7Q+f>Y#q7h~ z&pjmIZEb5;R9i`Bd)$US=gt_>?_h0T zcIb*$xa4f8q&{}@U08!KmyMu}x;vSA!%SfUxinFwplP&;KDXh4aw%hdUF_(y1ZbR;W-IWdK} zJZ8;8_|^hNa8zE)L0G4<<5Q*He#MKTUI;#0%ugete7oA*6kYBJUGDK~ffZc1L%pn@ zRyGKGGl*qHD08DMbLAv+eY= z@*)-xKB!|X=OY~kU=6o_xXdC3VtNcUKb@GMq{$|0z1YMy^0Acph?eJ9_R98-jo_QW z>1OU=_VZ3!pmCJfL;tT_w2p=F>^%5DqQA0Adl;JIGBFGVIVDo z0EB_N|6~h-5bb$2#qoDJ0kVDdgI)DcG-uhp4%vS=W+t7i@Pz*=SyMa1>1C*e8yDbq zd{s3XZ7&Ya?l;LAb*W%d`f8MA?mZeJ`jr;@n-h8?7Sef5lVGevGpxj{<3ZK4%ww6K z*j*i(>hmLlL+&fG=6JR0!n2?u&YPU}eCSQP$B0g5(Au)e`_XGj9;Pe=!7NyJur96B z7$ZiMVUUtT*7Cf;IZ&Bb?=sNQl3H&H=nN`d_{BQFItJpj11fIiUz>(M6Wqn6F1>=w zM*gkkkYPXw zZH(D91So&aQzTEadS9?8ddSH)-uX=e3~Fod3Eu~Me%OUh^;JYb)jQTRKoX)W$T3fW zxkusLffGLyq+`Q^(?nyghsCi*+WlfyuVqdEp?rP6s9YDN=pa$1D^{VOCs!9E+a?wW z%9cLWyPT_@0dh>gZzNawc>OP2Yg>HtZ|HQnX&C9cz^N5!?T0!j>;bWB+zL@L%7sxKl5HfVS@tiwsE<};%Y>8aOWNW+^$ zJ%AIaG)|vzmSUwp5})tH5Y_BK2KQG6|1kn#X3j=6yPbUp^1#&o7#YyvE#nMs$9z}H z|F@qhaMxdXY1dylZHV233+2~>!j9e|X}L`-uPScp@sl-UQ}LWq^O{24Lzw-lA)8Gh z4f)N)dW`=+dkSt^9{Ack)oi#m1C^~{jiQNp^xQoGePrUsY3}9T+vK{pUsHN+Xd}U( za#mtyUwAhCQF6l4lvoWOda$7>tr%wTe@kLF10m~S6D;E%Sy|4LhR0P;tY=SKu=FDZ z;1epBio`%P?-!$XD%s0tHp(uGUhVc_65?2Z^fD zpjTs*qqj4ID0@2fjSGVq^~z40nSJ9L8or=6k)rQbkZC%e(Zaw?>-A(;#M5odVFwd8 z9b)>cghR|Rj4Q%ewR%YLsH$kS2Cx`+Vp5$36&m9E-{*YOL~lC8$~t7IA_VLAr*^Kp z=I6X#nXhh%8dzUgim2x}{Q*4=stE$sEz6?`znyb+{&eArkltul z%{j1Vw3{LzCBF(M)#M4|EGsK=tVXRvG781drWDlI|BmZTY&*Mk4r#}Nl=Z6Kc1C89^WmVMIespge+%6TBu9u_=Kji zF0+2jeu|?`?D|GPY4(^)X~iaOWw-p$;T7Z++Liw8LK_S9)p>Q?IL7;-KP=Z68TLMX zU=S}br?vUT2cz(GFS^~=z}xo;Tk=fC^saHUqYCsPmj6z8f9@`+>>PIQGgeVt!c0y` zVgYP^o6Ay3sM9Cpv;mrF`4xPJWApZcY_;Sd*oFuT2lxfvKt829j|CANt&KGd{BLKtsSxu~@EEaR}8ID;eDlg(g<={VPsLIsEv`*(4*cMrD4~ zP!o2%t;H<(Txa~M=ulMQO~{n5iNRHLb0uDr>(Mi7UgO3s!@caMS(4|FJAWAiSYt4W zSHILfLdlb{v){eDM$elp_p0pPCiCrs&136E{wKECUriVG=JDE;Ju&)+KVicMqBP7N z-o330Xm}kb*}`I5^fAm|qy{ zQPXUn+*9MNwc@P5$EvJ79qf!Y9BI*|P>ZTFy=_9@I-cHW;DURaH0=tc%u00Il`ql_F+${s;E^{JT*Ub_{TESxz*E=%4pxlE^Ad+N$@6Rp$wwvP3tdA zIr`gf?p;5we-34cx>ADhcy`7d`*fG0YHRS{-dz)tp0R?cbynrSE-C-MsSbnKi7-38 zMQywBYCh%I?Av*JjZb`v`J6Omk|g>3!-qkZ{V+daDKBAlpK5QD>NGC{NnKcElZv#+ zAnfB42#I_o_~JWVkwjL6db2n zX!~2Z=ipc=e=0hbH*@x5>36tYcz9R9_!Q_Zit-jg=jv;ut{Ybu;DZ+d;e%62uuvf= z;0*NSjr8P=wcrhPr5zoRhFdHn1AUnlQ66xAFzV|6zG#0Tn0=}RwtK2W3Kwuank&8D zF^ED;KJ9mP5OgkYByMuyvE1<)8(998Jj+hlFDE#!$@+%LdewHspX{7Ivn=PU;SAu! z(cHsuX-?Jxjo`=cOd9;Q#AM!bp6Dj6rDfa3xi|RNYuD_V}Q*=s(tjUI~>7-

h%yZZ$&aHN=l)F8iwXKl7si1{GRUR~3@-H|_ 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 ^ZGsvU9mz=N8x3&xqv zFQ0oI2QGGwaianUN!zKd3j`n-gOGUe`s$4LE6_t;)JI$#dQ81yh6WTKUU(w!>o89Z z2KZa#f7Bh7tH=9MOmA)qZ8|0X;1s<({<-@8u4nB#;0#&$ebL#>jrl*%AARProgH%0 z1o-|fC5oi41uTh-`_7WV9l44DiU&{q34!}_S7V25I|`DBmJbabj3s`b-us8yKBfr{ ztfWH89#Xvg4DTdK49k<=BH`P?(a=1aJy(Fh_unK4E{XEasWN+Lu+H$GLyG`|^9TdK z5~PQfIA6|GwgOSt!zlrSNeBbduu8vYp=|!A45Eu=?$Z$kY|2|}xWfii<~>4va@Gz> zd#8{g@=qWYzzG{$78_e9+ciPQ8>Jvnj@bZltXKd#l%NnykXBTJs+0d|6kdG2BV(T! z9(Jq`fY7cmk|W(dJ1iEY1Iu@K0de;PJIXEFoJNd4g*pY4q-Yf_TOv)ZT7o6vm7`$z zUwb9WntHhW>G`_)AznPVeU9>N#shFkBU8Fp!tT6~1$!bNZq7b4U=r%|CtSE@bk}fj zo7i+^K7QsJGY=|S%D*(Xqc&fCIoyVsDum$s&qlvFKs`_OO+SkW`1-Q#UW+|Eym^Jt z+izM-w6kPbWM;nq%hWsR?;Zr899wI@_m+IPJii=G*8Winj^5-=HTIcqW%?ey7N&oCjgokZ#3Lmn*GAtujsWyxZz%wq`MYYNJVsCw^pXN7typa zM_HxE{+rU8egEuWHFUM0%FO#$n87uL?W){ z96BFRrw`MuwY0N~(PkW-p9esV_Lb>|Pfos7sz*yx-Jo$Y4d`@l1fcN+A_6x$HXL`( zA-^B|we?&!-WUA!+%^nhJMetx-bs1idL#E@=2~Gh126my++Gab{uuUXfoxvwoVs9v zLp%ST;e(k29Ay99@9*!gf6AM-V!(e=rY747{c^};9{@bp<-AmDVcb*gz@2&j#x>z&!7IbTBKr`**|(xoLHMx9}whB zqhoMxnVm^6>9N>i^i`OjJv(TU`A_<7WH7FOM2Eew=u|+G!+edJ^r2)TL`$doBmJO@ z!Ja1oDpe?I{HxET^Yz7U_6Y|g9D^=2htiq@Ix=Q|Uar`0egwzC7c^dPujscL^=&Xq z&}W#Yoe7)Wzn3%q2^iPkh?rXPAAWsH(5d+dEqzhauKLI=ePLPkxOx9oag$76l5mx$5*h!o@jQ zTCcO+_PM9*>w;vm^w;l9veaKc(;D4o$Q7tP3>>BUzoHfds7)_*$N2^Jhn$wFROO6T z__1AUPGhOJ%BzAoWfV64Qz)b?ig+$+g|nly4;kzTxoTxKm2yk zUe)RT28ZJb{MS(!+?G!0(|yVI$1`E4kMKpnaq;$)u$RS=b<=QGUI`2N&7dYBo;+Vq zyss(T)Su+}1)7M$$2s_I3S7)C?KQsyGy(Ty)lM{2F= z>1|uPCz%CBVpYc0D2mKfP+D;&t}P`m((!3Z^8#3IEgeG1EREFgeSS3U(MUP)M0#eV zkklTTKk(7YIS|*or5Ih&upCpd*weDu9BK3Yt_%n#i>-b&#!TjjT+>4Q7kSiJlVGw* zJjh5mP^CL&yNss>*At-M_n)QKe|gghgZm=D8wwssV&?Zq1!gK5Jg_9KXfI5XW{f0% ztdXwLvi>CcCDMD$BjLyHTXum%flJM6WJnsjsViBE{(JiRi)RlYa8l_;=}AXzbhe8< zU|D}xYRQVYT8Oe7l3DW{VyfTtHWg&YNLkKASx;Bopf(z{kEJ+ll(Nwwuj>ROb5-sp z#B64B$B!gJd4>$_j|5C~RixlJv)m>Nm6e7}RnY1*)ihkDH0*3yF89gw+on4&VJ=qT zlpR!0eOuO9iUNSKE53JIzxl*|f;s#}DyJOAR5MJXwkx2%E1Zh8nt>6;*g%#&Y;rpI z%Z_q8N3!(fP-BHhUAS*}d%>)%UGK!uVgEoB#$XrsC9Spxm+RWEGss(mWpD#vp3aA2 z0(cSR!z_s88=|1B;tOAjxudtVPK&+PWf!e?$+kHovrbnTP;PLT7Y7)!SZem)T?~+s1P}$8$N~+F$J- zZ1fC*`lAYa;qf{vsWrqUaiOMgp``GjsIkVYu%f!!pHe%XmKZ}5!0wWR3!{PylU{)^ zd=4Z!8eBRSBmbWOYLmUO0?zc52Ip4ZeD0|g@(enxIT+bHq<1N^bqTj+@1j>dCB&?< z#hjo|zUeM0-2!O($H=%6guKcT?>ag;ZVq?qD$H?;e=jA+SlqkCm-zzoiY@r{@X;7; z)mdEdi6Y=tgiNGAqhU;Jc!$E$)y3Eo(9DZ)p6z7omZ@&*W{aa+OIWHn60aLCTR&>d zX4;n70Iu!OM}zM30W)ASCWD4d1QO&t{?>L7bFV83Fn6OyEX6Kb{x(@OW|f{lzx=fz zt72n8$Em8GO@iH|P%`+1yR19Yy56F+9qr%_t3?gHf${r5%TwY;nAABlSFwS$m8Uy) zxBO4N-Z&dyoclxk-LQ;EOETjmP8Vw+rHuo*jn`mfZ;~0r|7IC;ylQ(@bEfg0`3rbs zx2-nW%npZknI37mio+8~{Y8(@8)AUeb|XyE9(Yp}!E95UFNAJ-%?w;QVdIuH@1Z`$m@FYs@L{c^n zJB8k!QwI)`$?V>bL`tGXNupo-4DsrJ(%+=JR3`SMisH!pjU|tPMvD-!3kwqg>kt3b z3wi4C^%C^;dUJj)M8SOoAeluPXkqH@OSNo%rq{v^p-lj#4D2hK-I%lbHf8$j)b!aq zGxyp|S-EP|I8SX-%5SPF7(Y?0GK8!Rzsp4;ZYiZ+c`|(NZAAaj*#2V?>ED#{-0uXF`s5ELtR*6RMF+E zz=2cFX9AvSef88j*Q*m*w{8-Er>m5km9ecZoh@JVXyp6AracddQ?ZgL3L)3^=vLqH zX-ATFxh9TP2odmT%WZw)eT5gOr6IKZCqPr<%2wjUOyj`H0E@T&s)`f0??0z4TMe97 zB9itXj+G0t#jY|hgL!A7S0gmw3fE3Q$ho@?@m8qAK={m=K{I?!1s0=9tmc$rib!;d z5Qgyt#@^<8#Q~65&tp)IW|u=(70ab*Phg*>9i-%#Qt-Mbh#Rx*5%Jm)`C9UG@DG0{ zh^r}u$egx)Ts{&M3j)Pf@aC~&onl}R0gNxn272ZqB$mU5=0SC51On-@ZL#gzY6e!$ z5F*QVW{%GHFCmj;^S%E>0PFD?*QVPry8O`pjMog3Mt{h!$ObqYBC9>4er&N9zH69L zYk{rjm(qytQ{{v&C33;W-4qrzcY7N$f9_4y_u!R$1zh6dyns<|w zjA@+!fKu(5D4vxL%8+02b$y10?ry*SZb(?MyS6ulv-I~({TpZ9af%cb z5~Dk&+p*q-Mvif$hqVcSRQo###Tcw^*dGJMwKWyWJ;K(TlR?eJJR z!+6xW^wY1^!V`f}wBsdM=Lfszc~sK9phV$mRo-bAzietF>6GbFkmX)(56HzOcZav& zkhg%QKrTs%7DR((zU$0>&0Fb}YYrt~P9x3f4Qs6C3s2lm@thhuj9}wV{$xR)lf#bb z5^1XVRbd3I=v9Q!C2he;e1oCma|i1SrsLdcd_fjAZ#_1Mq3MnAZ~Tsg%{SP*TGU!^ zloSW7`dM*KLUTtJXhHw`B+b-$*39M6^p4Zy--gsx^}w-zF86rOfI%tWo zK7UjJ+s*OX&iy@8)+0(JB5f}A8Hle!P6H+zETXtLpbMPh4p&J|}u-^~r?qP4$A znp@>MoO}lhARouEKcIcyN0wn<74RMu2@ZDh{@gDnc1ZVg){Fx4cJHwp>J2?SBt-0jSUh_M zxZ^A&cChNbM-+SPE5Cp!W%|3|-Ty=0hnY>h7dERtBBxAnWLwi8dyy7EYt7sm-xYRH;f5)^7&oj(YBGc4!+=u37=`?YlLW_YuFHVSd{pncrn1V zk#63)^XK6q3gIKKuFA`U?I**J1~F(oso zUh;u!yx=9C@qGC&LR7@Gah1=h7s0``^W59dojz^%_!vr3fzX9te=y>jK{F9RAQ@=%~i# zDK`zipttzoWj3q&IkPi6A*=p9b?sCstMVl@3p%B#e9b(mQp&3CoU*@9E3&O)SA#I6 zJl3)Ke89onx7*Zr4>g~5|ItWS)6p5KJ@u*6;`w)<2k+-yn_J)anm#M^9*r*a6x-A^ zO9wfohe{o&p*c~f^9NTei)4iZY5Bte_M@SK+TwS2G^c8!u?~YZk>?F=`iY#%3j4CE zL%vq`*~(s{8u!QSib~u4nQ7fRquzo0>Ws=B|G08=hGQ=sImbuAaQIVvq8hV~_TZql z9F(>Vi>~gVks#bXIb=YOZ?KWs0G8Gs{_fgcr+YjV$^IW4Hogmqp?BhBoQf^SW; z_?Vm$6`;6M#+Ou+xMpbKXcjd0${B%-{Q7l$hc+(VtUAanA*}oHa!{CzLpE#e9)RdakgqsGP&8TN2 zsrXAPK7aZ0>}g(lK#W+0Shw<3r)%c-pQG5CbxZ5YpuXpfsfqNgzdGfv-q9;|WhDJ2nQ7ed+QVw@ma>!jH^$~+5u-*|#&Bs(}Z)pA0Exkx_yQEc|z7=dfr^A0n9 zeKwrBOyb8)w98CbPp=dw`?#kaLK=Ub;95x!g*Rzzho0l7>O#8-}<& zoIhxOvqM=(y0GX3^B!!J7sf8VSp*^i>|^xH9k>$O6HV?ZI%hN-nxDkFEcipji5{o_PSMMv?;M_BZB<p8%OjQ$&mlrrK;GcqC4RIdbrvSYP5~R`%djG#_`1rYwShxraNKW?hI6Um87+#tgP_{<;s&Z=sLM-ajdFJjBEL0 zl4FqvttXRV+)gG+j3(MxmBj!^`XwD?pr3f1~e6Y z3BE@Jn;Xsn-%(u~j;MFh8;+1&kI}L2IvXHN9U*AJmfd6;Ejv93;Pf@V^;iJhg?b;+9VN*BdSF4#88*?Dp|f5V|&jl9msm`Wv5l` zEm^=N@)xsqUrV3MO{>}UC6@eq_1DTOD#}iwd%u3@@W&VJ@NbPJu?I3*#HSqh6o-^- zg}mtdX)bPe!nQVbYYn*?1$1^MUy$~Y!XX$~c;fqeblaah{IZb``Xi)Fayk%E0hiyv z|MWSo2ytlrKimVlwpNuES9V;u0=B<~LvEg2dMWO_8jk<$aw74!lGz1~SG3c7h3lM* znGbtQBhk|*{WvqO2b2c{{JE~6Ib;3)AqHYN-DNK9>60b366cw6t6XUole5{A?_goA zz+?0`_XDhUi_Qr2CUo+1q6t1${hi{%%*Qf{2YG6$>DJ+kIP+Jzk|M*RMwIte`0tJW zJs^_TEdSSQ!QjTXdU}jmrH==0BP|ce5Br24ZW%w^uG(?HA7{~*fXK_hLc!0Cg0J)b z!^h0|#)J|0Ls-%j;fqi?)FX-lD)@mi?Cd+#@tqthp-9=HcoGLGsjp>ZUV~7Qh2!w0 z_a4g;p46n@sfzGv@z=?T1%H$Ml|s41jO?LJec~y3nw4%$cq%5lmO@7m-vUIEn&bFN zvHBzme0X;5Z3w!pcYl$YHz*lLdq2Ls()8#TELkOe*WP?|?Tf(%i$z~jh+f>wORp0$3f*ab>Xi_+!kO27wa=8`p8B*r{YkTJJ(lqlUzd}kFcxw_^mOl-}U zR`!##4a~z0%;T%+1!3-F+0+b&h$P8=AzoXyZRK_=m^N!jC#2L_mlo_1n3etL>od(@ z!O494=)6lAcELsSE-M+&>Eu&wsP_XxTKRiUy%G-HBQ=ew zl^1fc)-!B9F5&Obi*8DJMegUkjt5fSeE(=kJxF&{CfmOU+`}X|l9lg?P**E3;p@UX zb5CA##Zk1%W7y`4-losO3Qd&9`(L2O=ebEYPGy0rspu??_d#Ovc#HF;W zETdoPO}wJVmk#wKaO~2tJs;t$rrO0sh!FLHHNxFI#B6`gNi`Y-4+%P=Z@JCTGN3Dc zSbY<=wMJZE)#&iEwJg9b4n~`> zpDt}(NTJ89EwSxQOKzPs0D+uxlGXt|O?GCWSAC2)Dqg3^VG&l329PuMk2`+Xhry~_ zBi_|;qz~iJpHYDmdyp3CNi<;C8sQr@6+RNqwgc%poTy2O6Ye_Ppo!=}eTFQqL{dly zjA|t|i($|9Or8J=Dk>WnmxPrS?Mj{2{MwStTea5rF4v6FjC#60uOtSX18aFOBe06k z`H~p@O4y{LHlukffA=6H<8C}0>g|?h#{*p0oS%5RmmaMyho{R_r-!_-ArM)bJm zWq}D>H8QPHJf1utNa$o^wUWCv3`=u%U5;~UF!z1uSmW0r6PH}z?6?D&$WKS5yG(E{^?G5ph<)f4~7{O=KJE#;<4k(8< zZlm9(+NkyW6b4P;1+uA)8Pp?j0^~kAUBbgnz}rtBS=Vs6fy<8)fW~3O~gnsQ^T5Re=qAnpBI+tGKqrZ_4 zvmF;9ze3yej!yiX!U|u&)<+T2(YTve;?lImRG0uv(ClJr{};=^vmW$PHq8NK?sDBu%{&Nteo$bDUpZ0upGOHAr?5cducC zeqat%w4O6fcB|)WQq&1cJ zcg(@PmWIBj-}}ZaAr}gF+{=rQ2ULH@t+|gEf+i`R;{a`mt0B8P;jYo`Jv$Vk8uM+# zZ!n%QP$%u-?dceuB}3zmhtD^Ek;m%`q*VOTyzdG2m&y~3J`la#HHVgj+4bKj#a0ym z_ZEFtuKXw0vgDAnxYY{3*ExKi$cmubIsF;_NZZTlP)oN)U~>I!F?Qwkx0iz=Pk`~w zp)(DT)C&4m2Fy2Zd4SZ|_KB(ZV@uqt>}zc8-!a`(71OyS8%^4F+~|cf^jjSN^}N%1 z|E)azZ6A7t8h$ay5dw1@E1UW*aj_)}Qms^{?p-8}G>cR%O;uHu>Cz@!MWd?yay4pV z$UF8}A0Mb)D&Bd29G#fYCD<{b<2R@|EtjEpsI?naUC6rVMFyTr$wEJHS>hlCZGx=D z`5p*UxsdS$^gJntCuQ9lYV+1>oPhl;rpu_zh zh2;|a_Q8gL=^m$rN1fcRs;s**I)9WNj?j+4u6Im)42wp&O_LOK@*qTM2hpmh`gB z{S%(tq9Ha>Nqxbd;-M>@rBKqwEyIwpmPfW{+?4b7u2rH71l0D+-d$)UU$mY-Y?yf- zlM_5svQsLp68R2vSFZSFI_@5&p#`Y8-%k1nUoFE&*0}9t0|!`_V@;~C#{SZM3Q4XQ z5t$;SJdMS?gZ=mNJ<|_YomB9alw?m4dMG(a1zZ)04 zHD>a6D4Z|aOYQydQ#6Z4@3cmAK~cP zj?Wcu;g4XcRgU+l)DwJ@jW6qV)Y4tuunM!zHdjrpK5?CEs@N%|DDg`R!q17}Cpq79 zY7Y-4{PUTFihwT!=$1qk8a?|iV-C?^N0oIQITa}!Jn%&4obF6mdbPfN?XIjIlg0g# zzOTx3-b+r;v5)AZ7X#KLjC?%`d+XO?t0(H4C>};TpH=qBc>(OqFlWYhM3g>&`~r&Q z$9LOF*2S~9So(r_Zl5@T`>~FPeT3OAmPJoomuhHXFqOy_%O;(_{hehda38zs*Re=Y76vpmDi zy0>M|Mtb;zb6#D41H3@GT9*A^MqCTK#V6T9&(p$ys<8aZh!!(OvoYoL9Ol_HWoF7| z14&gaS^H{i8MV+~oslIhLoF_d^_N2N_ba^aL$5tpG&m?&IJ*dS7{GG8_OW;=);%2i zrygJrDG#aAgNzH9ExOBAZZDK|LEEPVpc#=^U5bwW)I1`r$E-Bupl8q z0wOyOY%#}%I#5&sd%hQSCC_27Z!6lTHviWxmq4XK=YkU(Y$akKXYnB}P%4=;ZoNIV9W20$Jdww!A)Dc6BDb+0c5-aHi{{Dv;IqpzM~BG$DJ1LmPu<5xvC|?T!%*LH`C8S}={Y<3t873N73$P#jI{O}(T} zflQJv;-+F)WnTD};k@FzFk6HQ5>91EuTpTGMB^jZXX1OHIhq;*_6O$4gB&2}i=a7N zu}Bn}>|QzsAd(kFV4UVzH0FnO{g@`(n{g6T0%M|wo z73nx{dDyz*<{EpvK~BTgoFrV(4%j(FJydHcJLOx)BUc1}**g!|mHtX#EdC{&%s=0=*?-eMudN|biyxXrcx$z+n z8;32BE>9DGj-fypY^`N{#3Pxpj()@qmB8GMXY#<>a%N?@7)=iA6ul^XK#%I4DIjo^ z_w_jsR7)Uy&@ZzZ)G|hI;$hu*sQ>ZqTBd3PaZI9fcuS@g0UyVjkYz*7P`iLW9u-W* z(;uplU1mOK!`1~e-W^`fg3mjLuet{6MrYsrf1DY{Zw%80E;1D=x;f~*P(2k`Ny%p754+z<6Ufj93}-gG7F6!1x?qqMcM6JjUpYVx)fNMK5)Lr+oVnxlz6?# zY)vNL)_u}?5r-VPfz*n61V{Jt$4&qSGx{DBqf5eu(?c%oK{2RZv=Y@mOLqwFk}!KK zal8XN#6rAvY2ctvJqgk$B=z+0hlYmUu0P-VpMfSHgY#7?onGfSq#+;U2M6DLt~Shk zeRHCsV9rRE*m!xz|J`A5ad8!hgcME2$@jg2X$y&s7^hfVAMBwYueNR6+)_WEl0Qw| z+(JE$XUy94+42-O`aJS+S&Ut)PcSC6s6IiT&&8{=?t)3n=Oc&SAuyI9xPVN`z_1@I zL<1KdLjeo@cZN+9t*qL(70;7^|e{@yr!7#UJ_VNjHo5-B8| zQdlk-if+R#wR`?y` zkphMZAc+lg499N(tG{m0e!@T_m$575%c$qj3XaOi(SZg)a4ffAo0S{`Y)vpHGG$5 z`(J$J=XC@PWg87*ok4}zLD&jw?pf{fdTWeUZXk9Lq12R%r2^$_eX))GCF6XJ`3IRsJWEbaz{G_+1JL39M9Jgn z&HtYOM)x&&IR{y3v*{PzAfxEUkOEEme0$+KUqLx?behzd5NzGxT*-HWztiEfECH+5 z?76d()4_bo3|r28uc$3f}`-!Z93kkevh z5Vzf8CBueyPd6U7vV%1G1wV(5Uq0RgyuG~KK)5N@tEhu zy8)?*)M>+7w<5Q$Mr~dV9;e?tmqQ_W@eA=5LXuiZjT>W@84g69w4FOplVt`j!MonC zXy0N@Sruuq$gtwjkfPwfiGPD4d;363!;(x3>wNxRdNOv5dFvb4$<_lf)PsAK+X`!G zJRRA;#XfjI@a+{h+d8~Enwd?UKV>ecg`Cp5^>~t40O65q6C!iz;0U;0*dM&cg^z@S zjvV^(7W}1ZK4}h+2pL1Wo8^bzknllkCL=ft7HiA6^oje#DL3>PE+B2w~0 zlonE=eoRS-{U!ygy$^Hl5MRf{($xO@hr3x(<|>`_q0ki4Z}!dgam!-{>HK1HmtPi7 z4?+ix&huW~2@Ql)p4+q~RqZ)j=Ti4txN|06sUI~S37egREAQ%~SD8NnKKLV-=20#t z<|m`jFfN8a8()xw7OPIH`IUSY?JP4z=Cp1p3UyTe>3J8FoR8r*@J00;@!sWO7JI%! z7W-4eyt9g8xCoH;H)ht?9Y#zZ6?Qie+T<-VDAF=BQjS~Ozt{@& z%_rppPbUY49DEBAb}yiiNdg_aD7#%)vQ@Dd@5?_($U79N2Om>qJ`(;4Tp3^Nf|0*o z)bKyYr^@63_*R6q;sQHW0}InyUJdC&MBQ$kAiwX?luAXx>nVA*a^cZrC+32o@Sn08 z((3+zyh@sETR%Pd*L?Xd!Und#n&G9FD40g5x+g({=Gz`euf{FhYop*aqFVpF`b@Q> zF{=b5E)F^u)1bc0=}2v)+Cp7UAzdwYBv7L57-`8_t#!#MMok0z{ha_HlPRK3J%d3k3atrX)~hWyO+e3dXqUXJC`Otr7I>NsZZ z4o8&*UbmL{j(?1MY^f}PK#qw0jKA-I>H?(8{3}LIVtIa{Y9BH6yEZ44Yi{rZDkpBrZBxY;#@fi^4NRsxG!>!l3syA{WH&h-BMZt7W#8r_PY6A5Ex zjb$!3rvSuC>zmD${M32Qpb5$bEWUl^IqN^vn}yy&F{u!9E6l16KyvD_niCjEP>6E8 zqZxO?s(&PDX+BPeI_i2l8yTa?zM6=~8X(axX16BqTU6KA**fvPCBq^GhojKRU8hOJJ_mZ6G0oAW z=8S}rjC(Nlzx9gp4q)u*B)pR$S(6|B_7S!rA-1koN3-(+CWw|#_DSv=c|;JKqz_!O z!N8^09y;UGH-WI(@Y(Z;FB^8U5hh5Cdf&VKn|niJ{g4^MTh7F1 z%EV{WM7TlpkoL;brS}e4-|aO4(1XK>f=QhZUpt*3)gS8S6!nnm4Jq|CFBm53eZW25 zGt^BmW-t8zHF!A6!_RN%D ze3_i%IlySZ>ebe>yt!NW!TlOV z;H`vxp&K{8GSh0oESv#&|GM!}65@^z6nR+YHnbSi9crkK`#NtWoX31K=b7~wW$vxG z9Fs?a{(BtG7x(6M8ZHetn|2qAswa(<4NVeDBE}p~4T<9LEnWO60xb+p@+s~$@JnFd zj?U&e;vQxgWH;F(!9SN5m)_vuZPi`hJ7zdDNxB$H=$mKB4U#X(v&E5F=HEKdMyQ5e zeM?sg$QYCU^VY%3ris##wWOlHk(cW+$0$zmYRnmCfFQDO#$-|JxPQ*$zx#SzAyPb% zKlPAFn&8R3JT%AttMYg~Yd&tQ#~Y=Hx{)OlG-o~kNArm^8eDP_Y!>*Ta`g}*e4RQ7 z@YoOV*gq2L?k8=e+{=7hUB(Xgjbt@ui(AGWVxe;D90U}Ky_rKbGQ`a94zWbSN4D&& z8OUx(BgC#d#iOQ6nXc0}Ic5IU4|K#6vSlLYk1y6L44;E$x}(AzVo;9CDqLMSisRt9 zrhVE;D=e{sl~90?M{hUa=u8u^73xOa9SG&17F;0E(%|`BXAM!f$9#7BQy7_LJ*AN! zPtSu~$6APG#6EcKfx&9oO6YYh=~J+t7f*XFwUJkqaUI{Fg`*Ki*DyQB07&he`NG;t zNFGNe5NAbmhfOmCWQG9+MQ1X@WECRO71C-GcLukAV!LBCNPXxh))*$#Y$VheB~))J z+6E>B!Dxx-aJ#))t$~|9`l+2GLs;Dy-hedDHp^5;OYe$K5qRry-_!e3o^&2|>-{{pUU(2fizVNx(IM;I@Q#5ZpL&x^ zp)x4R6C^mXBt<@*4%h~pUZ*zG*IGC{!&@JFXghH!=Evc46$SQe#ho`lqzV7F|g+7ffYa21u6{J4tMAc>)rXb1o=mQr@XCKQ| z_tJnCDzH^?APs8w2mFtV>#&YOJ<*QsTrKKsK%(~)##zox*02-F*yhiHx$ia%u+9$_ zpl=t>gC(rY#ki;O!=PLy01$9y4OCD#m9j<>^ywk9)CKQXLGxg@e)2 zVnXBmwR5<>+wEIGIFZpl+R-jw8a3{e-<0Q0UZg=)^3Ft%@P zXP-6lXHI-ids#3?X@fg?&!O=9Uty(ki!9A$!PBBhN0z;f{>^?Kw|tdT>nLsf4fL654)0=yhsaQ zh4p8JJd3(dgnZ@>E4_+dPl#0ht`;|21x!Xgu$^b|FI2w%Qu0wFyl%1Xnaa=CQ(t>!nHNwWd3uwm%ra){Rh`|CCj>ftwMF*ul@h8> z82=DUcn{~zErfh$ZlQePjc)E-9r9YuI}Y6dUcXl=-FNkVXy;GuJ?=&p%=&8022^); zIl)Xy93WV0rhJ~VOia8KwtpPyIfRYRd;W@I}n)-6^; zE^{jVBaq%(vpc4)W}X$CwPqHd68s>b?)lfsfbAXbx~Ag$*6g^Zj(qA&Wt;T8+eR8^ zRMPA0zhKtC%GBw_TGeP$&8lmIn_=ciyzw`arQB7J4)~HHe|*%Ze)4nVHEw2Mu~-hi6Vm{ zgoI6o5sTF~1VVrb?{vS#5H9`!DFj@4AImc%Lc@nWF~pYM=TBZ`Gi4WuTn$ZZ1=1ci zp$r)`@)-2~J@>+`6e7X(?uHn^jV~=xOP9gR-Qkj`$BeaB#O=p^`(v7tOe)gS(J=-F zbGvsIbawiY|Br=2>NK3$+4;_#eGYLye0InXx?(gHF(lyMnXRlS`vcc(nxV@o$$3Jv z_lOA}BN;|Mmm(@io)#ldY4PP>EUUl-Z7u}UbIMch(4b?;!fXyp37~ht_iII)s_xIx z-`25|6yjMrl;gh3vaH`ZBMoihMG3H>c$pH|+myXBO?Y7?H*h@N5QIN6oOBu}&t9_oyBJs2zHl08iOhLj%J6&GHwwxHjKqem z(JTMe4lZcFv-q7!T2}Ff$5gRBum2*nxhV3_$Sdrs26McDSi<{~cXK(3qE=8@=MdF1 z<5N`T+2?n5kW9d8$L~y%iu!xnORMcUb?*$G?Bsuj{$Wf1if!rn<%TLq{R{%LvZ-*Z zyVZvaI(x0cjT7MF;C5g*)pa#XBc+ z97FQR3{?u*YzwvlLj+>6+V$E6*2l zN`M#3i_LbN<}uf` z8){ig@~VIbU1&`0KQ<+7j)$fOA}Pquu6v*2{fHYrCG zocZ8m&SZueH64S=@G7be2l_qfSLg#1}3QtE?l)aLq(}~=*gnu%7b0_xa+{#iu`T&>LZnm#XyP6L{dP|F=fYf(E+#+ zQxHPR)-F@^_-n)kUho0Wl(Uw)@eG_zO+TnC42bLeM*m7{|CRANDT8SjC(t&uKyolv zV_`XTTUHS~eTm)bBvf<~w3%Cp8=X(46Hc^n3FQhQ{hC)L=x;FG%40PSQ~Y<~@khg{ zzjjY+g5H=f`$OCq=s{4Y{m#F>Fd)5=?z~6pazKJah10d|lv<+3ZK)8ZeM6f2(jX^L z+VKkqB-#1sSMKErcUKIGlPhBV?^vmoVH(@mIBRc7#A`~5S7Ro-Woo%&e!7k<;%)8# zhym)vK#`^CcH@5G?~%}-djqY5eI8jt>sSHpVqis=RW4y`nNWSp@BgO-2uWU8LjIRW z&wf^WQ7!LRMZYVmHT6e-j&uiXB5tCz9gO1SlVBBjnoz>2BixyB?@cE#DxbEl6MHrp zdjh<5HvHoPh!pet8r`0WDn}uJPI@bvlY%F8AJwYT|7_?h#SnHPiq!)r?1Hir9M(b7 zfmt;aHR3pI&W*F<)Mrx;)O+!Xsq1s@PDPdv0?i<&kbBcN9)vbsoH z`JXT@EfL!fje7|AmNJdCqfIDW`ovsUD3N?*^J^w@ zbrlO7_65+8x+?z351u3rZsSk9};W|?Wzx0%_UWvkyVU3c; zkwfo4eT9b#Js-M-FwN~Sh{jim=IT3x*RbitCTQ-r*{E8 z)T{5%?8R7$yQr0^PZ0BW#Diq!E9@*y_VD(ULSQU$mNDN5|O+sy06^SlK6rmFR-A;Tr zD6sFFut~v>jKRyh{ifF&1@y2`xKgw~G*Y*6Zi0Ohu?7mXN79sIQsGX$ne z$Ci$2(dH8gfg?$QtFh)Iq2^TQcUBO733e#n8wS@2i3!3!wXprZpMb@!AJ1-KRqrbR zVcYzP&TidLq%G_WZc~=d(9@yy0D4T!UpSC@3m{YwkF*d!w;(@@>7#OIma3y$(US5RJ7GpV0IU;*y?Hi)$t z5ag9G){!*l)>zPXM4eFo6_AG=lW6hnLw=8YzW1q`#ujCb1RTO;+s$A=PZ{ypg|m9D zPrlhEyT=e~0MYv;!9cI^1l9GVHdo|`HSxm1dQ_x+?T3M={g$JFP)GCa(JpT!FrJ@U z5SWyBYss!ByK!}Kks?b8Cnc_HgtD-vw4~|qE3?*-sova3Z;Y3FR^EaoZ#1}_5T=O> z$p*8-2{U57D%Q*LHSt4x58QZG47U-S3lK7-_p5SfP5}rZIU6PFpC0` zkWyho9;3IXu;2(+G&+ny(wRQgR8v3-fa%A2e=6YNIS?X(+UgA$dwJn+H0~`00CL8X zN%uj|czAd_Z_l9rfv4wZKTm#QCMG6L9i92Dt(lc4-UpZMmZqj3WBX>dwlO6oWH7L> zem6T`yu7@A|Nae;KdaJWEi5gSYSQZ&86AQz*XtS^TLA!BDJkgVnZmNZJ`xD2#fT$; zB_&8QE0P7kminePK$z0>8uZN^-4KOFL8FxsIkD_QyJ>ABxz7*IAs)&HNNe7Z5pWPc z>{NMU{N5Y8E>Y2B6<=<(8qK@q#q9RCdHglW&%4_?_EDJ}l23VIC%xsGzVu?AX8>uA z7m#uIRQZkaCiyxb#SasALe!<$Q5wIaC6|EoiqWjPJ#pd@VV)3g+FnjOuAa~FpUnxJuX=MGsdqqd(N(F} zw$yQF_>2cb)%r!aC>WraYBR`^MJNdTYIa#ESY_M(3>7Cb!7vM8}DP$V7~z zr8<`E1jitXsNLpXm(0qK!+7uS|RP*(T?dOO3z6 z=AuW?oJpYU+w|+S9ZLG^7wyGr7h5_zW6c5xvw^YOEa-4gBIg|Ex4y3Y#Jof( zj@;`uL1vfU0>Z_OH;=&UM@$50kL_tP@>JK|SAkbn&GxV;+Bn|AnL%BY=(4{IJgCgA zAicw5(7QcI$VMc)^}mq*g(^0YNHr8#&AXr6q^c7galnpvj{HQt#C1F*|2iCwuu)BTF`zCOOW60gjh^6D}1a4I2wPX+y`_jCdC&{}L)YpdyGxjUJn( zEIC0*VVQ>Rou&p(Q$tBZ-=ZN8l$BgTRk(-_B>L7HcoXn^;sg3~eGtC0Q+D#*dgFV! z301iX#ZRL@{heV=eLr-#l6APEz08O}Z*Z0P(CZrEC)6;jMCVo#bK%y2_`?|;#*Ti| z&Ufhe`dM9DztKRD#!-GT`|^E6AMEl;Z%ATM0Ji6LZ`{R)5t|Uq)k*kD#$|y5f=u845;Ai*H+L~d$`e1cc6dB6$fPCGx5)C9XTxE4~WF1iQ@%t>Ln2iO*CJ( zyzHJN2YzlQzummsB@y=zG^b0w`Mw~C6fzu7RX7xM2Zke7_yBahv*WEEA>>gM2QIVQ z(Hoy~aqqxsD=uG9dyGa^JfBxhOmVOvF!nmx?PZvax%fFWFOAgK^BvFSin!`<4qm^w zpybestq>XezGKT$5&WYw)TS=6*D9a^ambM8EER{FTA-O$2E9Go)rsk65x%*kc5>;v zu)@%zp4x^*&>3A+1}1ryJc@Y_>=u|s*RCm{h$K?c ze~Q4dxkwv*_E)KIr1E0SDQ9F~-3;Vxiq^sU^nfQxtY3?9`9k?Z1)Y>jHfXU~4y!Ns z*p{Y^bmwN5`)Ocv5Q2aC#!?s?Vq$doUS9AR#|-v2PQCJ#t?5njJf>jpRas5#|1R{A zb}+1vhS?~q*h9^I8+S77L5?|#MonU-wIRjhi>vf0u^{2Hl6N-NU_5HWPUid7_g(Hn z9TG1vv=i67tJq?{ZL>pO>uGdF%>YRhT<7w?E-=e$cOMpH^ij(G848* zO;tjJGC(@;{h{s{eU7i5GN_)Rr%P+HwJToG_XCs1xajBEL$YCzk>u&Q`{cIauD=4C z55IipvewMkRjo5i>e`yBtxo>)=K*$ospR%QEvPOUGUYG}DOHs9u(XsAdx0ui#WtH?T#rfdPE z^fjiF&gfrj*te?XS408!y_8p)Ypxn!*q@)b?{WCC6bPuqY0HYAgW1EY~>Da z{wyf)$oRv3hZ5Z#6E&)3X9-st?d|CsPnfMtMuDs_OKD1Ed-QJo^8VoAZ;R=N@-}_N z)d(l&E$7x9-i3KE>u>CDE@BWlk8v@f*!|A!+RaN{OfatTMC91<=zhD!T=l9xk(DvH z;C5N-7r)DHQDCe~AIbVKV!}Sl-|^z64N%HRL-drlplN$+Qs&38?HFM*v-iF>@~$fK zPl9?Iz%7gr3&TlcqxG-qthuD_DOADXo+kt`P+H0ro7}$9zoYYu|KT5O(2U`fz&2=%_yI@47NwK0i@k5+Rh%y)yBrS@`w<@#|y1=W|!(x}uLtbXKs8^mWn@9M)dstU_vJG>* zDy$)JtzLIu?58-!gVK;k>XMqV8Te{0MPW0MuQ*$Q0J zA$Q{RMbn>WAILwdU6)YLhiBl$)_(T3v0RWqU&yC>I`suumrP$so54N0ypd3A1pV`o z!34zGcQonz7@1t(nWNg7t16JI3Rxj`Z;OXdOpoQl-FHA4T`uU~*6KGF21h2-UnbBy znLKI{VmdI7_OX8q=cPAu30TO(TGV=vYKIgjH}d0a@#7i&W^2Sj*ztDLkgP^!YrG{h z`ORA5&er#G>Yr4-k#N}9xHbWJi9ZLM?Ap_$+w-Io;A#+{Y7p?u6R>EU8;@#6zb=1# zfd~VCtWOwX_*ffRI!l<->(J|!#Ix5Vvh|{yYcc&S=Gq~cL&MjnnomEEUGw^->Ha9+ z-f=0iuBrM!}`|n+{ycnXHwfQSxO@wzw>My^+}o> zYpvIGr(!-Bht6$IG>S@mK9CCMZEQ*2V_!-v1g~F{qKUU}%AXC2`UFSQ^T$qmd@|dP zq!sJm0r}XnA!V9(X0ESRdteBX^0rP6==VtNonibh?)cB;CvYpkyTk40YM1?bJ)@qw zLW|`gBM?D*CX}3xEe?x9G>p=Hra8rf-ZJIC^sw$RkC|Sf^P>Kz4b=bW^wWf{jOT5% zRbGdT4QNXdDxlyOYO27&0f#Z090%Q<oFH*Es{A1Fn~`cU>8)@*XkyXQ*652C+MZ z9q|6brM}UfG;as@I`|U?U}R`$X=evX?Gvj|Cu50&+x;$`4_)>rX4Q1Kf&*ho?^Yh` zqzKvk+BdP$B4Qi_uWqD1jLVU+K5^k+d>4WPc&BxHRoLOa4GdcW!564RvGx;Dx!g6S zG0ZdSpd&)FJM6S;N-|>8Vj*TAF!^>HXByg{W?OGGOw$h8S1KE6HeCo?iKqQ#HU z;>5p=g}lK6fj~%ZAbT#7$ooBJe0==3aIp<%9tZ<8G9m>@6NK!3duR+X>i=O}uPs+K zU(eTi%6YxjTQ+A4ndIrTs@V7OiWp)^7V`NRatt}c@V;BvpYQ)W?0#N_k%>u-IXeW# z_7lf7f8s#Dl?cYbY!=-2 z52`)U4~GE6Nq~6HbNHrz2lg-pizw_l2W~;&JR;%(F3vAa++T|Z-+ijp%Jdl27_8Aa zs=X7P6Wpt1%k;$){MC>}B<6w=Gg{*FF1g^nc=GxbR>rP&G6YRez+^>5>!EH3B+h=M z7KJ=FCsuU}pdO3ZSqywDe)AM5({qw5_mevm(+abx!BshuS| zetLR35-Mt$Dy?d@Wxg$KU{lYab2HvP4j zfr|hO_YD$x8EVU^$c|5un~*9yN{c0V*SX>E&xH|-h7v7Doqk?yQcC-A@p}KY$!S}3 zu8-~9!j&+7WZY8U)g5`58Y5N(D|u|`&*j(}T!_KM=KXBOM0rS7b1=u)>||0*3%RJvQH>8Z!!#p*`b z@{01FP@VXo-*>~o3Q3AXrKS|C4#@E0krygz*e+`yOQsg+iZWu+;lyRcLDP>wEt-e= zcMgbGh?W`tRKu{t@nHPlXyHV}*PbM=#ZFz656yHhI#h>@qzZG$XusscLFCIb&x)zgZ(@B_mhAtk)|3uf9rvrJynw;*{_2)rl%pjxTu0`pj>%mO zPmsxLJ?1u(w4Xyf#3m3GWR2AAhy@w>j##apaFCI12{(U$Haekm&aT)u$j%iP4k6dChvPwt|4;<)f_vh=DDKZTEA>)3rl_JJ#e|_3J0py^ z!nX7|{dwsd5YMu@eZh)=cyYi5A#Gy zyhDLjkR2^}T;)l>{|bOxrG|&bda{5iphIl$A&x#7%=f`mUXy+Cw48RYv8QvPYJ95x z_cx-woUB0wZZRUN@@Il&CXN>R+M)9hqZm3X*gTRjY3c zpW!Oej3kLnT?~cc7`ksb#f{5K#Ao8>s}59Of7(qSg`F%}!qm@RugqJD_0v~>Ow|6h z;WDOtRin?iv^T=D${;K+la_<6!8jid5Lju-fM?Fr(R{TtmTH}v;7EycI^TEyi2}IP z_{*M0jlBNA5r`=KIU_f7Ctxmh^?gh28@z!W~z6t1HiKOd_$ns`RZL}K_pZ7`f z@R#d%_;E8*@fclin1uJ&=ojH&8y4YDR_Wva=A)d;v%W|xg?oaNGP8JPYYj-leWxN!Dvptd2Gk5Jfkk|UKiBMRiv)F4@xM4!V@2mBotoXbeTI6 ze$Dr(D6W+_XCgnEs2q5k$t0HRL7Fc3MF{|+@kS}3&sL(yIdv{rRTiEz?aNkqSee73I;Hbp!Iu<287DN@P>{;xRmtI0Hu0U3yCEe(C>OiHL3ZHik-X z5~7ZU5tGgtS6JqL7g5MPRb2o*R z)CDxxT`_n7g{g-ab^X!e?DPc$c={2HNW;j$c3JLhntX*+;Mj!Kz9q*cX0i!HPc4=>ukATYA1Bw*+@KbtXc(a^(0?nk7i? zUoK^}BvL;xK|*L^3TU9XA(B*mjWLn?N@-2{U2$WS!wq-n#w(*&N3G{AG`9gb-qrY% z1Q2O-m+-^>$1k&p3@@ney7W04Ts%NP*e;EY-@_Aiqf}{AdDl}jGo6| zupvLu1ywkF3l4YKwBN^cv6Y+71pd@qbGiuG=spx4Bwq8@4!UVCnZ8^@Yyci+eZk$`*;5 zFCM&9+50GfP4k7a6Ab0tngy&E4<0J)VPOCwR5q#J2E9Ydx+5sB+Aaex`Yatj!`v>! zzxjNZ=1p~=Qi}(j|HqqKjfQmW+PSYwY{obPhoVAM#S=P|KCm0Rdq3*xTgKbl48HSK zxWeQ1LFyKWn#LTuinH(;Y3kZvF=V^A;^kIBil&Krzjn>1iJB%HI&+M{85vx~ zn%_z`0Yt8~XQPf^h3h^IHqH{wK#|P|Vs(A2+%CV{rqTzll+8V8Tz%(t3+q2yfy6_O z*sgv< zAVZ4pi%}^j;j&(2lwHY&q>?qrY}Lr$=U_x`;hlca1)){54P=nTEZmq}jQ*$5^&O*- zw3_)wulOHq>e<)gTQrPt(pc_+a%Is{P{?{fR*WDxx%G% z-q^Z$4-+uTH_)2ccB;Bwqf;z2dNN5!Imvrk{?aY6#N@TVfXx>1`7{-M?X&6(#+L}BxzY~YeW)t1T*XW1c5p#tO75k^H+)P=2N znXu^unb%7?OrPT_mXA~A#Z8#>&tqVQ?J?!)6&(VL4c+5-^#k3n$J!66KbMrZ$LYMJ z{eypR<9=`bk#8Ti_bM{4mgO&|Fd9#1fB+T)+)QBPKYjpqJe7OJXW*z4cmBw!CwVq7 zx3F-;l-0Cj-K~2Q(#+0Dfb88(T(2F!XfIVZS0^%N-fY^s3em#-(xms~-+bZzCN==s z#GMa0PO3!p=lm(;1u$pY8VdoMAQ7fQePU_~i8>v=Y%T^e!T-;Qi5W51q{oK10?z)t zbWz%{Zq>tB<%|u4X*L`__ADzZkQQN&>;hqD9S?o$qKWmEm-TGN=!ner(0t8UcwOJ| zHnre?agp1oS-qMr|`a@QLVU96*3w$ z=`tO#;=K?e{SYGg`Pfv*iOJKNc9Lgz;!$^#ymym?hcE-YFV4OGPYV#mbBkos(yEnB z6!JsBjZo!o3AVy{PkHO<=P)V&bJ>-qp-t53Ov0#z=0T|FfNEpn+I4i+BDrV;hcBEf zkU-&t@@U6x>W@WEm<$_qpA(%gp2ZHU^e4LFRx6(1F{|%Pi4R1&yuNQsH1?M_sm!NX z@?0=>(mhOXU#)UcCO3uD+Vkjp*?e>g?JRq>;Mn*A{>xYr2d`V+#Hz!%=3}m!h_nrf zqz#F<3(1gW{@_{4zH6k*KlJg19fr>xsal@EEVpBd0nEaivN? z4MoVb97H|wBk_@eD=Q0vfE+Xl6f|*l=w^AU7niNyKAd*EFJG%x9q%CBK@gx#K|wJ! zJ#E&p&W4AChXk`=&ow_kKYr+r1oIW*4(ZziEr%IP+w6-L@;6>&hYSNbMR7#7QXlB# z&EejO6saCH_iN;`dH#U*YB$VlxFSGet+Yu7n?y{2R7;~#Fxr4XB+kRl9I_vPR=sdXh@Jzz zdyQBLkRhzl(w}-2*L_r9xTwH#4mbM;48%kPKQ<*w0?~$)lKI*gNvIQK`q8my^fwa7 z&T3Djj`ctBxSNp2GAlcK`ICgZZ@W1Eum{|sPOnKDXNBOG3c0tO7{idtCfn)Xn!}Yk zX+dYgKR>c%dH*6DMU+vR+p*iFn)?-*dxeS{jGPIM$QPPd$TzF&kxHr3X3^qE#zh7y zm=}o)%T#EVYcs1gYW~UuE=*#dWzvHdwTVG{;^7t2>4!(KO!c*Y>|6iXm(84sCmuf2 z10N9L+uRiv*%RGUr6F*qdLU4(+<07#;o#R{>%yHL4uT)Sh+v|45hSAknoY)Nij~DW z7q@kx#g2ZJGE>pul=4t9&7EG1D$`WBxFi+$SJ6sW(Nb6GNKYw#Aszos8TEKJWbD@C z_-Q^i{o(}-w~iV()Gh?O(h|f1X~Hu<&vJ6yY{{%Q=x7dFSN6Vo%QF&qZ1F(ea^4zR znhscPw<29{zp#1D`g*bA9b+WWXZ1J(S?$VoGU&5BC+)WclJc|$fwp?-uup>Vm$?0l(fAp~!D3(-+xf z)cK&b>Ev{5TCF}NEXsAzKd z*psf{%Of;3smqgCQl96=lE3uV9@$AmkQ8@C%*Sw2nPaN-tqcQ&@|!l+#URQ?>{m7%MgcwVYtz-%+&n)_ zu6^n=2n4Cmx6R{bYuuI`T2Ys3i!C+B)Vjpg^jepb_1W|7guUE%Q4ln}x-x?m7=%iEvP+l?rh*9Z(V&c;CE@A!=WiUdd6lx6#| zJ?4-+C=^Y5-`aNNlMM0Bf59C64O?guJ;ge8o=cN3y(wkZ7rhjWn|R32QG>W*_=p~6 z-_%i_fB|Bi&&Fcg~ zBw=Gm^Oz63$v?c>aDAc)X1^-3X8tvt!M0luaI<2veRo&12e6%@m2y zRg&omQ~949%cACwL(PcCYB+{348X9cN|~WB6&VgoE52Q8E~chD_?Eonn@Y5OCAOtI z@f>Wnae3~6{JQkTh_J;IJYY#MPNXuy6)dOWvK@b)&75136v!=0aV!|Nwu`n|3}kT z0JYJz;eHf%cXuuBTHK+yLvf0`y9ald;_mM54#izVaR{zA|Gjf(-fS{wXR_Iy?Cg2Y zBd@WKAEe^7xkVQX+tQ2BVi_<|SSY?5$WYo40e6=k>K1aOuPW#w)a~yZzOyNf@9&zX zg{lm?n`JZH;hWVSll&{rb30C&;4WN1)UGV#7#lY4l{Jve1Rd9SBr+N0n8VY1*nOLK zQ1gU!?Mv%*C^S-82W^WBNvnwm&;Ghua;Gww*{S#Q#*f792S@|Qt}k4%$g+hbE>5potg;+_&SlW35*{#E(P;z zDptAUT+CRyv<$hJB`ZO4K#7Gk{X>ZY7fLOGOqI>d?Y$;zSoRjo%#DGZl`wsvMD5#~ zuM$wK)`NVtOT;ZCTBjx%za|$y_OMB~%#FRw!4Bxcyy|DsMYz3Zw(`qz_VkCnBb%io z`Kp(SmEX9V;gN0-ekx(fY{<%~Xhnmm6O@d_l-XS>PWw!nta%lcs<~LhW6b6c0`iO@ z%<1MmJGxD!ttc=cvF)XDfgw$1;5n4z!DJxCltaa2xbBQ+6jG@4RjBM%s1$jCPsOd+ zh?h7NuY8HIfu^z!l6CXxL1tEY%lPS&XzeTGCS1G`P|um~kty8Yyz>Q^I}K6z2Th|v zLc>KuvrJmiqhI*QUhzowo8?Qf_IC}7#@o+~LDOHT@|{zjT2P#I!Z}zs2z~sh6{yHeuTHXWKvKfXkl* z86VgGwb^huSla$GQmO3Oamd$tGorAuC*A^2UUe)kyh`;YscPAm;@BB%NV>=+f6Xde zY)!t~5X;x4RHKw@UuiAj&2xxY*;2Q{G~1!Q=|LpD4#jMOrCIJyKSW&|Yg5}V(>ZpF z{yeJ6cG$$}r>B_hg4;c#0BJ+T&VNbgRQ@KXzT zvUldb4e7NnfS}t1cwB({?pOL7vb!xy8J(RQfX&+gMaQn*-5RV1+C6vh49zO$$OV3| z3H|=*jrB1Wv#Fh~xTz+(>JqV{L=_-ca@U0TZ1eT0f98(7_t~=t&iU@#_C)sslPqBV z;$)NKBIzHN{Xq1N?cg7tU(5K8HnC8DY4j;M%1Iv&E{I0nd}F{g3;XsGmf`fzOAXfD zGP8o~0N(aXwWj&1cdRXU1&s5I;oDQ}&ayh0-?r5jlik@y#k$PNv*xnVe0P__b`9Ep zC~ztwCFQ~n<}lkX@!Lt~Xlqx`*Dl?|BO=(cXU;VWy?aPP1_Hqy$n5)veYI>9pw1{QZliTLT`O0ry`4e*mK$unU4Fxj?ld zBRgB1Cb`DJ#@-$U+*i`Wg9jxd#JS@gKH~###lCvVR)ea|I;p7xslhc#T{uFU?toKI zB~FeFMgFJo)zGVJ53qvfZwEz^-X-T(vIm z*zmi&9|I1IIhJ%usPyan{jSNy2z@wAJUi#@_mD+DB&AES!cQHvZ>i zs7!2Zb;ep()@N>ZLZ^1t6f>pF%I+6D(Ge|kl#ZX+7oFzv+2L>?SJqj(lg}PwI2$wz;0Sn>f!3HN29MeG~&yY%+iXmG9qFQnqbm9pr zMOXQA3e($ImsC^ z%N;b!9W}`xInfX4B-k>9G#n74I-$ftO^^u(H)J|;#z!!TQ*C%|f;uVtbG>wSG#9iU z3$hh~wd3*ksCIBLRz#d;VN$7L`B}HBZCKv0QQgF8RLFEf7s*$-tZQ?x%_PBxPj;-H z#2%Bd`mm4R6Xf^I9#qkl0n5zhYATY93Qips7Uy{l-RS~m;$N8=D%5v!Dz|8sbk;{| z8;R*_7qqs^)jZOd?>zUkIayqf?YYJ)_;}6%9(s+< zSR`9CO&lChM9-w1JrKP3M*SR*n6da#m0GmQ*szWS=dV>I$(Bf#s*o&aAw%OrwdjR` zpD3Y8mC2ZdBX5RKqayp_oT}d-)~an?@smoAE{PdS23LZ;P=Xm$)HJx zJ&A=tjc@>q4Wb^_hhU?nu#mXRBzkd;)2ETIy&SPcXQNde#~ugXMd~E#b4O%MB+ng< zm#Uem(K|0dnNW%HWfkJdqPe~OtV+r0@C4JP7mZ7IiBoU*yrtvK5auH z2?-3}G<_fm3-w2rjh%YAr)lNldT#pxCU931khjG6?$Nf-X{{ni3kbbK?HZF4tTWpE zW9nbIK0AbiT~KA{`Y20;l{Y-Ysy|Q)LF9#p5IR%eRX3*0z$B)gLnDLWzCm&RQ-xF7 z;u2P&s#u;s)2K9F3~Iv$ztdZUBP?w_3=JDhv35vPyO^_YFP}-AjvNmD6hFPlq|{4W zqW@?90PtP<8q(j}D}Om%S=)D6UX5K;O;}uwPhO4MREOHw>xv6m7PVy`1)(Q?!c~as z^<8+U)@SYQ%H*mKQ1Rt+|6#dsPb$6bgC}`yY~cg$c^`l>GVjKDNSt9t$=ky44F{Lp z1C5-ZKN<7pWD9DE8N&(pUwy7^ztpTH<#hu&|7D7;W+etegqE~bd3=+ZaDS2=ZdG0`Q%7&1^_Ij)J)pAy+KzBkar&IQ!D>xH?F)8t zk_F9@M@8LNQnn*|c$m4n$H%EpFud){M-Wo0{xMg4*8|Dxi6=&6M{zE;Mv%7&@Oj>q z>3xHor1ys3)eHNt<^zvkiL$#>%J!Z+ai1_0rWXC8E4UBH{+Txg<;{Xg{2a8lhniyU zp~EI{S+Dy1zi zy)I1IHq~@T?Kp$iwPESOTO&+6b1 zaWL_waza7MtI$@-l2%oaRdwJw+&O8EKvjiNfr~MWSKcJ&I46I(8o)yj&Da2+7VO9A zJ7?v2)p*)DnshFJ^PN`vop|dLWb@sri-3Pd?&dH5__lWD)_qH*H?D74#Vhkq#2sqe zPDw86{ST8slNIrrlv3^SIxT}Ekk_3_mM^&?_hxWQrt6)h>?Rl8TSH+Y+O2k|8HE&o zDj9k_1|T$Y3>+)kkiQ&Jyd(==Wh%_jt3v~?37ymOhnd7F&?wOmOJb=V4Kro>g4f5y z)+{AiCo?WTgKhkSh0>vDEr_+M z)zmpO(tMK2#ay+I{qXT{xP~KPlyKrO8VB4WYMhf<{RGZhnke>r+{UNTC0lbV6oJpT znh)Hq#2@F80h$ETNIe{Y+0-A`a)mCRm-db&^Ib`Or~H=Z4*?S`k1PIGmrk6I$o6mb z0lJoNF99Lvxw5WtP;zQSMI7-1iQ>OwiW*B;5hY{th!9+maydd~GsUhI3f!m{I{dE) zEWg!oEbLsdyzKS{5E=j#s{2rF#%7Kt{y3HBX{@avv4ccP8N4Xpx63QI>GB%PS3iuX zoi;1wW~;$L2Dx6Pxst`T>>P0vy7DCHY>H-@WIXm3`z>+H5ZDf{8ca{Wt&mR3`xcv6 z%T1kxM8VK!aRbD~)HZNAI(#`880=jatXmf~=z^bFE6Xl^sBO4Kc}PS?bot{@U{3!T zZ|Tz^eTDK;O5#w93oN|2=oRE0hsT9lpe! z&yG1omSWH&&j2PBQ6>ipq+46R`Xt{lr=n6TR2twnuBQr!{;NsBH$PIN%P0e3oOQe@(^8C{elkrZO(D#o-p2G*02iQjva zOnT^=3;aKzD){QAfI;WRpR5{}l!i9%mN13*jsQxV1Mc{Y+K-%yUpzb{W zvGWR-m>GRD*H;RTvrS%K$j~I!_XYaF37se|TEu92f@liFXlNV)a7hx(V1Pi>XCUf3 zlPCpdQT|+Qi)e0xPis8?lTVVc-(j00=Awfs66An~R0V zAJyT2`|8;)XMvEHVzoZ3_7|eTC_#7VdO$--KeWOp$S!w?E@yx)XXHpAe!_#K=o(4t zTK4`5^K@%$zBBHR8?h*mKWfwotK>dg>sE$Z;TRe1ejuUm?*NEs2V)B8_-La zj-ImVKW{ofZHJeJIsm}^bB(eUVC%RI&zW1M`N9}B(0g>Ea5L3)JMQ4^#&v~rp9=LtL!94O2gBbvo-GYAGTP%ifE2ZfRlMP~ zf35_F#%my_-3|MBo-i)QP4jjIL*&@UjWh{4&$!sv1wrx-6RT+x%W1!>yNh&d0s`Cm zlG?Z7ibY_X7*i2~$@V}m<3JExaG+t`m=$N?(!Y7@78x*5DJxTx^0j)c((eA3w;5P?F@R>9FoZAgc&dr_9H} zkLp$OrGHeJu4k63466hXt4Yl^8*sm)p%YbahlFdc9Xh~2PIq?~mB;&N9LQ0u3NL0H zq`HH>O;3;3llDW@>u1$UIpT^kS1FI~}lH*mu>rK|lc?$c%kQ zjvhA(D_TQtgn+L>Mv5s3C%PDsnw>C(8EXPd-b~({edOD}LYYdsBqkgg91s1$Lqp9xz^G1`f zYHf1LG+7G-swQaF^#hm|lCmbr0|3*lM4GmsI8z=C!P_4hPFbcj`wylxatuXuKq;Iw zMkpmX0EB8^BKRkh948SuNmK&L7yuq(8irU+Ejg##HQa%j$nt68!}i0SN3U;vcI88F zz1I?P)8ixY`)1!kyk74S_+@hb`2Av|C0fYmvEK5@@bO}6>eB#rt?!%+*28azrwbKy zxjM#sTgH*|aYA8wa}Ge`S{= z(48!>dsznjbdt);H|YlPiW85W`g+D(m6iQF=bhUFUE^K7=iOe}C_HRQae0ysonrp| zXj`}kJJ0UW>W=6kbZ})ASqeYV3tu^*Kj;xkqp@sP$JZSaI1MPPyMK6IA@OZ{a1yt9 zlKPIuFOcj|hyNay8ix*d;^$8|t0QAG5dY^L%Eccj^hyxT8l#9e1WZ0?i^W_-!OX}1 z!?`YQS{!|xH^xa~Q1)`l;NWA=`gKP$lJ{l?D=@Brl#rV(@mE1*K~Zg0u3{phT&@#6 zA}`VVB~p9L?|tsd^j~{K$h-Xbn+V)rv9=Js2rrxVieFOTu?t3Lz* zLBBPF#j8ean#tGnL%%7R&@)yPldu((5M-MQlNk>PO$VC>c9ujGmO?sR!I!MlMw&j| z2=PvAwHdKBdttKlZH2zy8R$@vaCz$-a&(2>z)_-lFe7O)bF#)&v+XCd_gJ> z;c_Ay)tfyBQ-9EWwq272xciA4K0;?sC>GQ74(~ou*Uo+qg^l0y@xlT%g=FND_W$+z zZ)z%p7dHME=`)VaTwA-3^1ind0cfZwgVZ;=@9o>c8nN7=hivbAUjN||6iF`C%_-FY zZ5hBlhxXyl2SJ>tLRt6^MTfljZ3?!Yh?@^7wQ+{N*|(mCkZffX$JZ76TDSbY{c%)5 zPqz?QNS@Pt@3=+wu#uv{lcb_0R5pP(tk^Sn`&AdH0?4*Ea{Dnq&O3Q4OBUnhEvb58 z@&jL~zYn41ZxF^$kc+(}6s;sldF1bphTpCrl5XiOPOe65{=XLB6JpkIWBTC@ zw%z^dzg1G-q3X_PD_wckN-DG*N}Mc8Tn$WD1(O^vfWa-ofS}}j301CZ(!|R|8bu0l zi4#XslK^^0y|G(%#FG%zaG=^?o7`xXxL7|ke{Zdgvgwt5b4NpL#zkn#mHvx5->f6S zq$9(kBcYU@Mtd^CGuz{qxyqE9+?1Yky09<1^oczBDx0aRugsWFY3Tm)dhapcKt3NL z=p3N8&nq94%mhECb5CNv5w!?%mLGq;(+(nWvto)SerEQZt2t_izX2|@$m zOR&jv=jy^X0z6ZG{pbg}VaA58oF^SNjCTsdbR^1H`HkAK<9|`PfkmHS?d~|R>D;5` z7{r$ZfNRi>RIlWE;?9jqj)}Mta9um1j1lSWACLXWFv_9kbw)ORW?0F)o_7rx+X6)^ z2nme+U0RaK&k=pS7j)T9XGPi`6xtTmUQ!-qSNb8;e|qR5*ykI#A7Sa`_JzdaKyfm{^ZOmVrZ(M!OPqU6mk*3smB^}vIm;$-0_K;u7OjNKhG@bOs%D7Y1{gAUKJ*VS; zp9hR}d>!)D`vNzooW6cF=wtW_pLF|@CD=*k6dLm)6r8C1;zi6WnuhHyBk&j75{O)8 z58JVj`i)4|Hj=oRJbvk<-ipRx1D8r2HHjf=2PkZm;PEu`>+s$dNnIfjH;wgMSzf^- zkjDaFhfn!)zZ+hDJ))XR4*S@GhOwXgg9?O#)2F#mNz|1yPe;*+RP5Bli-Ip=u`*QA zOZcJ=cLj_5iB)>6t5B9d{yWN<-cE=6Q4L?l%Bl`DLg z5f--jVS_!cjx(W|MJ1fv{s67!3HjT104eVmOu9&HS8nG+sHE=#MP6j&O#Ub)^Fdt7 zZFrR@C3g2dLY@`0QFD}sL8|f=Zp{He^JeS}4#5BENlgBkNNfFU3WB>O5Uc(~G!&22 zLOWPi-bydui(f{=xI7Lhdc!b(za{uI!wxtAF%MThAEX-H+&SDE>3*%Y>WN3LI>Fkk zg)vyWV1$u}?_`b~&6+v`onRQBF%{ndUf%#-p=QVdCcSRm$={!-{Xd?e{P({;vISMB z6Us4VR^VuW@Wp4Ls)$faZWQa1`T%|m@oHo>wS4HRukzu`tj`62UMAPW`mmkNOMv)6 zD{{1Xt1BT%S!SzwMzeY12IBOFL~}S2ig`@^Uq%06nZwj@9zTSgM|vhIDj2Ih4ynO64B^eGSXA?~sc% zD7h9yPfNv`~c z;hc(+t)(QUPsZB{G#YXTUwOS+ZV%podzS%{2ktexPKq|0jOkM%@U4C<@VAjire5C)iC%pQ zBYN`I-7cz6()-I?08OR>81ig_C=btFoW%>!Kp>D+ zi|**?D7Y<4cfeO3_#oiLaF~$&WWF}iG8>WX_8GI4)ahb+%}F!0->&R@E`D`vk8uS) zej4*Q_P0%pS5#+;3Di0S8DcJ;nSU@iVK09dFq_{XWF&w**y)5PHLe1GGU} zfdH2v1pVhYQ$ur}*oa~cdf`sYPlwUpOy=79%u7~j<;$QHMz5$6qz>OCGX^oLGg`EJ z3^;E%s2(^7)Zkrk)FV0+sc?SwuQh4918S@X%s6NO&ERm7@E|;gm@A6W1=r5AeD^Jw z5qi3%xjt0f9!vL*WO>0;euvKUB;D~8*=c<{@O#Gadrs={JY=~U?%X^Z#JnCPydKO3 z3+GQq2``5+FNcZ!!x`U^EKliY=S_(Uq}M`F>k*#n5j+}RuE9WY;H)oJ!)hu3vIrxRT(!UZe!0}WwH)FKu(@gFLM2C12 zAcfG8NR#~LHPIMJ=Y4~~43$rqe=3^NE#pt_@%GLJ-aGqM{gd|x6#*3iB6@TL%ihf! z79f=Q*Y!&|uL{=9OZUsKXxzFzv6^)g+wOcGL`@dPpf`*Js97PHWD2-ih zqrKiC|1woNeRQqtD+)?l@>*K3@4bZ@nOuB*eIZVFg}!#%@W^33Tqd?$X=DY_$%$?c zL45Ta_u6*e`pk$Vb;xylKW;h_s7M=`Fi|7{5=jz874KF-a0_7L5T_Uw0SyKsdR#c1 z)KI8NV$K2jk#@!pCIzy*Cv7-B5>X|IL{l%xB3yv}S65Vb73-%ATmWy32o^b73>usi zd}!hLKAkgN6j2m;1V!X0YoSOe7TkV12;r!;AWK+6Fj<~!QWEcyHbJc;3Fw1+e@|E8p ztp~HyOSZhP{|BUSmui2R*5|ZzzQI9}GV|?(CF$*Py4LeqRrc1)E6P(}$JmG7Q%3-Z zTl8p_K=X>wpQ_%-pc7{rfqV{;o2-_7 z@76KGHT)WL%OkEg%4Iw$Ba`e}QEhuFaKypUsDY}0hs*_b(!3_xqTo>11K!ji<#dw= zdK#kal?d?fM!&}ub1!E2czbwa%(ksM*NpH5bva8^B-25T5c+xz{T z>;5V$(bGC{E5D$+ifW3NSW5rfOyt~mFTv0ZD7*6t{W|mnO zSDa%42#r&e~A+quwO!I|c(6 zKOyBY{cNX|i#D~#3YHHRe?AcvBx%JY4rUXQ7#zvq)9`N?U&KvcA#@-BS<0-TIa@^jO@s=gvG z9%0Sem~Y*`T$H#)$UA=a?{83lu6ss*{SFwuo#kQ@BCXfZ3T&V%m1bU;4V~xfuojC`|qrgw;?22Rs+x zwYl1>?TQD^Kz_?THXAc?DYZQ?tA%#Df!Sz710 z;2S+Ts>k`1!p^QU^w;dWnrX{)T%Rb{>cpcii{>`3;Tx2aJSvI{VQ>@X`u5nY9Cg)F z{6h8LJucVe`s#eDv`3P ze}pNAb1HQ$MF!UreLIr#{PK(Z(sDfVszTA-+;M7rp;{$mhd)8$az{*rN2jdA3o4O^ zhj6s(XqHYQV@cU+>4}sNMA8D7MAr(=)p>`*&6Am?@f>YI;_*Rh>qDCf@k{l?vTJj) zRQE{IbP{0s4;=O;QKoTNug7whG#7N)^)LZ!a_D(Eq?&lz;cL6DH4~`A;WL7!_1=Eo za+k=5U7#h4GV~>Z#d+ZOaS2i2#$vy{gXuDm%!tVUMc_SXugu3-Q^M4m!nUeAXe&?d zQZvHTeB6Jz;>b0+t|@pP;>jcBScA&8^cmVp%Y#?JV%FXp`MHXETHY;hH(_^1BJ!u} ziVY;rg{QfR{;(ZdQzKEmJX~{JY>UdWcUkek>@b7+JgYuv#B}Uy!#KMGA7gY(dLPc0N>PMJIvZuBrgO_?m;w-0Q45Dg%1dEYNtJTXATeLCmg|q5A|wfZGMcakNh6_0l_rL;>D!CI^knDy5uOWJr12;) zRTJoFFE@2p8jF@#*qf6c-wAU}y(zFd*F&0KKYBks<;TnG;}_1*8U`@vW|o#w8W1h~h4uIGF2PBTL`y&=(k8D6q+ zmRVRC&dhh8X!+(3gc*dNJmKeU&Rym&v2xZKn<-7zs}Ak`MM;h(phj;hX+}-fa8t-lcf{vV*5v?QD@HR zcXLNsdVSSbk1jR2gR~u&KCoTt8@;{>LAppl-`A8NKz@4fo^&roiH)D5`s!7C9lSz^ z)L@ga&I98V1^(W#m)&D>6254jgb~c~z0@YK4QngtuY)kE16j26?B0vOHY4dCvN^g~ z1l&HP?>=Sd4TS0uR<>*ZMQcQdUuK6Npu_JgEXAke5<1p*zfT%C_U`xVkrc8Gk>D$A zu8JCm^V5i~O$1ei>#G5%0J~q2JV=+uxsi0 z2=zAq;i}HLa=$FdwzDgLq8>GwF9XcBmoY#7=FE`OkZiLEZW+{?WFmd)g*LHfOMq)1 zLWek@%nrd|3a)GW@VV8k7}B^fh^#>HPn1*%A3PYF~?6Ii}gf+DG&xj31565#LllIB1cl!oUSAyWA8kSgmbt9^Tv}{9={S z(<4MB5&TnJ9GaPlpCU(HQc|+j@gok*-h&hsE`S z!+mRNYW^3#&C>Ud5hgZpf6oaHmE+{*R@KlL0ZV{#b94Wf)5Xs(=jFwRjg37$J*_VY z7UKYPYd$ATKlxHp&0lcm9}S?7{!7$OG2;*0b8X`0n3KE46EH9>*OOx9j@|p6DPf;W zzEw)K!lqp41CZEdzYW4Z2w`Xxw|RlOdt#aqqWL!%!|lKyM-u!%y(-4}w95yEl$#U?95?|p~Ve8u=kSf?NRm7ZscM! zYQ0IwWbQH2;9Ojj%c!aQi7Q&5En~NPWNVaXx@OzL{sYD3+#^%JH`e5ZJL*_~F73KN z+c(gp1Mb)wT3&DYf?#8P*`u-Q+IVh$uGbi@#R)6+_qSLlgcg687DK>Fec)_+!|(UuD~i;Tq<0eq zKlA<$z-QW$On=xKFLvd7iPVLDzPvAifPUWIlk4mFx1R45epUb1GN;Xi16J>8R&n)t zn&T$RO7k92V&QEG+PXk_bLQ zK~mPzq?qG2TBq)xLX4H53=>J`Pfi-lSZKg#2vrh#QU%>WLa4Iq;VszjMT7+ybsihR z1dc%iB#!mFeo+O2hiC_j7ui(*;Z3MhwK-BIcG+>_P+>h{BFRFDV-(bjltq3W2#Xcu z%&N7E)XAoqizFR^ftYbi)`HdJ`o_jD7Z>nN=ccKJo2d~8(mMXwg%}i^fp-xixm!mCJl9JZY?W%~0QhqQfIRj6XX1d_MaG&bgmD(0`-|@)}qu zSRnhHxwW?9E?BKPbs)nDGYT&RDZ5g>Kz|GRuaSrXD+V291P~rFJm_y?{7-BlQi2nM z3?mUB0qQF&e~$}>DqeQe(xCK#710AA}M|4}QTP z9zYDcfi-)F$m|#J-t7%ElDdOUDE_aI3LJ9oK}G&bC6OPgjCKnz3^foTkH(6CQZ0%q zRR$k17PV~Af7$x0@j`9;CZ%yh?5ewcWchANpZPs~u%@W0G`lxk)HuWf^G)O>D+2qtl)dVurYW&|j__)jzNGGz zj*Goo?(d)6nZ7%J_X^R2OdaDUWNEyIZA0mHp}_q|dbu_ijQ0P;=hJIE!> zm9Eds3Pd9RYH4MwxMoYt%bClo@qLZB&a#E=n2hXikeB(JvH19DdjVXcU@s(Urd~8l2YSEJzAro-)YeOswlSco83pq zES*qBNfZ5=k#f-)wc$jbNQ1PXj_y}Yec;O*G!r&XJ?KLDv`S>~;Y5Cr_(?Wan2gmG z+R_ptsNtJZtMCErVgAd?4a6>i@SegKd0Cb`(Y4?7`i{ouvTJa%Nrd?p{SlE*G#8)-k)PH)xBvL` z$2S~O-@w*8g1FZ%xL8!UW-N63@8nym!F`|PpRW;61PFOv)7uMICxlj}~FR4p-nf00W*b!eg3idvLu06I0&fYd_3+Mfb ze4B1S{Z*-VY~_~re1|06X*b)A<1aIrV=hiq7D8khOhgMw6wyQUY)iz;Npzv)+{`w9 zd%{ZVqn3l8_OjACqF0uMnI6Z{7t+?4z4WJFc7DuB=7^Wc3FFp<0G$s}hZoV>lhMJM zX2$6R|6q7wFtH?y(v)v(ltL*sAaL{R-rMMayX{NVzxIq$$@YntI{+MfE3@*6&{rB) z?vm9<)CG{V4IMHZQ~~_dr^$fBh=K-4fxa9=hlVN0&2%~gTZ30)!7!<6eavcp9}Jp) zU3TPfm+V^5#D*{)2xxowxvIDCc!b=V@&ag zKA2`v*qTm796!NJ>Xec1=40VE>~Uh!+mv#IX34qs*mI*%ph7lD%X=?-F04Bfkz@w4`Sbap5)mZPC2Q5 zai^ZB-!;~`E^W{-JqdmI9wG*y7#`-ZeH-E)236pVd!==T$st2Wo2Q|iy}o#{zCKHS zlR=Afn%O2p=Pzqdv1CKJv5Bnw^$|_oW|`-D>7E9VDfPQr_t{U?CBCsKP3YwsHTAE- zGJo^0c*A9WN%N}U$rXAAJ=%a11jA;f+d{>G=+?eDqgF+=W#O5rNBqi-vI_4pqgG|L zWww#2I9Wq?1(ofBKb3yrXRYfwZOUrf+~OJ_Du+(X^6R_hIO0J(@(?45*AHI5ch`|TXfu6~ zn#L(QppMo_7Jf_h;DedQ5fD%}=JKic^yTm(at{jlaPsn%%`qW}xP}X%oY}|=wBDS_ zBOlIV3*4YOys>b6Yw}vl9tEdSq$YX3!wY^=8PW$yM;)dmc@`hBZ08T3D<9sL-Mp&x z?H*$V=ZrFzp&ucMv4*f@jNnf1p%NQ|%rmxc+3V6Wci$+T-bjl`tCDct{Bc|<9+A0TSr&6rpKor#Y9B> z__{#bU%ANx8gbzo#SvOEC`_2wdgLoz3hfT)%0Rr6JQDrrkjPfiYB9{JJPeB-BM#HP zph3qFKo4Pzt)ZpoF^nG~&uPxf9fi|d;gh&wtMByr>(pPtp21%l%ueU0xngJUlukZ^ z?E?#r{-c+U%ua;Y1~fZO64fpc9d0m2V@TmADy^GRjuq~*a1aLrq{jcQ6}LVq_a1$P z_vVsYuW9V(NT=qOjDUOGXmES??F;z#r%2w9ZSJgB<>)OqM2rF#_e%BKoRK9i2$o&n z3QV(p0f`!Fp_8`d&Ac^vPxWSUX+ypwG2222i5_bb|EVQjX`r7QOj6qmSTOfrDjoip zWe9yxnuf_Ys&f*l&Mr%bL4yU42{gxii% zwF_tW;KV5btf|fLs5(^X$_uSg$`^;vs8QT3uK?fS=~3wPKKZ(@#^u0(im+S8@y%Xj z(NIxz-)%_9kjLj^lUY*)ky-q>MZ8QIsw{P5aT2}BEgpmp*zW-Z%Ac`jah@W-;l)^k zXSY(xILSH@>n784FU_V+*$rI}yn+NoB*aQ}ByDq%(wuu(tqoqdY+h2V-kq%8dTj8q z8KFEGzOfm;ig;l-3Sx*B4e(8CF_N~U6kMhc`Bmt8f6%jiYhkK`c(frOv>{uxi*;RR z!NuPkw-GH-v++pKQuDv+d3y*$%3H+~tYd9ADwvzv^A6k52wTwsth`{ge6YQ(s6H}L zUt~mOZnjTcydqm@Ift+mkx2Bbb-R#jYze>fQD2`p6zPks`fEa2hH6W}Zmq|KkDFPv#D5UeZ^ zwy|Y-G;Fwnr^HbCm;wFrtf_|u8)BVH2Li_A)9T|9hFB#3P}ckb`6P~Si&?b11GJ-y?Q3nN8d7LCKNm!85>p9KyF-78$4%Pna zcKEUjF*<323Y-xliss0l%f!qKR^y>bf4RtV_Vh_3H1~O zZqY|FuLAHJ12JV{3|cHSy!1ERKU`#QkrKzzhjRm$d@-pZ2g+Cpelq?n!V9rrr0}f& zEWuNFB$^@!9!lDc79rC=?dE^!cGpSr_3W|FQ4&xpBMuRbkZPLS*+C&Bv|(alVdvqQ z+S+15M0813pN1ogW_))cNJu zv5%jr#3|6JbCrykV0@nR{XEErx-@oy^V~SGdpJbe7rIC%#D6>8TA$L^)-p|%yMmWH z;@wH*nmt??~Xpi+oY3<+*(q zGkM}1Wqs{@{*tcG@|9vUlHUGUA6V6f(Ee@?kzVIJPMgkhds{|&H(?oYa<Hr{F9ROMxCftua#KksEyC3Y^ zok8=`ZatTKNKFGFp5--pxg6k1BXNEOW9cuY?cYCnUenX#T1YXzgGcXf+}zP@zYX^n zIrnsZLJU+wO4=|?)$qeh**RlNE;!Tc7c_#c>r+Z@ol9xu@Cp1SzGU!wOqEZwJtxK$ zC?`iyxYhkGSUgPit;AIy67-458n)tjcfuQr!dq77GHU!r)q#u_Fh)(BIx~y+94W~q zbW+jygmmWBU(l0@?ki=qYX*%rqmB25DZ*K`64%LCUN zzjYU_@~ttEcisM{b}enYjQgjO;m6Vq^ydOaPEXrBm+$z-5*X3o)Em57RNHX>P9L zj14a(xO8T;!S_w>6aKZ|_@E3uA*S*giO=-P4|0JX)b(>lQ6ZI~Nk?RxD1wVF1E^~8 zP@y8KV*0@y_(5i9<1r@VF+m-t*rq)gOLA=K10?BQ`kmL(7hpfd7l!u18o!iTU-pe5 z?ZBnGZx!-dnc-fRUzpbgePy^F(_ekbRfEWY+O%O+%>4!elc9(Ade-SL)2)NA7VBrN z8SdSG?k_7Ado0F@4#^Nost|E%5OIg!q#I+KrIj}tMcr*uidsnGw0wBii4GJvrchVh zJ`Z*d1?u7)pgAm)QZXkcocc!^E>5UU_c^H?aok;S*j;ecT`;tdwR4V#IrXECO0R{aBp(fUVE+OWdtdE)1+vo29-0tgqB)L{nkij{i`41)rB@v zOm0R(Zf!%g=OH$#I~Z_QhPyv3`{=;#apzT4)&IFZ|y~S6n^pcYaY#jSR&t=xht3A0~9;M3; zIjDktZgHbk;&(rFZ)!elxxtpM%+AsO?5o6RpENw3CzqfDm6yd$zPsAC%S|ktMP$qLl ze_M<1uJy~l?9l!fcLlb~PSk!8^yKKDee{bo;+$pU4x1yBkf-yeve_-Zv?qQBzg?z0rhdNdLHGE}?NWJjw+n3N_US^8hsxv6{MR-K^TV_8# zDckG%aFK^E62t_v%p+X^a^|VK1g*FKkHeY9H_sMlE;z@m$nRjm$NV%fG*t6T$;g$0D5{8-njLb*}8q3 z+Hh0FGZP~+kt6ycM)t#yg{>$hedd$Sbcn8I*wT7(Jrh4vtq~O7}Gj^yLq` zWe|gz^t^1eT>{CgHzp_xZ*H_K$R-=5)=}{H=w^N7_%w1vkNy_--*(AzcU0|ty3#JY z>@hfx8eja*8%9s$j7x~5arb2LEB|&o5B?f>@M2WyanF95%{OEZI`%Kd2S(LUSL%uE zX|9@E=jof5S4O|ozQVB8%G*=m%65QKY$!J`@e-B5^K8Fup?ijGR-)(_r&<}N`Y~^o z5?p$6m1K^vS`Xspk9+%1pf^JpE%W}YePrE*|0U|TI(HV#9hX856Bbwa0bRsjJ8 zC8aOa)YST2J{g09(#tC=8M(O@uC6Jgqw;p^T@$cC)PwW${iP<${v83u=I9IxOsJ) z&q82rR@ngNiUPIJVO-2|Db-r5Y@vIE*&FhRAb0}hO-OTu2(Qk*%|DyZ3u7ICpf>W{Pa%;h#Nca*O97;N^KZ1xBnX>unf_EQn`3O9OsYK#eT9C3oI;EFsy zCz&HOX~yWWZeomkd?bSP=jmD#o=HDA)sAW<_UBQJz4(a~(izI4!^2Dhx1k$Ot@SIX zIyGA379223z@(Ajv0VT@3TA{P^DjF_+^3K5zV@0uiP zci)AFV02s@2RFByYDPzMbI1s=*NlB9vB+i&CIzCQk;zCWHumxgY<(cu!?XBCUzVPg zXY42!A>TYa7#i96Vv8cpB%SoB#*Qq;EzS3a+xtoH=Wp+HCa)9J&#%8k8A)jpq7x^n zcm?I1U9vYX=q7rMGlTm6ee4(N&XykvACM6F&?~zEVDd(FouZZ}?FhuG+j!Re=H2Cs z>ijW}!Kf} z%a<)ABD3x*G{w@rA`JWQAbxrQfBa0dLQ2?2FK{F^4=Vd+tJv6DCTaP-Z+n*Ve&YUv zTmLVj?h^^r5%@le-UQZ}a9Kgdc*M{BeIKCVqJk%sq!@CN&KKOcw^(1EB7)&00q+3` z#KSSc&Z8yi)V&xH4*%Xj42c5F*tkexlD!mP>mY7)RDh?>;YK_@a(z1T&#f%F@OIt^rW4=dO7ZVrfgRr@e{Pb_gshmQ);YE~X3XX= z6uWixf}G%Lw&<(+v~^CpdyoF4{VY4%(x;bN^HBZ?%A8haveV@9#-bj-Gq7~qz|x4c z`KcA@aHh4rYWt^IBh2bIva8HT0eg9!8YYw4+xJ)#Xaq-|l0(y!M>1q;9GAbA3&Q@P z;;0JfE6*N$_9`Vz*Jx>KSsXY6e$E`>7i^jc-d~OwZ{8;G3~H%~+|@3jvmQ-9sW!2` zppJ@6W1P}z;M9W+K~g7CYK}*@H1hETDL04M+K??wa+BV$+uiWiPPqACQ3n%=P+nY5 z@t(aBZ10K`z0A@A@q9+*dxq#f3;!t0|FtQCGyP)xp6TPqYajhT%S9gmt42xqkAwv; zaQdeo5#c^k;UV8^y}TE}7v2!?eLvFtp^=CT>UO8lIHo;3ZbV%HGXZ;|%&z$eZbNoJ z!>!l5doQt$&8mL;zH0=5*iMAZ;V9+BJhKRQSPb;9Dh`oAs> z-)DvR_g+3D*QW6}c7p@XceR6U&M<4*WlBqe`)=9QY^f#nqQc#h(NFyqf%zXA%05_a zeep9F2`Hfuuj&it4#ik_s%L2~RPT~5^9gY+K~1Yfo&9Hei*RO2%q*GdD-HWOacquS zjqu{8wMOTBDGt_Ue@~52K+PUt&fcTc*kgdYZ| zzw2nM7?>Xd#NWZ=SmTvr%Q}y`1 zTkn3G8yT6TTPMW5Uu)=r^(iL>t(678$9}{b66T;yOi}NSnavMsijTq49gFDbi|`M@ zQtfGI&!Y5Z3fn_QRYK$C_UVh*+=CGl-L<4nK>zr5VE0(T0}a6}9Q!^4Bpx_IyRq(1Z#BP6}h1>&OY7^i{6cZ{(W%3}O@Gfv;@Ys#Q^P`#AxDaYj z%!2XY@225L4I*dQC>zhZ#EN=gMP2esEI^BpG{4$&`1%-NK}5>7@chnv7A|=LEyJEk zdhRLt1?p8Dm6M))%A5MMgkNcSF(>iKNVxcENyw{;l>NRfou|Y|Rog47v@GObig4kf z9MbISm-P9;i!55CCH{y-8(H4mc*j(S9mcIi!{LnPbPi{>vX)-5s_OrbYyy-oD^@rx zDeMhGh`*mX9f7ARn!-(|I2zZu72BCmZaWLx3NkF2wv%~S)aD!IJ*y%k=Rf8)PkvkC zS1^Am_n0^82{rK0KB3p@ z*(usXP=Xb|@AS5a2fV1cvbfk>u-w?xVP)w!G5j3K&$HsD8{{O{_b)NCg8EC+XF_a- zPc)hq%Y)n%9vsqEr-*Sxv|lR;3X1)r%aqgwZ8Nu)>JF@m0%^Y_byr48e~cr-5wuhL zHdCHo__gfH7q(31QN9E_CJrfetL(-kX>h7Qi_Ie=OS8MHB2&NSa(*rUskLLbz&Vjr zYDNFO)MHt&Z+6fsw^>o$P-JvAlr6V|U}GiAq;T^TnPNBnZO%5 zirT!8cJPn@LyYy;SnX8c(|DqXhz6J>FFcAof)Pn6x?h~{q#eEe2SN}HDME+v29CY+ zhAv45kE1$`x4G)bk=O+1R>QP(M? zEi;=9-p{p!`I`Rn4a$ZCbzvKRjggVxO2YJbVT1n~N+*3Grz*)7sS-&ptLkHdBIYwx zf*&XnNjCs}Fy%{om416TePNUICuT#JLEfos-Tm2ozb|1~*i7XpzFdd@vcLx&$ z6KKuyClJ)+N!f?jYhdGPWB)Yt%`c?*ymMX_+siIq zKq?TsJ=l<1N9g zpy4Bpdn>NITxFT!$UsSug`c6_a^RgN`f_mN^;@7_=gvizpCk3bwS`}1$%dq7nJ=Wt znXtk%)M1D?qE?E1b&UA7lK04H`zJY?9m3n^z?Ggas80*L2S(JZd0F1XN4la%*#j$V zF`d4cwpWOH6A~xaN+w3D)bz4uiC?!G@HfAO|D;nCB&NWKO&q4R>xy1jMF%*v{$s3_>_ z%7tYqT3cHm93M-Rs6iiZY^0^74^B>Y_9n9QyZv%zW>m3}KhDj~{RV+J*x3Wc3-V#R zy}tUvJnFvE({J^miR{eR=)r^&Y8BWp=yh^_?(E=jkp=V9`wN1FrfBfT%$XRQTf|Pt zQ4(MB?E@;-%+=udeiD%xQgS4E=RNvvxCv?32>w-WFP-bLPJs1@LexmG-vh<#k^q#VSTngMM ztcYM|${aITo(tZ{c`w5v)T72jPzypzq+Ir;tPkcu(QgOZy!`I)nMU7G{k8E++|MDV zBgaQK*2R>AQ`3XfAbjFZd}3dG;+F%Gz5^181A|k1K_&c7CHxLp#o&iXD~fYi7?~Q{ zvpyWLA-m#tG#?1n&9oX7xM~(Si^!aN#!g;Qq1iA@gUN~<(+XVE3LJ5Y98>aL(+XYj zid=DE%K}HdB1f%yn`&d3w@@ZqlH;d3)zgk2p2q|VSvZWz;h!eLExnkOL+OXk}SuYU1c=8G8 z28SBPB!adav1<39r#g2QOkM^X0)t6PVD^PM%3)enQvb6rghh_RX+V;XzA5aE%Cj4p|dsypzSee6o&-G0yRkSaJKpMC^yyOOo)bgCADsq^>m} zKZ=U5w-*_*M=b&c`tU9FGLF4^emYZc8@S@TYw;;c^Nttu4qNaIlO~K1Cyfv%D3c_} zlk6pRA^7uveec??_T6FgYCS#g?Lb5^(n0biCJqkqU0uR^`};G8E{i~JpyxX~&Lh>T zyCsN@rKe}YgD188F5{K6{2=WhKK_BFhe!C#3uZ;pl@%p_e-=16Ulf#U*ka<~fHf&;dwf#4siR|faFEdYhLk&N7cdQLiXeRo zDxO99dx#wtMld<4EJtGsQ}#73aUvk_rDrLZ$(AMIHDym3-Ce!8Pck&D=eRyywe6U( z%kdHql3i?G<4^0(Fa4!cwN=X3C-@-_3*GJ_+P!?IHHB)|{XWiY@EElH*&`tk@cQl7 z4_=n{-I8U!W&GnHOl3zncU$toK1&x$#`wZ%IaU@;yY9Jgp<;WozJWHIa@y;=^kP zm8vNJTdlyG5C~>2j-#*B$y_arrd;qTK&!CW*Z0?`qpq~xNfU&^~ijxjJk^2 zSV*l3_!?3Cp+fZI9vvHP1mAmjtaQ;2_LI6c6Tm!)kbwq^R2vZ>(0#Y z)Dqh*2hW-;CKcmY)^6sR^SR#@=={1kxqF&)daQEJ7IuwoDr0uotQynjcMjQdHc!rG zDZ3Wuquw9=%BLr`)GALObq>uhj2O~9g>)~8n=fI}%af|>YK_$pHA5J^hnwr{RedUh z8Or3rel5{N`?XG|&z^P$B2z_A+8)aq6QY)1rrOEa)~>>r0tj(K$$k*||FUUAo^ipN z(3k$_k`R2zNid5?JnlbUHDGjQy{nEHmA9Ss9G&v2l5zH&UNO1OHtQR?+jGTBqkuH2 zUC6jDV^Bl=`x*af$5tzhxry5)v!>zm36ln3@d(k5s|hsy=O~JBT;-f~>D%OVAA9Z^ zOX()m-1>WD`bR&^|Cf=Ci$dkGUtr4OXPZ;7A_yw@^kLHtBVbI5SA@ajst-+v>G4ZyVO+-7$MAqc zz++@&y70~W)T-`5{maj|V}1eqJ^N-)wO3x(G!+F3vN_$xpoZ|(Qh@l2)B%=M@KDq@ z>8Nle+=8zA_?%JzakJF@cM+<8Fi8cR5&F-!@QEQZR?ky7em}kbpNIArcSf{!T`_{r zNS=>^lU?iV-@fkn@5$%Z2ouFAZVs%A4I6rbk zWaf&1fPp8&hE}&t8tZ~UU=>mBoeAd{A|lyxuMQb;ALU=lu`(I+?N9agXcY?No(rxy zq(6>hK_~JY?_LhQPn#n}r8ypn7TiONTJ_;rSFkRQd4bybbqn?dcxK+8V24dIb!oyI z+5lLJ04&>pI#c0TGX&iQ_KXQfr#)0u%iQ=JFL8^~T*wwjEO+kJU$%iN0}h#5DO3o< ziMRF=TD2n;5URGkmvXYvY`rgQurF$`C7Zj)$~i2SACmpVyp+S<82gzRn78F{e3jR8 zDpH4RuH323>tsX@y27!NVLR*$3qPJXAjMigJC@``(o9R(Moy$CqM^Dj7H7nuAdN~2 zFO3K-diaa3hA4%LRK*_2h>7{(-j_7+y%FhhXmHZMQ^!j!%n-r)8*k`S=e{ViFMlYYkAL9#o6u|xj}EZC*Ub|4 zt$SPz(jR!f$Hd|qh!$crFKh`O2~|+!)VFASWlxIHW)rIU;krQ~ki@h&lnEVoZDRkX zupU(9qKR{LJuk&yRrmKLKl(AU>7Q113DgZq#V+}>zB>7~T{HdDGPGJq#>K7RY!1U! zJK-`V=_;+^oN05|U@)PIljTk`wqu~f#b|TbyZN2NXY#xAis_>Jk~nJ6)p%v- zLX7|Zo=o;klDncYEfxGtlF`g2Xk)s#V>bL-;VM2Q>r0UaXS74RYvl0_rG6dJro}8g zC~L5FR_CG=>5MbRxt;ACL^#;0D>7IU3Tj(o9jtlmSO*gCTg>vNd=$~z6?kGG94rSu zAC8josHR&Mvfja`C~ZT4n_UE&_V&=T#H4=yy*x7*msgs6jO!*!cDMM1#ii!5DT%T z7{{;9Iz*Ho_NgOO#YG+({QI3hOCiZ4`TTvaY!o^$hn|{3emv<=pwSqptw=756qqO` z8%rU}Ciyjx%38KCHw~MK?iNleVF$mFSOiK|br;6~RA4isjxEHelP6}%?j>PQ*Z=a2 zV)qt>1!~gc=g=dZb<42w4u>)&AZ3k0QV0KrPRV@|SfLo9}QOgR^ILcSNhz0Y~S=8vJTjjJh)|kn;ugznm9O7sfy@!xWtZet&0unsxrXcO+UuO?FVQ@|i z9o9MLb<17^ff{ORwwGM;fu{`uR>mc^@iD3I^+_n3h4l2?3I4@=+Tvdj z4}Limvb)+p{SeltK#anic*>P@nm2?GOWJ0H4pLm~{|sF(b23vWh}QT-=_?9wmZW)# z1fFpnUQ^7-A~O-w63QjAUOI3S$`#stg6izS&(lPsgeDBKs^LpFZV+Hfr)sdv@aItE z$R&*8Q>m*)OQ!4SQ{bjW3|=~j&SGn5im7Ut$%$);%UZvaLn4<4Br;MkAU6_!Ij}|M6HYv&jD}kQez_ukM;XVSNNRE4K?|hQ> z?igF6&w6XPz+CB;j<}`Ext(3#UlYz`S^L6Sx!ypp%B5?KhQrpYSi7df)`8MH+^jPM zAiti@y5H!s76L<74Py;gL;d$K^BbhSlp)3ORa2)kQuR^<#Vj&5+e%Zf+T4nzPo)+_ z=|*-#jemOrZwR8QVBdW=#;e4Gd+EK0nL{kq+h}%MXm(hL{7CTbNXXuv_{?C$2s`ma zA~6>n@>9})4LidC1Bjgf^BuQ$EtA_F@Z_jq|G4#Te)1&Qcx7|hvZi8n-M@#787{FvezYim#63TH zu+S&pp`k9Xn@AwH0y+8*YwII3sI0%g$ba4pm64@Z;MKDv|Lq(STG;Ik1Ok6Ff7gWt zBO4nBJa{^bUBOT%jFEG8c800sSh@H{{$0b*a%_)}$C|RMG?+C1a0g<05ww5P2>7W; zjf-YV<$^gPTVM(MgG+I}%IWDUMad5acilE14Gp$NmMdM8k#m6~f*~V<1LG(6NFF2v zBxYtV@jV5kj|goC$LGamcVBZ1Yz2>jC7nePx3M&YgkFl7Opx&qSy^D)q zF8r>4+quz9nrN5Tr(TpicYxg9AAoUFEAC^IWcFl1dU6=?*m!5t^ec88Hj_w<$9;<9 z?(BA6gWy8~<#kL_N4PpLY;X`WUIAr&B!Lfk~Shb36t<0D2LIVNJ{y^!DU{9wzK zo(oa3n$sH%k*pt^KCda<;)^)}dpX;N7a?WF7UDsnI zhvlTx?FpZegL&&&Lrm6T>kMfGmaDlVaQdwG?oyz2wjD6@vsjmuYROZl%tdh$yT3Xrx}t~j#f z=_RkYf?Qg`bKhQ_b4rWHb5nv^3+HQ8Z*?3*XY+%-I<|461h%(WiLs%M@Ao(?Ok_?! z9=H-(m=_@51xS~0Ow{2 z9<+^Y*S7z56EVvN<+c{!w#Y0a3ffEmkEaQ}-+;S*_4dfsG_eKu9;`ZFuf1iimD-@V z=v$i9V_xkDrHS#zpbyU|Kn0=SQX)Rh#$2B`AEaA0r z=6np0@a zp2@l`bsN7JgnyK%EW`ek1Ams}p8t&81+uxTi14Gx4LA2f^>l?>hT2;7J9m42h-j0?xsJX^BZ~ znR(Zw>MM5LC#zeK@b>WS$P~=|PFtJzQh#?^Z(L!)^VYo!uuDhN`GoISloGx&4ogoq zNK&OlR?`<_r%IMYWGX=CaES(sv8Pg$4t&FTFuO^plntKqQTerP*h1?IEJ1I4#)XWk zg@2=yCEpNu4-(D`6aC|!*rKUPprnozmU8zfK^K{Pof6QyeI~HZ?ysMq|EK4r~G0%9{MNhVu{9fae**@jqT%#|AYJGIw1y$66 zl~h(K8CjMc>)bG%{$Z_E0nXZ$myN_H-9sc)kYs8xV-pI!rR+aP2P$+_T>kPVKIl0u$;GtBgJ6v2ky|cD{2>rY6|3pwc|G(!KKr zrqA1|vF~iNjXj#zt<+n;t8C$`T)x~kt+UH1IqJ8pI7;7EPRlrsVF9lSjzdcEgt8Do z6snYja`|DVh<>o7%6CNEJPOB#dka443qFc0XRKB&Z02iby}x_Pt%7Eje3soj+@cEj z5MDS?2@z6N)au=rEx@WGlQ(US^hdN`>;9YHd+ujA8l+>1zIqxgFDEN2d?l$PD(moz zzI=3~Cmj50pPpZ6oE;gMwt&}RoK19Nn#>cezIHMDEd8>$;(4?_Y4jQkW2qdA9HWn8 zu=MS-ccl9yU-|y2sKGub2c~Nxlqt6(*;gK8T_AOvel)=?O9UkIi%%!f8N=~qQ&G`g zgt_PoX9(3@ayuULeFBA$f_iichHO#nMf=XRp-(u^ekr1&)cF69ktq@R#lK0QziRd5 zhm!9U95m#KYKzfg|HTmZ@{8@g_q7U!XF4~zuZi-+6MwLk`>Ud#d`-4%ANQFu_}|^$ z3mbE=hB(C+)xQ{0r!pdE{`VbJByxXY?t6jQEXnf9ok|dX4Q^uO6=eedVRAY`#KMHI zX_M-Az`o%E*1}?n5ezfAsdi#MN7cUxyNHpPQmK@~@|@i-l+X9Cjl^P!*UxUo)#a)h z)RC10V5y)A@hvxN1L1(?x1>L(C-dtFP3LgS{%8fjwo zI)-;Wp1pP0Um*x4c@CC&Ayb`$em>)Vjr5KaE-l@1_Nuh2pI-~A@;&i)-MYeYmCl=vIR9Ac%^alMzP(7-Xq;V8I$$E4tVq_;tQ^UJ>;-v{7`JtX$@10 z7SF{}_V7wO@6b47^KH`-dw7{?@{cE8`6sG`TPsYGCNqJ3z7xZZ{C9SDPq<6x2BSe! zZ^j$k3*Cw>=S&^G-5Qse2to=ccZ`XLEk9f`!UeO$4$~!pM3jr%p;f-oH>qM4#{z7w zXxppxNwKuDw6pjP_|jD0VFA)|lBWG8j@Q8fspDmKZ-#LzraDb6ErT#5RcF|_h30<` z=l{G-=K1o-weEXIvhMf9wC;2DGnU-XV837*_ z7UuKza@XPak}2|XsPdoZ-rkh|D+g>xSUxRuq5CzZ`}L;ozt_*Z-*RD~%&^mIAn)zj z^1oTe*XuG7=zm^*JoanxBWAE*9H6~@UbaG8ZP6kBW_MEU7aQZ=<);g7%!nWOpOnLr zK3)krvkYb&91Q$}OjumKJKHnvAH=WKkbZdN^fCY%fc(g70LXSEF>sY4U$!qnuo|P zqb9b*RIkKy5jA$j6rYnHwj)NyM-PqWG zhad-vauWL1!JndGfie_B6`5tYy=D26!padcsAQI?!Yc3&#feyp9E2^B*fgfN+xLt+ zO6>q+t3MTlfT%(y8=E+vZ0uQe{FBP!7}#QN6C>$;?)Ipc%mRV*NntG&C>a`|`ut;l zG-F~k3fxHu&WDPbE;JJSNfar{NnZPWZ%QmH`lOs>>uwGX4wr;+buxCKEEqZL<>dvF z0-C{SwB}|mP9=#{^V{3oi-+g%LP>I%x%tNn4`1-Ap*}N@9Vl(p0MD(xh@2KREGZ|) zfH;<<1q9MvuW#&NpL%}gWAHd_`>y zzQic0{IsemgJHDETJE;C6$0X;&4J-}rrUl0Aw%8tfws0kgQY1N+0T=n#NTFaE=KIL3+c!a#U$C*xtTK*<7KJj%9@BtNsaN53TNseNU@9*X`^6eqaa26nWU3Z9EKo0>Z6N$PcpMn_UI} zvb#+&W_hav&y=>Wnd-NVEO_dB4F7}*fP;8;25G&Z3Vt8d;`0IM8d8Ck!T6~Oy~v5U z((^7FO!7K$1y+u|nPR-zqU!1g*2o4*=<{Eae`0eHex-{fjCm2A>8^6%j3l0mr!?M? z#i#xc$rVUyNGgf_Go$JxSCal${QO!UiLI5;XKcn5U0f*}DKD#v9!Jd(Y!(tvMJdZJ zE-Q{s4KGH8pNJH0{QRF6pW+W~a>9QXcIRxZ5rY0Tts!SqTG#xsB zXI>uPwHms`C2rBnv#f7HJH2wbUD+>y;gh$9N2H+3`qGFt+SA`Hw=+u*fw!q*q^mXs z&+<6hlgUoIE(Fw;b*f&Qn7bwWo-Wq*_7c@ z2FZzi*$n@o*XKGM@D7?=Gli=I#-tx#c8;{)Q)l-j!ZOvbj)gt1F{ z9us$nOhS??KdBn$0@`L`!TJggo6NZb?Tb9Q^$iP?f$d=l6R5e9T;BvP;$>>wJs~b> zGOlxikwUH}Kci=f)3D-L~QrGp8+GAl`0~P!OD-*j7g4_Mh;UeE+Y5tKf^G)mS zc`hnAUhdSnu{PCQ`WDYU1dle8vnx9CMtWZMX3f5}HE{wI+&y6LsX(pCwQD zD}+*hkBM2kqs-mL=kI)$`Wt5R?HjD0+}-l%`6Agzoy<6jxRDr;~0D!CDAJe|YAr4Z(s^wSNS~I^TOSwE6aYZFd zP4sn0xqdOha7A6bZEFS}J%VR{D2o-4@H^eDk~pfw=_G7%BNa-G-Ecl0YF2TTtvVBI(r6l8e9=+le>9*6^hms}XTDkC~i<~}PE_6Ze zu-$B%0#zL&Rt>|j1kf?^lbBEpGcpMb4x{i|(hl+=O5(#@?QcnytDd^bu}l(a(|TCw zH17f_o1kz}xI-wpbcV7j+-_;V%QCrNjS46Y3Ws)a_8-G8fiB7dnVZg6s1Mx}QFupW z1&AvJe2UI42D?WKY(sq&M3xR|cW5e?^1upqj~HR8xUtm+9r|P&KWx$=^Pd}U*_84IhDj_H2ce=vD3aK0TPPEIaPHkNT<+ew|`a!R?0v0 z+t7J@aF7uH^q#L}9@~6y(wz`bU?&ykL!uee56VsbT86xP^T_Zn?@#-{btBgGC zaLx!o;5le>PMP!`;9PGNwSD-=f3{Y5)gy7lV6W=mp7>h&bi#N?&X-4VDk!ak?;@G8KzE58V89E=CyTbyV^)9NbEixAag+vrrUr}uR=lw%2_m>LF(kWHg z>N?UqPnq^o>XOF|k&vcrqeTU(6qqtW5j|^qz=T?Q%;h=lWM~ zJu6qnA+~u__Mj>+-PG&q>MI(jK}XSQr*&7ZP|_2%pe^-2ar#cO<5>YcI>?E0~^^vuT}^*zPPmu zsE$QvQo@dUJfqFDMac{M?+;_JzCF#`V|Nt#0nn8F^DomM#SS*KoKiKb-lGR=2Ju#LseVXmAt-$?S2bF z#nJya3y{;=$~LUkD83ZD=EY(hTfj?fDgnj`C*k@dLeytPCb4 ztzY%FqwFx;MtuGYNeI$ME_g9&Y&CRv9Exi#F)=ahKG{aMEfKAuJCWS|RZsuu*tiFG zGCi-M&!V>?mx6!3P)1_F^M$I6Z(Y;q=zlhD__X-j2Dq$wf|~LxKCC4$S%qGqVB6n_ z@GEPLQR6bJmhoL{Hl@*OD_DcCkPlEpMa!w&}WAgX3=LU&DHXCB|v( zcyPwKW9GPGay}+Z7iZm1)5r)h_$+Wuk>yQ54bmdCJ8{{AK2wFJj-c)+ki1>@pE^cN z4ftGE*(d0ChXCIMM+`Zjq*ya&e95&)9XT&xnKq1hFC^quU<6tQioS^?@5II0*HEAl zYyBm)P^$X%xX-|B1dEm5D}gIq-bMMjY2~uNoNHg5$HhewmP7l@d<@7GyTW(tf0!@6 z9&+x#vduli5jSH6fV!k!b6|bH;&mFs?`l!iB6?gT%pMKW;}UP6EsTlkj@zybq6a0UJ;Y6PIcyT!SwiJ#}cCan6$J=+2*O_d~kNE>c$@Bg~ zR(rZSC+5GCLMrvVPomRxtPf4A%+c+i=)_m><)7eZVyzOV_J&C|jZUWp{F)(o%HxJJ`!$2F1G?}wDcXh=nn~mt({Nd|MQZ+XUW76a>-FO&aId^k!b z(zO!0-m>Ug{pPZcxy|h8-Yxx#H#c#vt(&0dFi87A>=?4tyX*F!V>+^-q$)Wf10$-) zSqXl^Wu&}hA?8fFA|okFvGaDYCW(~l)rM5k3?;iGWpu){EY(#+wlF+-`5NGlp6P)re$fu$V~&TQxL_$(R7k{td35lvgll6eU#dh>Oe8ev-k1azQ>wf0fxB>`v***V?WR4YcZOQVrWo+?Q$HZ~SHkGi7QQr1`?36P|eG=ZZA zTH@*^n&FVHDa<*z@2DxMg!5lQ6VKkmuY*I?d{)6%Z z#Gk>@+b2dqP*Ct8ThI{Sq-hDCfM9bV3hzI^Nj^R~a&+<>GTGa2^g!IGcIy5jk^_$!>kKF-& z1fn!R96&&kLC?4$J0x53rfsbRN+222`CjHwOg{m)9>4jGGkpKXqU!WLSAi5~_ zKretL=;cMC>tXNCjGeD=hBreoHYlj*19*ZVONfq6M7gZ#oQaXwFD|b83D&B4EN1F+ z>|WV+6eOjs9tp-qF!aQ!15%gQP)aR8!_qE-_n@+$Pwp)o?=6;~8B1Rnw@_=hFnFMH zEB7TNA0mmmj|RwYu@Di^f0I)P1!E_~QzC!YkcpEDmn=G%!S~`+rn-zRRQ;`!?4U?X zJUg@H8M2*#Wd%k2E*Oa$hZ!q{Gz17XRsE-f%~hK7PLHd!a8M)pKrf^hW^JhPtJzb| zxS`%iTCMlt&7GbwkytvhFPI7ks^gR%PfSBak60Lpu7)noE+$5UpNK&nlW!z;$#75N zw^cyr*PeEEOZo{R)B~b3mP6~_>UPerZD&-lW5H&=i}&?wyQm}7liBb!GYXHz5&9R0 z*@(FS3{F-^t93d9vXyn+XQ~LlM$VSiIyB$orr@BpIv*o}=*gUmPTnunu5G$KkdUtX zO1>0*vbH&@Xf={qO~U10emp!RFweJ7e9cA5JZ`UGY#$n^lLvcLrZZT|gS|EZ3-Voi zn=dvlEh0b4pD0+oNLgq6@y4R8f$DQ$B@kkI9mSN9c-9+o-!n$WgVCiEG_Aw%@#9k} z05B_cFCDe$1tqFx5w`Ta28>~u1IM+t47^0AAJLZ{gD<`_IeIf3cG_*V8uNStPvJ=aiR5>cgj!CK z&fc6L!A%jSpB?`2Ek`qc{`lmK<-@@@ob@Wbb}eYueTCXkh6B$(y7-gX;%G$olg-rZ zy1ux-9uj5e0$beL5dXsH;4>@H9s&2nF}TJLyImSm6MqX#a*e@k5|K1&4ToF_1Xr$a z(7&P|pGUI3w1t;UMJ|425-)!U{(1NHFP7y@n8<+P)BB{fD34cNj3P2T=yM-H+TWnR z_d!MX>r3$AXEIi=+VB`}DSXQA?Yk=Kj_=_9st|?eF)hAzCL^iiS40IXjM@FD>Ac*% z-F~I#nlyZtR~&;pU)lY%?wy%B;hoJgscPYN*&i)|gJWdQn?ZnDTpY)%AhZKs_sp}X zylK}K#N!(kjH*fWT7HG%qYo9{1H{6NyZNQ?FN4}UXGWU`js#0XCB!X|9rJwy)V6b{ zY4YO8I#c7@_ai(3g0+}(@27Iz5_!QEQiwYU{2?iSqL z-QC??zuez5@67o#nM^W!XV$sbx{ehjh|5Er6uC1;<9l&__1;7NW@{1szOA*XZ^PP> zdfbm|4&YtsAyE%jk|jDpLfZL+R5*ve7Eu2c=b*lGd@y&oTGDtBd6!>RJ7cYwEkTXT+qNoUY^>u*G!vjndhDQB`^bizrlahUGo z7ur_r>Ro?;q{*sqlqpYE%bN_daB9n~fU|bwmtj=PrdKR7#tID9FL}#YRqEt^uIfp) z)Q>Bz3dG;nFOq!FL7KI>7VI3QgrfZKXiN^QsX%RqV5|ZI$!P^6yxTM@+ zf_a-)`_*IEP za*SXcf1!SN1njZXv}e(t*dBaw@Udf4FhUKjO9m zcBpc`3H`}Er&d{@q^`nzmmnWf5~T>s>x-Get;Uy7+Ah?>fFv7O^7q`BCJ(w|K>9as z+gTf4qcI@wYEyUKME+~{o#)ZnL(T6b zWo5t^B~HW&>dRg0&I8t6$F6k?0+aY7|x%9pa? zRClZJf(PYkO<@I}-!x9wbW34h5nm#9nG&8a4OCW?71?Irwann4m2RHRc4BXNB|!n6 z4#e;e{U)L0FTyV_9&IG*Y%~ZTs}f*G6OpPIY6=j=FuW-YBUTL&?{>#E>ba)LV|&-z zx(lB8o;C{2E*2L<57_CUjMeXO-1UcvV0dEmX=mRUB9Iz{F0KA((>}mn?7hBv$Ue( zKQC}fx;~lK;6Y*MeSNUU$H#PZ zbd}pqIn*@Fs$}_=qDWJ-UX43;ToH!2RED>CUNzWbNoBI+aS!)8rShp7-U7YK`%Kdc zJe7RzLoVGPGW+%eQuY4U$)ee2044=Qo>D?(=lK>hzc{pp?>r^0o!dSeSF{J#o*JHG zR5T^Itu_uA?hC*1a8^r$oB}(N@y1sGX*ED>Gc%^~QG?X1-WH}{lgW{-Ej}b9U@2{Q zX*okxRaMw3xO;bv6zwLb7;!RLoQ{|RI~pzgP!wS3q$@TJVv}Qd86zc=Ld=elWuihu zMhp!=Ao&>>=xk#0^64XS%Xz1hHspz{EiVrSXy=DPT2uyk^|sw?UAf z3X3=m5jB;TVuT8dJdMe>C+)T`KMqHphd^e^EW5iJ|_7%4>noNivx57d+@9vDLESB1} zFE{db?0MvP;wf6&6@Y1^raek3U&K_IB5)UFQ&nh$Xl!Dj?T@=tC+7u&rg1wgQYa1x zD0jx7Y5YUz<9}YV54zODYIBE#&^#RHO)5tQGDKi-I zSXnid4`ua=yq;JRJOsT{Xgl^=*3JZB8ya;`G!vm0?SI)wUf$ueGloG>oE_H)^jZ&> z34eGI0IBwE-&Qt5!flrOx~2f8!+a%HB`1x#FaaOler54PkoKeEGggWC1Q_3bkz~yW z&L0cIKTWbjtL8d=802^oMCZFioikKe#CQ^b@eDuioKmfML>QVCfEhsiaCFYCyeSJP zAF~O&GlX)`^iHavnj8~q4YL)2vQL~pb`>Zi+}%$T5<*v0Ov<6XI8e=C*LtFT4u~ce zt|s)QtE>T?R%O+#M1$^0zQXfWG!6@q$`8UK2$$7G#ZP-Jnpx4*W4vnv_*zUV- zoYZN@UVY+wtIrJdkS8-jIPE^HlSo01RE49qWIve+hIePf}tg9NGX?4 zuo85_u|MSm{;K_m>@SKjMA*b>}IN=>>us2mI zi7IN2rSMy79;~9uM|MKd*(eIMxi4KFOcjzs9=|Gyf6Tr>!jb8Cr)z2%%ZarmT_~1V(N*;}VQ^TB8%{pUsTZlB$=NAWhWEo}t5y&Gf9M(pa zj_FTurz(0yTStvnI{fP5gN+!{V|trMkKun3_4d|QS(>zMnORkOj~?VsrvIIcc}4a+ zVcYLo)sBY0w4b!9YwNhS9{czh?m7d8i~!9z2w*RN+g%yH zlB{iP?;z7nGV-5dC$hdlphH4wC4^@J2vbPOE)8;rEB?`bKk(y|k>?nkp#Va~Cvsw0*jb(kc$H9!uvFzS`%`5nF&m)Lrjujdr zz0Fjs5B5-!RWQ&<>#S>)cCw93YA$(6bBprLBHEmd=TL6F4e+pHx?Ka++ihg|nL5TGYW4a?fz9ld{1WnNjmPlu}bny^lbR{ZpWBx$#Y-6`}Uzu zNwvj~U2MOx2;!?r73JHXM{O&O#yUw$KBKtd)i{20M!Qdze6((f@^B||u>aVsE{?gkt?i!@}Rv_2&UQhGjV--4~0arc=*RrC& zJ(06BLA5{eeZNj<(5f|TUK~rX;YQTi6UHeG<|a)vA}x>Js9GGIx)=F!)E*$y+Jo&O zNp~N=Ot@QT9mH8op+~DOIh-g-t0q+>gWi=sOTg$KBsNua>N-T^{bfCQrg3}d;5|ggp|7wccK6< zA-*-VOoI;+9ie0f-9!!>U)>P`L}2`wKXo#-{X$KW_*LSQ6>QKU(XrpTUAbMaX|HYL zM#u4SE_K9h6q`>RQy?C%U^1W=)M3qHAovmN|B=Ke3od%uolg)_iEVo5(aONbK!DQx zF-d^++|#WbaU}$J{fxYSKBOE_h$l%`WKhd7Wj^DKw@2c%)w6Ec=!R zscb&ks!U-w>ho@f%@Edhd*tQx75Uef+u% z-WjKJyxg7^9$o#Hy@_-Us5k>|d}f%dl!aMlM0f~TurkaoqS z7GaT!kf62MmnW-gmzK6VdqEfrL1d@Eex3Ym+mz4HR1X$nj~8RiH5b>+gi1jcB4b@aewwinhpKptY9K!CKTP%HhE76V z2RZ5G(7#Ih+!YTlVcm1KS>1S*TET)Q$GFrx>SEr4!o&2T@g#58GJz^JoVh#dkALdN zl~*|woSy-+r`IYF#+@2T=w8Zx>VC1*CTY_@Wh+xqIp@@(yFO~b>|54)CEmxbqs8$Vt+ z|F1>t4(sbIjo0%`pK}i3wY7rY&Hg=P1ACZCZeRRk!DQ6cecQqDb%@~|DMI_Jwh~acCX@oT}T(QzJqs>AZ%t08l~va zPNRL0FMYf|Ih(kA@-%Y%V&5Rb#cz00j)tOuTR<5xj3Z(jUH!ePhU%KB`PcwF{)l4z zT7e8+|D;1HbLDEY6rX=8_4$7Pm_t*_^L=>8L)J4(eE+ zYQ=`$9whx~C?M|vx^NM$?KJljyj)23q>(ZQcWdW~yM{!c#^JAG|LPp*s|Zp^nT+%j zJLf67WH-X3C6}0&;>V6ZTm`Py$(5QBy?5{>_UE1m9vg4>65T9)-04%RA8|#~JW8HV zxDyg;+xPOqwqp&}1Yk|i->fc{bc>b8~nW2C6_tJ`3#cNdYRL-Rt zmg$E7+16&oRGfnge{pB`0DEy#E{@E7+r=qkU;uv-9sT!jF+yFx6l))-P`c-WsyX|U zA}M#jhtf7+rTWj2&_Yja7(22DuII88nbYvZLWIbdHi(k!(q_T={- z9^seU6+gDhTY@rn26!$F(POi*K79^O@H^!&@Diess2d=;n6RP#Fd~uNyh0VLB=+yW z_hiY&jCQ@UM@*6cpnt62LzSjlQ6R@aA2~ITi0PMDIHWka!Eo|GX!3qoZQJIC5Ldw2 zc1SRN!`S#eDo=+`h8|f>i&69HMf^BGmqyfG%86RN_yRBXjN6wX#8fM}b(^akKc;}n=3iJ+as9UkekLS{fl;Wn zQ0Do<2}h|K0e1N9LmOfZpMU2M;vx7s?}r|*j`#mbquwiMHN=o zpO?pj>r3L-_qG4-_?pdC^>1TrIU{`M6?~pNtlf54v~LddKMG7Wrgdq?N*nbXHSM%y zH?B*m+FPcDX;=HdEWkokKPcq}SIz@DNZ9EB$^_*3ihug?8P0O%nP%o0@lKWHPE~m( zOn0VQZf5H13~xyxXOfaFLpItdseYPB6HhqEIk9#2%iUaJOo&=ch}gh2oYKIqL#-CQ zd_lY-)lHP)gO7>zM>mQ%sjbj&p|U|5G*aKc^&Hx7Uo{}WzV>Xz@_k2*3ke>~GXhOB zvkbzgh=z1K#i(mChK8iXjLQz#QsQ20+<&=v&Ux@ge_2CoREg^b#l$$0lz7CxmQkLJ zL8>qE5)aR`M2&6uETEmbP04}#3L(KQI}UhVlU$Q-spbGVx>!K0WUMSuk}?+*uQU~k zTO}G~&LYDW%ipHQmPw9{)6rUKBff5tElGiyhrz7;#XOBO8fk+gR&v9oIhx=DHa0di z1-x+Tf(#4YatKF%!!~yZ%^G%Evm4fFPaL3VpqE`39dTcWJ5s4Q5Hj%UwZlQ6g)pXl zAZDX#T;?4Jdidh6S)(3H=FLjYOLyG>e<6%Xt}4lNb1HE_Dj;JZM#@x*(jgC%o25vk zI)$uykxaRWu1dqt;JY+iI(fX06vuTKXe$Q9C&3a+mcU1zF%&DmFZmCqFhv?Dm2cFu zMQU{U{ZcepRG7(3B>ThfUs*povIGZ6MVWAcxX9@6K?tw_m`|iHZ$H|4JA94wk+$yJ zSI+}pWeXi$8+96V7}DkUFMpeMt!I_PiSL`yH?_v>FO6-Of#n4M%HjUC z5kM!Q4K5)Yr>+V$K`3O23bZ~m{@eXSq&r%q1$@Tt7uaJu@nt^XGQjj11H0d{Emb#S zv?{c>4Lbg_Rl&2Q-Fq>{t~7QHDqKXCIw!l7D-#R z=bM$ob_=x&Cmv8V4o4bsiCpw-F>lmjX|EBw5r-918hf%VzHI*I2vcgFZ5EzwfQLVB zh9T-dEk8HcaIs0m@qEfdg0lk0%7nc;*fYMuoHG~hgoJ;864w6iJbh)*XWX^EbZ%?3 zi~MO;;qYY5yspXp0r&&$nvW}-*winT?(v~7OkaNMNvzfg;? zEJd*D>V-_LK)}THQF~^~2s!QF0_Sk3g z{o?SYW9UCi<7cen7S}iaSqHX*$FAp7(4kaGa^5qvqvGxf%|4H7ZaqG}QPFp-J_#CJ zl2U`F_QcuW*e(*mF>+&7kjl=vpmh2`C?y!Z?({>6O?-$+SVU8BQra!KxJ>12mazA$ zvC}RIrVVfR@n#7KmSM~G6<_3Z-&+4QByd`6B=apG#a7T{Cmhfe9x$R$-!*%U6+9k( z>Eb&IHbK8D2l!~v0{QGe54I|Vj3r%poa4tnMpwGvWEVe#WU!Jj>#GFpcCvpOr&VfkWqc)GW)jNj)-yfnNex0j+`Cq*** zpebBzuaUo(>+MJige&lcneB6P7X*kv;?&W}B!tM6(&B1m#?xXlI0XnQK5QvgrDDH=pE+~5=#zPl7nh7rg#u6{QpEK^<}Ge#fo&v6#NlM3MjP-FZIqWwFro) z4~%GvE8XIgxEkkPq201Ohl1-E)BWr{GfLlBq*ldpQVHC4zH*s-esBil$g{@&K=b_` zLb=g>=(>r#bQz%gK=$ZsDq{cA$)uO1{;o^GuB0@%gYdq*DM#^TiR_sXUuUt zK|HX4Ia>Kr8^3r)v!`8NHRTaI8@#V!&C{*3t(i}vXPSS?<7h)M0!gf#@Q8ezE1|2` zH!j0UDU`gwMJ;^*5}5eOrThIeRNG40J-lf3$)TvJKKw36rV z#HI@KwpX)Mg0_E;W2zn`988n*-F@K*5!$RUs6a`4Ua4f-5CVpn*#x^h`u%_PvL7H% zM%6(jJIEB25zCeiOIp=S_?xwFu-x5P4t+8^$i4lJ_U}yK_W@tGE9W)t*ROh(GHykU zBeWt2cp}t>##la91o)#L;;;E@Z*CnR*IyvbbA^XX|LU!xQ;C`D_+@796_nRGr9{s8 zZd)DMZpL;ammgc~d6PK7IOYdw`||I?YYn;^^6PxAPuTLf5UY0P_Votu=VTeS8%BFG zyObsQ&IaAsWCZfIZX#J@$A`;jvWKe;wMN??H1pND6Qqep8mp6)l|=^jx_vKA=_%~g zKdqEAE2Q1)Yx^Ijh>gQB`mjx$qAHXg?E~@1yE$>e~qx(sb+Je~4BrNuJCQ(ZwX(szMi{5LhVBpwO)$F&B;d4^n!CSRE?%3dej$6}C zQx37}oO5mx@x_I_n?z`%$~cfXhJ9ci`W`MV2q=orAVMm3=HL55u~x*tg_%Z(VtZj~ zo^eiGacycIpBrlvm%B{f=OPtt6Z@>o3hvG8=a7^S2@%i*GB*i5T>?|uh*(yedzv{f zQ0WYy0d0ZF-a8#K4-pdOZIPZnk3{DLS=x$A9sA$*hnx{$pYHesN9570T;Hcpx|n7b zM6W?`BKp%4uU}kw+qXLXr}+x`M&p-Q?wbDFczP!V{VQxY+bJ4Gqr%*|TLvdX48nmD zy*&~f@X-i;HXu-BM+Zjv86KfGD=wVr!ZESg@uj1z5w(4=0p6S1cDT zw{$39VfwHK#F9OGtY`r(9bGoo&+quhY_zThAV?8fVh*Z*=ALV_fPVbL6U;UTU#&1m zMbyd2zbD|qjrY-v70mjG2MIo>UFts z`rF3h_{Zh=eXRPr_<8CNE$wh_zSOajJ4AnVe%XDDPO2Q18Q7&bxY`or0P{m_g9ua1 zPP-6Mmfw@0uI;-Rxqnr-5!Uo&Roon-F6%H`bEF)paEms0M(x+sd(hpcb=vJ|5B`o3 zjR?&$E?&ec@46;IA+^47{gbVN#_T#j_VuAaVsJA?9ZKN=JQtu)9RmGN|{| zY0Ih6ZqG&%vP`cc+{~AU@#uZh|AOAX+b$L7ozS`}4)+vNd}>%7_t)Ni;zOL|tDe=&qpdk9qXTH_3Invn0D2O@ zgzrg%iZlsOawrswxM}x*yOIT?UZfHxdex(|0P=HVkpg4@Q)RaV4OfDMKN`6=b7P~T zM+Zw%0Ctp>91d|)K*_RGG8~3|+cBF=v=>dXZmS&WC~$hNXzh#<^Sczph%w>M1LCqU zr^^fM(+htvab1IAs>?bVC#P!r7dM;Oa^k&sSaI_Lr-R`bqA~S5WWMk8@75c! zSWO(xQ2oKUyQ_~GbY;eOhVgHEd9maas7U(Jp+HVZiXDkm1L9d56^PC61Pr{_v3;N4?uPqpHtz%% z->x_2NG>+)@G7}glZiZWO94)a?reMeCj`L@oVU45wWOSEWSnf-O#e*|69<5k4RQZi zE9O`$)AoFrcdI8Aj{5xP}~?_%!*jT%qME? z>Qk#TMym;|zX^)J$wz+^1b>q+xz1nX)(J&&xo5@(%Ojj`GA-IWGq zp~X7Hq4Kr7lOs8r;iICq#UFBy-uT6-2MvM)=Ih^n8kfjM(M`IyXFa8%Hn?Z|h0&_6 zFqGxCl_oaDNe{_LH`s5p+@F18UGnxH-T#N1RI#ZoC}Fof9?+8&7n8Ylu|XrKQSumm zN?dXKwda25vO=%F!7i{2$4mqNJuGE&JelD2)8vfij!dt)nyrC;yO(T>EOYf_SPshoZPm2uZ>-h|KW#9?^S5M6c4 zkhc^os{%z8?Mz5_k>C z%mFkBG8ksu&UpjL-Q)VHoeYw;N(FIWCF3L*@^A#zO-1IcLL+ zhmCGgok#_E{O{bf^9qI*4Z;U&s(!AF+wGp{=cnOZR*V~kt-s3lKD~KT^boHBX0@d9 zb5nK9zNXAcZ^@a6o+Y6*{S+>3OxJPcm+-$IfNmk&ZoxD0&pVlQF`jGE;OfW~72d`} z7ZfuduGG_=T^-JfJrAzbLm=n$@Nk`>&mUO_@(l7?c5z9LLE3&4##I)*;95|t<)@Pmv`2a-S_ARspI>JGA9F^x=ULi z_xrNtW`72r@bv1--{tMd#g2PevWmM|a!CEa>FHIgyqG*KsR>#~nM{q}&zb;*cG;d< z`H>cRWr(zJqoh`2&t@lV#Z7Yy2aTKY>OOCCBBwm`A$Dq>rr1;|z(h5+ntG56w6o%X z(&`Y!hk>$cgks~kBTEKyDg)h@3{W%JQ9Y-VNuf(LLrZ{tH{ttEvo~QiS5@PhkOJ;2 zw&Ugumyf%OQu}QeDUTd6QJyYg_!?dqI_o1F5JW%2AqyRyfVZJ@{2K_O79L6298p8U(J7YR#*U2}=MgWXZK z3_YmRpq9>o$q~-ss}heAFBNX8KU8j>noy7->->jx)hQ)mF1)lZ-T2=wVK^!y)3QfG zV-&#%1Zwu2@`T&;($(YCtY~(5=;QHrvrG2b8fzSN)lT&f{lNNf1JSPNSylXg_4Rvr6hQkx>4sy~UUPUbP%J%|B%90XbK?yLogtUNuUr}FL-WMyI z=Fy{#M$=9Aece{ucSoNmkb9&_Im(HmWkzrBUt4lSRYb@ohn^$vbMeQ_(VMHv_Gr(H z_!-yG!qcVfe9z#cOlM0EoG;7uzHvcoU%>aH(-WLooR)#`^<^KdkdEyU3j{S1UaTCd zIUe^Tm$Pc@0*iM{@Sl{30QQ79kHBxwy)wU*UAoV#%Y*l7U^y6N0u%93kkM|#a!SQN`G8P|FS(7 zI(P8&%l=r*_%^rh0ZLLo$A{#*MrgKwaIkr6(R>z2ewDbo6DV`vuCIK%&b#pPhb|6L z?7rS5WC6RM`^rS|#B-3ze!?*=VJt*NYG-{g&JePWa*fo^9^-nDw|=}P{GV+C)h5_# zNt6-K{M+>(!0(F@%le-n?ba)AYcG0sv^u_0XD0H8X5v^zO2j|NovR==n+B@kCPGoR zmcb7V$+?@(YsjH)tmIp>@z6c5Ue3rX?Pg()Ipozwbie4au1l97-?#Y3VdbJlVrS>^@&1Qgb1r%4RHtUF-!R>SFXbEEZc=vfd}6*4>|W%&UY~>R03qw_UEb60C5xH z@gn#&0D7#1l!UZB?eDPI#4hmQ79A1Mxd@tcB;vXvwe!SS>oa2h^!o#}Wi)p(M7%=G zy>h%96z$!Jk<=Gr^E1fF97C#~swop^!K1+bc5G{y0212|b%1+%@(otrFn=$*emH}J zgx(j&NpP$&gS(^EVeEJ-Lz-=|W$wxM)>@pGp8_7?_)G61|LQK2npb1q!-c{K!}tlU z_>eHPN4`1HyJHFqv(!x2*G_P!xqwAaV?Yw zA9qBOY3+1Rzh5$j1z@Zc{GQ|8NjBc%>}jpD-d^h6FqU|Hd4`5g2ectB>GIlZO?3tk z?aIXw=?;pCIPLgC)?`(694+o*2vF#IrndMjW!D16>F ziFYmKBLiV&Y;e8d$0c!L1b`vwrlOxDd2EG<@BN2NR3hu23-5^Sm@Rtem!7hl=YjFR zZo3mt6-dv5JI{hom%9$l*`%3vx(_*wT#Kp}C~!*&%tx;YlQXMqagEm5e(9`7$*xDp zt_SEqhw+DYN*j7g8$wDwUT8kTpb#sD9INuE2xuwT{V%O(KK+iNkBwNl6?8<(tt85i zf0Up9$UYa&J{KxF7c;^AVS_7bEPKP_S^deD zihzRBr+6Nnv*hb%=?nkw2%W{f9ZgJ7*_~0@9TmeJ2Rfct9Cs?H3rd`oxfs=D)&?@} z&oh}bfbk$h3GI6fRs%tGMJ*BH|f#wUR5Vu)t zoKU|`3QUMNO0eE*olQ>6{CI6$o|#+EZ>f*E?w#lMJmoQCNU+;eM!>01QB-zG8#)47 z9xoM@o9}tp)8n+Yb~dukH+bFg%rhn_c~GE&WsVD>QvbHBS!KPYzx7CshZuQcnMYcE z+W1KNT*)KbFOJpZk3K^|d2LYBl%-{ut;6w>YB^5U=Gf_VgtNZMvlznMtWj55Qi!d$ zh|#fCoag$L{BiTC13T2(H2&XIXn7=y3jc_`(vYmAinr4)JAfWni0GNR5Fj({f% zoFfSv4PxgF!h??G^`MGt(zALXVVT^5miC2{6FP~Pu)_;=N-thDfg_01OfnoeFe12V zmy;wr{yC2RYme5^W!-G9hgUp?1lEi$A4JY3j?j0m0)N*3^Kx>n~Mn6?U9HL0cZ^*I78sdMZ7N zv5KL5$~Tm-;Q~1|g&~>IVYs~NJ=TX=3(e11L5V-9&b>Od4k<%Q!b40~J0)Ls{Xt@3kQXID$e>&*P=@zI}bGg4rYto$S6i zqdVT>=X(D(w~|zRUcab9LA;wYNh^;pm^=!;T`!Tgis~8Ndd}Epv)np$`}VWx-Kvhn z`md_O_cBtof8xOCyaT~8NCxw=;Y{3$npUWfT!SN<(~$A#}@v@CqBOMqQBs*WzI1emHqKWxVO!A>U^V z*ky@vIFxL0`*x+aJ&!fl2{s|eX4c2x*^t@NPIJBv&{W$O$ni9tf)mTMYNyUIyC{)5nya2+ z>oyDRsk+7im0?>=MBtb*_Ofl|g4&3(1VYK`JUZ%%k!xOJYZXt#@G5SSr^Zpq--;u) zR;+afXKnM~oJw{4zgRv3SmBC!aSycGHiR zM%)=J;sY&+Get>P|1S$bVRlY#SV;O0s_Gdj3ur0KsDM^2vU6@yzaURmJ5H2k%QOy6 zh}BQfP?u44AMMT+EBJqYgEZ6)kZ3Z}J1n;YQ2|X_#Cn`ild3Qqtz$xqd{UobEe=w1 z%4I}t<~izgd1r1*f6h1m@Lp%T_5SH+|BULt9FKi!%L?|TZD^f_#QBb7`7Qg|A0wDT zm2U-Q$RJ4MAIJCD;{~MybQ$N;Q*+HFl`1!kmGVKiswaj9qGA8#p+u!2ZSlreOgr9J z-cFm&hKzBMn=YnSNY=l}s$Ti7e(SKILNyU-r=8izn<> z?ayMO+Xl_K--7(RW9g@IdCB|hB_qN6X2x$%#XBd34-Xtg2W`^w%)V=I_R17Sn{KFv+$RZ_Xc&S(&HuF82 zS`uS~1d#is_AQ@jb-qHb(cEQ|lbgHT<8gJ0cLe(bealpKLgn#-B^D5-`TOSs3Sj*JTfDsBU!>nAi#zlrjsm1>WXGyM% zfd3CaX)ZvF+|YFculY3hz>~7-er)3my*N$;S_buS!4t~NJb3BrWB1%a~|o2pHb0CzVhjBQe&T9kAj}Tni7WNvs3_}rwbjL zl$Wo7b6tq0#ONV#*G?dW=4?7o*CBMima4B9d`N9(H*KhEYwgiphkiw>4}aS~U_)tm zn~KT5)}tA17qS1A%^!CkUvJ)cz>5JitT}3Vh>AqxWN9LeJfm^Qj7!HEDxb{Ld-L_? z2;dgoA8=Lsxq{ZDN?%#Io=q?B8PSM!0Et<)+Lbn}WLw)WbHzJ4Z{GKIApfM#fHl6g zjpkVTI5L8VEHD~&k(F87lTDczP1U*m?Pnsm}m^>IKO&+NE?~?2C{_Zx5 zu=4Wv(S)$`)w8%x_T3A}`EJ|>>Ag_y)e&o1&}9<;jaey4^L8!{II2LFvgsxOl-;LY5AX={CmiiO^M`ElfL#0_$y(PmkF03oBv z?~P6o-LmO!J;B{M!ZbdeYfr2<(&*?FDWCzFfm8AmdrZ^^gvN{j9W`MWdhCRd$VI*U z;3ISecKb?!5UH1Mvs>`FHqLZW_wfjg50}mif(q=?na5GWUB_@I@$*fBQ-WObYlfp9QsMsTg7yaL) z*nT7r4Z`etIg$*MxA>OC>v`IAuxNgBw5%&?%9((JE*YXOnS(B?gEtbQHvyuqrvMREtuAy1*rBsJ zFiSM>2Rb$bs$~Oz$|Mu$p);T|dNN2-N!i|?`9jQF-Fz}|R!whXpuN)ca3 zY)!>jliku2w8e59hEz(+P*vX0k$UsVYU;XFYP^Pqzdvk;kT$NS^d!UB;v9o@xmVU! zmAQ3sWM%IA^_JA0D3UBgITLfM+fI!bZn@gJq87^^7rzD;tWM{n;-lMW@Z8>c{X5GX|+e zX0L}trV_^~_;hB)?SB@38>t0_E#fvsSnqtwFA9H9V~AgC9g2Nnk+`xQ9Bc=ayu_6r z5pws^SBH5_J)h>?l9AW_gvtBKrPf!a@O3l8O%&wxYbV}E*?X0omnQ_`jAnZbm|T;n zwu*V!Fy1m2>B-^;KILQ`T+7F8+ki+o<4;>;t_=A@=b9gQNd8(kjtU!7j4xTbF|YKj zfN+L?dY{loIDAj-ZmElMSNBsZHu6;O+q&bhy0USZB{)FcyRhn)Ean-sRzdgn2pcd! z5ABSGcll;mNN==ngpQ>DjrsLZqUGUXoR9V?H8yAZ2Ftszqd)87WM#ipCDW+&j5U!~ zVDB*ykm;q`vr-4R@z#&kYL#}&4@j9}#C^#Rc|Egb`sy88-wyAokA4<4jcX}S+J1+S zo8>JEg<+RveVgF~ph^!q&%}U>$R8{HtgWzuZP*Fx=VL62$XDIM z4>B;~P{9r}THPgQye)_A{ljm~plAF66t)<=CW*a4?(i z*^0JALwnS~Hf-EDu|vazjOo9ugQM@0r%D*b)NPI-k5)f~h8m*WjS2V1$hn6ZY}2Kq zN-?VE=-V6zA6%0{&z&rDmg67hU?opSFV$<}NUSYUzAiu91=)jdVq)p9a~-1F2a+Ds zz!~#HU-d`^9`$m`8T5KDx2R+5#2ku=2#;%E*tFf`niocwHAb~HWYaX9j&T!)&Hp(r z%nZYfF6Xtv5eAMDidpY;xm1% zTWZ@k{ym~gJONSeX<_VW1$!sK=)wQx3Wm51SB@$$cpH95YDTDQ1=>Imy1~%W7CxbZ zAoB^K4zqro+HE9m_yGQZE}xgq55yIy(aVw0Zq>ueO{WDIJAw=J3y%vP!fz4UNsmye zj3?KC3?vjMbBRYtTXf3d=>IiX*bhDaP?K7vH3AjPBabvDHB!mpMs@HK)=P9j#&%Y0 zmeD0~6vs8C0>?(#6^V6cY1a2^1{LQ#+WZvOPFOWFs(s1|+_e0={~dBKY7OX(!cc3r zt>o4iTQkr20KR4g?>B>|v>(}9ch@J>AL(r<3J&OaWz-i_< zu7T-o$$8mfAw>wyZPBZzLgJaI6D#)tPvsVt&^!+G8F;;C_%grM%9&x?#CG>Nn2t%rw?% z4-@!m|9P63Y%@C%$G2J8**>{H5iKrk(d$8KVCEd5&4fJz3vQ)k=>2dq5&q_U&4)0c zuaN3(1-eaJ<7o3Un#68y-{6LH$j~x@4aCedte>+lt~-%=mgFaQi_YA-se)T5@`x^k zXX?^?Pe{@w?J%!X>R|S&F~;A=es%rdbCOSNX{(V}rmUNV{T=Er65lXCV?v`1G6*a@ z2D(%$_Z!i_^GC5AHt2w}G2Tk&jL^i&HM4aPka-8Mi2i_>62JT}PHHG}Ah}hNKD(ES z#fZ3uRbhaPk|^Rz;PcLtamu2hs6!`Q_tl377TkSJDg_>5^8KqVkB+NNp1?P&KOmZ9 z{@j+&=;0ThLO{6uwYTt7Cj9ObLlFmo_dFap7OQ_09on^X(j0Gml865XbjI}B?bQdb zC>5?18IQEd!+l%x5xhazlJQ&#ojXK`Omw68U&C61Nvt!l(GytVL#RH)8M8Jub1P)k zVG%J1G2DkDBu+Bnu<1lR1yfOc>-5@L!1=iO5%C-d=6h%sH-W%>YEN?Xw(kO$pYV6i zCY~^>&(nj%{;OGhiu2MR)`wpV9@@dPT=DMo>=IcuBx9-h@Apgoe_9oIX=BO^iBdHS zwOsts*6u-}Ggjk`w{>%KLo!#CRG|Lf0<-{?Roe* zp1~)Mq?>WC3Qz6;(Sjj6(CJIH4d}t0q-zvB6n%m$6!m5Msq<5J7pNJYKXinEwPnhr z2pq+MNZM^G9Aq_Q6BP>q3|G}mSftc8Ed=(&qu(3II*u)3)1ULc;EnYUEL;hC$Gnn^ z82wD#`tnt{{@f4W{ya|tn*0#|t_2a1Vb063LhU49?c`TV6wik~BWtn(MKFQzU@1HC8r)T0#OC(AjVf*l=h! z-F|%o)i>~jdE0#~1&60>NC_NL9MxmFuSB%kOMS=x3n#do5F2QL5o#SWZxw5=%uSgA z6BC$?wsi^#r6oBTSKaLe{nTNSpd%(HR>q2>j)a6f?nnvAFp$#VU?j((Yyzvj2@$k% z1ECu>7wHMsOfr1f3 zxC8}hIjVlDBy#K#wla;7omr%_ZZw=&L8tacJ_9{-MEy#Tl8J|{T#;``At?nrS)C`) z7t3+rk-OniyAji-3N&07W=s&lJ-_}J9>kXDNMW`B`P&RS9B)>}{#c9@ifx0#i`)IR z=XuBKrhp^>YsqkY&_|h%_;rMMJ02u*&%JpodG2%36+dVyML{k^ilUN+pLO+LG6rAm~Jh zz_>yXzC|^`_Bi3FJn^U^fv_B?#3Q?ee|CxgjuVdv6KshRZOJGXM8pgHen?&6*6q`q z-rz`G>PcN@UPWM(V=fbJh12- zD88pKNk1-mxm@h%CqLNc#E+9i!u%Cj^uv<*bvV>52o=;9fe%6q2LZ!wqLUZ!Jf zaCXg)kMFZJR5U0}vU2h?Nmy<0fz~8Dj}G^}d<3VUP|t<+zJ^=;+(s_-hh6$&x7gjE z8W&$`QV`oLghp#hYFmT;UY4fd@}8gjBlFf+x?HVD)}QUFr|4(qI%TOV$QypJc+kY% z(@5|uO%Gp08R^zlnuMvOFEVBe+|?ovm3ux)m&2trDGT1r2& z*i+_2fsY;cNaNf{?DxH5UeK%l;^p^YXHFBH*C7FSeN*n5duUsgKhd`@@}7gX&o^$+ zjhJ4K?=O1t^aS>|2^`ExES1JL7#qzV7u{{acQx&v8-K?-nnlz| zga#1;;2 z*f*yi-IqlS=iykI5E^9SrK*h$I)@f|NuQ$J8l!YO%dsf_;`iANN|msc+4y4-om9i6vfE^tg*sN3@SR|2ub!Ce$%v=Ap(MWpDEi!n4$$m|j_;$Vb;+bdkFKb5I3q5n5 z)ddq{^g*7*jK`ZgM1gfi*EOSDKksVuSk=?@*pA^NshV!O@PFJ{hF>Zd&uLXn`b3^QF-&M%HJZ=++o-%ce`yT^AEp&pp#@i!JO%<#QbAzJLj?p_OzpeuU257 zIe=)(Pw3ZoF{g-qH6fL@5@GL(vrMqtq zgg;SGV9uZX%&C^(@ljazHW<`$peD*G zu58?In9J_h^C9if2(Q z*xGV7)aWC)1E2Gl0WIe(g4>7Oz^>==K@wnQw_xz0xF@n3Ln)b}z$ zUa*Hb0*|zSmit?`lVClQ;#BKIAT)FGItI$=sK3mSoMH2H0ayp;)*RSmOje?3aI=<7 zKodTVd4j!$=& z@j+|XG5XQM25G*{uaxq^8*iuOdp&62s<{3hfo1{pIzIF|fpD4byF zOH2x{!En-e!BN;_))VKeVNN$VhXG%<2**8dVnFm&VJrq3`7tq>^doCtcok^$c#2)Xzpm z<|AF-w>A%-I|LJg(H-6x?p+bU@tm3?b#-pr{ZJ~z_eI|Bk!~QI6W#tb(P$gr_r05D z@0xW_a>?DB&`vUlbZ1i=K-H#(8Dm6SBr+fFK7a2T`qL-rT|)Mk$0&^x}&oiehk zP4cZP?8_(q=iwNrrx1uMCqn^v5P$)P!XTz~zh?h^E!P}Qv2nE1uyv|HJJfQ=YQ&(l zCGA@k46pJ*S6vheig6+WUOG!lJdy0ZXP;NWr8Q6EH+h7337?l~I9iVCqVBIt`q51Hzpa9Y<0#@!*8L)EF)7a|C3 zYPqh5i_GVA=+DZ=yFRklnT?%`O(&moPhn5r3_bI_PiY(BV+UOc*Od!$Y$0pbre@&8 zrV-r`MIxoJ7^`7HueTCt?dWM*TuXa2M~GWP{B!rD+*I& z-Ty7bhjT2zSpCj8&(20_17}~EU%5KRo@Rt4`ibsoS|TGGJ6(t`c|KEOO{NFe(QSFA z$O$PhkqXxcscQF>T#+}Th4%-1@+=~k*~z^H$lzZm)hBWQf#ceGVX^iTYTH##Drs9~LPY*#s?psk*n?_?T6!l*=n(%`L&-S){A9%$oF&-@iM! zTa7N+X5|LI^!8uzkM%j%WG5X z!|+jQg!Q@*3YP=NcBpWXu@$9|WhFgdNGsh@6q??Zeg7d-3OQ}uzG!2Ix(=s4ot)Ox zQ|p*(xBmFv7OqDtS%z20O>FE!ctO^VG=z>U{p{(Bo(;C6ks$`7c^7`JbInB(e*x9d2#-UD!J%dT7ipQQu(7gkvV=Z>shDTGtr@v|H)CX!LB$J_JEQ~&65!^(5RkVxKHAnV{P_IVehJ~ zHDmaCD&b$=msw%)ayzN=3W*X{X-hiE5?0x2plZaxzs0I+q^fIVs%ykcD#XjHWXh|g z%gZDS%A^abr7J7NDw!lJ>7jV=bD+ibC&W5XhFJ#qs=SV;sVWbfHxg?&BC-JJu;S7 zsrs6&jcqb(gkNR||L|YVuL`@ApK&6FZrA7K9nt&iDuy?%m*u5dKi3z9?9P6bUl2T4 zaGM`!Cgf;~s~F<7J#g>tX*l1x!|_&|yF5WCozFgfOVO9;?U!&q-B0xCNq7z)+y&O* zZkz1EMx*<$O+r9xesQRU<<$~3(qSNV@uJ4y%s@B6vOjZ!xcaco(9(S$1J$mlo0ur5 zxcFGnb@y$;eCPW}Z%1yl6(z=^CGssyZyXvw0~V6(S_!djB7o@$mcy{j`=oC@_OY1a z>v@(ZO&x?eYc4Z9onuFa^6C~I3F`A%YncscTKz%~PY(t>8suP>iP*l^^DxJx{a$d72~z z@;2q%xUtUsB?>CycB=JMR_yp~%PE%UhUJYumCkY!PqO6ua*i$Bqw2f3oYb&7)iy** zv(Ok%W7p{-Emba6@!$$DcYH+l8TAW^;%sRC=qFcJXU?*-NPHUyVRX{ib_1zb@fk_e)^PG`_(yl z(^PO{*k@XK)ui$shcqBl`rw9%%b=wW^?UznUZ}&ai$p(09rv2l_e=T)43Yc;Z+vAV zi;I(4rd&wI!X8IZLpPA_=pSKX;}aMytgMF!G<) z?3>rd6>fQN@2Eyhb$;odQ!sA|Hv9KEpsw<&%H#v^C3*%J`M5E5@>aSO=xj<|hl!4r zJg5#5Zk#G@jbBYP{(lw#a8B}T{kdez`ew7dg%}-Zw)RnE3p2ONUuB-?S)Tq&D_2N) zMbOULhi>)L%V6g`k0+w{pJ*eiSrafFjMvipSd50MH+uIIjIW4|Z-&`dLabfiq2pE@ zx&ex{kLPzpVuaWMQsYtn!&+X*BEQ*Alh<)7ooocQYx`qXZ z-k((kcXBs7mscN1eH%!;W*JIiB#su@xyRVKy~}#gDmkGLcymqrgqEN-Q0I(#2L zbKG+%edjI^0wDvwrs$U9t@nf9rz_E#-JmF*zzOSS;}uP!UqNGcDDhl9?W;}(7h#Jg-#>tBrsVsj}+W#A`xA`lpj`fOo;9ZHle@-p-@PIkbo9&pBZ;XDP zq8!&u60{oRcUz@~t!tJ;OUlmDUm156j?uQ9A7?kU@+GO}$y5Ge%H7yFb`%=hD2{Ib zjA=td<~+uxS)}UJ#bc84*kl?+9*@1bcGgC?6 z$n^VMH4-@Y=LxI z^ev&fEW9ypqtIrTMHRu}EA)o@2BdA{>6IE5Wp_P?M{)R1d`&c{%VXcj0|J}oaR~R| zBTxo*AF<$O5gr!Y{@YqV#*3Y+WvA#axlF0cB46R!B?k4 zcoMe5PJBTZCx?``q5AjWV5%E4pqWqZG|EY7yx_=hLfi-=>6J7k*=(t0A;KoL(*ydj zKP}6*Nr}lvl@KJ{YkUsqzZVzmz*3zK6J%?PoFxsVVL3*tLb^=N`Ip9*xvHhCbW70^=z^t^;u*(o#cNuKnd~w8F^iUMYclaWVssmOxg=WFGJb9Tt9ee&rpxnFizMvL!m7i_p{APL=srf>6@L^Y4PV3;glQ-r=5)jkUL`Q!Pc-#sPy zs<(ttzyio(ML@-}@&Bhc&t!rr>fm{nE6{9VL(GmpA^!|+oyJtRP^$>3VvOraa62-vOmjtYw+$OM& z^pzcOKPv@8ch46dZhjJCC5&oNzcK8%o71Y-Fm3MM(42+4d-8V6TH9y!xB11TYP~XJ z9zd<53U!inD8#u^zj&umxu;M$rBI|QIb{nxI>p)Va|U2J`l9-O@1*@+$Z20cWx)E^eOP{oMF{UxJZ69+HStrhH~Dzu`GA1;n|4a{(Sf*4?b}5bnNcpc{nwP_Y?{7f8SCn%O01E#e{&@!I&KJGmI?~zg9u(Yo)St zEl;R2&F1u%p_=4vwbQKx2h&x3u^!$~X^v=3fmnIIFyFH1vgVHh<$$gHOoV*9__);$ z9X>@y3{K=Ak}OU}`);E+QLIdaY%uYl1o2QGF)c+AwuxF@gOr?1KUINAK_cdiV}do+ zv--|$pPjRNY?sen+}+s*ptS4g>q{2S7;|JGg-RSu2|sm)^pmfGF=UeAg5~1@Qx@A6 z<0gGzO;X3+66m^R8sI9{eoUAQ?$>TRE+fBxdEXyS9QJH|qY&~Jglo&L7yK?*H&lVq z%*r7+wAhBGWJp&}cT>ixk>Hm#UER5%1{tq%^#JRfiNsn5D5o}+F6pG11JMsgw>xEi)rMusg#S_ z&c?rGOnz^P83ljWj#bi+)ld(WQV&&94^q+((@_5*We}pH8~8P2>Q$WODeC(`xzNDT zcc7$3fg%nW4M)Pmz+!M-N2SX zF+Kujqi-K+{gM`WqgRp!%}6IO_q9(-45CNyUZ0-jR`7YUTM_WKIfj)~^<*u)vaBFH ze$LIv_j8PZXfxw#&tKB@WFzuZ3k|dEiM#8rG+4AR$&;jdS?sR2PUY0F zxLif6w!K>558gE#R(4D}d+6??0s*(Rq~F3xd}em~#E`N6x1oagg` z=m3YK9Z>~gRE`{p8OU+Gfx$4T`_rs{eTF*nDbTPcgcB}8QlY0=YEY-tPScv z2bEr}u7&Tj)3h6Y504gHHZWy6v(A3^PwVu_b2&II)esrU_vnmF%;1q(?=&~PCfG61 zZ2V+oB5=p?)W(Z>@Lg8j_mhVKTwRGmoPN32qF%p=8_#LIAhDJ(m0p%&eO*F@vd#MV;dQoNML|GCO$c%qX3;&* zoVY|bC^|dvbi?v$w2b@4@|m1ZFTSkdzq4JlZhlY6?;N9LCb?(XM80P$+W|fn&x5tH zz97^ybJn^WWNc`IFQwj&{tRJclZ{%3VyE^gR#MfDmc8*JO6}4u8-M5_Od=(WnF?|2 zB+_cec45YrXWGugaS87p-m(viccwMZb5&Jnn})PLk&i3kdW7Hk%;jWdyUHxoBhIVa zN$IM}EX0AitCPEPS4y)#u`{sfo`rr!GcLr)k?Q#xuxfdl_^_juC9Cw3kZ_6R??tX6 zPq6lVq}5!fXmB3>P1{nIHXiDO_|D@~?i|HPeZIycK3CqY zXoUAi%p3eKCyXYgJyC1<-aPGNOQ&VV4Gro4NZI@P@Vb1&rp8oC~y$~hXsI`_~{75>XiD6UjJy0DdqiN?@*%q9`jaTP9 zo=Z8SVphu|b{wiSRjjnl)$K{wbARg#<=dcqR&yxvF$y31u2ba{O*QiuOaHK`=~xA! zVaOw{Bo3$0adttsUu0&STe%=l+39Lgvl+M9D$CdZ<@FtGx4At<$3k;00J{^L!;v{^ zj~a7^_yA=smhs^i5Cmj!Kpbmev$OEYD}F5P&nc?8)}kZQ2KpWhOqVd065 zHby$66j=nwkbFwkEQK9;(Q@k%rp1l!1vD0_bxPyLw{sE&- zfJEnnM`DYubcpu;JL&BLuP#BJsfT4`RiaHvW_!Bd@`R;}=+i{7TvqtE<~TF!ynz+& z;0_NsBZn1N(SVn5e|tDSLM+FWy4|TSC#(o9{r?VfP*M0!H+El!(MPsGzWv8QRI9Jm z?bVCP4~GJIwF}f%WtxbhBq=p{)Bk0nC23H|3;oR1C5a!BA9y2l^yNFgkPP&358%sU z^qJA=vR*gj(tGOwc9pXNp0~!Kd7NO@zC(;EC@0$!Inb#8@1NFiWmN~Q(y7|d6N5&x zXP_Q5!&LX7h5&%GYl?0zfnL-xJg7f>$D43g`DMd!+t>$L({d6fy`$Ax7v(D(DA5|O zM*b$Re7W)Cwr8a^HZ*boJ#tVoMA9F-4)aVEJLDZWrQT2KxIt%tQA+vgJ|#;hBw9yW z@w3N%ZRAhn<2&S|JEzfwB|^Kcn^~cSu)OWrO5;=&@@$ZWPi5rmQ0O%mex1-l=tlV- z7nZyOlR{BGh>egIHxfHGM>9lLPFiw6(%)2^Rdz-)&ddZmQF7Zv^x~X+#5&y*aN)uI zf{l(P{Pf0_NR_CRs6>(|M>Q3+4kWiLQem3_d46>|zJ|%Z-rkSNdQLqX@&8+Dz1eo< zuUi^l%HbidCWGmx%0!-sMV*L^2C2pARY+J(7w{gjWum1s*&tPL+J3XfVAG3j^#z}R zX)Uup6wd!xH#aq6GI6nrhi}5~fX1%v^_sgG*SAd{DO)!(#8`gt>BC!B>Mm(`;urQ) z9>#m;3x|VP?$`XjLavA+Mh1tcf~aFYdd)jx_fGY^Gd<|I4RPq5-HR{OCPjN^v?|3QQ!x zNz#dr81Rt%zqy9MbxP2@?VxGh=H1g&&1`h+mmW6&cDws??Yr|nQYuDlI(W#g_jJy* zS%FQbc}5riYu3=W%tt=9W=h^}2}{o)jW^WDQ)KM59oI%xEIT5gFzt@9?2Z$yiCBtA z%c`+5UfG@d2e~L_c_}!#zRYTq&;F!b{8_4P@WI)Dp93UKcx20%XaiJ5f?auHgub=>JtYaH3#UeB>CBEgB!A`jmf(C9y|&i-$4GKWrhZH(cEqVIYtE z&I#+C6Z<2@@~xcO(vxAnF0qP#to3aQg)c&gCAM134LOh$dnfH?N=Y)Dy-J@3JpdgER z&$t_XWE+L5f`o3-$ZVaEx>2zAX^r63&m}A%i*Vb(LvU!y&}sEP>P}VvK~bOeZDxL` z$HU`N`3WUXpGdx01IO2}Z!1~tIiAr;#D;2)ci@Sed?R8!>B z1$emVV98RP@Y%3=3rRChioe5{40nkPEo?^%j&`MWCr$a;bYd&dA09vHhCFre!sgIk zxqPzjaCjr#146GxXo+#n+25q`$I?W_e|iMJgfHs!+F(mlE^dd6hBhE?xRSt=_YCP z4CJ<*_{&ODsd6e-HH=*zQBL$C*wJ@Xp@_r`O z>Bp5M)dJ0ZgKzTNG|Gcv$C%)i2k30j|hzmnz1^>=5%s5 zUQV9JcpTZPqz)2~kUBE8_0}C?%N9%lIB?HF_C%}jUp!20QHp|b2tL~jDDDHL$ zt9sXbl?W&J!div+UHkt5O8La^LEC9l-hY2@MrcSZb3P_(Wkh}i+IJOd+0vAJ?Gbic z+;lh54=vtZgiU&JYTfYw?6R*xO9YR0a;-&iLN7I!6aTv<;bqRkPb?vGzB zNfXuBmbq(Yg$CY%Vn{{U3R9cQnSX`!(>n~=fSGJ(Inw_p!e8n z2m5518aD27ouFV@WC5&1pEeJA-ijo`;ra^aoZKYyxM zhnolfgvs?k=Kh#BpdJ%M9CsjLYoIr?RUW-B54q4J=pWQxojO@rw)ms zy$TtA2V(FbKmwF(po2xPCZZ4$3r5ld(sQzzI&=uA>5wV~A z^Y9pe(%Q5%Yt+yoaWHi7XJLQH{Kl-F#MCt`(OT#vVs_JAcGt|vJ3<1d*E)LZlDf7H zKAnV=iN%4?Q$JY89;*_trq{+ieiL`>_|jPa#hJas%FOVP53w1Af)>DVL{b0uOsvH2 zDLxw}wdy8%O)UoCId(WBfcHdxnv1-b;JsvK+^1&lw&9;~GHFL}zm~NoA~T|8Zx**T zPfp$fsf52LjxVxH3LxPc4Gabh7|rwtAUu&6ARMwKnuP}W-*#voQ^fm0SQVJmQ~mc4`a{I}@zUdI=G=E4$rUl(%=6 zl<(OwkOs&b+-M3Meblx03at-#=W|B9KI!GV7X99PR>s2Kk4?~HsZa=!l?mIp?xlNja@?@YKag|=_FZ+NUqG7}I+}O%7JNm+VPc$uxSIHki z{XIW^lLfnoTIs(sJKicfV^#YhAq7lk3JKmmz8rj++;`nPZ%3v!1uhWA-HB)_KGaMN zU5p^Z#eW*?PVXw_4!Np0iJRiwSRIlwL$RwdY=Clvw0eE^8lyXEc8VcU=W9PWzhQA& zYEklK>k8UslBN9Ns(E?HBWsp%Y-Rnls7W3FY`sc~Vecf+u4wOxGIdUf929j16Mw}8 zjFOUa&4`o-kZE^9)RFr}xCUZrv2DH*shW#@C*1c({rk#X>x3X9g5WS^xP#IAyiuY2 zYPEZ&2{LK~2gqw)4)MJ6MP2nrvI#(6$qj-=jSTHQE~}+x4mWS?i4w?ucIF zO8}gCt{G+x5x;EV(>&o`AV|mkQ=c7JEX#V}X1*i-Ehcr}XyjPdle98`3ueC2X;SOv zm&c5ij-XB&NE!+;jdTS$Qz-}$Ql~~Zv5@Xt=!FR;D@j-eLmU?Gc z5bj^lD@n1{5Ub?0eSv#1fHgAbgs@J-Cm^s5gSG(iaX=^@KOdhML#ioH7Qe7Cb%s(d zugtx#2w(@<+b`+sf2L}$-!LE2TO?bhng5mKORD1JaiTIlB~A2&?=9@|2%GV^!u|~Q zB}G25Vs1Ev0e#Na)soRW8m((EZut~K7L_RErOKAn2aCpxB6V?nWKPsck>U^o)=4oN z>uJ9ibliP-D!@~tg;SFi{~^wL;hEyl{SeneD~cKKC&_UOpWp9MlynA=Lp0dPII$28 zPG2)1>3Q6e$hHYTXEJ2OSh9jWe?I+N1!_cyvy=q?$56s9!}tkHL0)T^yC8n_hr$`p zSHY1CkPiYF!~;YN?D@i{8P*IP-@NX+y;gC8MMGLXO%(@#fsrO~@%YdFv`M`JTV~6Q z{?F<31Xkhl|IY%@e$9CLmM*}@)+JFM5GR#}&_n@(r+}GBtqetQ25J>l$re<|mRE?1 z;@cf1{3DtauUefR4!U4Rgg{&Z85b8QW;MuXi^!|K>!$`a%?~$n4|8$LY0k^d&kxTv z4bQn{G~t)EBSe&V!xh=JEEHfT)8Xe=jaEay9iGM(UqEaQZi`F`ApEDRad zE`1vrpOsbOS~b1AK-<>`H_SN&->lo6basbyzF|N1D)Py)Y!P;axn1)-)`b&yj#vd0 zWWz=f-d`z4q;*W!+~KSS^!v;(y>;^rVW3bFyS3o>-~RZzgMuB)>iKp;y}{dZ>F2{( z$~+apJC9>mO}p@#uH%8TRm~%mBTO7O>D*quTQw~0x)E$Q8wr9&x(!7+$;L~A`#`m3 zycsiujlW~{Qt+A8g5O2zjR$#S6oQGeywPFqw0(7IR5>1OZmWNw9W2Q%AOj^}eSk|MIb9%wu0%@=(BhCv8e8%O)Z#?t0U)}RoR7LYCd82dk zq2pbh%2zPe!_LG(%Xy1}SqwhIwvcXSl#yg64HDiZQ2V6${K2)Buei~K8@|9;V$Joh z6(TFUszU6IHx#z5x9b-64EOFrQ4^fT<|Wj&J9_=H10vh`+TyP0Jr-Rbjl;@_1lao6xx z);dEsK{@rZ(a4N7$wqbKxr3lzc4ZTmf%l-#)_-p$*;Gw;nY)&s63b+MyigCwD%`ik zetHhL6n|~;O+PC(@U8hrNo5OZ*ie$Cxt&t~XIh-rsUV^QD&OH)kQ-bbk zz3-##W8XkaJ6*n!>ArAzwxlg41RbCcvHpZXweib?2TCfu9NaU3rU5AlexGV=5SMSM z6lSo+!eJS@W$}J1ECnI40FrbHi6M#?3@)OJqMC9FAum&mL)rYqZ@-KyaNDtxu z{b9=K_qrplMlxR`_Ko0$H}Sn6;OWfk-vgi4A2C+hZ^pgZL~yaJ{Qf)sJ1}E-E?2AD z()ALv9+M@SRy2N=bo6qOOiilU9EmaK?^>dHJ|#k88Z`Gp!Ysp3>C!(1n#MEqY&N@} zH91fj=w+Hv8*cw=&g51B06s6UB2&&B!GZB}r565uAW({QW)25pi69dN|vD9(AXs9nJ|3d1*u+O525YWe%Mb51=eLtrZo zyx>sV1@~D9ENPRB4Xkf92?qlZ-wiG>)UwPr>uFh|xunN%O(dZEb=LXzY6bs){6BRp z^gl}|If5)w-O5DsG-RP0CurIS9gMaB0P#8NjZSu|L@oGGVBfQ+z^Nnq;nhOdyBiiY zH#XUgvlsSZ=*Q3LkeGo(fA7h?VT7_7H`5(Esf|i3A|qPv_SD>1fzJMa=k5r$ubJh$ z4H>OKt`lIm0xph)zJg4mDj#*{f!oe*W1K}-y|M0*&P{JRFc&8y>Gj09L z9$FBI?Y=>a`ky=>`^Eam>Yo=cBMAPaCu4{zX@_%}-_;w*+xOqmE{e>tbf6DHj|jry zWZc^_1U3{1og!#4%)^ME3Ku2r`-E;UAPd3AN>X$I%40jtO{EvSx~2*&L7 zusn4TeYzAOic5tb?XvCaT-!Erx=lDbAzb8gTL zjH6dF;9T-PaJpmOIW{5}Xw2XOu_k?f(b*!+TY9LdNZOIi%2qzXCd6^%ApcTVx_`$b zy5ZfI9h&r&2RC{m=R@mD-FL+1G(g<%g}Hh9_(6asyZc8A*#UGkfxbx2LV{{rl4={Cs*hwKJS*aE z0Sl1wv6v`;!egRXPd{*U`}vYeaI5_Z3wa>{2K$9cTA)RH00sOXE27O`SD#)1w^P1e z>-Q~FKHpNaxd6->b4Dk@cvw*gp91@G%U#b=u5P8lN6X!8$wKO2_KiS%;K8CGy~M_Nhzy4h zd0scybf!xYk}Ys5sH19)9a4=P!Wq~>25jJEWo3b-S90t~%;>@Q?}92e_Vzr|fgOx3 zM=H^$PB4JEyO*MckHuXL1OX_HIZwg79bjxYoLXP;(BfT)-lhh5-6FLkVq~hRs&#P; z)F_iG_)4K|$EH`A4r8fQ;pIsSH?zBxFiakdoH>zlaCWr6*}Q)5AF~EOp!!MHxl_(J}n=^!48N2$s(5u1+MqG;}!y4|_yQOAP(5ipu+0_HTlVGjR&F2YI z*Afs{33W;s{cad}QJ4zVGngx@NdC zpvv*f>i5kwnuayF^X!x9{_k!ogIyxSG0TD;RTQCAlygXw8c#OVAp3WJFIxuvhet-Jbc`Hwf z8(K35ua9LrPe%`wWvNj}CYanB+26`T9~QJM1@$tHd`GPB6lER_*@ado&ppZ1qdApW zS+6W@LTCQ9G~S`B-&Lm8kJ2cN645h)sLtdG2>!*l`Is!OcO*}CK|SOEck_+trH}w8J6k7{*DC1pd7*6fIJc!*TffJ(ZX^yT;V;w zp;}T9diPDr!DSWVA(ap=`CMU7IP>=fxV8TYBlqQ^1!8H)sfb(U``O9MuZvF@~2zQxQZdZS?ue5zTNA^YmO@GWXJL2Zf@Mk>afD7fop_Y zH*Mc=|MTY6qzS&mFx%qfBcJ25<`8ehhBXnPA6|=(vYn@M<3@k-HV=Kp0|S#Pe$aI^}G_PkA`!Lc-#78Si??zkTi%;`&CpW&QQJt2j%DF6XYR zGaD_EceCu&tE74-t2pxURAu@AHZ!V$2gm%+YLBSh)p8AVAP}%VF}?ttUVI)@_YOW# zyq2zaLL_woUgNzPd@rxEk;@k*kEOueH0@_1q**ovI?&|JB1~gZjKINa1R-`P#|#wq zc~=hEL$!3qb=zd-YK&GKr&g>wUW|;~h>aXI4qUc!6^EY?gXW&Waumml^?-uIkpEOQ!B7LMp~4)Af!C^hZbf2xC37gRTig?7|j zb3D_-fV2ENT`xb5)p5vy=m~vdFR2AG6rH@_1 zPf4&AaWGgKjsK#$lBF8^*@w-Q>8JB*mYryol)Gj{R&&yIKral6i+$5xvT;t^Q_3z4 z3Y&dTzRp69K7n%XT!sE-PdsdWb+E00Xg?3Oz7aul4$&Z4Ctqu@K_EzW53;471QvWu zaCKsSEIUu_(D|^i&Uw?`ZoY*EQf6DuVc@S*FVgpdI-;vSP}<{-#cDvx4(`T) zxZHZT+JY+ct5($C)sgP*RIa<9sUKZa(f3*F|4xkVs=jO;&Ou%f7J0K3ds(@5 zXWTu{99iXys`Vo}nPsS^pc1UW8e#sgC0;63iCgY}Adeg8UC!(8#(RqlqI?43`|1?Q z*&3g*f`ToEp93lp-%Dhtd@JxOtni0UZ5jBGI#W=tKs@v70`K${`srGodRg0;(rfRsm8Cb3-*5!XCVY zA}myL0mtwX{gl%Rbs#$;y9@GELkmlbw5++7%0?8nt<^CXRj!VjP>kkiavOZnW!~TA zj69&_d4aG7Xg=lx@%QhgeeusJ%@?B@w|c}I)U4fp=3xIy*>~@e*^^b&h>0WoZ+}u( zzjJ@@W$&6w8|@_}5*G9tpcH{t{S=y?#Yx`Kn7}ZV|4o<$NHDk{?EW3TV1^|WvH-vH zkbM{;fDIfzW_#p51t!q{^LL>gt8gg>Im&O;*a*8wUN=wR)T)tEj`51)7+wYdyGKb3)(iq% z14hA6@Wj#ZZtdQEHhSy`yhK5;i8J{Pdtf{_NdSBaC=P@>j2pRwHiRI7nb{R*+B}AS zF4sVvYUFeeEARz{wn;a$+Y=*FYYv}M%3KmpUIKhcw$uAn!Sq9p|CR=P$@2ayY@vbH z@`x2P0zN`4*oq;1#5ZsvsgrEd{commfXi;*iQAq_JCCz>tyX2~)FC~*Z3_tc+~CDX zxbYI(G!a1aW>6&ifs5ZQk28-d2-?o2LRFDoGt=@`X8Ke!F>-_i1MPESvV)k)S@8HQ z2Bo7zH#Zaa!gbC7s0R%3ojB zR8h^m&t;)f`Ot;TufLl%%1@d4HD3-AjGtrnc>GEC^|6|KRkmaN(1C!k!@BaKxUM;C z?Dn7NCaS=`yede+PGTP^4*7Yr`wk>Y#{9Qlq<5C~hnga=UblB+luW9RgYK5!q?Eu9gz%R_v z0qP;}WxbZ+n{E2ZY3MM;&AWIdCd(@L2zui`?+cAmTnPi#JW2mJzoI_&bW5+N7`i-i z8D1X`YbKU#5i|I z?~?4SEv)ttqr>mn4kfWxKxd*)>&yBY;InQ)rhVMa+p=x9K0bxuQd~eTp`jwz`?3Xa z=^!%^+et+=_SIVef{U^W(v6s&zJ3+O*h0V=d`uL3ydQ)R4L%BpwR8mofKSVvtz4b0 zXh1J00}u|)A_1pqEc|vgyx&fw61ry^{X<)L+{DJZ;`;n4`@nG)t%%Ggt>1XVakdHE2TuN7c}VCslf8XePR%wi=d_Pg{{k$AI`n57 z*yRo-N^X21x4J*Diwmz$A-Lg$BzG4!uv_+p&a;2|M+dMs6F-s-HE9`i zrj7*(K^w-XgQ|98#oB)rS^O7;w-ml?1R}m@MBy1S96p?xz@@W$C*8ruaH$@5Kj5f7 z_86bs2n16p&Z-^eGDt~g;sRleyOjwbIpaO z7qV2m83R|I2DcqS3YcGGp5o{b%5ruV8Zj56Z?o*v0-PD|e5bg#t`u(_|H{9sQ*Uo9 z>)I96usjOwxtXVKU37i#T!vO|Bo#!s0EX|hvPX^0AwPTx%|{`&%1DHBBm$CDUcYr& zLnJxF{2h_s=CGMAcsKV1OcXGjUjfP!Y|0zltmZT&^_HCpYPVITe;h-efq!uB43wvR z&3UfWi-1ZvHwy7He9{2RU54G)vO$lle~1nr*{;Rj<84fFs`7%)=7P%RsGqdIG2MKr z48zBJbeXkF$y>AUt2UtCUBqx+zt&-d>0}Db!-{2;akEjzY&}g}eV`+f;ACn*ZJ7!m zF&;K&H(|GB&G_59Y^7$xLC1=hc=@R75G?Pi*|tZ5p%W&z_O zikza@K+4VwTCrLE!5t}_jxSUUP5c&hoP;}PHqBvlss7nRM(zY()F1Jyy}e)^_@b^B z)FHnh^RJzB-I8|;Zs|x@3p)S)#LnBbSGZc$_=xF>eYb|YR8{@&mh1bz z&-ATtoF8+~R$xJ@ya_6sQED^VAxkSsdLm;-`|O7%QHhdRt5a}pv#Wr161YLee1>gl zV=Qv_2FTS0QUeB%lA&ZQ^qF4I=Q4fTH8CXb^*T05d;cX{(X+|3T`*wB-kD{M94gZ54V}UQ7Jd97NV?a^(EkU0H{Rq8$QtBW* z!a}_LeXFvKl73ot6yYe$YfCG2w&mivWhSDkW1s?{!PP!Xlj`VM40$MS)N%TBfj2`` zXx=M_f|(MZOV0Q-U!q`#u=g4xLF6U-vR06l)91Thu+U{Rs4hz}8Z`Rkfw>;*h(WMH z$;&_nZjk^weKA}ikB#Mt?rMl5 z4Jt>Piou#GqBmbQ2P{+2;7D^dCNT~=bdi9_`RT~`(=&t4Np%L;TO%6+5Oinwi>F(T z*GrU}?X66kd=m@O%iJR1nXMA!J8IUYz|r$6S9)bbbv$ z24`nF?F#mtx*4&MnmY4_XAei@P|sR5*;Q9HbhP))ty5aE~{yl!9pHJmgGIvxk;DdZjTc`q~AkVqA*CPq=N1H4WPMDR?d&=w?E7ja=qbn+WnUah|j$bBSFmR*E{dqlu{RX3&Q1&xNftes>FghiP+rlmpK2I1<>@Fn`vnf(i#GVhTY?AnUq!FEvcY&)MTVtF`3o= z$k{0dN@QfSfz(H&T&b4Y9@9uJsYz~~J(7DbZgwG|*RT}91GpOA++qypG|=x!AU9zR z|Mf(9JD-}JSIyM*)P;-F&_H7xC_XpdnK1th`tw-kw4$~CB_4~D$J0WkaqxgK003BB zUl%EubAn3anWI-2Fm&LfU61MCC(=HrUrroi93B|lyPwdzmZZo?21yZiP+*FK(RtjfuKD~A_x}z6FdxXaBoa|ea9(Sj9i!u zy^~jy*>)*Q;V7wy6dtCUta{;u5*;3BG8ZZWB_EnGn!@*S;LXRN zpHO)Wk7JJe<3LFxGrIB57wb=7=S$9Iv+J416bV{(FK@sFw!j zu0juVguZ2Vm&M=F`HgJfSP30T8fH_*OeRd5bt1X#%6_iuM3hz`Dob)oZg9f;*l1r? znO4`tbG=Q;A-m6WF3Qh5!4E8`Mt7$fTiN|>uKskIp+j3$T2h+(_k08vtmrFtdhrVG zN|HF8a%_D&SONdL&;&p8T7x$`Tyvru!}#TVgQcX+h2n#7f1O2QAdTfu#dJT zO$TL^6>hakzi4tvy`Iuv`aR&pIr_^Fb?G)972OpB;<~1F8f*AiCQbeuoRhnt|Z%Jy#DJv&e!PR*mKtR$-QbfvZ(ATKH!E(66 zl%~;L#BD(yxFPE_7G*gW<;WGTNYZbAzt`wpo9V?3X`ky*{F4^PqgIYihkYEQWA}|% z<^(lxiM8F}P&w(2FdMgIRwKUO?F=`3Q}AcQHTvA>%A`igbu(p1K?)a!+J+f9MM%sp zA*}&;uazEGRhG#%&T-b0KBW2{+eTG&^p!VcT=z#}apA1bD^ekf;?tWBXV2E8S&g7} z4!_bh;bwCY>%4nhd^|(4X2vQX!M4&%@|Oeh&r6uDx6;E!UC~kotS+m)g9<1M6G?KY zxbvEizn0GlIe7IebAU?bOO-ZfP2udLoQ*F4=zz#f@o<0>PG+kx5*j-6( z*_`ci+Fni7(3*UBL-9{}=_ceT2ZK54&M%!Wrs;G%w&lBx?TK36-$~0Sc$n$QuaCda zoihN@9MC7)q!}K+b<-H$_`R9F_v}c#yXU6=6s7JyimT30_2DHmDUos3jgGHP$3O#+kY88GkzC!&_5V=S-(j7kGr^ zjKre_Y{sccuvL=-q}ty$kI6dj3xowX|7)vuzNiO0zLl575=j zcH+S!-zT@9$OtzaSjVfV8(&RZQ6yn5ECQLn3U46@<`8!YM{BsJHkvgdR_ee4x-i3} zgC_Dv?75sxxQttlxdk;$S)ei)8&94NS%QkU3%N=sP?)L@IMv>CnuI%Cb&j|Sjdya+ zi!RQKCjR}hD1$LFqI2%Su91PzB{AMN%%CdZUU{!hK~!~+Tl1^ye*)ONZv8fVXqo6x z_g3qK)~KoL*Tp7guqmgV2X5_b=8%piNrz|=gXccGMv8*t8u82c0$%B4Zo?B3W82oO zfm7V{yc_TMy!8*6BdAF{rARufat}3$8QSSd7c?Nhnj>G`mdxk$KZ2XfX*y{GM0DMM zY{;umqVOTvH zF(AXcoJ4kg!6T?h_AQ^GvH*&#YW>z+iFI*ItxAFgEK^2z#m~*wNz0E=tLvYsL8_IO zx)L)PK@B3JGrSK1wu|=+s=mOab_BPvU-^Sv=$MowWht=YP;MxblDWT;kA@||*CdBX`FaRGst+Muz z9C>*{@1(oYCMAAG^Z-qlx6CN7a}W0J^R6Q~*}g=So5l1+j5|T$)=Y`ixO54GO>;3X zt3m7M!U36$LeTr4h8T<$`luEVmXP}|-q zeYOk?9QxL8hhoYP`S}0Z`66;~C~|Nt@+sInB1pY1Ye0a#ol_tipQ;4QL=gGv=A!mj zL!Em*Rs~G4#KTt)P3(L z{C-hdUyEns;%Wud;)HpBEwT3hZqF7F6##|W02Xm7E5_3{Ck`GINL<4XCNI@ln^k01 z)R>qh*vm-ej-JiFq3q!=-WMw0oT476dzLcFS>{#;4)oO(I)fT|$7Wz!EOCFGy}WFZ zfMfk&TKei3`%QIWBw@rPV8mWDrIGESQ;hvoPpZX;GGZ|7h`q+Nv4T zsqIFOoek>TrvP$B_WGd5$ZTn|Rvfh0h-Pf~W_Nutdlvo7x+4#{op6R6d%?-)S;C)??Ed@OCXjs+i+H>1M=sO@jD7Q!3%SVrU zcds`uz%j2bFE9ze1DZkHBlECpQV%9nYGt-2usi6Jpj~yp{Une7S+h{r&=h0jjk9wI z2pr?t19^e}KM;mG#r zgx{brMRHc4F*w%1fbx0;zon#L>?kr0F+9c*D|MB;m0{mghbG`wEMXe}CGkaJghM$b zgs<>+A3A%GdFp?iOwXjm;B~ui49R=+UbcV?fAk<>PgqB&os8zf1A-)^o29{|$wjMC zi&26lDZ!#{jWJdM0@h#$MykAvVgCFk?O@vm_?1I+dj|5gO)>Y@C=G_eTot1RZ71kq zmPlR>=MlS)y)Grecf45i$Pt7QQ?D=nL`=A-C0I2p^0fOjL^oInuTp~)+!q#&bO@hn z67IDA>(LH*b3zz$`|A6KLWB&+&9WY%!V}?I>G#nk5fwLFfKZ0CX||0X@vY|A8P~T3 zPv3?$CKoPfLw?0uibr>s=L3X-em7e}kyQD0Ebl-6I8pv)#_Myv@y0@hl^zuNcLQ?m zcR06&L^raW4mOiL7Jk)vagFUhfTD9djtaq4y~ zw022=4G8Iq2x7)3BiP0GzYSc}kz?C8H1ZG3-y*+${mh|*KVm_=6HXe?o6zW@Sm4Dk zjl@L~huNA+2t+Uz%|nkL9f{oY;*Xs;=yy9Fdm<1tDePo7EdEwcp5ZQYeQS2%1-z45f#OGzyJ zQd)RoJ%t;DN@lm28uBF}Ngr?BN20R&lh3mNGIdV9FD)oiN$#VG(8m&mZOFVl{zrK{ zT{(2Bsa{5`KGMv+{ub(G$Pu*sHG@z+Lxr;onRkCTcY@!|7swFWD%QpaWk1IZO!88w9r(5ZU|Uw@ZuJa{9|)zK=Qh!O`%ES z;g_4)zKj8Z-*4f{S}t9#rbFyAlEpQ20NU1yUS5v~XsQikoe5)a87JV^Tc*eE&Z({% z2j{B_Lg=OJ|B@GI4x8K12KF+kj=qYpmQ>o-86A11{*;4o!=<{r{N$`LBNR(Q?cq!>o*#9 zT%~D{ z(8y}(mK!-#{XMv_Xr`hdI!RtzajdV@v5?^%D+H!WtD`w$+fPPiq#0J3cE0`)C_1_4 zmnnL$*qXmTa6FNDOaHxClj`RcRt4q=_AVpRG&iPe56dIN(Y^7TgngVdE6MlI3@ze_ zJC5=pM_Gcgm4#nUMlYv-OI^nlX`&Ldk>znL-ES<8)*4ft9*^Q-W+cCV!l*l!gdqh} z-aJv?oM!}+`VBqer2VUDR_P8%3+rJ+krbz^9+p%1I^o5o9%q@Gn$Tymdp9Fh*+t%Y zpSe(V^iO(owC6bE30EF%i~fasrE42J-^({6`;JYzqnKy@zQ(-$fx>v3)kzG}Ldl-f z0J6VjI`$lZvRVcYUl8P)jY+G;S2V-@JO2#4e?3Pn`JUL?kVf%H?Djv<4n_3Wp;FkGQLYyjS-=f3VR)-POeamN-Uwcd2{JFMM;B&=#BXhi z5oiLLz0`@w)>#{+)lPzFrMGG`SE^cqN~a4sODE9a$DtO*8_cGTTVzH0{sf*nW;ERx zPVdra?CfaVtZh;16fg7`tWtwQB8%u`6S1NOv`SQdWYikjl?`lOuh+7jHaanUy^ z%+SP(d$}(6z5a2AK#LSn;rg6Au@eMAAYJ6?)I7LT(Cq-JDfAtO;APqBc%v}SF(|ZqDklx)lo?WX_G-Ncxx;UP zM(t!$L5a5>s)HGv7+4jOa+Q(zU760WHs^@oWCOgGq%2(b5n^^Bhsov{Wp`H9=5o{b zhJPHBUBS&u`be5*TMSuuYMzWL8*Os#BZ%r*QEHx3Dobz4ztDAD_H-RwddH?hFyNlCn z%I%)f;}tB}r>2V3)vgPC*wG$f_jZ3(&E>n6La@re*wAKaax^=ZJv*@(pCMX@ls6fx z<?>!N9>urJ^s=?f^F>5 z3y>J3VUW$NjQo3+zS=ie4f|I9=}H&Ja?hljc=MoRM}At8E4RdNr& zPbbw)<5w{Vg^Rc|@13R&&9lel+eQ{tuSjiGZa44>*69NUw`i{KUBd}b!vtYlFlb7Q z36}@t3r&NpLgD^AK#bCI_Huv<3Ij})-KN+i6gD|YragoyBZ`Yy2a74ap1Xa%_QMwk zwuS+3W{i1+9UHN8R$^5e6e$z`Yij_t5uaqAXedH!boYU`1WR=d79wcFrunC`1}PGDl{mOkMANv4bls@lfP`W;#V z*g*HU0uMfZPo3S0->YZBjz)UZR$MWz&~8Jx5WG?ESOU1kMCTkSIohChj+d^y&kVRi2wTICEX^ZjPK z#ZU7#@dT%VfLdj^+KjvHv9IbxNUBKUcyqJ=`WHHAxXGG`_iA-AJklJlV7He8rtYNP zL8C_d*pG8PM8b#@`+H|E#N}YRVhJ7&*Q0#V`~@PdknL`){!lT$jT2t#0j%V_ju>3M zKyuP^{+ZS;pST$uP&78_|J0?2CLeUFXBy>onny;4D}WB5(+3?l-YIn^OOQc}eUS>Q zN*R2_J$(G}e{*vr`2&n%UkTwoH82prVK_37b=KO8+cty)zWsquj=!=mz#=tClx4MD z;?5dNf03oXpI7_mdT4(?&K(UcW<&_d58g%Szv1pyLN5V@Y#j7LU2^nmOk|&MC`l#I zfMLXEk{V^_SJK<2_xN_r+tzq_2(Ngvaa#bKs%IR+{Ri2#3r&ZyB5F=BcKNF#S2UT$NEK~XW_x&sL=2nsNPW|MuovP~NhqNbvu z97H>T|ErW3Z?+88{mZ6u8&?|Nm5!i z9JqM1P}Af>=b)h>Aujs>E3gFf?a}2&X7O*lc&lJ3?oeo>*h#%{Qw3{!+$?cT0bnYZ zBbK_asu`sY!b5J4B_b~%na&%#_&{WH%DuQqp~mG>Xd_Z;BT}d!QR=WOwG=LOhg=7F zR;O&om1<)CW0ga(ASjs+warWAm&px(>9pPEQ)_Dnsl{hH)2pj}?+91Zj({#P?FcDl z59JuWP^I`r`#9{Pu~Ftcd$zCjKvXm71xP)Uw_&1RlEBVh#W^BrgYSKK)tg*1gdOAD zvc4_lhP4A9zPVvlcS^KTDbTAPZ|CQy`D}9Ju7gz{x?1-X<1@x#L8ZwXr61*eE~u|` ztHfi~KjA#JfP%BD(s!}7qIR<>s5f0sJRhhG?wHN3G^?D80; zEA909fHL3x#At2!FZnB1&;Hm2bLqcBS)I#(q2oOegFx4Wf;073sg)ZTor4A}~v2 zs{q@BUPWt4%6K<}a`wV2Q$$x7@r}xG_VI~&qeWF~rc2a{BkW0z;A_keIh-Q0;|X!s z)gZ0qp92&+qu?97H1GJ*q*7Ju;v;OU3I1JwK&7=$dJ)S2|Xt&#ct zr8Z(R)Sz~J;$M*oM^!Js54a2-&$XGZm||`e{W*bXacixpD^s8k+Ry-Klmsl1k`q!= zjU3??lF4;z&6roOs?KoHFXODN-k_P!fi;Qr_ zu5Gu97_?oF_fp?sA^fxFpyGtbaY2P9=J50i1TDHJLBMEE{=~nzuKo|ysXH2d+{-Z^ zAQrLL7UT{(#VAC~c-Lk0x1q@YU&74n!+zeS->AnK?l~GT#)XM^!sDBuGJw^aWUD;q zwyQdDOPklrk(45ru$S&^ko-!N;!>hr6SgHprgvT}vo*rw5L%?Yuz)!CUr?iV4ZZ03q$9%5m91-2;k$ zw{raR$VB}kTBuQT4lCq_wgXPB;gU7f=Yrpl-Az65Saq?r;&8ZQZ0vZczQyn(IJzU+ zNpLosGAdMjDp~rqR@h&vX*5gEf`@&KjOYf(vrg|s55=iLvys}bJflg*O3?U)j!(FB z$^M}6@JXZ7F0|rJt2VXCiV8%;6i0^V7n<9XS#`+|&?T+Ey%j{7nNRag>pPDMV`w_8 zUA{>S+L4KssPG2e|7yccgCD8T_DY({z}1!$@)Zjh(ub>9fM!UfJWmAHZ+r4u7!odT zUmKH(=XEltEAqcK;+W4HK;84dVQz_*^D2L3Bo72$a)gSnv;h}OabDWl^0w+27ft4F zJ*7q-`#kj*21K{Qz*7Kux{pFrQD(WTSIO965OoIHDbc3&E%y>O`pP$~g(P&=M5l7b z{eRG%mF;_iOYy{>-d&=rz951hD#id7`AAc%dzVzRq?WFpv7hL`Dj}yk@n@TM7&Xrt z<&6$GdByq4sw?e+I^TrQYw0u*x@jToe zKDM!vlvaByslJ}V)LC-8^XDWuG?lADgjzFLt~wIW5Oa>VSwj1co2rJo^gJ_fe+iqa zN}9f@(=YTkR-2B=)f(J9qcrENoCIc-H9rDdrhP=IkE!b;sd+L}_SrmQE^S2NYUdZf zGJjc5zZ6QC-cN^VsgMo_aVok$GN=nUmYrtj)%(VlSBsD99+sZzF{~+Q z@~UeSO|`2g#cQ!CKv@cLuIOfQNP03o2pktQsK%$@fi zh8s1F%;I-JK`XHzXoP$d2iyOb1!zGE^RRfFoFvt%`E}8s7ZV~%I6;1d)B9#Sxh_iv zBt~XNAg&D8*F2kv+q2RCwx)#v(*EW*8M!+Bm!%ErzOFO>tk@%Pdb4HJd+lkUTN@fT zSFc~~YaflYS_yVmkMfk5UTgj17zTNAkm`M2C74@*9v5id$k$+`>OhYRvhL>O1(EG< z-ff_<;wl-1Y1kNfI}Acxbo@1PwpQ_4$1k2+n1{cmkrN6gn{kZQP>luf%|#7{eitG9 z?oP)U`k2}Db#F=9I!P}t{VS8k6M^j-OD-OP5Wyp5GR=b(|6h0}Jo!;CS*226OqlQCXG-xTb%&GYN-@n)*%=m8_!rn!y3GFF<1UUVqWyh_u?ymyn)xGw9Jg;8{wBRh95TGi3>}dGn?DFaP5uWf_WGr5Ow?KDL0uUZ+hfb3uin>PLrid z6lKYCiZ8j&83}Yt{L_U~qFLnZk;LTeH| zwiPy=U6_yCnXjGfX6*`RqyhJDb(RQS?kGbJNv%$)&Z~uJ(87+qf@HIb?f(4ayYJ@~ zOA14P!%V0OE_r6GoeOWfw|!>GVg zFMH;@9yG{*=~UZR*VjMEP=ORxDL2D9Cp75f%Qe7AJlTm}2dU3lviN@HE%bL&)7oW&+FC6c z&?SF8^(`I;HlP;vnKa&Y`ZI#mEr7r zM;>J82qxM3)q<*^K*XH|IRhHR{o`qD(wSPZxPbmLf_;p{Ta&%7Yxl)Y9_CWs=Mb4l zk>)6o<``hW-Fj=1{WOJsj(9sDBe2D`VRQvo*}f__>C#9r(O5vmlpE=2nWwz~P=tLm@qrQS9;YWh-A8uTCZd_?RHt{gq~*<*(43T7wx_>0 zu>^Fa0rIAsanbIJbLzTsl73XTStz?ZWLMM7+(H6-3~BotC-^^YFZNNH`>dpY(nQ z$?F=9A4bG~cMK0#C@XIYjSkW=zTGe(``wPA={YeIYd3dqtj+JCixszrrCXWAne8Wb>Th&bSp3`G zkNU;Q^cZnwbKkuO_f1eX{Ja-AHcgEx@vDq8oF<2cURC{HPCmzINNoN5YJaiRiGMZV z4;&nNg}(`ovznA-An84G$BdHlS^a;j31T|BP`TBZs+RUWNa!yzfY=6RPJINnRZU@Q4}kkVR*( zMr2tTy8Z&Y+r^R3i7CJKf=+O;$1sG|ixFcsm(|01(j1`jlj04PIh5eQ}e(|ZzU)Y!o@&&P7CSWCdq zEoV?EflHV4JLv&sSNhs51gPi2=N>_-eK0HVPMgy3<+a_2TP2V&l~w5#8^Q{0=r*ppmjn**3|cI#df(s_ z;IwFw(jBdGhb-Twrv>3g+cnlXafdFp&7?a+u?E`3amlIdGj&#JMhlQ+MtdRIyQ+Im z%Nw>mK+rQjf6wcegBAy6-?MM>Ee@Ap4CWp zZfM~Y?<>Y>rR1uNi?jN^t4i{Svo-4UydF475kW(M!a!A`wen9xI@`4E1On~>2K_jV zf!a?>p^OGg?@s3FeN$_K64*z0bAMUxE2h5Aj#k$m8l{(Cp3FJ7LNqydLPwzI4LSCY z6%X71@Ch|wMa-%>VuA4!F5;)FC3!t7Iv({VOx13(!s_0lvA$xNBd$4xcRb>we*VFa zJ^Wp?7fmliO-wxNA%VsIlg!k(ilEFHS+5@2?|?VVES8*@L&vp~chse0{d0Q!Co~s? zb4$$4nf)yCl(=;||Et7n-76S`Gx$piRzM8=fdV}!gVAc~^ZmNQd8p! z;F2eg`o^xFca-WHTBZ!COSM{T8Q z!a5y})Fwm*NtsIM;>AHN2*s)(xvImD8wj4T=(T1yVl8DoQ(K*q8NKi0r;w_uz!_=yJe zWXpNgY++Ar-i;!~V}<|`PjlYDQwFi7XZW*7bS`X)Qf7(k`sAJ80F6URD~N zj*ATwxs6S4`Khs^Y4kx7@u5caz5KD&w<{%jts;X)sRFMTwmXh+O>1r^)g~S*EJ+q8z2rL&X@$pCf~A^G zr3af#pB;XjtOhl=BD&}b-r};$&PLk~i_!~)qGH$d^=kZ6AB&n6&9aNMqH5pd^=uv+ z7^FqWq$<7E69Z=;kBx6~DHekYy;iU4!utZUBr!y+J9D5GtcbhQRl_>o78CO~z2D;3g{PYS$YAZS0ynXl8&n$*FS^&X))E2gk_ z?D={NxAE$DWjKOqaSX#Svj+mRvd! zHF7b0Ad}Ye`{yqyN)gJx>7uw1V$}h`-E2lR{_rv4$w*C)6J`ph;4N`+r*)G*=rIu{eCej6Uyp2(CMK7;Z(s*5yHur%g3vvSjGJ&}m91 zZk9ATt0tX987j6AqB4=#muvJ6oj3>gIK~}#-iuNGrO1i&}n9=T*rvnUb?xy z#r3Dj=C?3*2UYjOBZ?fl{u;XfN7GjYwb`}N)^ICOT#LKA7I$}dhakcA!yO6~x8m;Z z?(Pyi#hu`K@}Dzj=9ye%CKt)P+4HQuEJ>+{<%Nr@Q_3`!0#YFI)(bS=6`;zgWr`-lO`3PBq2LN!nlTo_wp-ye9hfM``)RNPI&u-@c5bv z>tJhGH4|WSY$&>?%o8&Kh60-%*X$k03w)SZNWY1IAsQeaE>?f+VxI10;`EHMy6)XQ zOlJ4fK$SrZrw7~8`haL=L=zW6rbE|R3(DVP-&h@vP#u;?F(;dsXdHN%l!#jc4GN?6 z<^ft7AB)kg%4#8^H@)&i;i+*HWCl#a?Sq2x=?|xoM+1t!4o^fj@gxMY)JQ7KTze2f zTeaLf{fX#DmKy z-U{Y;8DoA526g#x%_vjO!jE`u8S!S*4b`FpcM-8tl1Q;6){{Y$0h=-*A^_d|ZLR#D zd62b$Bo8(vVLYY`#Z_p2tAM{i&L{r>X!+8pj(}{hTg-ry^rFKq+M&q%oxy(|s4(r< zsb}|p{`zc&SZVy{^~^h-K$l`$%x~p-sS?D_FcU&6tB@#kxK>*$dIt zMPj#^4hSmD3%b5=H}vS*aeI)nd>%TRR5VGr1alKPpEP6E6Xxj{ndTWm5h(j!v8*?~ z9D0k!-1eIE1H{%=)}@SLdS62BD<-($$kkRL71o{yg9Y;JoJ3Lx%oZL#OkF^gc{bEd063e8A=JD%QPW9`jvqVvoNDaB8JQcFi>n!A- zlFFo_U=q?m=XZ4#P=>;J^azKC@L!3muQM>)3yW_=RY4$E6oEpYE7pO98C+cE{5Hr> zEEJFLsG6p3#8)E${NPuy@6ifVpfdk&d)S7qi?!{n3LLv+xV*c2enJ0i5~VrfwsHC{ zM3xq0|N;NaencV@C{L3jUKTZ za<3dT2Z=fwh&yJtR?1-)aJZ9kH$w4F8*B@k7`dw0SGX`()M|!}32C=j>G+J_$9lgB za>%(Gi*1uoW>k*#R1Eh^@j{zF52=ukpDq^gluJ3Qdmy;kso2=@2$b(C>xIhdg{rDW zLPsB3nq>f;Na&~=1gaZM_nE9&D7cJKJNa;eHShiiYU~y{>-FYT{wHYjxno|y-QwwN z{AQI`+QLpazN(9m>)u6sd&1O#I(jJ^S+k{nRd+_DT|2_N8TZW`;egwMFkW+qpqxTL zTcWTgO4^9BuUmG*Z)x?}mgl6x!bp9<)&piCyD7%4>u(JND}OpQ;#>CZeH1S4iIsJ2 z?rxy}@H1SRkKow);+Kk~XnE9F@{8{a^Ru!FZh}KY`{tJBkRug*oA?EpfW*F}@Z&;3 zX=;cGpUwlx^}h=PV!wdQk?n1&w`m8q%MGfxdk=y4dwSx453Dwip1hkr2VIhn{~pH- zsOCv(Qy?M1oye#V;4IER(}0xlj>g}=B+&E9Mf)|LLdv7BxtGwb0c0Di;-&TY+YM|2 z5|o~@vR4{fJ9g!RApN+OB3wt{=k9jG*W}}G6T~~TFQ4_EJkscU2K4U)4^Dj2>~f9m z#&=tr;8&tev#Kby@uPUknSN<#{Fh%0Zz0B8e!yqWcxTVCQopJ{A*zQ2F))DEc* z)N(Y$xN1e~UhG(}1Ol0VnRCmUvP$pWAw-JsTY;GrwcZ9>zJxRfYeS8QYiKvnQeKQ= zc18F2>odNqOFnoa9t3*9kR`*{4AN?HG|du(rpr%dK3GLQSZ!tr3R47J8fJuRDXhF) zETEOz)l^o!LwL#NNGdLsQy9WyZ=Q7<(fi_0=dLL2ZJMam1lmW_qRNk7mpr=npStu2 z;n}Y$Q=C{_Gt0ELYx#6zM6O}O{i6K_z76m@+&Xj_8w!uLJ7iOWVJlLIG^g|`Pg1oP z6wP?ndcm9Ke(jO(!*KGPf|h@eQ1`ceCFWL)RG#0oI>&uS18a#^Ktk$O$@bX7mY2tV zKa>K*4X()7UrBh!JHmw?gu=3X2rWJ$@~&8m6REZ3*qu@=FllDURj>be>impMEXhj6 zPGlITPRooGrcV0h&($5o(5VE3|AYP8ev(|@jl^e*TN~ItkN`yUnf4Rd*LjuHo+25x zeFDofe$?wvIC9xOwSorM4C$dE#l8g0S5@x2y1s!9d0#-f=oi7VUoz-|p1*vNisxxE zcLI#>imDCv9N|B4gMt3*bcdcS1a=;LBD>`I`7eXd5Z+w-15=rhfMU$h!at$Sa18Dn zlAH-)Zk%uvwy-01Po6EZkwhF2!<7mC1&&L_Wv@$JYHQ*V@6~9{t*N|xxbuW>$?d6P zP2ZEM;aaXKP0UbK6i{XM(e!D$DVaV}N?-Xg>Mwbd-g=eleO@(FhA;QqUJZ2y;nvu< zCS>0c03RwqfM-U%14?LChKqFCf($;A^htSSxg7$1#kCBQGm*LJ_RN5{a;*Cs7V##k z@DLdf5mTIjVwNEib_FbWA6d6RGE9YWpi;xhetyp_?P@i)wbEOk>#KV({zL*siA4Aa z;NNN?6aty4lNj@CjFbxX7HjDT>7YDBqXStz8-Q zG{2_@oaq}7I#o0On^Yc6Zwra&Mo5zHy&vY0J7p`@oQ$Ay<9Ik%1vQ8VJEc&~eN)&& z$e=)4jMgl}xtJ&2DsJ<~-&(ymZ_u;&aMlweZ9FP3p9$OZC2O2bJ z@Ps!is=`_Mq&@v)<-~2}1xa0diHVoqSbuxWlLjqt0#2U!oV|;|%ta>9$u%}Z%dzY@ zEguTpELOf~Y(lxBDU~PNC}@~rIlooud6vxQwd(XAmFGEKiheU2ZYSOcrI#6biob&j z+=ANVtoZ_LhM1tpuTZmA8VZcCjRjT(EJD0*!yDQGpWE9Ep zhN^7iw5k*Q3*Kjds}YGp~wI#MVrHxFJ5-SQ0D`X}OeW6bixlIDlY=pO?; zP2|ey*32JF>)!dCUVy*sn!SXh$4>g}A%@eyyZ7KgQ0AwH)Ff{s?)&WbAHIV3W`d~s z9^Y2AKxu}mtX-uhZlJ#Ll;kQu0zNzVaQegyhf}`33zuCdZ#4*z2%T^mJ}!wg?nBn8 z!^%SC!sJ@mGwwXO=w&5vEkIZ+<)VJxr>iT6+z0#)v$o{ZipPyqzv!;x<0M37VB&nX6GG$^hk_jmg$RYxIb{kb}5zO$z9+7bVO%GZkH8n zUs#^t_$enk!N}@=`{+p63Os5J2L2Y+Vo!LFBaYQ2>_Io4xu0p}OF`NlMqxX4^Hfu1 zrkxJgGJA!MvA*s=VQ0$Rx#`x021~$d|7kY9w`I=!HC5`NA0Ef8Kwchs_WJV3B6rE$ z>TeO9U83?RVm9jIU%~=?b>^sAmtVT&cs!st0OcXVA_u2yx#S>db(u`u+e&{+56rp& zvSUf_>=D;tjfarPU;0}1#<8_4?CU_zAis%LiByQ34;3pSHEVQ<3ffd6&-Jdm50gm9 zsdw>)f|Iv~fiH|pjel=U7&!&GiV#&|C&YVha;lyh{cpnU-*Yb!bKA6!nd1F`)1p_$ z=peLtPS+Zrx*GZGxjb<2Lz+1SjCu8^aRm?+alDc6fqO?C=o~k8*ls|EF4dVdHBXad zZ}y0l;j$jYJ}L4-YN;~L|Cho{}oUn_6ylsr1icb!1Mxn4l~>HYzl6hyeQH955Z z{MdLe%spN6$<#L6{x_jMR9&ZNZk(*V&9=1#0}V}D9b7nS-}-y*9elG7KYuUcuKS|n zh+el$W?EhrJ(t3CKuLb4$oN-xQ?iGCqbQA(EYRNvaM>x_Ns?Joik8Cun|1 zU5*v@)|BXGvJQ;>ARv+f&is+21QB)rX0ol zU~Me5S_8mrObJ@*Z1mZ&#=bc>(?JVrdw3b}0|))4_j~~s+{wA$8hvs8&RpuDB^kUr-jUAb=*PeCz_AbL$$lgGrGH`* zu#4O6O2^(4f=GJunkwN5t2~f3NciTmzkMK zNL+sPB9N8E<4jC~iC9$bKd=jpP|9k6d>dPUuk-v*dt+eeg|x3Wwkq2OR?28jctZhH zAql&EyAw^|9A=KJ$T834E2$ud+CX368Kh`xg)l9gWhNwK>RKP&-poO#+g;TDMsUL4 zQ(SjwryH_8OZ603-6s{X{coN>M=A5@Cl=$jn*IxsLr@7}Myl6?5A*bYDNEM3I9^A)<$mzO4RDQ-9t6zZT%7BVcHsH!q+yxJ?5g zr#8rGLzd-i=ayk|&Fe>($iVVFm3LR1IGGHCx9ltlIZ2ne$=Mr8*#)Ek)*@w&B1Lu*MLuz|D;eb)Lbjsriy`_eG5RYZ@+%SYTJicG zFitgRAYIg^B^u6Tnnf%cj%1p~rBTi$X|#&p#G1}d+GBktFfZXnXCx{9u#OMOL%CC} zn;O{l)H7B_DKp(1xq>!K{PhCv=56+J%)s9R%l=%aFKdgy*2e|#ms(Y(xtUC(AO(zsZ4?@oErCnM1l-2zp5*E zew?lzcr!XZM#)bdJ{g0|wlF^`qeT8NCdPL8A-$e`Df6d(tznZk=@v*T#ZJo#ojk#rtLMji*W+NBn)HhDM(P@-^eVQW7f!%tNN1|JrQLk zZ=2LSqXLIo(&)NJ)ScnP_62X3;%8UP|5i-x*V3VRc@e|yKM|^9=a(`{Ea{K*Rk&mG z^Wpl;4X;+D#vpnhogU}cXbs-p5{5^S$GI^P&YK0ze=6Zu*;502F=Y<~uqUt*)LFn? zE1=C)ksdfB-IrndSG?oAOT78$J5C*a(`%KqpukpmZM+0$Gf0aPljXrrlS8F$GXt+HACT2EC~}LvBlu zFD!oUY~mBjkkK~T%QEA*f9p{FKlHFFD|`83R^fz!bz3C5eGWbdF@LcH?0v`anzh+5 zOJA{164ojH#IPH7{PHSSWkZd@uzP*M7)5&r-()sR+~k{4Q2mLB!7JrKTuBySfu zwU_C55|Vc`4tG}ss4CwB+3(P@F8l_<-$6yAe!u+GAq#PsM%V88@SAcNY{JYd8E5tt-c=-8p z!zZK?xQYtLLKrn$=A&X4rffZ|Y_t8ByK@MDKUfnWp=}@|nj@p?o?3clM;4_wXx_pj z_!xx-w|xV8^LdTth!!5ry;d=tR=UXu2m%Ex>g$VkBZ1WvW7jC;Z739;DB{YcOHU(d z%C9G)ohIs?&-P6POMi9Dg-P{Hg=^#148%^HAFP@U?Xv7}oYoR7;-VH2(%#R~KGYqf zUGvF5#!a<4!0KxXq87kbD26WhhJc{VmQa7Wn(4fBO<&c%blm1&=q>GFv6hRyD!A_S znh&|vfsa87@wQx09-mfm0)2!FldB`tESxBFDPpK_2(YwQZ*vV=Ix0f4SG=zkP#y`| z!J`-Ss&p4Hsk?(KKJB)=9wO%&l8_Fsn3Lyl=GmHjS7xLSGPPWX;Mq-ferv%)Ub0|Q z&Xf&Mfc0B~!Zr4UMf0C!W1{-mk*$1~CK`M}H?H2}^T!N|C6F~tzUYNx+9^r>WTgND z^x(UhBRhuTs_Ng%2QJSc4h%}S1)GE;Raq4I#H9JQyYgD&K5AT-lW1O6-6L)LtR=+0q~-}i1K!j2%V*sSlEF^ll4D#7T@|$8dmQ<7BQ`)y`5(P!Et?CyyrO_R z=IJF!&8Mrwk?#5cEwzKHN1PZv=kZp*cM|IjCcvnUHm@;2X8d-Kcws`73THn;QnSpD zSMjcb_9O&J-IYmstx4MLK|mvWVbN9IfS|c)lRX!@4uLA5)RgLqo5hCVR906x&pXEo zm&GEJDz*M!!$!|+zPT@V{fo_t0#ezYIo{U-cZupJ;=o0@1GR%n<1pRbvl4jAGW4QJ z&~pwieh3l=VoE6vLrL$Ig>6XmBI04$Sw^7>hg6bvVtum^1-QaGeqi;jL_0f>nV=k-pZLKh#Ny3Lq#H)gqF0HJ1!gx`hW~qErd_)j+`JHyNCWhR@B~@t!p(g*E_HT zeuVfzBOQHyWU_}W?GGKe7sY@ul@P~?rRqpN9#{c5?=~CnBAk$Q z7Fylp*tIikp{Ut&{7TiRtHb&DU^R zIaaQENo&vK*;%f>ZUf&$2f{t9m@Z60>2Irr1%&)z$~vI6rj-VhGP5D|na<(_8!tgH zoCb0w7BukSPu;n!cWTbHtw5$$4bYlsG+*VnqL>tH(+r8)${$Gs1AI!DmNJ^onULDp zf;{IqA1h}$Rdzs445(pOfhkOAsri-W3Qkve<|#yk}+-K3#!mhI8=}$gi!{^>OB}?6{+Q zT#}*AF$`ZIxNd?8-D7?Ra84S&eA27xsuWITS(zWuUZ5Y&@nCzG9aR0m^j2sS} zKkVLn{SV;y5pQg%3kWe2_i$_E5lSyHP-7xYD=Hy8zVV!)x~`K$oltrN1Ps&DbuG0) zuHNYq*DPi;9k@2WW2eJf^3AU73-bf26%lvMhVF*9f|?!!nZ_c0wpS$ zLFN?=HW3DN%B%EM_!fT;E;l~Q7vmL zZ^g6$iY`xM4*kGgRyaK>epi-KrWJF@4&H6(8DD&4?k1{*SfX| zvb6HRX?ljXQaHT&3y+y&Kn?Um8C%j6L7;QVl7+giu25OZ5wKgaWg*`=G^W*82#q*C z`X6O$EVZb(nLimTw-wIk*PloP{A#x-O_1`6$o67HN$R1H8OE%Tf44nVMQ!Y<@=H-TBSu2&eNZohn4$FG6Z^!O~%R==Yqn(5_dSr*(jE`V6xC&d!1E|p-#fQU^KGJGT_cVeX}^*Ff55poKQI%v7!M+9CA zcdrA3ECqfqj?)g$oN@hm9(T=O?wP!%P7w#by8VKf#wUzWX~`qz7oV3Y{N4n;+!v+Wh%o0x==?Qd{txr{KPF07` z=VoH`9I)7?P{5iRk+-#pU)}KFPUx-mZpKyr&c|V}B0|vvUQZV4EyO>6<`Ry&y04)MBKZ6+5XixU_k$9fq~Pz4{dBA}s^lYo zQSf5E-J!6Iww?6;wo>T#!D-XdLv=pgV!qj-u=~cZzS$!O8hD8y5j1|4!Joi8KC`g; zJ3cn3{5$eZhl{$%%X8x9TH_y>cB;?tcN|0qS}fqT8V#%ynCidfz*IA#8Yyb~cAA4; z&P=iKTd7beQ(FNxA!_8?#N{sI%V(+Mht&yy8U4p+wIQOo@r!(hr-a~q{xiXj8ABUB zf+D=i6w5l*gb`f_R({5%vli}p`Xf^f2Fp$emRWWU?#0F5mWFJ96K=JdZPM+O-R11> zvyak*lG66yuDhCD$QHrJTo``mq-`f;-4|5N#Dn+4Vg9q?=Cu7iHt$%M1W5En1vI*c zPO;K5mD&iE>vc1_wG28ebeuF(cJ>6tytR`B5P&hfeZJEqo6qb(obwMcr*wt4?+`lH zd9ciFf?HuVuX(l3WVcQu9|8mu%awDxfa(Q%#=li!&ZC8<4H#W~rYG;ZZDK~29UCfI z_%gG$c4{JZkDu%n?Dv9Sqw&?Xs%xjoHsWnoNUz#qI5|mvlzOenKEKx9gnw(mR@=1k z5U)nI+obYX$~(tTYT5&;bMy&+_3;>cdd4=8c%qS{934DIHs6wPdBJwP*ff29XG|gX z9Xc7PS@pi&k(te@=WgBbwR_yFl<%h!kH0vKuDe5vjne^xvMehGR0J$^(cAbtYQ9 zy$~U`OI{giUiG0m1Q8;S6&5LLAHBrGP3LqjG}Mx-__*^~W=)U@_2SCp5;b5$>Cor_ z;?bZ^QhEXfnk})d6T&fB5=B z{=mYVjK1L`A|NayhCKjCCEXd^xMNOg}sGZX0s$F9L4Wnjk!*0_3pB?6mO)i{!Vh6j|=B4Eg zV}xZ)cxt@-IlPmAH(X@d0!?4o3m0#$cqRvjEM^bhx>3l7QcR_1=@0_}iiaD2rqc6{ z=9?M2!>(|``af=(?q*)i4*RtS`3KaPkR`J4-(=D zBNhN9Ex37q2DioNOG}UaM!ELtZ}uKK3wNFI#d#sM2{tMrb^tY0RPRN{r?%{%v2x4V zSaqD$4cpXYz@Cc?V#aF`1TG?2m0?XOGiMbk-g?=FvM)xf9@uwT=fKVpqNIYLumYtY z=0pOrD0@(b!>ml5UZPn4E89F!*ZIV~$~p&sm#``SiP=03w(m=9(9n-YtYU^O{9U%C ze0AGUIdwM$=v8--3Xj5Cv=D`()*K(%>Z=R`wf~vojMdJv@q4>2r{d^9x{w9w-Nc0WyW=5K!+BYR7CCO9$bqt}t1V#1O)!6>fO zTk7R70Ts!(BLEzy+hWDZpxppQVv7}Cep(QKnx#BO?!o}cH1p%m19(+;gy#->^Ed9m zfB%tR%f)=%#FZR8+PWtvNUG(Vow``0L5+>^)$+(00Em;cMCqR>OlYWyhU9Z!zYa|c#r|wpg>kBeDkLOcnVLFNMMeDLLlgol1Fw>W*CzK`nT0) zlewkpd`os4%UuZ_u0DUvbQ?>M{>ScfN5{Q;9smdBHUE1(?X5b6{+GtCudm&z|8qcG z-{Nqn(q>43mbw5z_f*in73T_7+Ui)nP+zqDE&TFLiys|wqs^(m9TYIB212?B& z?weEAwsj=@Yp3!|Nn$l4hw=x`UA`lF)~rY&+P}SgqQ8a!bEWZGc0JiFHo`DlJ54sW zzUTddJ|@GFOM}aM$X{#lj~$pybmwF2C1Y&&uvBI6azayEu?+ho6q z#9G{^Mf&z}V&$ZF&L-XmYyS)xy*0J<@hEG$$pTj4%;Hyu45WI`caBt?P_Is!$s$VO zq?A{AL#)F&jYK668)AbYURSI`Qn~+=)M#a&%;(x?iAoMB2+?}VZb6U)EKPSd^dEF;x(louC(WRv6V6n2OO!SJ= zR`tJdxcW~ajl~P#y#J~=V#;4xgYqLP4>vyF$h~f3Q&rY{Q}@>SW8|Bht#u{Jb<9mg zM7OQ!1-m%mU+m^^Q|mhRZ&7;wI+iAp7er|bNZy zrfk0piIBQZj#@K+F@X!W7XEt!bFyYa$DaVaa(eGt56DLqPPAIJKIxXpj>@4 zJQx}{93r$=ceo_8Qw4ucN}_N<9mn9c`XM4plNdrKgMs&xZMC}m;$*AAXF8*8?QqYx z>rfw_MnBJ|z1_!BNx`7=lscqW`yGk-W!GzaqGI9Y5LzWdfeM)MhX+9GBm;~zZl2Z< zs7s^>i5)PZ<=-2%yLt;?gUmr9LUZ2Pu^^?WiIt!My>N#n#LN=5Zs$`><2ygc4c)H% zR)^DQE$R=#)~*RCL{W_YzEb7f;bgT@ozl>#`~11JiyZ)V8>3uJjjChD+SH^B&`z~C zh#3I!gO}TX#}1`?<+h>qI`9EKhN~E{3K+41Ibq&>+4$rz+S@25ht;vE*{@>F8@STM zN`+J3F23Yvhh~*W@v5b`Ffo%;FZ z#j!Hi0*KbER%=K)0H*OXzu+T{+pI?aZ|6!pK&&G`9(ol9S_4*5Leu zG)_y$Kq1T@eHPq~4qHj^sY24CIcq$D+cdlQk)!2<@5|N0l{lQGShi%cmAcByPxgfgylVT4nGb z(_Nz%psdlR@f_3N0^YXGq)#dsb1*0D_H%?y0CB76EbC<=n!CdAEchFU5UDI2Vq`(M ziOqAHTjCx*^aJIn@&)+5#TNJHdRglayz?OlcaIS?euN%jt?8?Wn`b|{i)pkPs6*gH z86s2H&bIc9a6Sh4&5-T(DTWgP2Nkea^aocS{5q=q&hETAIl$UZpK+8}RsPiRT&%Rj}xJolRn49t+ z^)5o7)=WepHTu-dzrQrWPAd3$^&HLRhM1KT{dyl6O9u?{ZZ_J3FqQ60yBbSittB7} z#X+`6e@nyC25x;TYxlq5n-Gs_YTvG`QJ)7pfaXoBAx5nOjk%oKU~~0e>*o3F zGMx<+*PFg%0UXp<+1D^eN`m0R57wVUhu_SNFpej7GS}#sI#hY>0)`cVY!~hJw?X>q zYc}fC{xW?FQj6w7`7IahG37W6s8-)|uw2aT_U-dB9l2aPQ3$+zSO!+YVW<1W&K{TS zpEN38e6Hcbt}7KVw^|xJT6^!889?18rdxpN&8k7dqCvp!dHNmFG-K}d@+-pSl+jhw zKFsBzn&&0Mzs;Z>Zm2_FfpFtsBM8L7w4B&>YvH_43wDv{eKMsTL24spDr|62vKr9+ z&!;$rXojIjSa{$1@V~A%KQ3~SW{+i_=nJPGI@Fy9eJ%fb8;s2sTI5}=lE7WxeOi_s zpzB?+BX5qLCjnw*?S=EMQS+`rR!<9HMUZJ(Guz%1C!(@#ZS%IiVb^36Y&v9Oxh6DG zKM-PN@wsLudghY672DWPaP+{N6xDHMGo;f!Wvbxl86OV=hiyJ%%F~Xj{a)U(NN1G~ zQRl42+^zBRr8s$aB=$x@Y??+9vO48FrKd>E5td*-g}21mEqvk;c6YwsZ}}F|bVU<7 zTNPMY5&Wndb@L(*jWK6%a~Em)eUSP3joNpdVrWl!egj$j#kg;~9ioal4r%qcl&*oe zRYOGCGUR`)0{L{UB@G z#a^FQEt*xydvw;gF{%*l?x>M;_^Vq~BI)pmc6f2UMEA!0r6sv#r&-qK?+FP!pu{Rm z{`g$p`kX|aQqBkY4>yXxaIlnPIhSKnq=Jh`Zs_%^>N_nm^ zE^F}n_2}Q~=g?G{h(t(9Bua55NOOPDkVrjVbvD_<)Z2upqKK}E*eL(`|5^YJ(RA26 zd9gOv=XZuA`Atod0Fpq@47OtqvM~;CF=Pl;>88>#YKgF$O*pq z39f(o`8elA$m#V;Dld)diG`jMoL|&-mT@+Qa8`#%HbzJ`sB7JS{qKP^`U)7hjs@La zq1*AZV!w499e%+*;HqULHg&$()ozDr*)`*8CixFE>bP^y?bHzrUBWl<`}r|RdD=v+ ztplxdgEI~Jw_T?o4&mvJe3p;x3%wmof-9Te)g3YVZZl3xf&?}47yiaUZzxwgC(9W8 zmpQwwpkL~O19_$?M3D(7V;qK0pCIGduh>|9f03pBCa(Qr)iwIL(9PD^t&7|(IoW3! zc0NSYlulD@w7~X9)Io`C>g{;Ztyr~0zCI0d-7uFD$5`qM=1f7U=660=>Kj zmc7$jtPXvB+=pd)M-u#qFO8WY^HfT=8WP?TFl0^A>*?1uD`AkvZ5Qqy84!}v4X6U(x;)TL$rFXv+R(vk=h;BCizSrqCh zp2jy?(ETptH6Hd_%fNEldy?=zvn>a5bqJ-hiL)UWk6D?J2~ftr%c-8|1;|VJzocj+ z)5GlnP|s5P8_Do%uOqrR)ry_{ zJ9?ivJ&Xb6hP5~c^8>bWTwMJ7$DSyuaZ<(2tj^Af8d^N$&mR9I4UlVQb4hmWkCsQP zXzsJpp_^XV^=|1+xM=Zqs7;9%XKE8v^-)ZSq<^sb<>P4k(BnBwOQpS{Q`QLOb8$zu zce<8uo0EEHhq17Su5;JeFpi1o>q^_HFu6Ihl}*W(2vKLBOj3M{R4NiDo)iD711K?9i2TJC)S==4{=zhr_BZx@7r4WpqKn6b&BLFi*ryW$v_Ta%H?yC zBn)}G<_YB*JVD}ju0oZiKk@Y?c-b~TqU9!D`@cct#EuS%XkcB+5(M({@7T-Ng-c}a z67Mg}b@>hF{(6d7oNBqoVzHK%{Vm_e;2Lvi z8RpkB5_{-RAqn-wc)QBp9)%PPn8l$&<3OlMf%hZD>KA!+xAD^90tA=;W`k`}N1)ag&s=;IQp}wj^)D6V< z;GO1w&_fOm015a600R0PP$6;h2hbC{0{MV~VOV_wT!VnR zU(5Sju8=uCxY}27Q6h^rx=s0y%TIc+xaM@Ad~cj+ZlsrF{hE)F-@T zO?9SzgBa}uKnNZ0ftn3QJJViqFH^wIHf9}qY2z-Qz^TO4kfTie` z@F^vARO9_x2~$Bd(Yzwq>+|wqQS-PoehM`#sW};@-kIXJEh}skcBZO~!?Q)dwttFk z(@L$B8LQG-s8drc=HDlP&~iUx zy1xuCa5C3#G>+WCe>I{$i*}Pz66v+|Ehu8{)^MGJQ)Lw;GH2IE)r^F z;>0#$mIGljT*@0GxPsx)z{0GisP}B9jsxwS!|Ou=d>-5l(VO8pY)4Ru_@mCg7X zdS4tkbIGcn{+LM66(gW8knhXKYMC_C)%k>9pJ(cmm4`QIXt2tP-Z#0ybACC!Y! zpQ+Jd{KU1dvBJsm^d}J?3o6nV-t86t)U2stgOlOs zG*f^2C&|2n<2|2_&@IN|j~qSY%xG|WivMs{ecJZq&0Lq9)`ayUn7g`=o>@_0#Nj6w zZ+TwbKC$8!5aBU37Bn^CKiS>k`9)FRd!Lb>#7U0x&Z>wrM96=`+e8Tz`Ut9Mqu!YG z@6%hr>CE)$Z=#HBss2)p9q_fKXMH1B&xmU!(6u_KOdqDc?K;I}AKRr)UDo~@MJn3n zjE{ZQ<;O19a_wpMK3ZytxCa_|hwBGv<34$N$C!$F@TLOEX^zCJoI6*S+*x?gpnFTi zg?)Vsma)&K9LxH%6%rw8aiT)giL$UuMkjVT%Ox$vsyj9$`|>(aRTWrHRLrCICdp1p6N^s_F&q zzFO1MDvGQA5%&=xo8MEXkSJ@!DI}wn?b&WUFP|)_V9VVK!)QO1Q_;Z5E2k~0=|WU6 zLP9Nw`YWd}NN%#CH4xbI2mA}wDsV;riT!Ckb!?@3r4wS|44&8<&V^(;zv#Umw_WdV zXi^?J9W(9@>M5D)#Mmi@iU@~TF88I4#oL?nqVgBp%GAt*g(c@GCZJmNR)QVT(a*hM+E$qBYa3ARHFOXE7_$(H5G zRR0@*<3~X(s0V8!C9;IZk)Yspx%I6~5JX}{Xaf2cbnhIJ7};t-PZFKkd;=OCrcI3< zYO%vIgU7m7D@yILd0^bKrC}|#w*<&*J;rp8BBrk1p$mJ@ z&(=+N67&tB;r&fX$9uCz`z?Z&=1_+(deru>umI>2C=3IDnm&Mf-&}>bhEvvv^>+$K zhCocz+pepR!R!5(OU|Az-3y}%E67@#?E3eUE^F)q7V+02u~%o?@MwTo5P-an>8r{T zGF%j1Go>V#h1#R~R~|ml)wJC8GpP0nW)e1P?j@S_8-3cg{ZLbtv6oWlvVlyA5W$c- zm4g^9$1UXo+iwv+Eqs)6WZNP1JM1)y@RM?GtAEU^LBao9VJ>cIp5?|c4gxoW@2o^ zPvW*J*&IuwqWx0vVJxVk&U|1P1eKhc2sUoXJ8seYeo?nMSk({g7`h_fw=1CSM@gvm`g1)Hj*~sLaA*vd0^?HQ~tbj z`8=?g&DR*T6}TQg0}&?NaL?p9=5*#T-R%O#25bs~(WG$nrNGdnwl&%kE32&RT%fc2 z^uF*|>)X#(zgD-7o}Ld8gBzkpU+b;+jJ|U;1rWcn4>b2U?>u~G8SD(cZoRZiyzD(U zP^e$98QHDft)1CTTiMH6*vp8{UFJp6ObUC_L4lyrCF0=NSGMD5BYCf_ZT;hE{t$^h zgZ5u;;k7(qZQxjCHur=Bhkx}{rcV#6!h*(U%PZ23 z%ZIlN6r2ikM$IuZlN2g%qti;|L=z$CNmDwL9$NEhcf3J^+bYRVAz?x4texrmMB~%g;T3pCOs{A6G`hib}br}Byga-VH~PAPCAquimxKli}3TsrdbtPTKjt?cbTB^|%` zfwn*1AE3k-(ARhJ?(XgljrT3f*)F|>g}tKBcBP@w)MN>43Y?JQsh1=@G6B+$s<_5O zqHzy#M#TRQO@JTjpp?J0wR#y?-l;mqP>(3Do+-BCl^Y3ExgxN# zvv(HUe}W=e50`rFu8C}EsbV(IuRkPg8(6%krM*TUH+BvOo$B>=m9@X`IXgu0g#6;kW`gjrc6n}Pq_SVAm<1`{?t4PSWuB)BS|6Rk{ALBaL@vuV}0`~e9 z_A7P^S&J!mMEheEw#ia}jkM8FLiB7_@NCvVCmHtiiVYWx3*7Tz!+N4ZQ)7UN8ai$y z1~YcC?#LK#Vu}l8*Jhg<-0hgG6BwIyU3Wyv4P9W7s;nX^o;#@!ZCkqqBJc1iLZU4O zx>ls068-@IhTaD#k4B}V6ET4bKvn=?>|_Nxs9&^rR8*0shxJYXp+CrWv}{C==d81;FIzO$Gv_j=7bqEUz!@RJ{I zJbs|*G~}TAB4>^RSXO zF4Zoxe4kE6bS($Gfz{XU1n7-#@QeqY#`WKmlN%V-#o8Fvu?=gPO>0W<U^`=&t~SCj59mw>=#SqB{l6o5{kfOGf)k(i>L}DJFKdA|K3Re) z6xtrBgsCXH>wG1)n=2dhwxql~(ONgJ{IfQ)cqekj8rd?ne29(tAaFnoh>6|(nP+}V zKgIpA)r9(?*XgL)oHfk+w5ja0j+X5jPm`~at)+6fRdDn@G^b6C>2Aw>PQQopnnV0qUR@L_OXJB=Pgg*GD~8-`U1qbWZ2gLm+5pg$?u8Zn#5nEzfr-;@0Kbd zm?fS{P&oZ>QeaVPbhmf!O=2zH`yOU!&)>8N79okZ2h67FUttvIyp_LAzdqK&%WR`5 z9yYAq!c_hUxqTgurbkR8u@`5bnF?si3Ouqs@{wK1!FJl4*te#O_h87qtv*KgNBA|- zWB=pOU^($+Dtih<5v3Rb7%*Q|dy7?Bj6?$^MtNs5@_ zSTF9|P$8D3+a3WX-~Ebx-_C&AQu@DB1$)(QX?FdzN6g>$?tJes1WUi~qF0O^Pq-a7 z@aRs=8ImErs`zGt>{18OuvbeU6~8XiImi&dX+0W0p<``OiI+x-0=8Z-k>D68A+ zCMM$wtaUP`^V7dPgMu#Q`p$nX`7zl3-4x?`C%P8r;oUG|X_}fckDJNB?eRgsPDpg? z$-L1f+JM=N$=zt%d|+y5KBGKw-+f)V)a6+`I?=;p5{YW-?4fL;`6h zCVM}*Bw>x3zecTqOin_JfF9heU5iMI zMY9avkc4W4pyW{`b;@}bV3ER2Y#_cS@Eb;Bqlm;S7a$Gx|0#c+#W~K zpcSOCo=M65T|`T4=EY^bOSsU-{ji8NYoH^d;l?&rfuRaEdkC+bL5ixM8oBL&3^xXB z-zs1WI?`JmfquQ34-Z71D z=2UVvjW{~pZ$tv8ERL`|$*Md>PK6>fPeM={tSeeP7cONbQk0f2g5IL*kFxQZrR3wW zy$z8~yth3rlp!sYS(GVFDi(4m6#|qBGYTclN+9+6(P8_f#JOMEdqupQ0Y>tLZ6#UIk*Z%lA>P-q{XbLLKIVGwU#bOm50^p=^u#+Q0t^_4MO;0!C?H|VROpCuBwQ!-aD{z~o<- z>^(@#q<^4BuV=4=*6}j)|E=yk)QEXVeEgU@TEl4gHJ|Wo~ z#H|9?0JQTNmnwiWEq4ROVqB!7xJGLZBx3xFY^2QMdjt?J^y_QTyJ$z5bz&9oDtVY5l*q#hhIv*^dDmXJMOst zJAaGr|6}d=V~Jon^UEid`=5W^e7havn4gc&*Dt9;zH*G-BZGsysj0ZS8%wM`es3xN zqbyxq`UeNUL7v5nt1AqI5J;d|RZUGpU0uMWxyhD!*S8jZE?jjjyg5VrtAR~HDNVsq ziFMYuNUNu0f~Q68f|i}9_hyOL_Vod?<=PJV7Z$2+7rVW71{8Z1J`0}n_K+4xchBc~ zQNeLhRDmy8#lF7%$S(av{XjG+8TRQL%~2a~G#@c_7kZ)*Oq3B!W^eGkrMc74Z&4G|68|K&h>Vyq39MqZvN7wE zN?W5&{m2sGm>T`Sdgks`o3aFe3RVBwOkhVBsl(fU-Oa*FYoRMxv2_&Lh6aLzvrJ6_ zDyO^}gsqDIT*dE1J>O!#wcMU_t#Qk`&JA&2q4^7T9<1-X)EJlQ>ghW={~B8LBHGZ; zfi&|Z+pS&P_K*gBPzYsXtLyrzn_uS_WR61OEC}6#x_b$^7jlDI{pp0jMv(9xv=zZB zw@*6FxBhpurLD^~dpo-ixV544_+|TiyBnO9&y{9~2;#cgj&!XVB@8*NKXl%xm#uV| zt+ZdTbl7}p(_*X0VykM{igVw2qOsv%;MlFPt$yfp3#GJ_t)}MluKRKtqL*0l8Co5r zD?KjFg8W2xFNm}V-{&oih=|CE0MyV@KXoy{x@pJx07jUltxUhHF{>#J9SkJs(}rKq z;943wW0Sr+#q7*$d8b-yh8S)%(D~f*pBV_{7qe!cT~J11=6;`$DtMKH;cQFiz%o}! z&X%yVr*`wIrBjg3J2^B7K85Ev>XFb+39Bf8^Lim%Ltu|j?#l0|2(F1VHto~ZhK98J zz~YMU*<%IE3kV374mHIcvJt&yCMGVR$4O3dexsTi7C4v>pnMD)$4ZdZ(#YK%Ab$pD z+xLF*gX9fXtsV6aZDVR$hjj{Az#Ri%TO8l1%NQ*ej%J@fL7vBpCh+~m4H2lcsCA;t zPosoqUm1B2#E;mNS51m4CdTA3gZP|q9usWoGnLCMW%AppptL-`2^2E9qHxV{F8rx$ zPCn(Oqj>dR<7Y2VrBY<@lCM7CO~^q~?RT(L?k=eM#Ei5NEYN>KcvNH~?k{etxU*Ej zEx4%sIY(EZuPfEq6po{X{$YZwsrwOqzE}Xuz%)WLFj$Gr9PdjXUhV@=nprz`J{O)*f zW_}TMJlCb`t$)AYS!z%7$mD*WS=t-xp3Y*RAhCckmwfdDKDh!>x$G^D_h;PAnc)k0 z(F^I&D+RItNpbCV>$-d2@t)A{v=+v(o1v%PDc2kp>q?J90D?0kgPDQ4gr-)EfqI{^ z&zF0q5a0sNypG=QhW7ug^w{RO&;eRZ^k$fP6#AX{j!`89*z;=1gG0i1?^_PEeC>Kpxx zjqVMjlLMfG+Onpuu+|3XfHp7_XpFfpZoz|y9=(BE0s4UG)a{!HXl#o@S83Ypyh zrv;d1m-0=KD6Gpt7smyC8$9^+LdBcw2mG`kReJiXVx6czlae0H!;kGGfpNBc`e0!; zmzx7rn3HWc@D=|T#e%Q!noyp^;*?a3VLNIjt2LqS08jWK4h?g!bs{fH;U(NdnfQr9 zMj@~mT{f1kdT2sOXY5iFus;Z7-cV?}eUEW~iv8i8C< z_NS+|`Tk!h&0irU!hh5CVdpo1tv2b0kLsqRo`OPZe9!}DN{z01=$IBUPD8%c?gsnV z=@F#`|Ge(iY3s_OV}0TA-OR+|=+}A`?)XCN4MKU{FNA@0nO#BO!}x#2aN+R4PdPRh z9So@r>*&xqRP%Ob%I=-FL2pe`Ioin`^`(!W{(rFGLD;g~ZEOGaRJXR+5qo5JNMi^r z`DalE|9G62h=so%`I>;FSS1#tyI!S?3vuw z0S3PMWn~M=xwB_d%Qg37gqmN+CV0u$GgYsu)fT#oA^0~5mtWNLke%V+FNYP0r46yA zjVd4As`evC{z>Rfl)hf<=J#<=oTJ-n=3)N=7duc_mw<6SUf3+f(~}1;-^THdVJ2vY zK8lNiYoC_OjGX9w))$=_t=MGx6ID%AUy-%YFm-;)MjEHvD?RAY4sN%sC z*TT7*W8@oaIKerZqoNmMq8CwC3a;wT3Y?-!fK&DVBAHnJ}#j>COe%@9(Fx* zZvUP0I`$#vw)f-heEfj0%i}`a+d=ELQ+^^bKV-OY-s&fx3T8ot^*ngoZ}BMn0y(y_G9Oj$QG687AX>d z!#&ialp>=XhY32K4D-t5=_R`Pg{lDI5Z?@hRp|c_^>5~yxF&l!)34;CODhn*gr z4VWbl|9U4v*mnQb0c87&_ZF`Ibx)%EOWm#ynNH^$Msp-Dr35W1F_#9m8}j@u>CP9d zmm3ltX#f2FSrE2(TLg>G^XXucxQF8KUbs80p6(EW6NSnz-=)otQOCTxm8PBMIXxV3 z^`8bN*Uxj-D-Pt@xqHwy^j!&f)z2g7Kt!X+7ZB5BHI=GIlsX7b@P|u?S@vC9Z--#e0 z4QW7XMjS+v*kdSJJ0qhnm5bg6i9`@k029=@dFA71Q?IG1tKZjiM%8p+WaUYq5=0Q| z$VghH#oDKc2ejG3y}sOvgdz21ld zRZ0v~Kg40a1hF40fXdDXPMG^tS^1tv$YYJV&7#%|Z<6+Hw! zq%N`1+M1UYg!G=N!`Q5y)Y=u6wui(-N+hX)$}-kYlIhb=hz;G9gXT?*2G9N+YxmiC z>}E9XHE23bt~+Yk@-T5_sq@QMf*`(Um58#8)9dy4z=;?+woUdwWd%`W5s_P=?tBac zr&tTKTH3O?dGYa)>O(dIz(tv~8cRu?*(qQ$mTWeLj|ojp35mM4x0c;y|27v|So0-C z@cQsdsyte<9HxpTZ&z5e1oI;M?eaR*`V&dazr>0JmUcNJl(d!HhPx@uqiLFDUqA0r zuZ!UEN?BtINY_31OwKYr)%u$6j3duD<-|zV#6|A_`HI zbap}2{M!Vrhk-}7mnmR{{%aAclK#wh>S$_m>~Zk1SYIRNx@hLLH5X{+CFW`*sg%Zz z)f(>9iXF85W1rc7*woOl*LUpFSYJQ1wS|In=)zzn#ZU{gh=}XE8^Z1DqNXIsf|$NW6LV_5ojE=&@8Ua{J4lSyD8={}1=eS% z@hLvB%_)|Gu)=VG6i%!8S z@h)j@!&RHG5})wW!pbYq(G#)7B4o!qU`0CV@KAig`rC(Jwq*&8mcjPU$J_IB$>rvD zqQiFg;n~?)(6Trqj){c@Z0&G=)o8fSqB!lIcqOSwiS5sP+x!kmVaZaYblvEAv%@`r z#DiySP(K`v1%#y{JF?SWD^i1_pGRLToh=#>-OvI?0b(PEu!0}yR5>kX1e9YNY7_Rx zQsK@L6(5rGNf=AD(xtO0(UtC1g5_e%6T1tl*`d4)xaPJPt*KZ%DgF|_6ew7!n}5G% z%9GEMH*=wPyIfsp?#gc#h<$zfs!d4+JXO=w4Jz|tC@&i?Qqvv^E{W>jha0x=A<892 z;}`nw-8_2KoINFso-n1$=gnZ1ih!4`h`##h?A<-Qt3-)XsZcNw6Uz&k@7;XQX>}r; zo}FcjzhqkC_N{XGyRy1T?(RIY`f_V$oMn);akY^n5YYG!&(Y`BQRsayI&q%%4OYiC zR2{x*{ib$u4_ zNHT`*xOl62BqaL#Z?hd+^PsV9l(=Tz*LdhfaxI-J+v*u zH|RsEswQ04ZRJ0vdgy+fgR~X*Xv+ulOXPWSx**l9aFJP&7G+>8P$aiC`%8VAQF>Or zJe7$a{m`pVTKeq1w(g&{9b;eTuOTABK01U6Tx@gh@ChmE8RzF#Wfl2tB`{X948+QG zT?m}k#R+Sn62XgVNl7V+%8F86!enYMAsh!dGk^KQUJtOem6hX5O6SwFMg5Jw6dqDp z(tk^%kE(}fuTQ38*T|aC)govfh0{HTQQ7BfO`w*z)Vs zk!5@XGrpDHNFaH(xUDS1uvXEh>teBY&qNCR5Id=cT3^DWxK}<}9$Ni%Z05Bd;^YOB zsW81agctZ>f%G7dklk=nP}Oi4YXlT zTXK6?UwmLGt0%^H90Z;$4X15#uoAM)uTW8O*2X17s+-ayW2C2)JUJnJ12o*9)6v;b z9fRW@invW_%1~< z#-i}Bu>fhQL!QC}?Q^O)I(J$ssr9oeLlOpTnf>CBM@=hptbaAPw~R65*9+kgpKSUC zy~uKMkR4@I02?U$kvA-=XW#S?efd-Jo$meHzvkSjo=cp29|yY9C1dg-TX>U;55v2e^o`7*U-rlbrW0 zcdEOxo|}obrc0gJbNfP=k})MwWA91&*}CrD*^~T z@NpS~_zEAh? zt`Qucc)6Ho4;~PSV=LjVA=mN6v%y@(b7abf21k!{(Tf~8 z1QSR_0pe1-CA3oHYH4HhE68CgWKS#T#g(;0Y~y1^|UNOIR~L}1_KqP?dv^z0Kh+Yn#NP-CZWGjqPeT&JVKQNZ7C~DL!AngeO|zp( zy`x3FqiIW{bweRl4lqXJH?Tu?(wQ)Us!=;6eV?6XI%Meu%6xLkKvA%+EaaH1Dq1{& zS6h`b`8|mMUFsnz$}I_OMQfM+lXg+5oI^2xhAhDbZL}0!rW8$z23@KYEpq>;rpyl^ z-!l>+A{1eiBN>A!Ss6JQ1DX6*wG&0_M?{?;g76#k?`G*SouP8HSc-%g3anU_EkXG< z&)?1v*Z^4rXp2dBl8)4oC|9>Gj{_2?S112$^hzYGvIvayF0H_XJs{2A#{(_@B7m(j*66W2twmX}`3a z#AGs$Gc|EItwJn@3jJA*^N(M1Nme{%>#$LW^#+$O`g?vdH4d$UG9rE2W z7F9Dr{j(e1)IRwS^$@LdpYIv478rpW4}RC zVQ=GLwhvvjP1u6&@xG0?>zJ0EO$^cL?}G${${3n886TdX*}1ugA<%(2H7e&{ZWlMQ z{X_Tlk3*g21?84k>bHZ{&R#@Hr)_SjxE;Sh%AYsTf1sch;-KLJAjRY9T1my5l9*n- z+ExJoCvI}HC*pe5gOfLHhepk_OlVRt74}R4kQL2NuiI7J@8v0st0|c45ftiv=U?FR zga!W{f2n-E_wDZCB7EvKO5yH5nXucK@|QAj5V~*Fm$}|76)m;!n+hxH#?kN>(r%09 zZ?XT50iM}fl{a(4uI+OF7StOcUn*Lxyz9zWURIV@RTbUP03eTt3kwUgwYP`(tH48l zotT;e@bZpAgi2eyq?zZ0Rr22HTyAVk;0DHPL!DW1vDNW>`|#G!jb_f+c+TU1C-(cc z5PLx((usc~e=ez@eZOpJJM%WT@-(+gr4R8epkmIWqAwyhR9?~)U75+Q$|;&#s4ev- zRAqm2V%WlAXP=ay&UoM< zBbGo|5;^C!L2Eu!?F#_Yhc=>#onG{6JH8EM6}k&n(uT%wNS%+9dQFwD3IQ1>ouE-H zqFg*iiFQzvrcZPIcX>O!iW#Pz8qu#%tta&Z{F4z%ySw4xp#jbgV~h>^~HzXYx0-tP{xFb?3dbg%dsS5YoUnmr+To27lr zN1N{t(lnJz%VfY?;MxH!?bmZQuu)oAhz-_=ikkxaqw_KJW>f2v3`}%2K;Tyrv)W%U zMxWRN;w^Dl+xcf#HdvjX;xZ1M5-y`qNsGnduT$6rB)X-=Hz<>_5Ye}1bazegYaby;(uOcaRngTb6vEwBUek^s_F)JI z$I{&Lc9e^6blV^=c|5VVPX}8ja?|?6-%fVZ#x||yQ`grwX6wIYE>!VSbzt!1!UJXH z`L7%S1vG`wo4*pLb%e8oShQ-!N%U;qK?u(Sc>h!XOj7mDx*kA=WeLzGi&pjen>2TLPuPotH~|X)%?o7d(8}ApyH60jiY6# zZ;E1T<|0!|E?iKXw@#g(wKJR$n7FIRwX{tYqn9}17j^(yH@%N|>Z78okm8V>%^9g{Sg4Dc$O`EW z#k9uC@8D_10CRT$ltZ%%y73h?AtM#NvB(DK*v_QD5@TCXu_Zxd9CuETju|n68aq80 zuS+{riEg+mZoVSUL}l!h%ks1(9sla`&!sznlN03ACuiVKO5F$#F=tS(7A~D7w@07d zpe+(slr7A|Q8K|qh{pq~Mu^lD)D(wQ3`tZ#f3=4G8tnEcbw&`k%$WyC{MFL}wUxv? zg-Wy&WS&}C=Nl~amFW%zcZQ6XIGbyarJ*OYQ`H#DXb&eXB#Hdt%E6)e{@%Qf;?#B%}nZ&l)!2L~P(?2%m zyj-L1)Zsp62*bvtjhOSdu=E(<-07+0nvwYIR;;E_xaM(z@I{_5 zK&r4RmOejZj-IMG8AC?qe6&Ypgixc#f^VUKS^O4wD-@ zr+sdK``SC(QyhnHB=@e>k@I$RG_&gRC@@mj{L;b0QqW<%4<6_Q%k^8^Ku@5E`P9U% z2w|8Yp|AqYtQ+_03Au&OmmG;yPslPIWBrtqbz;|F3`|772L%t-4oFCk4!Lvd(AFp4 zn+{2io!s3c6RZPEx^$b3bj*(f)4ea#ov5R)SBdE?REM=6SR0?6N2l6T&68R!FIiRF z2d;;L3Q&igZMu_Kj>Q4lH-i)4}`!B@Z z!>=VFwSpQ3=KvdVW$T2tN##{13BWo0o&nVXJFDmZ+otLp4t&kGl{L7!Ho){zL#*MS z@pk_d5EbhArxsVLUllXZ;Ojb7EnyE0tZi3f|3nPxe!3&N=1qM^m$a>aY=015glCrN zUAQatWUo=Qqi2|-XJ*g`TDn-8s%>KRp;d|GWwdLB)3YVswennHwZ)&6k-4h8d{3%BUOT0>edZ1GteDFg#aZP!OXOP#-bd&9L9-Vcz| zGMZ3#=!p`_)>x!{A>(KVbjwgfm?i^4-BOYvR?_!cIuTW!-&Mr~Ayp|?_MH2LI5;J8 z!SCKE8V9E8XFPh$N477!#deuG)43n@k5<3B?_CekrAg9$u>OMqb&#cQhvFKK}-eBY~4fZ)Bh_}iQ?HnMB?>Bih04qyPrM3 zndLnYHE~g*xGYeflLHszVmOf=-WgRaqEsY9!C`$Y(88i+9rra=$GNI7UloYVefX)3 zE#CdIPNIOrl7~jX{aPHQU7X05oX7``f~k(uUZh=&B(r7?sIopG`b1GGB`#39&XeYr zNpy$KUkX&@|E;+Hv&?BGkEBGJU!>8V1J{q4>6J|khK4*b(fk7q)Gl}i_FJIsnEql< znj9%ekL9;e27?YM0-^;vAFnyfz76)lrCt|z)ZBV>z8~D`g;fq$4GrD>cWYb>=SEAv zg>)R>i~>69!T&^_rdpJixG8LH#aWovaBX4@-nWLotdP>M^zG$hw<2E+X(7^RA`LlC z+OqM*v)fzX?sT=tB>2kQs;-BqbsO!gWP{;Jm z21&n5e2+_|`wU_C28yRU{zK??tVQYWeHgLNmi#xIG=X1 z-`f1+=1@_7fOma#_D_URocq(PozAN+as=N zQ^K?jRItx>Nr61VD4w*`Bd>J{&T`VZF_V$0$+xHPuLRc>pP5UpimGl-2b#wfZ8=%> zXJ<_L*CG-w-rYmlvs`pwj{l|V?DCz+s{A)eFw6sp#^B}&KZ9MJJvd6Pp}X+pBo4+& zi5T8b{du^v6JW_PHam+hDJhwilLKI9?;jZ%p;~d{Awoh$O#~L7UXc#%=17z*sp#sD z&fMVXWUgcVV9Yz&6(z8?ZhalAM0$82$Bv?-r8S*6HKrlzwFJ1lJ=sCRqvcBzfB*i9 zh45{0adBdD5s8@a`i#iV=! zAFR_RE9@)T6BtTt!SABX8;-7HHOZra-fkMdb&u;vdjiN!kY+gp*vd0%(hm{MGnC3R z%#)BX043!R!0V|Q^Hqwusz%hQMb)Xb7*^WnKmJ(C&|QNj=OZv(2|?h?Om+pASvn*c zm1E{tVieR^|J2(IXfHvR1EF>0!6)W@i~1>+`4iajQ%n*RenkN9_mvLnD{qW8RiPWb z?xS@HA+l#C@NdQ>W3wh)__}8D0pq%y7fr_)$XAqH9n3N5%X%mGh`>svh z|7ii-D6S3g?$8~dt_fCtp>4GDSh+RY5mR5T@8nWWd%hJ=zdQs#IHgQDJz+Ftn>J*b z$FTHX&fc<(_IzvoFjCwfOmD%({Ut^oFFS)DA@(cJ?M;dLLh{Q>Y^COBUE7;c;nUXz z{f$r7x{p?w14OAer^gZ8KTrGg2`skjhO8D_zpz^Mw6#sGtk8S>1KW77&3px?VFAaP zMpNvgox_t^kXoMX^oaDj#_GPGVDZ${&M+}C0exsDxpEEOYE8w+Sxg<*nF~d@`Pi@I z^e|@&kf+Ne2u?XWyUXxpn+dfK3scINnq&uZF|57HM1vF@EeRb73DX)m>n`IO`3np^ z#739$e%HKq(2{lm4P3qiCD4SEbc(Fnu*|ytqc7;w36H!|_WwtX-BPQZ?m;}7IBa<~ z7O#<-Rhl%`Nr=^ROP|p2)f8J?_1K`4{+fW(YZ>jpptx;^3xw*R`0HbwL#Q2;Uy}qu zFAG?@lAEgHCNC6`q#FfIJ71o!H%ltov(i`Td|mXj>}lj%FhSabGm1hk-S~YSWb*P` zE!IN1q`&GF45}~`ij^TAK|7D$X$Dz`-@E0g38~y$#d!!QTk#E7W@QT%|0FhuFsc)i zO!Fkp_gC3@dc9TB8Q;21R2z?3*UW$K8a#33!Ppx*eO>FeKb-T%L^>KP3mc9|KwA-^DwNI_A zxS7LV)h#~7L7A{QnZQfyvC+w~;j6I?k73AT6%#SY@FpZXerF&fXEBp}3}#Z3M%kd3 zao$naj8xZ*?kvZPD8h&+Kq;@lPuC8XU>eR-H&mjlqd(MCb6x|>@G%jzuQ5G5xXv%H zOBxuELPVa0v*Fs+5~WLd%a-x7X5pFQ9GqNaRk(9=E73*bks?(;$>Wvg8H?JbrK%OB zR9p}N5zt`O&=LrnU;fP`Dh;LWw_tUSaCV?kHhS1r@Vv3voUx${i}@0*(GsP_T-l%U zMD_|5K*2JrF~^RzUH_uF$%1jQLUq0hd9ey(u?}^=(cJ!(l||7eFjrbOOd?dAZipP$ zBssz=S+>4Bsi{(}$!1|?fnY6(K>LuMQ5he{3$eNaW^M8D0be{?8@p9|5eOzoKex14 zXB+B0__2%5(h(%+4x1W|1RDX8kdmk5ai)?&5|efn=WV*EBhxl*aE#l1BSymYsI$(Z z;suYt{`tD^4XYADs7@pzZ&oT>alGqYx%*~S!}Icxq4Tr2*6}fl z<^JYKE~AqE1f1c7`ZR04FgK?hE4BqRh(*pWfES)6c73E;38q4lmPuPms^6R+Sid*_ zWd%-d@pDcnOcwJdML(M`DP+$DZAn(S37J+Ov%O6@Kk0^C#B5S_Ii_CBsl{mY^jY0- zPBq)R;4toL)rEL8um7d-G3o3&+{u+JdBMFGHN}3s*z6kJP1UEqPoKWMxX<0M&%C^0 zq?lK49|E_g`oN2oz!AT$DpWQ0G)kF|kFV>ncXo08^p=n}?o7A<(kUE|^Jvjho!62# z&OOkze!NVI=F}VpY|n#zvTC;WPRB&IbZd4d59zmb>Gxev1=EWODRCT}cUVkangcZr z<7&$X+34P9-*wk#s=tV5srX_ls`E5CyK zS4iSF(FkoAs$g)m5GNYZZ|d7FKK?MSyZvLdiDGA*mec>bKB$H3qEhI&*+0<=lSXiE z;oFM)Z-O$6pA4msKe(kuiipI~+gpS@-q686x2p?oc7z$W9xlBQ3J?LeD<_0FPchNn zu9bCR@~a^1RuF1F$Xo=mAKK#WWPTyPa&-86Ym`=;q>dg5v71+u+IF9^JGR~}Hdcs6 zT$boMDq+jsu*P)$CFek_!*{yYh^8By$b^ovoP$C-|A2}e=88VwCbQUCbwLU3$MB=G zuLB@6DV+*7LdpmCGJMjdMh>&@9Hr#VD--cO85hcI77X9o9)Gmh`#%jYmA-gQ6+3m@ zrA1Dwj^VZL{*MX}*N1=yxm0@6AdKmwD=I z!r2S**%R{BO+nOlEKH&L8Eyg`r#@(BuxJFKmH=K$whqe$J~Ucyw2C)0sWrL^^#U*- z9JET6L-ESW>q6^?7vO(TAeW#8QbNC-2#tGBX%^V!tNfx>ZBUfEO>*{dquDzPbN84& zD5pX5KR6W*^Qzr`v)}Vf1DUsez;c%!ISERu-Oamr-Yi@kEgVqV;Zc_pQ`fkmEj~2X z*!Mfk?OfWMk1qFJI8#9(del!F6mPl^zX3^tx&h`(lt`26CIqcf4Ijv+cFXZ@8xkAd zh*mlz?cK_JdXr^q<7Kw(^5UC>Kg!#Of+Sf~6dk|S=LKkiBkUGShc07HHoO;!t0pI$ zJn?#hadBDq3%))+JS2^dN=rycNKq#ek&^B^@|>KX@3T4ugS(>YBdmsoO5^Aj;H)7W zDKIJNM}D!En4cfT%ggiWH7Vq;L*=z7!ReX9!eTl-)1auXEZh_@Ix&IdalKVsUJf5G z6+FCeZ|@^!0}zgpvT~;KKul%RQts?}D?}(NbGkRd;PDJ)@{0B+n_u}9;2*~zjABwh%9!vZKn8N2rI#%O^h<}dO3jPpBOr}=o`k#sIH?;V z3r^nCt=Lj<08^$C&^?XetmSYRGdL7<6{P>~L#4K5rDX|NHym7nZ3v^)qk)wr$Px2O)|_qBR+p#St=b zZl5thlm#dvYZw;0^`@oXdi!9^kCS4vH>3S08hFQPM*At?zNyYI{JLJzyN)lDSKoah z>+dB#S7!yJTSD;H6`&uVY&6A&dukGgV2xjC)h)iK=zdr1-$&T1;2E9`w!Wr0J#R0_=KqwrxvM8*@>=(rLKma!{cC@l#Q$JGjdSr*Y*DpNW zWfJ@5#Ua=#eptO+KGhM})cK#N3DsIVf;Guj{=w3D(uQ|-Sgl_~CyRed0-;7(s|$#R zyGHSOhq@raCtT*vioR2HGMgbu|ATxo#G{T&WA6O`Wza*vq=pAocvJvdfka79U21ES z5H7^+B2@GuShRIRp05Lva|olZkup-WZ^|x7`kyDul;?IG{^eC|-+296x8C~c^KHgZ9RNhAuAj`V5B-G}&1rI99ghthD? zD$%sXZ0V0CZBH$Tpf1^eLl7nQ&O~d=M=Jkh%V@?BTl)dMX9Jh)p_mpKcZP^=MKb%n zqd&2oL6r*L`~iDF-+ zE3L{{><&P0b5F3sb^t?3K8F~C7jA~VOrnT!V2gsfj%#eR zkvOLdEV*ZysQE*RzH9naD^!(UBkF&H-CYPyj-0H1yk@s&Up;t%xJ$)2`FuH?Kc$F? z!5Bax4|dnk+|DxNJfW^*8`;x_?KTt02?#zdmMBS`s!T|&Ow)b|v)X7sCIK9cTTG&j-sU)gZ z@|UgZEIBn7=_h1(C5rJ9wWF0NL<{3hSWoIS86g5pNNyirHcHo2z^LhvZFAn@nbHX7 zNHIN@GPX=Q3|Kczx2B|9JXn!lxJt2L_JoZ9l!hb$v__UFCaBbwZCRa=>d3B-snK17 zSZTTfR;?^bIYNfZ^A>!nK9Ni*dGhU56M$Wjg*GHv&2{V z1y%4LUbh--_oOg2*F`H=)kN^+gjlVH-x$*W0W1Thi8> zEBAV=bF&x2I07>g?726f9mJ0`&B)dc#$h7%+A=%#% zcASf1kJ+&k2}ppf7qy2kTr~m70%E!Hisb@m&iLWG>hw+7kbGcXa%2h0SO|`F#^l06 zxu>q?Nt?#GoMz=R8GJ%{D^oXa5PzA%}?1agbKz&vWI;rMkw9^g-55h&- ze`o555Y?HCZVO$M|Ke1d6s^-YtH}f_N=5X5Tet0!Yx!*V^m^T}oH?xjPgK6NlJ{OU zKFwRq`ieyI-XTuYH+$erPWe1m8upxbmFv#eBgx|#*VDx(@*i*eNY7216c~=TGkJQo zlH2R^g(0i+0fWZCE24$eKf)l%U_bSO+tX$TVYo2&*!0!q2dZy6Hx!Et!C!>YKWa}< z9uZYZ7+aQx4l0wqDao!g^6ucE3lWB4M4T<;wU^>edF6ZMlC?-UphsQf?(tv8*p@{2 z?hL6r#0b$X`Kw!VcS3)|0Ol~Hbw@;$T=f4((^Uqw*>=r`;_hz6wK&0{xVyW1u;O0a zp}4yj*WeT{UR;8^yX%+t$2YUdkjYHuCNkGKd(Q3}JOA3si+CU8k7z*k&=xEKbP2BK z>>b~V~m6tl#4gNP0~Ko5uFriC*pVc*n$HfZpp<gu%6~r4lX^s%`9IcQ8~sbt<4Ot zty+gUfAIySHJjC`MhN@_KY zuc7L){BaX+ngl{k7UWU7p68m(w2fB3r7lk+`QvYwx1~7eZFt7_^JQkc@2RxK%Z`l7 zoM1Y8? z;}4p^2kStHX`iK&Q-T7mIAbbh^5`!G+UK~W=#U=6M145Q!vZNz7=qQ+)QozE(h7OoMJUl?u0$$xl zT}G_J`REXLpt}i_+uPf>o8Gsjx2eFlZy#^UJ-*MJZwa3do6n0*A0ls6=Qu9iAyfnO zgiXoju2XIPbG%d8Wd@2*(ia1pFSMTkzZa??aA3Z7dhg4e$RX>->r_JXMlY5y@goQojvd3q^SHQ2ZB9hxj^>QrVY;(Q zv6CfQ^gBRojI0&1sq|MsH?rgjud*o78g-7# z>0@LN*HjCyvOv-9%`dbg4AI2$VH&zK`m=6_*uB6<0H*sjL-orPU#5OZ?x;F-R+Fi; zTuaKhCia7$5853m{4^zYvC4VD9zw0NQ*p6@Ei77BQlMLR09w?5#Zpq>7(XII2O^W} z{a^SjQLI&pq}A;;1MqG1p87kzbvXN!a2eS%9opKYBgdl41AN(N?d8qX45D%}A;&RF zW)pUNd=m+&wQN2ys63O|8nUtw2$>PdRyQM?xO;hdAxg8F91U4dj`V>O8f{r`RKGu7 z%4^=lw4O&4p1-`j&~&}CwRP7!u*QPXL%`@6AXm-_-!k1R#U@^!kU(MWn69?1f!-tY znahDoV-sKBReo})VF$qk&$RQ!zABNWyx+ESjk{#myo()Q;<;W(OH`@M3{ z_W9!Xdr(=?l%ePsDsKDoYp*+p6;r;@;^MF#lGv*+NODfSN*`6mTaa79)~YtW-!AT$ zqp_s(CEk6)#a9;ppUr0!{rv*->w(aH>q`|quCVUz6dvBt{YhX!pWWM(^}vwT*;lTG z6g5L5g@6sklM`6T@=+r>*xXg%@68xiz~`5d6&!18Lbb}h{hYakPMhr^zJK@+-t;*A zyP1~m?onqhNeY0eKGO_|ANjk<|5Kzbqt%#Ra;fVZ%Zcw|Gyc9P=H$ZCac$^19=55G zq;D55K7(_g)u)f$r;q!RwTH{a#F%&t%f*0XqqbMfCL&cmT`U@q3-^plwEsLGeW}9K zBQCk?o;TmE6e5UTQ-c!HO%nFZt|mS;ScBOekY|q|!Bc^|DO%#K&~(BcQ&kMJxDFXR zsh(8*vLDAlxUH}c_&GHz^JJ3h8Fu7|4)m}CWgcz7FG@n?ruIx|5V_^r2X)^${Gsn*(rAfn zsT#@f;|eM~B*vv4FUP{$JY%Ru$#2}pD!pXlDNNy2L|5}B!C@@`rpRr!(l#mw;sEtij+>aIEsi@P1F2{Tr?0lH#x-4}s^#A0Foj z(s6UF4y>eAv!pDuc#TpE2ylliaE40uXh_DQqekTrnB-P8QyWWJtTa_awN=M{RmXbR z!gi!_P=DL!lC`r@;hHS~7OFCc7A_UdoYo(q>bUbyFv7yM!^CwFrdA_Hl^~X?g)5bh zi)tq$#ta27tjhUz=5A~R@bmLGWB>_J7Y**(ZQN=1vsQdJR(wQ>STU>L6WVh{eeuN&Jzl{2$F|(&Jjb?6_O?s5NB`_>v>6+s2b&=P z#Mn6C%`8$EwKNdQhhT`Slj^z95b46wx_<+RBcDqllG5_6R$Q=A1oYR^|z{ro>EWplq{TS{79%)Vt>XeFHeG0;)T-x~N=3 zt&6DFWH%mq2AcNE&tQwrSe!8R^r;B$u$Oa89qm)Xju57}nTqYL1ZT)d?5*J5X=#@_ zGdBq-FfvW(h)slAB1Hg0c7D;B=SF^sqFQK%e;qUhF%RcrtAF4&M`N! z#~9Cv>Vf15VA9D)5gwqeDMXM?TqJC-xXxW(T78%#Mosel*5J6%SWum}C=lfd?s6bY zoRQ9*jZ!(3s30rTvnbZGko;G%E$dCy56AutBEL#y?V1?q5=_Cu>^^t6TLCxNETp93 z%u+gt(&NumV-%`HRaE*(xL+&s&vTbRB;`jyGd2CcS=~vwJ&Z*mxFm5}zudKc>@ZRZ zdqoU<*oUsxVl*32EC%Ke%!u_5c%Q{@Q1bi72yHq%q?2J7S5XqCByTjjHl822`Q~{( zE{yiJE2bHhw__$(R>GKcRXM0W9Li=GB6jeI9f>#_4$Gt0TfdjqpP?3@l_ zV*=9fqpF`rL-BaQnR~$Ev7$P~{P_@n$Y&ud0ygo)|bg)KgrdUm*RF zC*-u6nYE!Cw+p5NLM^9HBZsvv>*$+0*yeEuPBo&kye=C&G&Jm)x|_btwsx~Q9+r<> zwMDp=)f8u67eam}TEqPMx>+PN9X$%Pc>8zsq6hR!5dJtYFkyY&P)tDJEZj3vYCxhN zTwU{YJ<&$!iMD&Igt2zjgmqPavbVRJy-S97%56+w52x2Kpt~6IFC2e3B%_wGT_rNKRSP z5z)p-t~x0`=w8}9pF-h;V=^a0cs|d`V`VXCZ{nmY?xWs+tw&?c1UUo)4@MRs)baG( zg0!H1=k#35NXeHUi&j#ZM6R3%Zk)WrvLN5AykkiPXmu_-cpD8=Dh)o2-@`TjL(&N@$U_MucgSMcm z^j#KPv7eS6GmX)9^;i2&(be$#csHxW#wwR}=(2Kua9rLZl1|T_#z=9y(pFn1ak-q6XaX$}WQp=d< zRmhN<|MhPx+RgmgR;EiVPaI2LChb(=ISySKgVMxYP9~kVW7gI;bF>ZNmRMK27wWA( zcSk~gKF)-s1@z>3G?xle%IXtSMN6|O`d!dRo$+q(Tl#1E<=g1xwRGUkrS^DE=1;uF^q?W<6Q0<`}yh5R?|^&_5vm*}k9>;J2?Z`U_p#Xp{i zH@iZ80&kZ#cSS5V-({R%M>e0VF8DTI$v*G9FRzR@U#H-W9xt0NKmKzD_f?mLeBK6r zim+^cepwqfW9P_3f%t?&cxCP07tMfs?Z8w>$-TKny!iwdcm*H$ho|>hG2oWx)9GXG z@(u0M|5Pa86%>%|1 zgtT;dZEbI*3F4@Jj)@lW{Ib+LH8zHnoSe+e%4!^(3)x?RJcP)66_k}Zg@hn&@-BGu z<6(dL^DywnaN||EcRKK6a`T`!SA4Da`SkL-m$Z8z(S?g=b1|h#riaau^>N!cFrnA$ zQs8YU=Jm?A-Tx^Bq8-hG7Qt$JPxw68yygjf?;gMZ*md$tc6xu|d5U@LaecmgyXNV6 zo`d?y8Zhk_fR?e|C35=^@*j^q36&+mw#?<0%;DEsQp%!ZYwbB{nT3J0q8N8wcqS}j z`6K||kQQVi#VdQ#D=Th-D>u6>PHzoW&%oVo7)B0)oG&!yUvSM^7;_FES+_1!T4ICj z7@!x_;HE*)UkF25_;>|W>P+g5Mpe48q`RXN`EemjCOL6LYhvG$#YpEA;RGjX{l4KH z3~Av}*Hp`F)=6$?c{Ej>&{SWTD|7zo@%Yu|7)jL~k`fTw91t2CkWwwI-4|fy_QS{Y zE+2X=pQx>+O;*={I_Ea$?Ce(SCG<>{p9gez%rKhFT$y~vmm*Xrr$lZH8L?FU-oxKs zfIpR(qfVBEBpk3z@5dl>uzWqC3j&efFDKkQDT5)5xaF(a;?k0?E~4Ka5KIo|*e#4M zyouu4)NZ%;KLXs9lbPA;iuL8{_3-)?Uq@e`sso=UchcF}jZoxMNizFB_73$MitT9sjD>t*3>FZG!1!_z! ze&@t4L&6C&9@cSB7Pck)odnh}dMBBD-29_+3uCBB$PKD>dF9OCp0YMB`q*}0{>Gh= zRi%m~m#CSpa(jiA`sk!;?3EB+^s2GmDLWaW&xLnD#XM1bF{3!<)GfA<%fuzz5mmp1 zx0*!>#DXfi5hOGG6ofcTl{Rj%^q*kaRmoujkZhWCuP41DFQotGS$LhEALiudUcEi5 zHy*=COS?3#T;|)pzH4?I%RBq3rk>qCU%leXQlsu=FSiHmd7|UEADa#Ez;)z6p(45eT8B8uLOWN;ki( z7X0l>wJTG5q~eZ{luwKb%bxK#-m#_1zj>wm5 zU8+D>Z?nF1dOW`{xoz&jtPy$zWdtc&oprZDcI`s06q9qDf(Aj+vTtJcm1ZvPDPD|! zU(zCEl|_Qw>Fg=+#aRgT>@mMZ`<-=vgAvCrQ4Y=#O1N1RkQVfX_zE%)_Vs;8hkyqR z{BOcsUgzLIvq?U!mAjaBrjFEqj+lEFn zl4gNx%)U|`pjw5aUX?;QYo~g2N8m;q%P$1if|M&4tpy>!v8c3VR4Q?7TI>{PscLF! zmVp3ZtH&x>;P{lhtf?v;ppTDNMH({{zc3rMVm4yYYRZwxmZ^|2iC0~twYs`mzXEh? z_A~)`axC-weOl&iy0E2{8X-J7DIJ&(SF|r(H!12J82fHb3~fky=doN*q*#$^S7HVc zQ;;;s#Ft3MH|vI1>qd7-hRfELiCdRV+Z1lv6e&BENS7DO*YwqD%@nGcX*1T#(qx2+ zO^8vH4NJw|-xHjkvdu3P)?pXeR!D3Z1SuHA>oI(O(PR@b-Tn|6qcaVK$Dw<{kYPRLpKw|M9D= z;3u|BnIEB<9O-_qAS}_cleQ$1syQtxY0j&vTi-fZ$lmLAiOEXBdN~6Ge|Y!zaUamF z%VZO?op3j==&4rXaPc5i&`*e~cqOyAlY+6&Cz=;H3t9hcYK`eFVSB*k|01cQ6w+0+ zD~f&kYq%q>z0%qpz4?R-IDbAv!D*Py9qD>U1>|_2d674eS8UN!AMo1kx&@{*MW){! zeCf?t-brr)zwI=KoJXsP)fw$iE;(Iaq}mI;CJ+Z??v%PyNAJqL?weT$`ZXg@k7 zV!GsynttxeJb4U}lKhGe^YW=5$$s?}+(f_SYE879gi&l89*a`{; zI>935L$6M5@y8&$R@cHrO8xlmN!Og}JLMR;p6k#WatdT-&C{kigls7O8GlKNNPT8V zJEUcGHQks}jN=dx9^BI*$Bri(eg($5XJnk6n%D<~pNVFaOGlKTJ<1O54o=s3p-T6k zg?b`Jcp`)WbkUf1Zk4Vf!GU>wF6YmgWZa_IjwVyo2uWZ6qdd$JfZvnY%i)K2lcMq{ zp80+l`u%1@z%!V+2BM&s)@$cd-~Fb0gKyt@W~iy#!nBgsMYPhC1eD!RW!4t@_=k$I zwtHx=4!6- zb&d)@tKzaSF1|M9M_tjbobHgj-DS?o7c6=n6(aiKG<$VNq&UQ5Q|a|x`d(dc90^lH zb7o;<*rq&V2$NwLme4VTAip@ZqAEpvL_D4Zo!8CE)s1KbdiJNVz`DP$Fd_J5*;{z! za8dbYnm_(5)+Il;2aSaAD$s{Bf>Xd%UHYNQJm)ZBbm#ANWI+olc;$D0(f=*@nz1fW-csesOo1Jv9q_>SopD^I!IgJ zqbMIA=l`QR$}BJ8o740qTk}v*n+3?}f)Ps3i&I+S)D{Emmf}@tvP!i0s{z#L+_uLzR&hByl{6?P{@vVx%{*1>s+l2Qk5u`EYyokBoTiDiC-UC17D3>~jb zDT0Uy?aL0|D8BK|)sQxy-*wB~%Ucym_Y=_wYtQiYxbfE29usxEFtz)eWfGk+h4&pr z)GoR#Nh!8$m-JVUU{=4uGLay2y4a0<>!GfJXxoSnMAGv{RlTr*d2V+#m90tx`D|?qmmG<@boU!~9#*7F z-h|^nS6#XzAV4(ixb@KMjIwfsTC&0Kq*{jwe~G$7NmPk8 zQ68Q0BaBLNbpN1uql9`0=E6E5G zNk2u3xkhUNQSBd_3X_$G4AWhjmsltEg5HV1x2Dhk{=ggG7m@UY0FU5yf{5MjHVRq} z`QvhVDzw)Mlw7ijMoE!~YOmVPzWtEfqyar~th75_AB{@N-8wbR(wfTiPCR%!Gi3^g zFqMDbzanW<^k7Lkn)nIk30TUfZhODneBI|ddK(b=kZF3@^ncg4hC9l>I=JipIOq)Q z>t%a2I&FIoaeBL0neK*j93pfEvk&$P^6s%JZy#)az7w`V0)b(^K=p64WoKve=1$%9 zg#6d{{i?d@M_^#S24&Pj*Vw}gTwaaC$D2s0@g+~duCXZxxPH|@ht!_A(j5r&(Q$QZ zI9MCBa&Ktb@2lW}oa>NYWzejlKyKR092Do2UVs4o5a+56z|utA3z;>K^vMWkA_ zV8cc9zgCGGmH+cj`T48I-=cbAe|!9k)@HtE-`<Ch{ zBp>&lpTWj}XCva&H~39IcQnW-D1hl>JG0am$t)0~?Ojp%q42u1SEUuXKO zBYybH6v|*~apmN4n!!iAVV7^U zHiuP4qa9R9GHb-l+Q&tf+Odx>n5EedR?o}L%#Y42F#Y49X9svRKoU?|TF~|NMJ^sh zTlvFR@C41Jd4sjN!j%Q%jXC;)ERqV`vTP0>;~*C~ZZ++QAUk$oM4a%34htfG1!-Ml zs$(ei67PSZ*e7vG&4q*^(lx*|$fVd%D&5h`(qmHP$RrFY4$clcoG9)Bu6MZ|H@VQM z5)t}Le!ai@`w4GC7a7!dZcs)0D?|8+D}e(;!QNOoL&u$Ni6oy)^iAb>&-k3Y)Ag2Xe&NwD&1&=y z3~k}km+NnGO|^4sS;`I{;*9wgGb&dZW&I>bj>Z(9i!{*}2HVFqp7iaWnMvSFwc8^+ z(o()=e36pwBZ}x%vDGoMo1>S*HqYb3(Vl0tA>|8oL!-gvqpzKv$CX|m??Oe_2z0FR zvb4K{=9p@u5Y2fMO8u+X?t`1%5JOv>R52u}*{3d&)?W=6Mgv`ExM!)%HcQu~wrEioLoFU@6OYWsx zscQJA_n*Y91^NVajZNo3gFwF?w04(`D1W)tU#Od|=a>zx4IGIHK&!XJvbOx=Q5B70 zj%geo$64r+S3Q@EKCM+*_etj;#7@K(!HKg!LAiPd{v>1Ds z5W^^lvF@;5%&=Pgs$MMroNXr%QWXtVoJm%k4OKYM*qq}Yk(BQyG0g}tvM*P$EmyJU z1c84vx89(%eG|856}M+n9MHE%U2ru|GWN|$I57Wn zKFjAUP~1BnOM(5K%hfgc9qc_>!@28WdJTt6xa;9^L4?e?#1^|@rhlFBlRlw&I7SUtRlJQau0+vhh$|LDYh0Dv6vm$v4X^P~pc!-#YVKUTMdq}X|-To5_ z(~XVQQdNtMY@orve>nMRa{t0`q);++%OSoSa=`hd+<7vnj#Pw$fk`z=7&5U| zJRBD4jrRq{om&&b48NaEpEq@H4G5eL@N`TXT@sOn!P<{d&Y}AMwTHcPyEid%t;dh6 zKSwlCZEuKczm9)KsN4+&Mv(CCz_ji>bwe$Jme`ysW*jDqZk5ahGpx7;L-=?@Xm}Gw z1%`rK@@dAuUTl52xFV_D65J?(T?!)f{4*u>FRY+0aYPe@nXpKiS7E8bWX9bXySp4c zR%ba=b&%PT&!Wk+s|CBdE=$5r+WLzuS9?53KaOe7RH9qVwlky1ictAfpb}G=f`IMc zhP9X=P)yiNYQ9`-9`yb33d;-QzpTsaHu|?O^5qn_$-&Z@9s?ddjk)mUYLZICXCWV+3BFb&=HR7FuA&i z!Y??oiGOsx!kKNOs)?dYe~`v|^2lE3AUM?&=-HGzT`}Bj7<5Q8c>$=tTW5{z-Z!2i zH|!&u|7c^+bU$lz8*J5ztV_W5ym#r^khW7)`l0xS*!F&ywe&S^mqq#koMRzHBLc#` zS<4!qIdMo@^hC^LZRpJ!dQrnP8u)4)eeQ}Ci?xp4a0wm)otpYW3;^!A*X*a7c+UV@ zlTyG%%~rtDwNLA{kLU8ns)@BP^z;-Su_OMe5^}Z@Hn9gZF(G)d<#(T{+BRFIbJhay zU{6Z7i#Oq{%mggCSKCrecEf4xKZ5a|IPCPj^64 zKQThSQSmqP<$wg2*DFdzbXL`T_r#9sn0b*lvGCHz*s?jIFu-pxELlC2MxB+`UDE2PUf!yV@%UIZj8p%5~yq; zra6~aq#m+dF}=g%mo4BY;g%4zx5)eHP4XMe53*G&=5y`M_v|IP10Oz51)_tE!++Pm zpzYxgN@>!p?j~4mGIi8AyDH3NN~QT5B;veMPT~>mR;?->vWv^iFH&8Y0;MW}ch>){ z<@JLneE(WiBu)l|x^()Xt+DiSIF`DmAWKzZ#Iw~HnX}#nI~eE0)d>0Z{3ihR@Vt=+7L&+SP;4#k`1YXKS~4n!MeHQ=HHQ>5&04#Kh$ z_muwO03W($n`+`CX2-K^;nv3i66$!FuD74N=)Du8=^}eibFk_M(;T`wV&_K2}vTcYh4Tdijgo}d--IB{|`POMeu<;G!j zf=yci@8rmi%7rzP?IG*?1KVrwM!NuLrzL=Ybxk?cMFP>|LDhXk!X;1$7If%JR{v4( zR@mYxsGodw@tjmduQ@sTX!-+q#sP+XJ_Bmw3qD#~y)e3iHdiq^6 zqtj>iC)$=_)o#?k`mTCrABPLAm-C_%;qfN1{!*K8DaoK=$)%*s`1&>H51miAeD&bk zO0Z)!QcZ1!?yY}bCJTp!cZBKO0;lt9sqwNTyC3|@miyrQ5+Au9P5du}F8WvaY za+Eq~kJj}nC_RJsGz|`HS2W2Ed&dXp@J9o^!bceWV3sJmK(p)QXF$Z9ph}ox}0L6T(66KB)s(ozIwhr@bnJx^jycqGQ8$ry}m=X zkRYPks;Vji6u31<9%5o*h!0R6q3h{|J7AqSXK=So!7AWfI{@~l$m>-8wp*=fOFKaT zU@CezQqI2LrjbLa^Y2X~(Ly6!)lC20AeUYXT%1%4#AB#Nt9Zd~jyy>U`7z%c$oO;d@h77xG5zqW4^PTL1R}4_U7vczcgs zom+azzWf+chFJ@kcFp``vNr#jTF38{eB+JPsJk<(Yc@+rIZFs}J$WikK9i+g#*N#? zjBEVnH5_h|(efZlQuDs7|61RAXXbd(H@_U#P>3zwjb+&V#r=OEaqrGa^&w<(=SVv( zVP2Bc`JGy?!erT_)o)Of(az8A+G1v9H#9LHsZ)VjT$@@{nOs<#T3DG{Sd&~V1aFTT zmz%-yXK{8mrly8mdgQB8A4Yb+wUv;VGu_An*)w@S_tY_CYMRI3|QcWKgohre#uZOab;2`$za8gAktwCCRN@o@97AlItL;= zktOstBJW-!%-BRqP>OL7Qeh?}MN39qkZ&2fHgpJ%D1b6bg)!4G5o_6@^s#F~@dOa2 zK_(~65-Fd6ICK$dWp}{M>}!g_2bcRJOEJB-+-tIQib1c!_I`}UMt4v>HM*@PCTjcR z-|iRhi=KN1GQ+^^qUvm%&0f*_WablOvfH}{+#j{wk{fZJe|w+N+}j^*e0=g3`++b+ z3ARiVQaTTzwc%KL@?^hUcW>7M4(HZ--uQl87?zi8A<84qb$xyy$H$}dAzU<(UtuGV zVW7YwgrV^Y$GZObA;I+$;sAE$^;>iyj*__Y5`_FdNYLQ>On#o9lQQGkmyP?w*LlK! z_Cy@A?sR>Y!bFL)Dm_xpPN_vRv8pfqh`^iim$Tp8QJsM$!w(F4Ys?n>HeFWRj%Ar2 zn@53IG{yK^-znMn9#)R1M<#a*E_ITp(xy$msg1xp5IQ=DA7%`TC^VrG-(rr@H`uHq zWqZZvg_d#7AGG7k6?vh?+9mHj$1QhSr?%)E64aoVr?@c3(y0syR@2}Lh#xzcp8MJr zT5$^H?!cpphQrzLFZxFTj<+$C5LH;D?*-LGyL8ME8EVa=t>d&LbDfDvTS$ADXtf9T zYf$b)#om8~fB2kzodYx)Z%Nwj^Ee#`26uuk&DZiidwTHK0t^BlrQPwRDKRMtorx3Z z5F@D0p8dVL91R?W9$LJ$a;XT;bB}=MHV*DK)wqy8sN$TadKr0cxTYopSN}TGrK&Nt zs6n%+MZ2&`yVzBuEKXmaTS^}n0zF??B7F$>Ab;rj@)7A1^6SfX>@KRs2DCioxV+*d zbCW|5vd^%(P;R3DYokbbyQuN&qRmjzbFG$utijAHr2*J9HzQ=C`}k8*9FH?xpst|i z1Hjnq~G<`bubzM|)|r5n1Ck*%l$_Mh8Iy)&p`C!)s*F*GP_>q;uSlZZs2_jk0$ zXvD^b%*F&lH9&~AHpc~(?Qv;oRxtf|dq|k;>l{8lIP`mJ5|mJsiT_1O1ZyygQzw1J zh{lYzKnPXi=eLL)%$31?r|%5cBUhvN|6PFNvj8dO>8~OF{wQut$4OC`h_iK@tFyrc z;y(>)O@P4Q_I63FH0}w7NzP@SP_e}@v02G-4N;JRLV}nCNKB&KAk=_Tj0JO!CVj3{ zr3gbl5z>i)^%4QxRJIk;vnnywt#FdMG`Y`~ceomCDr%F?-lPMm?kJiI>?-Qgo|?Ex zNt6;au+8avb80!#>etv=(fR*$lH|p`$xvIo=Xr4cQCE~GuE^LcBiBHaB1osYO~-ST zY87%WI}-q0SRA*A49%^*Lar=+zPCd!9<;9Ht($rRkvISF_c+39ZBtUU$T8;Q+)|6A zYn4Xk9jk_0A7qfKn-h9A@VI`LNu{(2nCdx4_|%JCkAnuZE;Rs8Rh<-?jsn8RIHNyI zum(P;TmMnUZ()_yFeqfJx1p8kuAdK_5L@$Dn$vZJvtF1})k|9XGCW3amO8a(QW!G% zcUW01y|PI+>ri@d1t5=a@P$u`rO3Na)ZXvLo;HM`*Z?$+0F%IxV3a9VwOQt}=9c7g zRJq?n*v*f2Hm9oUbeV-M_K5oxi61Uh&{T|j(W)uYqSaDN$>LNfW4HuX);fkc=C*Db zsn@1lbHxfCOqg0498{-fa+KB;m58@ZP|U^t)%5zA=~`?Xc>|$aP`A(hSrVk#?$3yVi~ly3egcnSThb;<=ggRg5(17>-%b&3<>Tib!#a z7tc>D85vAe9={$&No0ot@2|jI7;Yb(be0G|x`v9l28DRCZ2292X)*K`c`_$5bAiA9nH;(#Yi6JNw<9a0MRz!Y5kvlhQf;mLRhJO^R!*zN zrz`Kj(^Cq-gF15-iNe&RDR*V0S1h%l{NR$5Of4z~h$(VK7z*?mn>>^#1nqqO$lJWW z{WonA*H@g4 zzG|{=IpWA|%6{6Q8(Ym+vs@!(;DP+wNrv_y=q02NDc7^c))WjQ=4$aIYVi>y{AA8H(>wERLXFn0dtQGN z-?y3O7F|S0t?}{+K%ZelE{TKiWCE44>-?NREw}g_FnL#AD{qU}Ih(4R;8W&)#m#yqt8UU4BWce^%DR zUBw>KHcsiROEgY#%HI(Nd}TEXr2+8V{qEO`=bSI=fj~P8PL1(Hj?7X$VdWOCrf<3B zdW|wIZi#lsazx8=>6J;<7K?npEt+h1wXV)4+V1^AUF>-|9Z8u9b0+N1Cu|)i?5ZKp zr2-sBAj6!=6M}4RHr~>5PqBys>!8^Kis-Be20L;(kV|O!H*6e`qRK3Xg7+)u7_7Ml z62!GNR&671gO>$_lEaeQ&j1GUIO|%TN zEOnL=ZxS_5JT}r0Vi-0FjQLrF8B8%l|Mj7S8aW2v%P;2>`A{rlN}ngqhhp+yg3qvd zy`SS}=cUWHL%g#7GW5SJ%m*TT=R$nvV&=NzCfma%+n+IqYw#n+BL-R^NN0C?Z{rxQ zIW4zY>sag-0qj2Pnp}F1KbAu|E{Q+{C02ds8H>KH@pgi-c7oQg0S3e8p#kZ#xe=oi zmmHZv1I4S&?gGCb*=oUN2B4`n$6US;==)i=v|}lNb@sIa62v=c`!dn_Un%u0r$n=L zj?FaJ%mv?0t~?2&hG2T7mvUqOD;DmwWef?!A%}SaJ_p>%O*^wog@K%SG-tg)pj8Oz zn3YT<9Re~fLUj4Htdxr^ZuLWpSx%*u6>W@lj5Y!1risTp)a?b`+wteM^nYDX&d4sC z?h^ixKF(13pC@wPA4C3^CL5KFvif6EIlVfSdAGRWRVJK;je`0UT0Ujg#QP@)vW;iT z+ZwUf(CKAIawTF=zf1oPL(;6STBB|}&h7DZ<}s%tqcId1!iPc(bbj!QJqm8UcN@Q; z{@3#w5je5kzIlivMm~oB+-*ETa!dXJLNUp<&=wp{+ak0l7597P`P9#=yJV+5J;?68 z*SFq!fOss)Fpquo2@}=8L6jrg+Y}=sBZEckSWz&Q8qxEn(aFi!Nrf23{CwN2A8*r8 zPnVDdIaykCS=xk1x_B8F}H}e*Lq-#AMd7J-%K5uyfdDerf zblwUf3C+I#IUlbs!Qdr+$IV!?Ym~(@r;`l2)CL9YSzW9o-JK*t$|T$1M%yoqwhuJP zPt@3F(NZgzvGv~wOpDDkT3VqN_28Xb@67El6p7p7)~f-K>p7BGDv(&ph%XZjDl-cD zZ8Y_xJ7?dAP(G8HXH3^ot$wz|qFuJ{M+k{#2#J697k@+ka32~7hJ9$t!j&fC3^Ry3 zbsSEHSJz^STgbIvzd}BaYUJ=0%=j(rxCS~h>;Fxd+>(9*qks89`nI$Tv-q|j@oi># zp+E904!?{}c_)p9x#8G4XD59Q#DaOwSLd?jrXErAHzZtNc$ibY^ZlQ>BC3eH@D+a$ zC}SXoMUj?9l9OXaN*l$=#ShCstfb`PbBR+)__!U-34gvS!#GY4tj^_#t=&>3PiNOU z#VZQKwrzUiG>W|Qe+Y@Zek{4Rirl(d|K~Y9y}|eWZT0Z#qVaTn==9pJ&ZTp=ujv*# z7Cc$wHbn@ki<9=~aON}Q&1K0!vmS11F=@$a(3{j@rq$Ap%b1i>pdBEr_D5Yl;W~07 zy5mRn$wdk=iW{vMvST-Cs@ZYYap8BUuHoZDAi+S1h#V}E*m0q3fGPA!a;B8!%A`yS z(rfVA$?<>n5nkktl|l@IrdD%Fs^lG&h}EE!;@YwX+YYdaOuE&j3?O8a%#2iPRCG10xf*?Qduxbv zNY0$c;B2;sHg`mRwA%e9-`pFGo4(x|v-WbnM;7dI&5ZD@n_FjqEb}*!FAoIPOY`C> z>4WH`sgv2o`ur&qx1>GRdNzWxf_xMI>W-X0JOF5u5sUkN4w#Mr0qi_H<4;cn*x1<2 zER#*$O;XgY(!2-T-K=5HTjTHq%mb0Q&ylI^GW_`}TAzS~n85h18&CS*J@U4S!m~<< zQrSV@Cn7{T!fhR5KcehThCuXA9TJka?si~u74So3*5b%~vv5h*HUL&rn;w#j-CP%% z*lq>s*^aU+3VfSW;-?@}E3&yVFB#ok%e)l-_@XS&3Sf_1_6}Ke;Rx4wU9#~z0~wxi zLB+=$*Lba(&b@9)cRTZm#9e$E)zL&*&n|~0YJOSA{q1~`XH1xRG5Ael28O#@wRpQwnZTDvKsQHDJEpa!$;BeOPHIQ zHLzWK?V&mo`wq0ly;H@3=h&BJv7&HhWJr1g6G*4wrnsTwTVSheT@>QU?jF#%7WL*A z<>p)OboMNLG36g9(>M~e&%!EzVHGu!Hs_W{B>P7>5a1r2ryiYa9-S}z55QEL8cUm+ z{UhN1(V3;~>0%bUqXW%RH3VTt-@*u(Ay8(|Ap|K;>$cX31gy9Ddrh@X^7Al0lQoqO z*Ib~vuDTA_ywKh<@ysor@1Wx0*ER`y=9aG5S1TBr->-ZVY#bp$xaGyz!#w*-HJ>M6 z@GbqjK3Pz!UvU2yG#KS;#M|qr{GDX{ZB?8`3jeX+&7piQxFP*^77m)t&6=uAz!J4p zsZs-pQVj)JY508yQVl?h%EG_zisGa-q>6t9hVIba*tupCiu6SzDndL=1-?Wf6l%zI z%E-9-5>K9g$pVKqH%DR0rOGER)nv;JWXh|d+e=WR3UDD=b!w*Y>qvavax}SE zh`DA^WAPq14wLj*Cy5K%R8=g}S}MV3qQZs=F-PM}*7a>!eK$mKO!mihzeRO*!wcGe zw(gX3;T@{!-(~zRlGeZ#Df+#~u9@0Czlf_cry~(kk(E|UtM>x7A;qG|J1Mg_jfEtA z%u6wO%;DAUe_I@0^U8O?%typFimd1C9oZ-%|180u-XgkCqO$Ab+S$Q78Mm*rt);8l zLtMcP<3gm4MVT-sXlN8}og8jUpX3wi>|i5P|3#XOewmh#+x-nFK&v1iUp;~XB+YCH z!-HT&?$`y=fB7LFd4^}SwnD5m`>>5Id3vH)FGjjMr5tTpE;rs$Tn|`swh4zPNF&P_ z37Z~F<5n9a)-!_n57xTxD)b2EV`hA;oTVq*!~k55Li!E=y*D8X);JV5%ZeJ+i{Mth&YOjkIb6*Y=Vb$b1(wEbq68kHI4eaDEJOUb_L?+*h4TrV@DM1nCiQrYMo zOf@J>6zKaqOQe^$|46uULQP`%ju%(pa_dCc{kz92Jn@eG{fOym=$U!a)wlLXNCTVC zhK{_caFlMR;_FETm4)rTS5-dx+gypqu#ER`Jxl7@<`He+$1yy8Snzf-oAuRBcG6-C^=wk^KZ+-G%WSgNXlBfhW`PQ>ni zo?E|M-Wi3=v5)TTD1C`ZUeBqQ4x+#jk#%D-)vf+t96#F+CfeME|9JJS;^74a0YgZPI#pjY@?Amu&`)yt8P-VqWP1MoI$9{-7S-R!@6t-Q0hH5r(-8s zl__Si4_4t%ljeAZxHuFj|p2$j9#I^NcW{M#`w9C=~r+d40t! zaC+pTHX=9I0RUKXspYHJnar5rpI^0X_QBPAM~eCF9b3hpa|(#HLUna5uD~B*ucXyA zB7Vb0!{(pXq{%r7gbXiYRHvJ`$;pin&Y9_ro&F6*3NUO?(+iuk?YekL%)B zdOL@8ylPjp`(|cAdbMuXuvGz`3U9Cc8);pf^te9yb&e!`0j4%cKv)@HVe@G0YMZzVj>^R4 z+?9t5$G?lMt)As8E7KB`YjMu8+ooRVXZRi3q!DdJpFX9+m|J83P}GE*(CUWL2-Mka z)nX59{iv@@oK~;;8!MhRU4E|jY&P6zSR~ad6ZbaX{J&|F!#0aLjedz-gG8oHlH4{z zvL4UIl`rtQsEr3gY?IYD{U1$d8PsOmZQ+)-I28Bd?(XjH?rz21DaG9-IKj1Ou;Rtt zB}j3Ky9GIUznL?$ha}Gs{$S6#_gdFF8*p;B;MAWvsr zz6dhfQT>t^Rg&SUZTvWda|>sQtrX<}{MKEKy+v zn203k@x+*jrSMXy2r`NA(&~?&Tm`$)pxxrUOJ4OWJX7YL4rboIt{s7GOAjv2=S>aY zOdSWN*CJS&$|m)eJHD3t<3eY-dmLe1y@^UHQz?c(YfgU2URV zZ2^MO51X|Q1J9qN6@#Ra!EyL`iaC>tCyR=e5m|b)5-mQTLXV-nu8fT1d^MHhtFxTj zdgwcVIRu$&{AylG5V`EGzT+n6Yqh`bCnZmQ`OVj@dr{V==A+^15;h=aOD zQzp~Jtq@<83GcV*ckCYz-5?473$8GU2iub_rQ#iexn!cS0TuXfb>&KmccizLGd*&t)m?ezS0EQd`q2A1Ml0xd+$#@@6X77ulof7kj?z&*EwBuEBto-Y#JH_%AegwHFa=T+dp z=lQ{Q*RQ(0XEIQT*2Rs$mhh+6^4>$*Pn!wYNHzs5^Z;twynYq}8yVhyKL}bvM$oOJ zkfK7z)4{KI>LlXy--kC1B*^t7$c1zED-RGpK4I#=Tf-&uyY;JA7m(H4Q`6>}oqF&S z&z5p<{zbr{z~jR`v;iI3iE^{)Ph#52*8t9oi&rAe9H0GnOLR)YD#8(|X4Cu60|OZr zke4@j@nF%kO3Tb_?duEh5lmPfUTcpalKbv|u| z%fZ)YTkk6tLG!84{|H(S3*O=9IXn^F_HX`R--KZ|h3#{MmCO^#mh&bl?%=BY#Z{?i zz_TiM%*q3qfxr=~4us}Sj!E%LAGx7QvgOvy?%&|LUpBEKlMr4`=e*tMoY18(#ocPKA zus|SOyL{JNMNFHQh?)qs2Uclo!ngjpEd1mFa&>XG{cw>7X#RJ)yR~KGycLX75d5_u z_+nAGr=V*>_?I*8blrdBJk%z%aewN!dgZq=s;Q7?{oMw_2z4mhtgfsDFrDNOLZRom z-~aI%Dibl&c$M!mYFB@$Ui>-eX1`u%&Yd%D&PgzB&Wgv1hYT40=a@SBWA(+pMZdP@ zKSFco=TNboLop3O3!!22FblQ*h9ms8_#U%$>eSK1FPG(87MwU#M2Q$N;n5^Ra+DTf zKZ9U81=@7t8RJkmR;x`rbmVO;=u*arBul?$VQDq+Gh3sTKtH0649_)zg%Olz{P8HMhz8j zBu~6v)J+=M@6Xc?S+enUdo?0JbhoAV6W8dopeNZVIy%>qKR1z4Rr^s7{BiA{>FaZK zWB5Mt1+lU2^5~xGns~Fn#$<;Td#JTXf)j_F2o)nbj89OI5+@cjTGAvGM8ZY?bo-Jg z4xWGi8uTt~-GpB26y1V?)CnPc{OaZ6%&+=A1CKCx=&uV)DhGvbo_+wFGUzuy4wn(_ zv%DSFda0OC&T~SJCZ}Oh$vu5yzA>f1Awk!tygwSQ3Hc<+f-x9MegLE6BH%gdAlJnl zX`8avxB$Sgtn7?H33rqU!WhowOm;Rdv3{4;_{>sB z&XwNh1W@rA$dgffj|v8-*qqg@zmk z|9Nid=HP(9sTC>FCMWbqfi2^Pb54}Z^adk_|1RWdJ05&9^Lm>t;;bQKZq`4Gwr!gw z%PCKZK|vIafhdC@^|QuVzrH<#ZB1rIKi#&*(e@O@_FKBG(SF6Z@;uOB1(8&R!-=eV>>$y&r3OQEO^HhW?wdA>+6uaB$W+X`fbT5upxGNRziurSnDgaM$$F6ou()oj@1BRS$VHv` zi@n7oy#0xxX2MvE!xw*dMQaJxsfi&_TvSt1R8v+}Q&QGYQP)shQe9b6T};tfPSaRU z)>uqb4LVaHzmW@?ky~pB(wpRjXsH+ z#9xf$5!B`2$i*1?6L7-5)yfXSSek$AU!wlZ6c3+Gh{nB0;ZRdt42l6&A+E*5+D(qi zBpF1t6(ajeVdrt(c`R~~I@=Z&m&H6clG~3XRaVg!0?88_V+`dP+~_JNic30vjFquh zfvaqjxMx;26y1Xv90$bz?8@`gJmcjRNY*ay&hWWT{n{pWZ{lbi>>DBOoBc#S?@G?W z27+zXBXKi3TAo{6k#pC=oIE?@i~`fz)oi=EvV}`&jp+O9;xAZ`7+F}1O-|*;PTC3N z+&JCGL;kEI{5)qpIq;0*|HfS&Qu_%P%tk|qz;F`Dy_7(-f?-V*NpKpi*Sv||e1cg+ zk`^E-hp)2K?i6GKVVB8O{DCXt#HMG+r{pjEF%$Tl++#_>hMIpZgh~ ztfLv;q~!XE+P6n7$YV!V@f+J4_^K>VvD7_WvIM-or2LAdkP#wmdYE|# zMBnWNx6wGGFJUJwWV$#o?myYnu`q@c>5(Kiu2b2!%Q$qUNEF23LOxNpK3@@7^5XpA z%}77Z8b;?jRMT?H%&sz&+`$>5rgr58T|!dYxI-Cvd6K7C=GJcFM!#S}z-lRA$e&v2 zO?PJ3n$#pi#;4EgZ|;-Z|Bih`#{f!mPf2MvWHbrGzw1Tz+Rr{t*FN}|bxHKQXonHse`kbcb01#3h#1!8@FQH67-43N*+OtHnvv|Vx&^+M#+%b++WTU zm+adW5B>=TdgRztyv&G(3L4dEWDZCTQl#9VoS-7(UmIr|q#ozYjg4!z1ce?>O}jU~Nu`|dM76nHf(cxX;Id4N&FyC=;>P+{fYCNL($v}x9`W{- z=uqA;L8&~aa*Iz4{VZqtjvjr9ds^&aMUpkL&MM=g^M_RpU5Kmcy@yGj+qT22nMSp4 zp)#LJEjfz)_x;#~vCO$-CL3awp5)tZf+zNtMk)Kfam~@p3Uy`;`h1`v=TMmSH|IyH zoKCi-r7j;Kh=cRlPW>-4R{fb{CR-G*1y~vdegPyu4tIW`RC^{12KymRercUJL4%oD zf!fmV@+yaEAxqs>@@vwxb|mG7f)Zlmc!RZ=dyAge^)-NgezKN+V#`mMij4o*c)4Bt zUr)oKvJqit6ia4UMo@%rXOD8!m0p@2oeU=)9f1TRfv9vCUnVh1G7(+|HCi$eK_&q{ zTqBI)UBus+VBy$&%g&f(*;@btb4bJsHRt>o=#KgJQM_}7@03&&qneWP`XRtt-R zO;g~R7xliJm9={QxrdcurF^Fi{d}F?&ataNgMjihZ*}L6YiZtSq>V6qTkihz+LdRD z7qeE6A8r@MPN2!v{_G8ei~Iy zvq^jkXxKWtJKMdHzJmLD6`6P$X?_KZ3QZY}Jrg6HqvY0c;j9zVoDecHJ9d9C#9b%( z0L~OU``4}0tRpb*b>f&d|1;4MKU`00kNQ|gOgqn!`CKzrF4)6gv;uZv^wl(>E z4Paa30&$x+tPTLrEP&axe$#p?KV&f_Qo>{?r7nLmh_5>V6<9@G-;O4pKXqd~i@ zebP+dTRyc>3bpyKsg2JA77vSa6oLM?)Tv7tx!^NiZj!4|5s1Zy{P#72lugN!Pj>KN zOuE#K!Yeg`evrQpkom*gYw)AU<0eTk4eaXMuJ_~lL-#;1B*%pMXrO=Jmb z$Gg@n3DFSmj(DTdy;^tYsKW%^> zBJ%L?Ai(`>J5yc=e6^L92DIwU8YtdY!P%W0{dImjaQ*gLItX{o5r-lxGr>>r(b7Hek?9*!#`mNMm?4LxMzzS!%5~|w6 zS2as!d%PT`xSg+=7CZau*vJ%xAc(2q@OE zs$CK}?f5kR@n+chFcah&E z{A;!a@}4^4C&61E-z__<>+zP+UrlBvAlKGb5Y%YO|FMzA)XO>Ztjh?b3~KdiU0vTa zclT$2b@5hd8aS9*f^+e5&%3KdSyCC2t#uyCs3tr#J$oi#IH_j*Rhw&NX9Xx-)LkD} zXw%7X{l&O#tk>UiI@E9!w@*~x!gt!hdp0pWZPB9NpkE8^6@u>Xf*a!o9YChs!v{YK zrvJUQx3^;+5q|1LjSNjs#}*`>#<%o)($C{5RB0V3n!&G!2G~w7E->SzP1?QsRHIBU z_nyN;Ka-o?{}lcSArntVGrr*NB>c{MsAvn7Uc1bXP;+}QTeEZcK=#V@^ibG!WtE{d8 z7N8!cs3l=!A?&&15S9XmrL##|{m67Z#;mRz6bg(1TjKsn1-M6^Z*t#%E%pig_!9C# zz@M;LBqh}(MOIBpFdaw;e=IE1b&bJwO_;{BSysWHFtPJ6Lf0v7ziHDBxQ1P|!d3OM znJt6gX&Y^#zI?nz@;n1y|eoSxGSPf69Lzg+ILDv&1ilySTZ^e$d zwPQS0jt=jvP8D-#c2#b7HeOitkNS(2Gr3(yq-1)+Z$8|~HpH9UY&9d?f#Sfnb!Mo$ z%vc5f!Wiws_(Q>PD*yaR9um*&V0N*YX410+{{$p|iPq zpT-p__nkX+$)T) z-`3{5h^wrS4LX#?Y?MWdG{8J%NgmJGt4f17rNN@S7z@eZRI&k-=d!vv9?$fU=(yr$WoRPCWx4PRw7FUw=`O6qJ1EsY&|rJE{M+*3vL z3y7R(*qg7|8}pkev?hYg4&@ApmIk^$-&=%)NtE4Eaq!v_T>pO_dwD`ENVeIKYFKA~#dGq2{cIf-< z?eKFX>QAh2Wc}N_P22I5}Q{x$#tvZ&KYe~z$aHTjI6%`xBc+QTztRa8Oa7yE+Gj|jUy(c~p;?R94 z%Q8H-ns|+>TqK6ZBkLVh%x?H?j~sTq{Fv$Z(n}6`QnX4)t5ubq%qaRB5jzOveHT=F ze^kZHDzoK5U+0|QAFCB5EzGDINT>eJ2bD>uHM;3*?IYhI{qxsU3XX-@?WJYVz|@6H zvn3#5rS9l+xUo9W-?Xf|o1Xx6MYr#=KTm<)l`P0Ss^c@2B_!rC;jzGkV+^8-- zbVxOm-~-C_0>_`LI@kh*$-2NOp<(!-2inRaX6i^?Q%CJDSB)Z%S=H8T}xaXpv7AOFefT{;|cRZ!$18|m*)h}OZg0$Igk?YbN^>PjZ{i> z-yGR_L1wPTU;h0i(hjydh+zH^jl;qyi^dN?5cJ1Zg+qIu7xE@V-Yw+Cy|l8aYhz)N z-m++wk%8mN$e-0Z$?nWy!5YV5K{RYjWD#JFH=g^k92{ZiMR2zA!2&ZB@0LQh42~@h z#I|lIVRI*;Ddla)EGr7YO%%L$oEJ|c(DW5vHpCi zY}UqQU0CR~R6(NlPz+-^tZhWoIUTtbr-d z;yY~Qy(a26Z$87QLsPZ{iNieip);s(&=F>Vnoerv1RJ)tZOIZo9WwRD(uLu&ueRd2 z*pA2JwI%{|k8Q;P{ps|n8Wdb5ZSyHBsF($Cb2 zw{bcDmH>9&@{9C@LYw`wQ-*@B!-On#gveV;0LWqtU;0t2EWb6Q9%p5FH#8Ft1>b%_ zEqF&F?s>;f5P27dODu5n@tEif3bW-@=Xyd}YaCqhRi!a)A-Bl_j= z((4{pIT^B!%+tH(X7QP%G+xZd5L4 zgfPyvv#)o8Z`aE@&uo{PBEoSY!U#5A*bn(5zs-xs^!coXUfCA=@W?48K_JWPz~b$9 zXAb)p&f*Ln)g0l;q-`b638~ecwD-ysay7cucLE6mXyr51T*Q za?107=}0WdHeMD@Zyi-NA&JGd>(yiT)3zzYHkDc%w~ENdgl(`WAjSfaP$8=%D>x)Q zz{+g*_1=qW?ZBa?jGPlQ`qq9I;FZ=;KOb$;6if1=hpa3FY2m^O9hHS6R-Mllt=uEf zQu3zL+3X{P{t&(I(*zHEeLEE?Dj+27y2Pk#&uo9VgpmW_+S*rbzrUXJ!2W%B@7%I3 z?#?OHoouj7D~9C?eu@kZfaNV#;_sidc*&U#zMGJIy)t=83U2QXhCQDenCpRzZgswNuFvf3U@|~OU)MOAa-gy z|BvfV&W;Uds}|#(!zE&gHqME*y!~T8W0OP3q$6cm4JH%;amaQuPiMieU^d&g@?iO( zAmMM{zCqO(l*K3^FV7CeoOpP8s%dFS>FD6*<>hH=YpWY+NXXdG004lJvNE^Bsc-V~ z^0p2Rf3{szH8sNq&CQ_pRVZz)L#&mUNcb3w8E(dJ zWQ_O;QvBkQ{NkG2(25h0yc>V+;rjq%PU~R0p<2yx_b0sR68(e{f&>HVt5(~qX8Y(k z13qXbqR8d(QxsOhpASO{CoDhKp*OJ&nZ4)3mg{dd(?Ye1!Z}5pR#6_|C1JvVVgcPof(9qN2i7yl9&9tSam`g}YyFY33^5gSBchtw1GYI> zEsY7F>i~WEMrhZQ=-}(;KT>?~HzX;pH2KY7*EDOZl=r{Fe9*P5i0ro69FtQwM9-=F z#!h{gStBi5RL_t7tFsZ+)0{!c)^AC#eouLIOxkJLGG49_pg#iEW~apFMvmZb&-7D) z<;pSnQhJW?nl_}p^$uC%9jZAeC*t(!1LUnapkW>-oVS%|$WOsVF7tETZwyuRWtj3WZ>QHNmK^wPM<5u|h&p%9>=civu0SFZv zWrv;Ko>+Y&Nv!tq!r=l+~L@`v=u&>MK1&`*9K`zgQ*5V;kk_rX|d<3>fWhwKyTWb?zlz>S>C`C z=biP;Op0jxBgXy?(gH0sBN%{Uc7qZ_ut`yUtTcwjlXPD)KlAoMY?mn}+;vaKn5Ov1 zF^2w^>MWX!*r0#&orvUIc9d#R>Uoj*9@AI5B6jWB`;40 z57zvIf}r&U#))u=-h?Km4}aP`8@jvu@`oi@vG^hHcd>Y_EILL#=3r^^FbXm#qAw&V zQ9PlFQ&gP`1LE1tW&M#_1xz5Iu;)Ato#bB%xR`BX+Ur2U=@4g z6ngKmosC$JuA3;PILqedFho}4US<5QSpbDWy6WzX!e8w>TS0&=F#-HD$zBoy7r8e5bQZ9OM zrWM=L$}rXe#mGv^Dnnv$(D#|*vFJ`lzSode*M*%PlgHRA(0;EdG}KqH%86^_#xG@x zPix^+pQSFVGE%gvjzZKD+P~Hx!@kpGD230#THxZDommj?s!I2>Lh?k!ZgHb(VgItI z&bMezhi%S=9UrgB$*s=hR3c3;U6C|1Ln*Vq7S>$+<*8UZyF=gZ%wB4-OtLPG6l0kT zs@=79@f94Y($it+#}#N<7|MV(S!0bDV+t{7So>-zsSel|a0r5$sbYdvylQ9e#iT3tGhpN;|E)>(fLZ^GiQzGlHcJ7bh5C)Qp(HO(W{ za!MV_#$Jdh*Xqp&#;4u**1vZ>Cg_hq+#Ddbkp*iJ>1on~zpT4CMiqIrx`OkJ(wP;G zsqS~i{C43jSeo>s^jN9cT1whZR7O?&M7!(<(u7&Z)mHWGaTyVU5&Xw&@!s>xbmDZ( zrAAsx?-b~tj6CD+x!L&`r8e|Ne^f>NJ9oqJXlZLMUGcv#JL!mMf{>5D;?{fpjxODG zwC>zxy(?i~O;7A-NvkU(ShGr>xYdFNGfX`jF?uA%uB72U>R@)FQcb_65;>jlt+O}w z@JX1;MNV`5d0RtMxsTvoJ3dg@mdn3LxL(=l?+f^{eMN~{?sPff6JL1mewxrdS$9sK zvm4ELqOONGYH7w>VCDG5V4myq!B{kJ46i=@Umw0i2_1sIC-A9~iItImh|-29x2Nl= za>?b2@knr!-hd7_gU{*6kh9|6Nb*o>xCiPfzQc(It5Aos%zinoN?_KZ5qS!+P576S=2s#=(S)nv#uis=bFQ>`NTk?kf z%Yq6YK_hV%U!74_y1n%^YFLD^!PHH}_2Pkq;^rT^sQ(i#Ss@O#a#x*ab8S0+7I zmQ`04u%13>+si=DW2(`XXS;c--jr**5uoR#tLrtf4Vr2&1@sAX46ZN0|EG6`Islp? z=FQ~@H@CD!8%n4!#`oMjD~2Xkfq~(R=~V0E%tT0DHTQfq33|vw(U`klaSg6q2YfNkz!{WbUPbmTzw~q14l#E)#FLL zK`5kz{z=N^q<*+6#e~zz(e@Tcy4(hDX_}SS(b9Bmq_-scO^&0>g8F&r@Q9?9>}(;~ zsAxy5A?!59TK?GI&UT5Ft#zvL;YZ8gkDJAZlKFwrBdHHpB*JDaSX2Qn6K_`<8{+)BZG#jEV@{T`Q4KD@ubnPC11 z1GGf8;M>EsKkvroRoLn(Qqy7V&eg>(3ejKaTwVP45{0P#Ft%|Qp{e1_#&f{kx|rYS z#OB61uP$EaZ>_)819k;u{6lLG?d7Z8-}{0NR|pgbR1W7P!cX$4jmwGMbj`H4xo>8I z`WS#B9cO?{2vVs^3G^Tg^q71+0{I+q|6;WT0of8c*k=ceojz_1wBqIa=Ahr$;O9Oe z2S%tAad%CwtaFuFUzoC$H<&V-djccAwIB!Uz-^a(Ot93?m#5~-IN`Nbhvq|b7syUl zb*AcnaiVJ-uR3S{E!0zhR^G|Z!$atqATh4MYr1=EKOhFv_K?_5b0&lM;x@{Si7HA( zuY)FDlL#+zK*-f+#X5T&ZxSNv$+_(+t z0;Vx}(;od-L}qu9LyS?tg&WT<%ya?Chs!RJ$A_A+XT4t+eJlijWr5qOB?qmU{U83@ z9{CQoeRJ73#owKiKQ&2!~_Fusi3~{boR-N#*S5)Y#HGUS^Yt@XC2|a^mwK$f)m# z{1urUNG$El$?BA4?V~uJ7)%7o*$RFSJU%%|mZe-+Ue+)%QThIzVRd!283am6O$`+# zEd+rwA|hbz?ajIC6se1=s$vXUouJ|bEn3pj#>V~M992X_#HC*sRPR8qW)&0+o3a)z z+Rxf@>MB~VyL)L*a!=$*998X2XtmTY%?uR06ujep5P81o>8H^e?ybH4yx#4w9t7X~ zY6UezvcTnTGO)Y{K$mTMJd6fC9xf21k6RkM+LaU)cvOW%RE2nhEF^s_!RVX$b^eqR zK9mxt(Qwm^RK%uAbJJCA%M=)M|L+C3805TfWIQ(0TNseHxIof#Ieq&~MWS|5&ROH{g&qiXa)>#?M@UXd61(2TxHYqomyT?ss&yCmMD ziuul#H!J});l%r&8pq^LY$R|)ZzhQqS_D)7`A{#qQqH@quqX8B#kRWVTBOF(bOr&p z(Y86p8Ltrwg}yW;yZdgp_0T|d2t_&gFl0;SAh#mD9dywv~Zxab$n`5 z<_FjvV)C)o;GOsH{lMR|lfpA!ie>v2^Hwl4!PtA|)zsM7zqEuST##tW>Z2|9TE+HQ zh5yPQ1-X9v+N+i2!l_6~U^aZnm-F%D>*@CD#veN_j=5#I97V}MJ7G^MK3N8&$}y#4 z@)Kep5ZRInaJ!T~qh%!PIAj!q>8zfbF7N2X|K;I4B{d+k{}wLo(5krNmvu!`ICpf? zZP>|rz@bKop+D4a*jmXlQbNuV{&UX&ULBK8MFmJs0cgCXL_8l#_I{vlM_3;14&>s7 z+#gWMpKp|r3njmVF<5Q{B;KAlyI!mrETkX&tyi3RuZXU?hCz-%;O5qW{~Q42`v4)4 zVd84yMS;NCQ1`==MF_+S%3KWe_D+0y(rfMzi)b-It^lhg-m_W&%&h_eq9Zc5q~ffn zHp5L*YZ;g){hvQkupd(b(hx8!FsR7XtyRHU@~&1egV>{*h)wtf$GcZItkc~-KX~f< zj&ykj_y1v~(`e|Y%X(c&Au_P2(shXG4JaX2)umFkNxC`;0uSJ#vga$XXh`k5BP;fa zQ6}X$LDU*s0g?LqN?}zw3p^VopntH7*C%_+T{6;7&|6z0VA(%rtue~aK!LRAbJB_) zCD31tRjLcMRWudfR}_5+F}a=zk6SZ|1}lk$v9v^4w6Y@QnwkwJ9WSIRq_Iqz9{fkMRj$GbQ)6*m)Uzon`#{>> zU=Q9v3*I0box7D(vqiPqzD&9js9yxsuPc!+D^#a0HY69DS&0&*6rWl7A-XQwUXqVk z8D$@yMNk^1pZ-}b7Fntj#;z$1R_{|wJeTH@ma4Xfv|h`P#wzvC`-5rlh;(#Jh0V<$ zLJE^oQeY4f-DxK#%h-F8BCZiNfzte%^!z#5Y9mw&2-RqsX{zdKvaV8OU($W|v<{LD z01C=h%zEj3mRg4zE2?72&4?jY8P_;u>5k&|{3jLul;X4HKoy?ew7%ZovmqAi;R>A- zYe&>z3Sw>uX!Xd@rpqSu$qTLvXhwfSNXuAJ+NGlOzQ+rkvbM)E4`XMGS7&R%=7MiT zq76z?&;W#0g4i5hxeY0*b>TAD9+=D*>*}5E>N~g1)+$O3)0DI~9O?ZzDhS8LSf78S z%yP=h%%Q1Z&mCgT^RSe9Hzw05(0o7fd+GH0ZJ-^ODwLMKc{tStRr+#8!P28OI8QEzs!d?m3<1dUGlGgyjziArq7o8os%RQpwB%D7^K`BCle;iOM^Vv zVOW_HV*bsqGc(p1mvp8&&TxyPpwBp1yyeOyV^osVc2CSd5a-;`!i)GbaiX8~ExpiA z*{tS?eW?h{c!HrfJJ`S(0HC__uSqoSn}rZBosX};rqrWaTO2c)*GTlbC}4jYb1M^2 zaEZ_O+r;Vedr8`(9Y06;hn`XYY+b_90Tv|3I-#}paUJuNxq@#EfA{tBvkAPdPe<{A zOJ!)e6W>Lry{}VHuf~8#r$GFIqyd3*EQ{3QB$#=~V6__p4?@ht0GL ziAPHbrksEV#p!yBoc+~nIrIGKEto0T^(UL6sNSs|}%Aaj_ zDPzLoJH{|no7gyGHm~<_KYA_$@Vjbvz!SYH) z9p6L4lsMC+hShVQs5j?m0I?3=SH*VKa)Fk0^h~1h>zy+5N~vfR#+5TNi5NQ_+i+?a z`5Ad@t#N9tGl+1s^W1BgCz>pq>Uo{}?Eph;#e?jt;}g1H=P5SgJa~$iQ5su8f6PV_ zy=_jA*XtNNUE6V8nfdGa4jNXO@K93m;&<_o`G2&wYtM{ zJ#TBnVxTCc%;zoa$??wB7LP{9=21xSJx#gZ!8K;2ol09<66&w z`<$>v^YWtbxgaQ{_v#RVSZLV$@^kPlTJRn#_b+a&L6SHONC(9eNlKSM~jMZ3yyvUvO+jRL)FyMadI1D*e;c$X_+s^$c*nCb9n*7bT&VBkFF2YyVQ1bQKy8n{- zchiFX$+$tUY#&M6tlN`Zz-gm{(EX< zG!Fc+IFq-!}Qc{vw*I?QD6J%0pa`j zJ92Nq`%{4hE1s^tzPXcA!qk*1ORrvdNF7!JJ z2A#tkMkJAEtUS|-J;94TjUb&sA3v_TFw(eN zJ(SpcS=xj4BpgOzryJ?MMeVP5XEwPC&wb=B`2@YTnt|F#@y+t0q;8c)3o{9|=Yzw8 zRWZ>B*XcNyP5r$flmyyRK6EB0?DgS|-^Jg2otWN}XuMf4HStQ5dniP4Jm`jZ6X)CJ zCS5+5$LAPf@Bo~zAH3aTvT?;?KKa%>EL=sux_edM**SiGevagI=Bo>-Ms#vihU3mb z$(g)I{0$Wwhh}GR=_5R)jk~DDji?Z@%7pf<-_=uq4eJBeQFk}u z{o?nB{yS6|_zM~Ma~UWR7yh%wUv9LOfx}g6yV)48icB0ip_DQ6lJvo-F*kG^YjV0t zDZ^_tJy+_1cl@Df)2-hKPuKt2j;;)Cz~lMRuGuNw@^tK`>ELCB6U zB++|D$&<7~SxhxGs)R1~qmob}Y*l5IO7U;*bbeRjj!Na1Z7Y~rt}>-iPT5#mtP)k@ zn;+L}{%P7*o!dMlmL+Bc%rbmwFP_vF*6SW7Kq%GLvd@D^9B#i3L^kC2kcf&-`L z@)4F!Mb|qmNhLZ>t|2w1?(k+l%u4nGgh05y5ybAl^u}A%!^4o8y1It;hS+IL{st$N z>J;zGXRpgAFFj-7FRg?&i+@E>x`PbgFU$+#Nw;mIMuL(?f}qhPMcPIc+5k~jEHb== z`tFt(e@|5K4jzuoSL)6f{KzbPn=^#pwbs@}IP>C698>mjQ})OSh{y@-&?!5kQe2e> zG$Ley(u-QPfvwubtxK$qwU%r8SR78%I@ASlt)TU0ZCj}#wf0p|suT1Ol3&Vg){z`Tx7?O>!052E6E*SMoyRYIpZs9Ja%B}7ixveYD; zZhpqe=mxKJV(5NXpk7H+(lqYvZcGZ)Vw){f2Ttxw>Q_fKFQOe+(9A6TXjS^-^j!!% zc~?^v#>fyh!Eihydwi4uZ-=f$fx8G*3}otD>dWNC9ZJep)p2t;Y*N>Lh<_HbIJMQ* zb(MWBzF_YV&|{I0VMFImlU7QThev&$ybRQme2jz6Rcme!ri2G;E_gSqF3-w4ekW{U za$IO`CU>xl4p~3Y4x40JsL<4;!_pktOOvBYi#n!7Uxa>Ph`FQ|yyW7-*hxh)VkLB8 z{<{c6%!rSw1xCI~p0*qafSsp1OC0$@tO^>q{N$TYA+Q`ACiqfDLIMaBz7}=sl`DoZQNuN4N+sIk9=HDmWv0edZ`N9Mr2Yc^zvyfX|3F< zi)6qu1a>TS2 z<>V5Qs_gLx=Bd{f2KE*-RjF~*sVa+&^&=%2C3V#l{dT?~suR!YgA>ZE5XX}UoBRNk zK{Oin0yv?mt514s5UUcMb;{yx`jk<_?6X1m_jf1nf~4gyu6-xz$dQf zUU=9o&ZWOFcSiDcn?2*{VV#Cu>7wTH82I>hd)8FswO##tf0+(E{!Q4$uzuCy*w7iz zRgQLS4A)kpPhTx4Rl6h(9J3rEwz4=v|4XD*&t2Isls%eqKn~W>S>f6=l?jgL+W3Ma zvuWnK2b0jJumV?SLGpY2#grf;UlBQP^+*75#v6-$9x$E_ii^@3+g8U6>I`e2H81l+ z)CJfLoy@tk2@Pu`#{NAX6K2i|ydunz? zzz25I)Z#A(<89Yqzy%j$pf}rX8QbjDkLUzs>kg87wjkVsZTgS%TK(?JE3KP*w%e%F znIxBki-Mab4Erl;q8{9lP=KAuCfa3btvT_p64y37l|RqSVmCGjS;E6_FP{1B7gr1E zV!bJ2jnpAlM*QPzjNE18t8B{+W;HfoMyql1L13+f!0OME;{1DJDvJ)|vPgkd0O2-6 z=dPd;TGPT4>Ujpw|27!WAvu(&-$sdeQ=^#It%Av-Eo=}Izl{ols9d2AE?eQ`&{awC zjL-Ls54s%IY~_=KRk+(=_C^x@;ik_1B~Z@fom7TV6Qgdqt3GvB4zZa-AxbeQl4}@Q zL0d?994p63;4RM+q@Ag2;MD}$vmV_y^|cFGES1t;SJpN}T~{VVO5nqBz`=2JXB0Tp zGssHBZ{@~hu13#X>`igRh?I-BYW!LZ!c}rc+C3&-!Z|yI`~CUeYjsW6CeSf_Kb;E4 z2x&zn&Y;sG1Aq53>;Rr$7tY2CTG^@{5slX9u7>^45FFdFOxAKWK%Ix9q^86~Q?!6J zHh+v$KlTDhuPB-vOep7sysjxVyVM#f!s+ySqCK_u}q4Tv}jgad-Xt|B^SkbJ8YFYNw~q^;~v_6S>2x z;&dv6RMREbck40McFA{U@Ph5J=^a#6nOA!BW+6_%Q!eY32ARk!9Wrpfr)Il>e0UfK^TTL1IOdTc1jejPFV-r4rsUlXQvO2=pKfi3+$&dK@#ZhxVpUByeTX zE~)3PZ1WkmjuspfVl4Xs?T47AM!z3F&&D3ZNQ|aau753Q>@p%B#=ey#n#h(=CXaF^ zk2k~O2D?&k#NSF}^ALy=X*LR{N+jeEPU!c>i+R^%d+>fcNk8k6#Bgs#`hF zcVkc}q?7U35W?7D#V4}7RNs0zJ_%Op{hx*n#_mM@2E)zMh?TlO#pvB+wJ1h|xg?|Q zq7OjI#~%2co(Ei>hq;%3?KVm_o5st>hFhH@G29VkWw^(ej@^{>iyikJyqWWgz&D@$ zt{uN``zBoud1R#bg!f^_O=ZX0HKbd(GgrnH+qX3B*qqTqiua`1rs^TR3BIB5Z5c2m z03VX;x5ta1K!}#LK+JjT`gdW*|N1*d3d?5zjyJ`&N`E1o;H}t+bTcn?j(k)IubX=- zu|~8a6`QU6P{UmBizOp}W$^nm!aK&V0oL|E$DIlm*A7Sgs@9~_VrywKDGU*RFB$&Z zeBL>ar*4&$oYk1Ss&x^0MxsY&O-S}i5P2$kztFY2bQfU_0>8iHy(Nq7$$j0k`VR!X z@5(;+-^qgMgkFO-pPmTZUcP(YHwJ>|ZK3h{V#>mSQl*w^keSGGgtWS(wkM$5Ho7I` zZLzIlcO_a6zN4dqn2gk!c$Ib+-N}iaR@n3FUeC)e?SHC_Z=^9=kLO#aR?x=f{%}YZ8KrxYIL8mvA6e={qSjn0~}~0u)8^}-j?ru zpQjrLe0xiQA{vhULl{2YgopTNa{!di<9c3-&I8Ide7s+ctaRViM!j}`Mt>*^7cez# z5Gy&w)yaCn@utajE}SjZ#4&q{4|>2~sc*X@$5Fpw z+m$?_GN{!q7>P%iR4F0qyTvM65AgsQ)SyW3_9I!9-LhGhQOQi7yrbw2bxTOef&T|S z8ITPfz4$UXqNax^%RkT|ErxIXYjX&?SGs3Rv>smD^BIx(X1n;$Z7$nJHRUfZAj^D zbwB)(;jytVA2iSG-&v)>M)`OB_$7oQc;H!_GVDYOUCFk{$T2y9u5}$eV9IUQGFjK$ z7|K&O@TL+Rv;*Hi`<=Ase)kPxI?^by+Z#60BYGYm*pSIdRUxWQQW7mMeMn|gTp=8T zWWpfojC;DiXibxOc!H&>k@xfWw}cNrDX3HK>6kj?et-Kt-j0yGxKY%3M%re-czEZ*&$s&3*L#q5;HI6!hA2Z!ro{!xMCD?gx(wK-no?>a;h zZI4#AjRz%qjM8;T10QinvAgA7UU|ahynH07U$qo)fOygWv)S{_DH23H%sH z{_^{aq0v{PZ@v4|FrN!I@tKTe4tzR^Lpm{%JQ~JlDIv*`_n8f!VeU+*NA6M0Sxt75 zY>BE&Nj67{tLfJiF?uQ4LVTQb8H>b1dcu*LRjhGg)rCIJr6+*l~w=PRt((8pHIei{AMM++8U5r3=l#$x+t2tU;Z_$ zA2+NYHmn}CrXDk{A2Y7~dt5zsPC2$;Iabu@jd1PgNcreU<)A|4AWDVsN`+vvLiTN~ z&*8&-#mCYVM0v(MwxVz=NsKUiw!0>V$A#7u5p(gk@XN;$`I*52;y5d>1A@{w=!sj` zx0Qr}0;;_5;`s2UVCk@5PF51wYj>Pq4{QeK=L0LtKKW>I5Y5q4ZA(V?OLF#0(trsM z9qoRssYlhd#V)l-5|%hDc*vEXCaA757c_}UM-+z?ws=SC9xGWbEvZlfiZ$m%o6AFN zRVWv?X>5z97J!^;>$B1tQj{7wQ|j&@<@tF=*>a~>K?Lxl4a?zkm&(-#pTVv`%`tVvMR3$a%Zc#~ zxm#c_C97&{$p5s!XtQ|SMYM?$+Z4aNzq|hDI2p>#I#_s+`%NKGK=*@p*#J*T2DGY!GV~j48 z!vfzBy+b?b@b)o{TvDQ!vYILy4(f2`s+7uf@??%(SYC&9lc(Vf2$XmD1dm@X=N>2COiC5h7SM;Ch(sU8h{Ikv|+il#6*=IVb#M$VSy1z!#+s4#M zByBgGgA`0X;##lN`%k&~r1GMRNs-RwAE3Tih7$bG6g`}PogCsN1nvn^gi z%OcL#jvrSv$0Dk;<9H%@4QIYJk@jNFG~ z`BL5w9uQ!H#Rb6PWv9v21tE$v&3IWv5`t<`B0A?pcEsJ3?{n=CRHYAH|>orwz1hB;Wk6-f@y^-~cITYT^V zo)EQIFF91{MBA@T+Sg{RHt4K;&(h%_tS8j0$Jf;6I9zQySlzZgqxnBA0H;(zwS`86 zLYetg`EY&9V5u`{mu+^*Bbzzp`egKt$vm_3KUb_9ZzsOfl~X-?K$Tg223tDn0Scqa zjwT5gAZ1*~yn&5#A}YO#KUFhj6i1C|bY!-?R7WGGk$0od&5D^L(WP`P62C$^V!CZA zPAr{BPHhSPXzolk!8dAdFbi9#NAa!k7+bL8=VhZF_RwbW#Vps=Ijp4c%mV4mi2Qcg zhsrRP{M8br#FPT4%6_<}7CP`PMKlUH0X){IQv&B%^3 zUvvIxmaygjO;6X#O4m5fSUiZgahs%rrPGz;=Ol0lcJ;1IQn0tB;tUYl5q0o-z>CKU z@69U(q>OH{VxW*V26zUaUwqx1#ds^C{2+z#Ax!E)6hrX$_qSJgQ5b;eqZI8k6MY^z zd8T-PmK^8N7E*V9)_8gWQ#19oZ1E$29A|p{P@Ue7{{tCW4xd8z%253_ zxpshK4L)dqJ;G(aRxZbf08^)DiARdM=bGh~Q&M2Ie>9PB=&oIKIdL?d2foT`02Lnj z@iH8sht3Fn#SaxQ!YL4Kb7Dj;FneuH0=p$&?vbwU$nj^*M1Rj*{dBuzZ9uL%jr^39 zGLzY|iDn-sN*=|XvT7p#&nX&7((<8(zS$3-kl!Wu`0Rtl-LkKMULjOCXMcSCWeBia7J z|5KZSlFE>ZNfQ&0MZUluSY-J{>X^#XgzRd`n_FFUNnRs*Y#U#VrqHlbqKn2--eAP& zW$_)Y_tIm@<|IHigfliZ%?5?B@-TzG#Oqs7k&?$upF_((VS=H18Rk|g*)t(S^YwkN zeTTP`P07=t_br6?Xpxs)t;fDgkH?}Sqpdh2zr29Uqvw~)%Jb{ZfUDz|C?$U(BtS`R z-|71`-aF4o;_}zC#@>Sf8K-B9{8O+9^t$(SwM}%JPTmz1vtv(UQRE!o{NxXF7o^)9 z{p)$mp*wlG55TIH-MIEzy?$1<<-(7VBo+Yb3!r5S03kI(*);}lBLR=Ba1T*EFLJQL z8r-P8&h~kG?mYMi4mqH^drC|UsvAGa=b+zhZG8S0L1ex(*6&Fok67|FSW!_?H#ax1 zxHug{LrWN)5fbug*M(0vB~+mZC(ATqDE8;u0gwOv%ljibgw~T#>Y^pK2Mc1TKQPdk zQF8tt=)Zt>P{6Yq9LNd>^6mz`kR!Rjwp;IRQAVd~ByQ@-sPhbk4g46>7BXUl)t87; zC0E;B+0x6X8J7avM^52c0hcZJS|`l&L*X8$#9!8tuN+QHv2Rs%)|v3L^mRB>E=-wQ z+MGVZmG=grrvy!Yc$2Sx;4bd?D7I&K06o;XJ1OR|uxI!&!c;>_upz^|>3Vi8_lyuc z?J#-~_X!|^Z0)P5anNB5ixBWE>+-_*YuF^jx)1A{>wIN8zB71i?>&{Uezxd61?S(H z+8^8HAp;aFDTk52-Z?zqQ4GR5&aCQ|V4vko(>kpFcgyLYOWXAF#R<&PBFvLH1N-W( zqn@XKoegb{fkV$E81J_y!3QYIelKujfH+EiC~ziLr?#X=Oj=BWdS;s6)#ANX?cbiB8d5_U*c?X<5TqgS9Yi;yXR`dnGi3;2@uq zG9fvPN4nc1XaIJi;n+t)6`fh{pK zwAe3U6v3ia9I%F6K#%qCX)buG0T_|8XmJNoyc1-B2%`gP@j%OAB6Ug+7x5P+_yK=M zewve&*~N4haA!(T%g=bQv(cK`x5P}pA$?qoQ0FRDp3jzbkYl)Yurc4=+?E)&Xoxyb zF!0Pf>6bFc8&1r<{&kbBJzl}_6_}!|k0oV#N8KRnm}mssRBFgdUfL|veF#ntoDhWd zq1Ik8;4q_?V~wcLdPU}6qS*|cUsJsMv5(gz89o1cSqn4QfKYdxaN7)lq{qAZ=NIIP zcMT}H?inOf(8pLi>pW?P1<*D&T7ZlVwHj?ROjmhF6YH^JRHD~bVDoEDJ#I}uZcRIATsvk?{r8-< zeJziWgnL$8mpmCxHONl$W95(*^p@92H@K zYWY|T-OF^Dy`qC?y+^Uoz53`WArqKcVo#f5g4M|QNY12;BPO0RY~W6i;xvR9nEdsO ziFQF_%-@5gJ6962KE>Ovw|a!xut7gaXJe+b64+jn@R%wo89a5<#67wx*)TSn0q%JS!!-zVkNyx8PerjJ@ zQIs%#=RLl5OrOTBI!j&Hpe5@bz{3UKrG9^}vbZdzVZ_tyC$w;Tue!V}=U~L6u}+fg zA^o)pnI4l%h03-tzdE)vmCz-#ViZtC)oA#`vg=o;H{2uY2c(%T2ZB%TCA*8s@mdD* z013EN3orAu{RGNU%G%CfomU?k&r(kLm)7unh+IykhcS{6xpm5&y7YDH~Acx6kz1vXkjWJ`CzkjI?|fHniJa z^cFIaV)hg?GNfVnO$1BOQlhqdI z^8}~I>i93)Q(8Pp(YhJ`)(!4eXcgslzfRC7#;+MQuN(K>77b2;*ksBbt@%6v1{+jd z&HYi2DfU02Oh^K8k5{_;MR0GaPy#OqcBwQfBGB~y}HF>8QSreu}mkE$jrYgu33ZHBn}=LnnIFA z@En@r-uRn2DuKB&LIE~W8SY7lQHo(2wPx$4#_Ls9>#flmcwFAqPZHddwt@oQ*>()_ zYxJ6UvRXL3|ehT}d&V;@c4!biwE2Emt3=A+_r!Sp^ahgMl zX!f`*B6#S$fiW*uT4P==8QHX2biUp}fvrTluvXc#^|;ZlYYYi=mL%^}Kh>Hc<(CJ) zqeOsmk|$2z4!-SGJ)11Y1NL>R2bcAawL9ctFj`$5?h>I&UgLI0|bW*^t1LuLVNc@Rt1AOnef`k5U1^ zMpm0-vQAGoGI3Fv8HKP1amYop;K!peVl<(sY;cR(9DlT^o`>NqrXul&wbmHIR<-2F z(oN|Irz7GGf5Q|PuZ|PnXMprG;aPWRcVn`Q<=1eFWF#m?`2N@M{T_8$iR&-HuE~-6 z^cYiWOgi6cEwTes6Uev#9uRv6{_g};*3JCtM~lnD)oX*%rXezIsWwBHSjY^Lmb=l4 z%-_56Ee-2~SKB4%d?&}o%7`U|_a6?hVkyY5E?`kfXng#9e}fYaz^~DDcA_Q2n$e@lLF2mTn^es~YB&e7nmu73hs zXRB{B8~}sduN`<539O=!sLy8^7Cx3cxkF^WA&&1KL9BtUtb?iRVGaW!tNXpyt6pW! zKA)XtdaK=Ep;!>zWfBqCJ8%F8IZsSAEDlX>6DGMHLx-zf#xAi4K*xGDd6CW?^iJ zcA;kX2d`MUL-1*&Fi>}xE$S%&v{>J`FdbSFS}+!d!YnLiQT@{dVBu7d_iM~MD644S>^0Wy8 zQc}qRJ1lOX!1T1LRuys zwB8@?XO^MLSAd;6Bfs}s!Z%LX5fgIt{%&pn`Wp0$ zOc7u5qzhB3^Bng8ZK7A~5c`Kh`j>U~6F+uf8P^M?Qo2%qLiz1I7Cy*mNM1l-DF8`R zcxL6LO8;Z4)sM@@DzL|X*?$1m{#B1Ya8%u$z0YjJE5*)|Ia{6>_&U-&2_tAVcov%r zfNEsCZuk*|S5OUe*_)Z|5bNhu9}czk;hnBU{k=0de&n9?(;B+!U`V;YzefxUIzjMl zy*v5%LV5=eXla>@M!#1zQjxZ@Lp4y)kUsv{l!ixvyZe1XJ@&gm!rTgx`9{0=VdJwp zl?e4~p91E&ei1)U(BT^ZdnYJ8+4TgUlW9WI26H#@@rHZsp5^*q7yhk>BCOar!+NqWSYJNQ^qqq56~5yO@&I1_ z-yel`?w_4~AWSxC+OyT$F6UcL?JMqWm!7Y%1S{V+zYl%ix__b9Zcfe0d@1uGvGJf( z=*Mhomq|r2i=K&0a6>M)l`bd|3e&XVZmy14XrWQne~jNfLHA5}go`*NOUQK3N{pns zlFLm>xzBzhXS=R|vkf_<+Vd6no^_u?s*TsZAP?aJjnVgrN{)r?Y8Vz(9SSe@YugSf z{lOhhF!G9$8e`kl*eGf`q(2MS|z8rXh;VN3eOfg;48|xaXoXveC6N6W>_v-LvwS)=J~+R<@T-jg_n?L z7fYw%a+|YVcsX_IU*|DRmx*+HkC*gRjI27!`YVvGeH$_L!r61tlb zIuzLPL-LbL@)J_>6GL*lEv|dYIVS+`mT%O36*kcS?sI1MV6`-^a1hJv0dU(M=YHxu z%YR@hOD-8`FHkq7x9N#5=?E%cftjuw+TravKn3S1XB!&1uE=}6QdO@)E({diTjug;7Ga(Me>dZ3<(Qo z_2oTPO%+i^LpbWaMK`w|b5l*l`-?A+ixPu)gIDTKX*WyH>Pobfvp91ti3&N~BoTjt zfBKOasHG(HP+f7piJj?3Y^}!NyO0@_?9QSxkgk_LoN+bO8Wqw!l1Ki=?VqL=7Oty< zYStT{mD;q24-N}J=>6lM?jB>-u|-XcQT2Opcd?)Y0>GZm3r=LiIeB%!u(;L-j&<~m z^R_YHO$4US&O!SbR85*jCl;ByF{%SvqFFRNj`_>@?)G~E$Cy5DSLC#9dLlFQRYDmG zI>v8;SwGD8g?(5>M0Lmp+}u%y`<`1D+w3Pe>X?h`ThfP1uRejtd4ap2`Wb^^KC&Pw z|Cs7St8}S`S#;<>?W%2oGmLJ$Oy~;RK!n^BtuQ0mGdC~L(Rp`+#+c_{-RNrb^fowS z$T81q1eS8WFkOj?F~ayM7`nro*)wwa;t;7{R_G}1futJg2gJT-=&D7EhWLA zjDi0uFhePZ?CNryTG+6Au&h$+G53VXei;odXZha*&tMD+b zQg3_w#Emgh5sA{@Df2Cm`j){|AAOIK=OYX46YL>=W{|gj8dJr8E9ugMFWHn69B53= z#M;|4TkDKsn6)<%o$OT3RdU8gL{Uo5D0#v`4(@1jNd)-&; zL){jGmg)rt_*THCtV=_TC@gqwt=;tIYilU&-#_~+4F`xPXaCk3jJd2=IGJ~}IkvSy zb(Y#g`Lo6bIu;6LW(qz1r802}WkXF&Bb^LZ>&4~+RlRLBmJ^&a6{g91k8J9V15EO0 z^%aR&cdg+c?^oSdR@d~cTwQZwrnqisgw`y$CKwqsQ#GtPk(pQ&Dbth+3=@kuY-eKh zLR>PbrvrXQaWG6SQXbk=EV(&kZ;w)J&V|heNk>U9x-zl+rodrv?q7`{V z`ZQCML>7<(8A%)Sc8ZwPJ5TZ#3caahD>m|rTVP~M9`=`(+xN?y2dF*XU^ZW#Q;u~? z1k6$nGhn4x`SqzAuw&iY$S+v2&nAzk%aLL!gvdu7soZ%OXCL)(vkuibP#Oa)1FDJ3 zgb8ZtbMyBQP3)KumUv-^lA=@`EoO}PP>q+pGdy#-YThBhf9j-r!&(CAsBw4XwstFGu8Ws(z$n&ybt3JBbZun<6(&7xeRg)?vfaI1Vk}prCVnhE zMfASEYy}q>ea689L0J7;Ul97>(clq?KcexXz)IQAb`YN~KKgkE84ALYoxT3o{o{am z&Aanw=LTKVZF}5>SL~%%?1higg*Teg>EcX_RS(+E9j#Cg7;AV3tr3d0)BYWLXVAv` ze0OrW>Iy?5U_6r_ zU9V3a)6TPhU)y8!u3HeAXJh5trcbtUU1bqmVvwhfNK3gkmn|Xws|5g)lu%r=$Zk@CftIcE9qKR= zG2*5;Oh6tDUG4y@;lCe(F`xo6k857ES*qa{04~_pnV^HMDs_&>J1qAw428v<{Ttq2 zJ{=b{0Oh7(Sq*J!W{u|>?Nz$At+BR>TwYb6V}Ja2k*MiL#ObapTB7L zf8+tbjE(ci-Y&xad)YI3#p!c8c$s)U55tV$^M}d|DbQaYu+~+aQ%tZWQ4g#@cE?d^c_%L57`<-sZrg^i zZ&@(Zh&Mus_m*<_bc@K&^Fq<-dD+VD0rpN{REZJpXs&^jNbRu0F6s_Mb7gfe-S#9r z!`h>CmgK{UV==F)`9s6-b0GtqLZENtJm#q1TY4Z~eR8Q_0o5S}^$eNn!woLMy>Ri# zkQjq1Y0~op;iD2D{`vqZV%b!>6IbkRfN{Z6P(nXZQSJ@7V$PIa&i98(|Le86V4H-Y z3vqKG@y8H?g=HjVI&)qR(B*U2!|QCt?vHQ5n`Hde3c?Qw&j$`>*OQ_mL1D0SgNd2B zVEGuf#eexIc7lNJ?DGQiF`>mNehEdtcn~BO4_r&Eyk~Du#QSK$ zgFInio(9?TTB05&%v09A|Md`!9QWtg0D)Yk{8y? ziqGI4HSXyh{T2Oh%`mTP6Vx8VUovS0XS!rXr==Fc)vOQ4OAWInbqoX_OYX-;dwzOv zpt2)7CK$M7O?LW7^D`VA)D&pP%UXF*$}Unhw6WcUTAaixz_6HqPujWx0ss{Cqc;e= zV?1+e?6>X$fV8il@kE0gM;rrMa{5-HTyr*CMrZDF{N6erM<}iGeku}o08cu=v%IG( zIf^IK2E=H1z%Z<`iHL#bq2U(9B#qyiJilFRzV6AA>6-B{h+)Z!amk8VG-0lO`(eT) zVZtP7!yswGByK_n8&MNFNfWxC1$g;?(_-)&$mP>rCxs(F9q|y9) zPx3fK^$2!aH>e#0kC@6d#yGBcOR?iJ)P*heAJa`9DJ5}D3Gx(vaHj-XQjxs=K(p)m zw94CCWA&DD?swlv`=-f|Lc1#MY%YIX}lgC4`E zEoS^W)i+Q{cK?!WWbh((i$=n-x+2g3kwD{vz$`qa+RGbFlrfNS zAwPL)%?V1Vi_4*`Y{BEKS;aY|V0WJ@^30%&MJV>qv^V6KK~(D4{-ag~8~UuE`gCKz zK&OXDXci(_f>F|BrdW`JUv6X~EjD#P@Ai++Xzp;8VxX1uwkQo?oXYI8n`T#->9-gI z2ilG!|EhTh>(9su9wH`^PZ(Ec_)C^Gbv?v#p7g(aeJOsg;t@{|I`evwZ5{{#!^rA| zUXrU}DFa8CvD~_kOEt+wIhwx1m?sqbt#j=i=Bcy-YdZ zimrY~UDC_Vr-p~OBR}C3qaE{ocr+Ro4E%_`SN6~M6ZcLr24+^|1oOT$6$P|Raf1C_ z$>RxpDgVZW?zqS>b^P*Rc*XaBj0qOk8DH*}g ztOE7cP&S)=?QGAnmzDo2$NB6lbx&F}^t1R|n01$KWw}uZfmNSdm}n*^bmetX?VfO! zP$sms7SmJrR#1?*nPrz0T)3H|w6)4~4Dl^(0NAGxx~oGI&1B?{LM&)^ud@Uoy)0O* zOha39Y+tcdW3j21M2KRUg^dkHh-s$85Xu_Pr^--jn8=EWjz*=T@E=fvFV>JPP~r`9 z!VT|gTK4IqOp}FhA=@onGi%|$mhDG{j}bgY!wxSvSGk7NJZB86=pt0FhA1{XrqVs6 zVoNdiW8DN|GAB|C-K~nQPb7qiwJK>&5vjY3Zu^iz#(QqDK<#0M9fC?(<3g5<)qN)1 zK?x?=3FX^`@0+W?3YGegv}uPAflD~1f|BI^a;S<1xTHJCAC^9fw($11@S-sx5@%xa zaTmK3D($SKi|;~OUssK?Hh1l&Ve9{u^uY-76f?8AKh8u%%?%1N!~_kVC2~;lw84>5 zD_{GVo!-=FuzLSfWVps2XQTv|8nQ0UzE-*>A%UK@g*6}rF(jkL88xL)y&8ZOKlnuiodbwIFEw9@40=&e469E>cQm!Ul64^Z@q!hG} z;b51sK>4=*-A<$oQ-a$D#Q7)gSRu0C%E1GpjG_gUckp4sA527_P0)f&D4xkF`o4zs zeSd}%A?+bL??#yE#)FNKF1 zrdF@+^UegI4xhqk6`vl9DS!W5j~qucpL5^m`HvtwJ)bH^pSlxI6#`(on!`6WdrGyH z1Ur3em|~9mTnMCgA&#@jhJy2GT4B;K5W)P(_lmbm_QEwwbu$qj0PSLyd^tD1mLq%3 zs-^m|xwTCic}$YY9$Hc)tde`GycAF8;Lxh74OhmMqB+ry^UkQiY@Y^Rjt5`gFVEiq zMXVH`W~p$$dJ>rNX~F;(^^z`iUfK3ac_yWfdo9w+_^Z+Vm$zxeyApQML@zWjlrM3d z7m&AI?3XS5OouRM(x0dznn)jLN+3Kdh>%DCx$W}Q9dQb$`Q8F-{Hq%zwmjWHleduo zzL6Ko_u!5>%MdNz332=dKB|#Y_Ye`|Pnc5|WIs<#_KWN8=6<^lcv4cqzY`GYUE>UIvYDq%b&=P8FOktL|M&sp zaHD6KYvj4--RD35dvyQ2zkPAjot@fQ-k)7X>^2GhYqxg$^x?Pbug0#fDVPnKk&$t9 z&&8a5m9N!c$@;Nt^U2}uZQ<>;X!AuV+PzEL&ijHhZrhF^Dl@Xs=EJtl9n9k%egk7p z0s>yi9%68yL{4`~tW{fa>U04TPCl3SS32%v?`KBuS=VO%OTX?KT~^)*`APM)qs0E4 za5{Lj`T)Hqb{BtrZnvaD`8C&~=ueahs>$6#Uq} ze6h_>Ds5D2CC)xElGtWl?Ftp#%Kg+*l4Kvp;$rH41$-!Z5+YQz8%@EJ=483J>MOIkUf^RK#}c25f!pQinh70z;e26A0V{)DCliHKG@-*{aESeNX!R=Np)l)D|%P*(8 zni&WLPH$BYZ1Ltf`?N?p&Vc;z^8KFgT`$pXrl+AUZLlaX$KINQsu@4D0R&>wU>H(p zg#dx~CnskPJJ$lM=qC+@sceu%Nk=(Uq1!#_3E02$?q9=1nc8nj8*?aY4OsM1J#ueJ z0?AZD1>CeTnGiSGIm|zk3KH=d;@%LU-1WEcb!L=yqGB%Q2@iY zot^!24Y5Dl$I?-VU`0TD3zRoP7;Z*H3SP)lBWVI@)SmpTBdNC7}-xq zh1zcs83?gtSUVMScq6=JKG1(6yQ1O>W$MGJSR?)WEvBsdm7wGneXO>VNMX?rw!M&; z?2!X)Tb3U08E!m@^Gqfjh+t||6wvD#(w3Pkmwh)kZo5CU8kzNU?FJp zpl6CHlaBvY-bD-!&BO_czKi|LxyHA|jq*RN=V`#}aq8Ix2<-ch^qiD*hV=N@ak{mu zb=Xm_<(%DVlPgQ$>zC|+8or!qp0hvJ#Jt&P#EJqyD4M`DGca3kB?nygZz*Jept+o+ zql4E#V8vs(-l3+!He0HT{kMx3{;jPDg8`$g9}be(CzqiA+Pae^#1N6pFc@4hWYvU` z%t&D)YbGo!1~={+t~XgIe7;aKWvcT2DfE& z^;SZ>Q-rGl!U1du&SH`Db2NAbY*!PPOp>@w6I%+?WVKUUifqq~e?rFG^k~hPb5MBP z|1L9?bV&qiuf%H4g_IW|nB4zY-NkBiL{{i*93I+7Zj12w&*5Q7MMu&RfSyZ8mGG&! z=|%?Q4oGoy^kacp0s{W|Y)re|hnD#yzTgH@rukD=Rg};W%RSyMo_s4!e|{V(3hwi- zc=9Pf`X85q^)oFwQISnTl|1Cs0b5#k6ptsj^tYf2d|N-i%bM+|Z8cS6Np|$GDm#(f zm;(!CPj#ZG3Rg&>?N#Q)SPd(6V`=#0ktn-jl7WG^p#x$_%pNv(sv4}!LdFaSr{BAR zYD&GCM~w!MudXfj(~i1L0fuKjnS+uO*S*OdKDY$KSea#&1r;SPM@IJnRq^@P8>U#c z{7eg9iLq=GoHoTURYy^?x_aA{LE}0zw$s9S$G`I;^8PY>Hf^7hxj4Un7m{&xM99FA zz~=lyXN#@8#*i<|lwZ!0W2NH}uFxi0^DTBRRQ;+lX_P^ZqMA3NX}o;0PgyUPRkJL?* zYQD2C1y1}i^)3&5f=tLaty?MOgy_9}Tz)ZFvLYitZkG#qMSZd({jUH1K|_h}xPdzw z3+G^XUdP`nZm8y7`zXf5??nt~;qhg1nw?wP-!?FRPN6fm;?uVliUA&@X^EEJ!YN z#bFRsKhC&`CUwT#qKW4O#wO;~2)f&9I*zs)|%0d?*Vu1r> z7{qV!L0gQ(-JP zwXvs#t@UVrhbfiB7CdZvfinD$G~C2-SBRVTtbvUv&SaN6w1ClbA&!@O1Vg7w#`91J zE!FfvJm8QB=G4uCicik)aSKC7v6Tj|(kUm@C`zHk1cpwg(pxFQDO#b}iYPL{THBX) zI~T09TbgBc+-cG7+(gf+@ITWcl~;nmjT1F?SYhkqcWVrir^JyNY0>vc83ggh>hc9z z@@yg-BMTFX=0)(6u{T9(3fmr4|C(#-OtgE;Gc3WKfj%Rl?h;Wyt9wiJhAZYx4OL7H z4b0aoOzaE>GHu{04MSBpVu5GWYi%k`u4bcUp*n`ylyy+5-TUn(#~r7We@-WL_06#x z#a1>FK`<5ASZn`LBvOeBZiq|jo(7KhJUdJU=CX$!6-l4U*?6Fib$}bjHho(}ghh#! zHfNCi!*1U!bDm5k@9NhPp2r{APK84laU$3y3OqqD7wi;&3X(I2_~hLPuoZ8HlOJ26 zNT9Q-;d+p$Ok=GzoU3JdhO7-ve1ZMk68yrZv%zlWo5uMMy&g zi!gm|b;hTZ-(y}}94=h^^Mr~Xzm#{)(BeeMeLbUR$SD4yV?pA+LeQ~LLJ&Wpe>o5P zavFw+0NY}G@q7jN`m@4pt+ktRn|QrYxP_;9_uE+Y&h-~A?;-kHZU>tuG+!ue4)kt z1uv{+6CVVdo-f0vt!rb!-p`yw(RND&YL4uM^&FkM=Gu)D<#W@M+ce`|97mTDyCm@P zTuZZy$)Z6AED8oZ)?{50c`u*gkI?b8V@+1@tL1Z>hQ2#I$Lky`;7-Q92i$FNw9X3l zT#MbiQ3=$o{^o;byME^QZ+~GD?&FtVh{iuC(y^q?1KWHofz64EcVpdnP`vx$8i6t0 ziBxJW9mBz(ywX z^*6#^lio$HFNdjmrR7$L?E4|$X%i2gmROT)X4P0~Qcs^H_OTH2Y}ZS=vP29;DoWz0 zVduy_UI~|22{Y}Gb#21XRRF#?cqO!|J9x2;zf|LoTby8#-4)L1oTu(EyA9#!?&f<6 z0wg!UE@^Hl4O_0?nsn0Gx+QaqkGwV|#rGJb)b;OfMuyq*r|cW@cEg7VIaDfczW9{| zyg}OTZDYS2vbTQ-|M|Y3|38}E0l3kIZ5zJZZnfoZ?X7LwHn(=0+U9O;n_C;HQrost z+ueHWFVFwaJCm7Yl1wIYQJxd+vH}M|xgg-{wBwUf*7O{u0K2 zLTu@Go7Vy9fv=m_w~n9p9dGB`&qOou&s_Wt*}>!;!NRYTcR7L2pC4GuwNvI zEVLc|`FDWiwr;cM(Gb$8+WL=pA3pHu>019&sBziTXq)w^E6%U3fElKv2cgYjBf#Xf z>Oef<9`F~JJ23t3yzNoo_}csG>BHzV5rR|O{(6>hnQD2!2bF!tbChIbl1$ENR@yyN zsbAvlyZR>pAb|JV<2!siSp_@$-kZhCb)#}Sc!&jP?mvoy0yCXoNipu*?av9GUnS2k ztK#LhgjpH^TY#C)Kv<``5zlP24MULaHeh3m!?9~8#3$#+B zXXMvXgSPJA=xB7v*V~nMj{Z~{>+9MRI2!esJLB&(dFbLD*SHx6b{|Zf7)qS@Jzz3$ z#4~6k+-tYCJKGXGVQo3k)O+BBV}O!+znIFtsxovwPPUFTZ#5Munet6iTo)6?nsu>w zNF@nZG{BCAm$krL0ydfWIqG6nrNK-*BJfICp;s^pW58-uzL1PJXmYkp;u(o10Gu`?d^nU)(KWI~|hMq+%flYfk5=2%C6b0^UnXQ-bth&pr8B zC`n`@^QcTzVS595sM`4SG@M5^Z1})$uz%F+X!3q?<5L`N53kgV&xQl{5e$1YQgk_I zwB0o!M1Ev4)YKPcO_aM8Ay#5)A{%R}8>YY-xBSP_t}wm5^!s|p`D~ri-D9?vode8e zmn5cEm^!^&K|5{QZ9BsFd4GjNRAD(?Mo7%-VDScd4@XYzhm8h=^H6?Tpkb0+)CnpE zB~0%9l%UuoqukC9I>RZ(^y;q!=b>C!17->&d^Cnd0rQrS?CS&`N?UY8H1DXgJpvEL11YL3n8j9mWZYck*{)v z+KZ^JH)BHc6-sOkMF~yIEd0WK!==B22kbpOxL3EIVycA%I9$EFdLcmuRLPN$_8iX` zJ(BV+RLi>S&-3HfbFh%rxo=mXg;U2d6o}t9PjxKMdCbz|@o|m)8W>nVF#SPS`aqd> z|MduaIAi&qt!r^IrX>o`fVcASyT(LldDC;bn;}>$KT<9~ZaiVQi8R*QpKsyCP2&Yw zV+%MMRRtUsCT`VaD(f0)Rg|igyh^*)uuzAq0>{pS)mP4d{jB}9X9wZUOl@Y_xDBl3V}K(?5?z+tNy& z(~$L1=e0&DDPF`jr0nX>m@H*u%O01hV(m{shFfJVM}is7nrX?8pXy= zCTAd()|Lw};FX->#FV$8wXP^q(GWLOhvkihD7SEu*Hjdw%>IAL6;|@vg=|`RioPr- zti9N{Z&o>hojBQLnI5OoXLSxR6tA>tf~HB=(p~E4!IlA+OPkHXOq-Lvu{B6#LrF}F zY3%tK(xW&xOa8xJ!q!d-mr!0zZmfi#*|Hv*Y>{odUq;~3({N>+74e6fD=4tOBx|F~ zi5c<$y%QylB)+9#^xfU#3~EXyFJ(!1_>x_o@g4BLH_=o@(x4m^sX!^`ZBiY47>GG+ zQtft=P|gHZpv3&Svc^UED2N~qClA0E-Ap$AdM!+PwX5yP#njXe&7QCK;c1tmQHF-SB>=CR*L?5Z%<|Fbe9l5Tz9fX^8y>?Dp!?B z(X_jQd3WXL`?K~7wC4AZDVC%kuxSlM_3 z|FWv_q0b<^tKgc?{=m4g06lHlL!A01PY~~nb9&mw8Rl%`bI9s|GN*rH>QxlKAIp>o zYX8FY0L-x^=T!^eU6e3ZA8DwH0;uN=zG$GP#Ud)rQY#9uxzfU&NNk)gDp(n1S#7A+7Aw}c7=Z1? zmKM&~1A7cUv0wLZIkIi>Tez31@v(5zhjsGsBp3sy3SClQ4{0hR`{I`HCCg%FqYLlVjA@li$rUNKYr8R9<37*?9C3dr`LWPtnjUW+dy^XbL;hjOA zU$v(eP%V_be8GaRZV1VClThrJr`yX{#eNS78kIH=+n|0vWHg2OGAM+Vfa?@}007DO z`$SjwcBDwbspJ#N`5IzA(9X~xb|@-tz^uC(%_kEmNFTAUv**nwzXq+qir(Xdv1t&+bOoJ zlD(^9k7|UXkkl!pOEDi&uy8pICM!xa)fm`owT(4CO!iyKci)HYf3LzgL=Uok{rncA zx83tx#^oTmv)nhnj>^vuZ)bl2G}Sh9mW`JxGE=e_;VhHpD>3ot8$FsP4cEdMp)P+H zkN!U`KzdG2V9fae%5)LCzVrx>0X1RU43A4L#J1X11+Yt<@V+?h2kHRVx=4gp1q?X2 zvXMF-5V9ecrO+v#H*W@NZAQQ<13615n@;d_L3eS_D*Ec=^@dayw#g+CN zYJ%+V>I%_58Pye~9aNd^VK@kq@m6QIW&Vr#4nzL!0LO(M3gc0)=x+;*!&=uYz_XD9 zx&M;G(q-HWMzIUEvy=d~ogulTq#bpVgl51(9dDSNp6 zzGS2i1FECJgjZk5RsdCpY*l>qDWm(hEG*ms4WfN!mL2nz^jntSo6o~Yev3Id5Ha01 zQc21g4D*W<{^waf9Q>X#mg z@#^+Az}Gh$;urs4dhMwjM0C#1$vHGQ_(iP(GgR!irP90EWl#2S&4^#h&B*7#ryH!T z|Lb4hz}qz(hK=)`$Er8K6ZgM8ez#!1YyNx#QQz&E?Ti1{A>KB-qpx{l&$#?T_r^D*jWcW1B&*PNf;QY$} zeFdK;U$5Q3-E~io{(m3+i9jnT`uXm@7<(`OU5$^A!|&Fh?VLTl&@U`=6R*K1*NU&B z_37ouzIHp0Lz0@?^_ixpr=9q6e~t|7I(ZoqC{Z(Yz@$%IMGnL*SdW+r8y_2I=LR!A z*60xuIsiKg%uIZ8fDWt!d%99X%`wYA+4MDg&-XC#lf=p+yhRn&c$!aHHOhumQn8ht zO)+nni80DC5kTLM3aKBW=T!Bl>dHNMm9FGv&Gc;iZB?<&ZjQL6EPpb!g zcf>%a{K0m|l!^7*{3l$J>TO6o>D=UYGUV*sDLFyf2jfBvkM2q{7poVqs~6!vU*|79jFxEZ939Po+FNTQ*Nt|L zhTXjH1D=L2Dl09H61Uyn`Tlo#0FB#^7H)px1V~cx<8&T3f8NDaeIsb>CGA_V^>5gk zsOO-`8JyL1{EfN*MC)9uqBWdIWEK!rm>FPAQxWP zL$ylkiHe__Ek=}4B^;PY)->2^g1uU~2a!~WnN-A?d>_F?pk!BKCw?}JfximK0}J0` z%KLFO;n)jrMZhMS=rH5PVVH?A%ERO&vVd-890S0&sw9_XNvsSBEL;h!lk7@un@Xuo zl_|SmbV+~4c?0m+Y4l+p98Z4v}>8U(<1->m6ZM*F>c?jxlM! zohgFVB!ZJUP-H7E2?{D56K<~z<@oq$F0D#B8&k(?u`4?$5cDJ$TR7Cg^AYtW-%M;_ zmM&2=+!s~13_UG2utA(Ei(3lL0D4M@%lpv{B5YE$R;H#jxWs&wqV$XybHp$R20a|e zoQ>I6P)hGXwPsE&nREP1Sk{(ms81-)@=FSVErv|nTiS9`X0)g7lEsKfGF3Me&15sl zkWszzcC4KCe@*3a^(h-KF1Psfv{tpHf7-I%O63{|9r09K`@`)ct8FDtx$iOv|5Gny`mRs80NYWIIV^!^3 zQBwzmvCu>c>_PNo9C2+e%mSUnkfX3~s)TZK{>YpI-uH}LbA{zpK(YwmZy+yB@BI3m zkuU!D-$bFIWIf+#eX*s6ihe{n2$o9x&2Z^6!+#65MvN;s(?PfPyut{)X1e)!LiBaQ z3H<$Qgk+PNR3K?Qi7*UKPY0Ya;NISMddOva?(zsK<7u2}tUEWC*BP!QORfPrJ(hg4 zYA44lN0DAn8r)NXikimssSG};L$kPYr{HO>?8nmGL8;DPo2`(2oqm*|$l;Js6TXy}zBSQ(n+i*3WP{)!HBTuMUB0 zR&pF3jJcZ|%52RQ)uTZPtUbJU364seyBHO}xRaros9*^d5$cr@oW^0b zsjp0v1x*3ky^p{C1Klz?Vw1SAk@wbMLd@D5Pqt34^4T=XWfi1Zu4X)d(jU`5#dx?S ze55GPzk3xa9@KFC=5FUkWHt> zv2O(!`QNlYYt3R)I%jJ+JFQ$`q*32iY3VCIRVf;0;*5N`fgU|Bdhe>%#I9yZ6~2v^ z>Q~=0vUSB(ibakTjn5Hn;}&MY1^TI@x77GYwLl}TNF}DgFhj~#+uXz(yUitpb_n6F z5yR?uSX=F}2+v+}NoT5_B{;2GC2K*_Sdp=S`0NIbD zieCpJP^ZkoWUosGQRKv=3VxEdN*q&oqA5c{#S~|#Q>Rd!OtCxes<;MgzwZya|L`C4 zc6l@7F(3k}`B1I>>5>)k6u1EFTKRqYMy!>2&*MVI_A&|v8^wCXKeRy(jz2Qai^MeYO-@aSi|N_sWfp~^J@#5MJxA3YBmXqr+DfNtbEOXIa~eVH`ZBe zt{b{8p+Hsi1PqLLDpk#s)2A6m`WB)ceIEtM(G$wN{JsNYW3V2_h+2^8`YvNXSw1eF z*{M~@nQz9aH4exd59Hm{&ULVhGqdA@=YmxB4uwsf^*Xqlg81t73|1MHE|$qJTF7T? z+T=?-qjeASwl8!C^bz8$%&)Y9S|ES3_f9zQGzOo1aSo!l6** z+rLJyIlpqYzC-qt{{KCnzh~y;g30WTz|g8=diD)2_>2+m$P+IEZ06=clIa3Jbiy{y zM7!{?si28?S~vBljTG0UOW561cu+8)DPE{p&pH0%nIGBunzg!T;AEU=c$t{R#3#m$ z@>gUkK;bN}NK4vSqqv@K%FL`dDYqLNl@G2SH0~s;krPqIi!tNGq~=1GJRKqPqmEvnz17q6JZv}~9-Uw-zQ(SsUHWdjaNuDw9I+-zlNwH=6y?I0QK)SUt zVDju-@(!4?f!~{_y*>wnJ_r5o_V+svXrgrlde`ioTkwEdPra)P2$Kf<4GDSm_Rd^e z(}6@R?eFg^C@B0Z z3O*Qqj3>Ui6$O0S&bXW1zdYa=kzV`8oU=SA+%`r!+THq&(8_o7Xg%lO{@dhmP^L6o zSk88h%s~Q9x;ofA=JePRxwQBmt{$WKnF=2*ddGm>L%@fj64JtX5L|ooUKz^4Q4D;Z zb~$x7_;5Fb^W$n4Dm-mq#;n=Ns<{)!DG;;u0WumpzjkkdpWL@!q$rK9JGu~^R=Byl zjkgVBl@0H7Tcyb9hnXQjH&iVIufNE4Ubk!AWYTAX2m2D>uAo$3X7IRO>)ua)rcP!x9aqLm9l3sCF894i#_u6y6%Y{e zyiGOv$rZ``J{ILC>Y?$2Ry1D5>q`25|5ZY`TiQaGa48e9I211Fevg$_RCz2OrG$eL z&O{5+<{*nX7@COvUB*Y|hxZ&aZH&L9sy=$CGeqP0<@-Z_envu>IhFL>hIXi~;MCR! zwpLYH-TS|Pm``(vOvgY^h1=JTLSYWJ=aZ9&;9wXId=#W;-5Czr6guz_z6hyNzrmv;VWeI6l(DQeO-}4_cf^HESz6Mv=DHQq^=d3TA-_jYWXuJkB z45uIb6fUf$O|X$gu!!w5PZy*lJ%^gBc#2f$R#usmmMD3_$i0b}J>U;1*&=0HiEoNK#v36lqM9;CwKrw4Y^rhHDOs!5b+J*f7 zTNa8-*c46bd9cyMSv!7}eRPdIhV421#nn|k2o%3$Gh(hgWXw|E+&r|q`#+i|+ia)q z(|^y2r*@j0o6&9i@zp-?x@{22@o9?xg5;teuw?<5fw2L#2(GPeSo)h~Kg6OebFb(a zaGU6|8*9%M8fA(XT>}ik>B=7j8) z7brbRm7&zDAtlI^_JJN?!j$XIE%zvpzD11~D)dqu3&nB6xk&Vp%6 zK!HiMqIjF)Z0*veCxn{wtd)iC3Zdo-vID(e`ae|ZeBo)%&q}L{rpz`yn$?z;#h_gfm@t?t=q>S7XkEooI-Qp~W6nhlan1>=vlmW0K2 zGByIaQ9ByaqV9~Qb+P%7P~!6zwrd-G7dc6$Q!HPqSW1XDL-7au{h0_%!pb{W5|dCl(F zN3l6+-1$n~eJtJJj!>vLASc)it~vXw0&Nbp`B^CmEvB~SC5~K?B6!8e*)+wWsl zk<=AGGBT=hLa4s{WxJ)F8GuHJk0oOlPQMRwGi4{28JDNv6%K8^Fz;vIN1TeHY^RCa z$w@C>l$z`LA=bSv`>ukj>K*Tm?VCL-A^hFU=-U&=uL!*-nXb=}hF+C%k{$}9zX@c& zNrphgYKJ%?;wrd9zkizx_$$cjf7xpg@EK}ODK7c`!I41ybmjUqO=JisSlq%2lUfRY z`GPwfE87A}CA_L|x~6w_jH_qUiE8@5BFFl`4M$3Bwp7VKlm&3)(9*q*?OxZ(Yu2g$TGAbQH z2yA{boW!DJX_jyVBxBq+t__WDW(|0E3N!L7|Ff{aziaKz@rsbGf+@||6%eT$0W;PxPf$}g?(ghn8(2$iJD!qGgD#j(uxJgKS2Lp zXeV1d{&{K+@HYHcUFfuRszkfD%oOUg`W$uJu4{t2=A-k}Z&32dY~x)Sh}vcDND&na z)KHlJ-lRsVTLEFyMeVBCbBNBoZP{-t{INl`IgKTlOxXK8*(gJNXYp;yyO?U7XSEUWNhy{yPy zePUkCplm!FQ+LcD(b_1@pjO12cT$5nt z%`$T7E1fo>qd4_>fANX2t5T4A2_9Gu5!;^))d15$95bEXxs!9ywIccs7xYpW3pUEc zt##Kw-{)PSbghj)cB9NOQ)i(rMW2rO);ULcBbD7dBJbQeC+X@C)7O?X)S@+d`}SkJ zLbBKeW?z`IHTR7-NRL;N40dRbmbuekxzl(B#!hgj8q?rfz?^+{nVg;ajR) zu%$_8vpqlR6LpS3K=9pNJg=a4@aqY3_-5?XRsSj9;r#`pv|)y=XP&7mk(qn0(+Q8s zwlgGKYuMD?l()&OnWtWxaFs#HuKQs&ZffsV8`Ql-PzAxpZP$oDz6R+v9%hJxzrky9 zzlKvAM!Yh$ZVI~@#j3RMO#}I+d7E+@Y(0QLdkgpdUa;e9H2DAKaIqk;?eJy!N-I&O z5kR|Z_>WI6)D$F>$N=v62`_&epaz^;{7V+Ktg69DL_=?bS2a;o!y1&8C5>Q9GQW76 zkhX$$LKrAgcP12^1&_=uY`p3eKezN6Q}@COJi6A2{g`AD7Uw1zj$+GPiiGBZJ6k)y z8kpyclouEP%1l+rOnKiSA1lf!WmEHF$GTGBAIk`YH3HG3#hJrnVQ?$gSzFx5YnY|h zlZQnDSvHGitdrs9SkOfkJqZtqB2!vMRF@%88rZe6os0%sT4fPa$wH41tHxQwvv_tj zS=<1Ctz%JOxX+dGZ!&$bREV07_t)qkKw<V4RO4z^2 zGo9&`q#l{GuNCj?JHH1-nNG&*n62umR zHv+!}|G3walQVgYZq+e|C)O(xnANQd|IRhl_jv1#tvBeAaO7Du(Jh$9Oc>^B!N1UY z(Nj@Fmj3WNFCsN)N8M;=h9sGOMC;wxFWJkNiV?n>{qOT1;8bQ^(8_MjoK+`&d?&;u z0LiXgS~Z0fsfB)<=bk#q&INJL3}{t7NPA$vGJwy~=WUvOq&OVyTv|c#3#NzntFa3f z0RM#$OPyE`cf>|}_;6Q}-~jAr8SdOzEClu>n&{|1l-#ieQGR@`7$>7~l1X^M6!fUF zN@Sd;tmYvCe*_qVCjXX62z*C>{>QZY0gCkVOOLwu zqFdOP^?S|;!HJha^^voY`LU*2HyV#Z$xjy%avUFl=p|zFm;I}$7>z7KkpOQ{)IH5D zhFBz$kAlKqj0UyBL=Ge!-7K^1&fqD_o1k-yIQPZc#SwK(&>`kBvT&Q@#qNKFqm2;HW~1q1_Gm_8XL9s_q!9kF~Wk23i~XUtX{~ zz?Lz?nlV!3kmfu>Lc)Oh{blak_dDQrUJoba7gFm}=r1_EG9yaD<}h{SKl$pLG35)H z!W#gO>n*-p-_G>F5chXuHxR-Pz|og##?a?6+f>)q0b796FKLMHl|dE@=t#ptM{Yz4 z%$%$xwNhM0L2gX(vhJvCif|2~Zstf8qc};4%symyQr!uAW2Rr#jd;ft7^%pAmi@?9 z{vcePrexzy|K%pMoD7-5rv|Ix*W+d+ScEY8R_!QYDrw+Ki|{lg*@}@Zw4b9$4_(7j zm~k~a3j^sgM0F_0i*6KoeBf;G zPcWiRD(s8Ox|8!t170WwIvq&LdTgWm@~q)r0l2u?1%akn0jJ3R^SnOPoNltmrwP*w zRJr0Dg~b6@Nm(lc8uwo94)h&-6&F{3Dm!A&xV~{RPHD)V(c0G*lmmkbhrdQirlvG6 zs?3w!7dI!)d$3ykPubFB1>a;*9#6>rcz$V zr?ImA(bJr#FU#1LWYdsEFI&Y-)m$5q0-3wdqDF0KNUMO0FplR@f-Uy$LKRrv6sZ=; z+G&bvI$YKkyv08c5)BO`q!d~4IERQM&K0HXzh$})9dM;4F6c|emB$F&xLfJTI{Tt% z3Mww%M_S?9mAOO8gP(Z@*uNHMd6%Z8saU%!oFh-3#7^RAsb+J{RXY@b*8whbGNNYu zyP4hxOH1r%39n@u|w* z43?Ilr{_sY*wFQjA%+wWW8`2fMX^LGX~MYj!zi2$X?P4KtG&c576K?NV3RVxi)ne` zMt&&EJot*uHKwP)cK*5FHLE0sSMmFV%7lip_WWWl&@F9XDbQ$Up#7NE#w_NQ5-eM`Kt(QMK+$AZ!I~bVoVjzZHY= zpqhXj&lgkEMu-2?0_+A{#=D>39o?{Sl|)`lLR#S#eyOevzx2~QDstkqa0+?Y-A39c zZa3Y#SdR`B#0&}&O=r>}9FL0Uz(6wa- z*k=23yL|%PmayH=N3-K6*9*>!caj(EU1p`}74$oXpy3nQG}Ezj`nY7g++kjP4zY&& z%jgp&Oo`m<6k9eJt&79XK*GLf7anSPlh!2@o}5Nm^(f{Dn5%bgu# zoVzQ&BSj)`DJ(XoxXh~r4IEenxrsDzGpf1{YfS{cao>MZVUe9TVNBZ*e;gvtN%yI@ zqhqO?GF6$FogUNC$>{r|1?1q5)a4w%?Wd61#FVN@(ac3&nEw*??5uzf+rB1SN*%79 zrRs84@8W#%_zP^0)@q zi*s`09ygkud{V*f$2lh3ddAFo6lVKvk=0aODJ^GI)<5GY^87@SmxzmmaPu$Q`fv-5cG-|Uom^R|1M#_-KP!B>U|e=RK@iV?Yqb7 zEEJ^wRl6bbB0qpvBWqkpi(;)#wT}WJ1lI|tWaPgL6iN&a@+!C^>JVR>xH@FK4?*SF z8t`b@)}OG|TNOE<7qzhr-%8=ktf_INx8pJ)&*e?;L*nR}{io~PHw;fOcoxc>EM;~k zar?$>&;eV_PLPG^uLp0Wayo>$h&|fCjUC7sTXrFez7wY@byFCPQJ_f^MsR?T=|(mi zQB*YTP>wx>8y{8~uNFHktAGtIUliTMl}fBl4!f>dt?EBA)qhl~|Fn8XkpYAJZZMyd zXkD^~>v}KK9vG{@kh2u{;u^dP799M;Ua-v2*lA~KI})||&We-&h7G{k-Whcd0=r+F z0tNXFSN*4NZeXwWk#eMuSM`sz4FK9XWrRG+to+JrjrsKe;oV-JkjvTM@4cb#vyqpx zkxL!xr~+WE=<~ZJg6N^&LudV_&Yy0;cA$2AU5ydv*6U};jPHp78iT{6*33&m9{6d< z?%8isSYX)B*{p@ICtDmc=t~=p`bG@}cvx&*5w)&vxz@LvbO+^E5kTrmuN!?}U7xfK zwmaIV8x3b(YhTY;pWEF7hj$)*YQ;C64o6@+u3-rU&0>E>O4>+eKGzwZ(vy38}7WIx%nYfku4goQDE=t3(WA(Yj%6D z-n~6_x5mViL%eF#pN*T~DbZI7k2%7TDSRc#=p4=&*RATkCfVsoD`?L<8iyN%#}_6- z6azx8`=TnVp~bD}YG6uY9EFcjPoeDr9-|p^g)fnmrDEljSn) zNR@LO4~13NW*r42^6xAy>n3s8R6JM{Jc*;uAg@@x$Q*WHjC^7Y_f+14KEtubed8tY zt?Y|1HRG0jBHFr7OqXjU{08wRiv#!h%Uby(E@*yT3v)Br&Ng-xjWO?I@LiCB3BKdV zpU{I}sUz5|1M*~E1D^QKo#o5^D?gmottM;XMOE+jmvfS&7pY$kc6P>WnX@*{3`|Uh zzri;*&c$l9bg5A#p|FoDTspZr=1p3AP#|}IyRWbHOFq3djo!$wzA<2R=1#%H(a!Wk zl1ZE&yY4jqT;T$R>BS$Y*>oxM^_q;ZHeRlLncCrg`Wu!1t4!=f;;ZYeKG+<&`>pF4 zP3T$W*_Bo`H&|$Emi$=}zug=MPR8Compy_78J)*fE1?+CP zKziy@oo#OhZTj{?TevU515f&&1;8<(g-5E+%}uZ`ptu3;zz}NVlCi}P`)ZkrAe+GM ztsGT988Lb60Jim7OfR^vcYM5qJjwspDWo;)IK5}p$amAcyZdrtYX1zpeVv_C-_tYm z^1=sK1XZIoQRxhOT#yP89yOXl-YoUGUezSybVF0aFK6*+eO@WY_>A^j{jX|fv~lsp zOoEA5dxSpGjp!v(v&s1)dRl}_h@>eauGBJ8-zYx-yqf@)Nq21fylej$OU^dS3qi}H?7YC zLv6Cbq!z{ihW!Edkg7^n?@oC{Dhig30ZEPj=^}@;`gW4UlM1UihC4!b!zg{6L6JmuoGfh==nGCL!i6Z)tyC~)gtQxJ4q^3N& zWV5m?ZL75Yvi*E?zUo|tNGwfqQoBado#9`)D{LrL=t8#ZWX*@5>N5ZZ&K5c8CpKOQ z+8Es(bKRhx zOuk2*8lqNLY1@Md2`~2C+Ijf+_TLT|&(HO$aUrMo$DKRYtu5v}{rtz>R{}H76|;g@ z8(c0fuGRJR+egvtZQutQDk^I>8cQ}BWJgEq9IkmbCb`>%l+A2f`mWp^#>P%DE-yoT zB-@tm_7h;E&c5{*xNJRsJ9`M>+BkL;m)3mA8*{GCP#42ecWLSa#0xEjYiq|`^Mgvh zYg4FX&(tVmuaFfll@%?Om8$&TMa(1B9BtJ=2C{G5EBQTnA44XwhG%oCVC0lc4hUQx9Kv0ZMMkV%Q$bYKvGI79XC(k)X8QpoARYB?KG8nfzhZ?y|%!@FRXNq z_6%;M{Or7}p)5QqkBQE=qx|apPpNuPy@7(Hyr86_=D|{G($AlAs;;~xNj7r25YQh> zZGK(CIyUgYNViLM!TkHalnz9Xka8)S|1UUC8kDqCqp|!TEdaN zIB%ym;UZHtO5Rl&(NrlmU-?xK9n>B%xekH-1&fkg@gZhiI!aJmih%PeRuiL5RbjPy zMEy?*`<{@aUDWlFSMQnxHm)j(Qq>~;MYf_P_9}K3M}5&QQ?bT|;k|Xf_DjLxB_Ee_ zFyahtaedqGwi3a)QO4l^t}SGe0}I3}z>$=)-2rICO*E}@L1(|<#K$`vya<_&efH*37(rn!LaiiEse ztLzLc^I(bW;sjQ2B6?r53qs|_BelY{JYySggrR-}pMAo#cg`&y58gGd22R0oD_7FG zDhyoPNK=u6_;USU<+{D+X(Mh+u;jE#rCqI2TS*>p6YUx3Erpm%1>XUzx&-4A;&61b zoUZn%4ELCgY&kO@3Q*YYRC?ny%b29q6=K?|VFlSy5)d|YOAbZ))gVV#nx`?|`6$K3 zj>N*Th^VGCEVRuA`v`w_8f2Vvy*poc?B*Gn*RH=lZpu1Fu&T1$Q1QKie<8x61#!g< zr51=B=Oe~@>C-O>_Gi)+-qY~Q#uy_~(tYQ#xfvn#`PFsGq%b^m_PDQ}Na9HO z#ADktpt>!1F%Zw2gKP<)BaUv#%00AP<}|oC8R1>mJGz`>$|uZx9(33N8Ib##6=5DL z5TZ)b04mXy%AlQ)H~Z($q3Whdp=uGKjvJww(!b;|BJnIB{#*5m-=2NF+dhT)r{Nx5 zWCBHP2F+v+twjArfAq>#z%4(SwC8_gtRtD=A0?8ZHO&!w1i%Xd)4k!oR`w`?0W^;M zTn=NXOGW&F9dAt0GkOktA`hStI7wlmqV;EK9N0EVNTkOruwe=C&E2%e=s4F+1B@i1 zwy-|y1~rvM0&C%nd@u3|N|ofDVBe=1F=}LC++Q`>zx{`sefX;@ z*FFYL5H2__cT*9y+Sl&d!B}5Msz!@6Ii4&VU%ZiH;w%g**g7&3vY#A?Ptu3$XrQui zua8UU@dmrE-KSE|>0!$I8WK)f&uI+7sp7t*Z0v-a!);QNp9r0bddi@6%S(+Kxb$DE z=lw;Nb@-Ai=`7PQP@#k%lJOSv*pC2Lm3&GcU()y^Wor-NC2GKGCO}Dg*|q&H=!6~- zP)`ZWPqc#Yh>hf1F6n>+MgCXT5`Ks z)en+#qIV%UTjRCMpZQ%+cJdseD;_mDjk-tGB^GhU(~-v0y#HBFLM7&iQf60H`dW6q zZjNl7E9bq!Sm`V+v2QNePIcOP1h&Qzc#HfM{paFh_!Ljx!5N4cKwlD-?M?JsLa9U} zOr-FSSko_&YLOp?B0qFRXi#-pq36iN=EM*VqOiqN#|tUH6xKV_>lP{$x3W6OgQ+w1 zm%?Jf>WjMU9wW3|(aFL7oRu&rsAch0%%5mKg+Hm8X0WKQ*n@t{3zP*2lnMEDvrj|+ z`~v;c%OB9%b)56U#Cv1la?v(;B{bsW6L!cEaYzxdc{+0FGbD;RIbjF;~iYIdk-&K*5R4go5Q!`zI!^50Z7)MTplms zi~aYKZ@)pD6{kw9oltj{z(|l-r|l2}hM5|JILPXtE}8SB|2eYh#yKA4?>vHrU2L=Z z|2{rhm~LXSIizxxrczm^NR_7Ym2x#H*xBH1&$D;d0u-zzx=k#cWoPd>vAsz`2h@xy)rj6K@;O6L^FD3-0gtj)h&$DMdge+K@+LZ2)s@5 zQcg4-6=4bQzbR8wRxN4ltJxTTGSSWOGI}WuC}!KnBuAKj+JpUU^!5wQB1Mh`h{q`M zYFYJb{Jr?3oZVx9delwOAk07_^7;*j+4(HhRb=$k1CgiHWYs=Y|1Ap$+?c(|x5*p;M zo+=PUJ7u54hXHrU#2#ykZ6iU*iDqJlf7EILE&YzL6{jPR%kISoxRDY2 z%jGpuFNiV0gYh}v3VGd*Z4t2E?6pziXWV;zk7xKr^Wl5PN4TWXjDg4tmOflZH*6iq za%CxC1+QOP%|e2R(Mj13`u_!N~{o z*4BR;V9xPU6^n+sU(;41wzEZ?Cv*BR`dv)OcJV4z@jL<=pR>K1Rq>Ez5cFU2Wwu8U z$z{zuc3i%T%dOeOvvl3WL)(*=08g$`wHCci^UF~*J0u_#_uj|P0S%D%U$;6pRDQfj zZ}gn0NL!7$XJEAEA+-AgG`{Tw&1eiY{SgW$i5hM>ZBYk9{&KZMSd~kr1D&{Tic}w1 z`k>oeM$(3ZQg-fOsFRZUiqSd#I^pjD@!_d+#2486QJO zk?^OykJVV%GLSRT6gUlKmSOf$QW}zvI@?mye+qj$D?9i~qN?$p(|=ax#}Fu^GzKGt zDfpvmhZL_3!lC#|sA+w{^Zs^#Dg76CfQr@ZSZ*CxP)HT^-2}6w-^1j(ak; zB98Tc*fZv=6s_E;VyO5nqhX?#e)pLV9&wnuSF&oi@Gdeo`m@Bk03r?*X`=~hMpN7; z>FE<`=@aVGe;6@~5yQ0>9Q@dRaY{xnfB))qn7sz-b-=!znsjW;3$+tOTJtH#_cqL& z?qs`!Ti%+EweCnlhiaFI+P z7th+u3Q9mxnHvr^-aci==f&+kaVLS0w4v9svr~!Xf5G`uk@;GY`83du4DI}4|A9ck zH@OdWZeZ#9*1)$|-J8|QG22S=p6bYg2i-{i6I$!q;@0ZWf>e5hEQT@LvMqoC9xo@= z-hA>+eNFWLnGWbj?aN3(hCdy;0^Ww{BXuk3tZNG)VX-?8-#eMkt4ie6#X^cu0-J~f zn{rP!ursA7o1)!kc~_KX-gp3VY!=D3v@I<<8!O1cV6kLaDZ8>}JDWQ@tNSxOqDhBx zI{R~)wyI2~*D=i^f~6l^l% z=bI1`)nvmJm?`O>DQc70yfTtU-yfC6%498#+kzz&NTOg>#RuAa8GYoPEudH0ltyLz zC09E}CI=1a~6hGt$> z=)ftL_AC5JSnKabLW-N*h6R0f{L#!H{ z)58Jj`!)0}q2u*6^JqL(hw@q>K+bRXrW~0mxJ{KnT#rUxE`;k9d|ob2XB#XG0pj6H z{E@0-Q;)*f^(pUpe)NZ>j#i!(ax0A;q0D`&KN$PQcqi6hR#(XN8TJVo#;@te+v0K1 zaOH+KZxi$HzNF3h=*wPQmA?vU3C6)c2vPmLCG>xk`zlz=bLlsA*v;*WCcIrbE#-^8 zzT5dq+`awkS&|1N_m8uuOX)R%stHz<2MhAVS+qHw-!8H9e*zEoY7IF*w{f?HbI#v3 zhv|dHU1JY7wv&1Wgg=o^m7zxfXxY(W5A!fur=)W-!q!9)_H zqD%&nm01NSHRFSN51^WSD^{h%*&viSFue!cGR(F@s0i?t5I!qU=sMLYTEZs~Z&ttHBH!!}6pt^_QHR{A| zl=Yd-nSiqDbda?fz1>k-5}4@HQx#ZyI7SX~6N3ks9^99f4b$rDdHNo9aKQ~=;Zs>Ea@W zrR??@OGH!`OZGSXV%Mw{EahnAGg3131mb$7&8V~`5z9DfSz5%j>)Qu;|yJ? zNHhW|(DNfzaaWLq7*Bu|6&uLvW@ zSniKBioSW*-)gSBX0E+wu3x6FJRwh*uRUjYdEs}Qo*k-GUx7T#BrO18_b}Ab_27x^ zq3x?3XHVe9VDP~9(6Q^Tt9N$>N-1pVK-Bv2(7}y~$4gzuFC#m}AF%*`xZKb~$Eo}C zTK}0#zcXRN(#wNOcb@)R%`=qCsV1=C_A&C*Ra*~qdHC20 zHM9O&Ra?2WWIfy0)HZHr_Aue+5LGXRN;*mbobqSEv-pHP4ESB|Ff5-N?fa+T4=p@U zlq`kZDHryl9b=Ww%CcL*qR$678uG`pUi(nleIOaTcR@6ObiA`vbFem>m^rVHK7~fq zBST?iNtSTMOjea;em#a>Ui(6vbhS?--gh}b+ie#?B9~PzVkc33| z+|zQO`J?Rwjd!-tFv3uAwFHe7AAf(_CD?meqHUVdp6fEZJ|dFyxn`^>D$HiuF>Zpl z-DEMGB~N1lzpXXR7-f1q&6iNprn;>0M+5RveMY|59Kc5-znAG1+sP8F zQ8e)cgOA**Iodfy3W!BnOmv!IhdnPT{UtFDUL_nMQrX=VNQvM7m+g0<7n0E_N8loF z(Eot$GlJclD&C@|CYC| ziib=8&&QN=NR>DB(qX?DTL}IBlq4fIg+(J;(wGxQp-S9r8LAPNG0V~HsoT+=ZWA9e z{y7?CbaP;;AK+pnV|1%UcfPSY|9>q&@v5c2KP0IMl1bCDyuL13$lGtzyyeWxBjmp0 zv|P7RW%Ac-XuEFPY1xVIoF@lGpP6Q4gjrEhlvk+x<2n7`Ka91D+P3#quP#GHC8eIs zW_m0+Il0NnNfwAf9P+=>t;Pm{6<9naSv+Hxd?ZPoVrOs$Pj9!KczKl1|M2qttX+|s z(^c|v;G@cb$E5BmW#-OF4U(r<102`Vn-zmnY7$Z5c8pXo-;qR|F*!5f;Z#j&<)TZj z-u2K)HptFb#GuE392Ui@c?t3pBS_x#QP#}TG|$I^=(%gfrQC4KBJ}RkaCout#BkyqFQ;sEbORAE3Dp4?Wi`c_4;1O&sh-qNuUh6*J^uJt&w$n67O&$mAHtDAtOW3jeI+|5>XA;IOXO zMqWOn&Suu5MIk`(;fYnI2w$-qvT-wQZfD6l!;RsJmL#AqBr5C+RkTHrupG`uHE`r= zt4kMS&9YxU!#+bHvdF>@wkBzIPZC_9*Xv;8axc+VMX9T!7j2pAU312AVc4In#iCF< zV6A-{&Ax$h8D~7GZOp|}d{HnX*q$Ib9_9MyK$VlxOj)9ZF(6}XLlsz_;z^yh>p+z{ zwy#Z{x)JuU$Sk>O=E|CxP%JH(w!zl^lsOx+6isW$R^d5S_C_?&$cm&y#m4p$I2%Yl zTqHWYdV*_jW07A^WUYon#MI^5^f0?3^fSyV9_9Kw(VPlj`^XV~W~q<1Whs}u-+VF*Dfahpx)o?m>S`;RVs4g#ZV*dI@szr(UfG$A)be^nomOOB zZPs|V(C;oNxEGl66Oxh!|KAmXCKWI+WoIP$4Lxz=-467x?PVueYAgQ&^E+}PYp}6Af^bOt3SG_ z^3#@>G=;Ssi?o|1-7!tEcDDDnI>(e(Bb#;jFjmYn64@-XXfOZGTKS8=!n(4;%8zHb zR#YZ44r@Z8kthVSFBi>7dz6b`thpxYuJh&inb&OZFe$-E+}jY(niq@G5>7@M3!T77 zS{~8~cFj9Tb$BJj8O3c)C!iETMt(wOopOv+b(gQKM7l{(P~8(<6$BC=S|dBLhjt{9 zy1Gz=mU*O*_JLF~`aF)c-3IjgDAD;pB=*ywj(HP`_*f&j?8cmtC;)`PeXh-M&z8tG zk9=I4#C<)u%X3O<3%Me8ivV&p3ePlL5xWy2Hs{={?Ey7egiY2ttw0;Ve_7s%?62sb zOG83hU#PGQjc~*VDop0Jk0e~B-ls?>@c~Nbo8wy z`Rk#kNEbkS$_5*C=A1Us=um^1;Ofpo_!kj(Qg4 z@?W}lac1b6gIEt0MguA=i-^!3#kneJcTsV7)pn#sH`Kf&V0T5}4RK7LQObpjU~0vT z!;-=g9z}rauS;Cx1;4)Q=61s?N}Awf>rwZJ&XV7BJF(NsZF*%ljqiou_+f6CZ|cTw z(i1aIB7e5qCKb!o_s=J}H_#{TE$4D-m8MB7Wc3x7eGL_Sx z$ip3$SO`{{M&02Rmfo@xj_6fH-daXR1 z%vkC{J!1zam~xHi7BDvHXJ~Bf%5kRh(atS-=f~72)Hf<|r7kS!GZ$Ar50bloCl5_l z?fOfIN2(0=uZ&}=r?3_^4^(QR>)YmME}T(2-Vxf)C}7sbIr-SczP>)ve}t47!xV%9CG?8G z3_#^-{to_tU4tEi)`;*`rE+P`8(sL&3h>8k0e(*QIMy)K&uENg6H%in(|i|@-`gP# zsSH*ZIxoHT`jIgM3-8Mpet1HQ*25PA&_EkrmsBSxw5zVFZz%(KjfMMa3{B3VxKzT* zGhMLNw~m~xq6w;gPvEE+s2iKCYQ{E|0r*`d3j-Y_!kjdkke8*JGz{NAQdk1XRl%LwV z9mt0zL;vXBy-AlrO3DHSHO7h)+f^4l^~MEx;ODE}U3{~jwIMpFQG4L<0&ps zFK6}|HE=~3Qb|prNxf(%U!|9^%)(yY#8%t{fllm@v);tSbbWL_H6epZ&}G7h)wn;x>j4Kw9#SD5GYaGc$c#K8JG zfJsSHw~q*V1?FQkID#6@vHf=c3(Fy@ieOkt;bd9MQ?ztsBr24dM;%gQj}NHhM*G9@ zU~bv)#+y0keO`G`o9&PkC>+mB zOUqFKx3r5dXtAe~S0Ke*$E?03)+i-`I3@HNnbc7pjImbCkihCaE%*9JEPcbQKie+n zJs%{Aq1{MVQoZ{mQ$LLNFUtu&YQy(X#owCAd7R!GpDKBOK@~|v5;VT;z&gEi=lP6* zQg7m7KjrdY?_YJQwp_x3ew-uxvPruxHkkI3Dq989=ST?i#Q8`~q^Svu%y6$CviYnDyGQ%2AOTo z7YCFuOF6m3VSmo)93JW1J7Nk8Dcm8& zAIrsP2?W zhf^Qkv#VZ6#9!}`nX{^>(+sKQ;7Zv$qvwRIa2!%4JiMWl&s>s^hL_Ou2d<^374`T? zo^)7JcK(t*dF3{v8A-~^mHcJFr&CT>G(41$gezfh$mr%(uWlxxnusOy%K|fl&T&*a zuE;=rB*Ac~9C9l;Gj)AU_v@3lub1k}CDxZqi6g}C-L?bomG-aihI%0I)XEB;VJ)QJ zn__WsQJI9;xG~ddnaNY26gv19q?LiDl-W)Z!)6^N3)Z;=n{vLzQe_rXOwEJbZ4P4l zC05pbjU9jCko_GI?mhlDBaP>^3h-!^$YuQ{s9k)#0$`11Nnvzq?ENRu0?6lPFEigv zrMiwT5yg`_97`J+f=XB68D95+1+lI-xl*ec-iMxbhWRpjiaKl~IwKk-Bs~Tt-@SIm z#gTIDGp~gFC@)j^xg0MI+~;?e%S%*yNk7{OGs6)s`g!$Rbep{afjC~{Dq!wJ`ZqEJ z-t|zH9({?(@Q@x2&#&9zHD7QXo$OL_xJHB-{w+V%%*r-9IUR_UB^J|HG;F~hCLDH# zd#A}EWpT$xfYJe5d-(P7m=~pkAZjII#cIT?$&@Wq^isGGJ6I)nwy4jFuisce+)?=t zxBdXw&-F#@E|emg8kwsDzGDD0*CJc-bt;YY%pI1wlpyV2@Va-8 zY9==|`9p)XM|F5jmaLJ1SN?}3TXQn8B1{tEu{?7TTYY-}pei~b5?XQ}7(Kp=t2W3= zA7`$PHnA*U}L&pg7~jP8%PILuam#|c2ZbY!atH&sU)3KvL3^TMRK@wl7m%J=`^ zeZQSK%JU%{KLfm!=FJJ;Cw`1QB1Kcra$f~rT!^+0X}E&8=l(556jf&}wxDJ54O?L= z{9WUekefl8dT-=Fot$Iih_cd;HFFNUIHr0z(8Nn+z%yDi^R~`fNijG`4x6m4%rIIa z1^;F1DYyJ3HnY~At5cj>zb_by&3&A!C&Iz01U{lcxQr0D z(Ag<@ybrAcCbSG6H{Uxy?&QOv!lzjMKJvReh%BBTJ!8V{3gv2n%G0Hpr)v1h#w(w)pIN7C3q(fEROH-ztaw;JSp+4ftU#4?Lrl z59Ig6P|g>()yyz5o2wX=6mR$+fWH4 zs-8J`6FHBlPs{qfofd)iuhh0u2&=Cr(o@kpLs9$!e&72}eb6Y^qDXhI4TOYz!F%ADxG~%x`FHRi6>`B5vwJ zoTPsRp>(xvGUsS%y{E!ZQEBPC70t&GR|z&6$!hx?b9#aEF%xXV`yq(|{vlmC#FDV| zcqiCwwB-dN=`m&9a57@7OhJsH62*iyZh+-ubB}WP1z8H5RJzUzkrtW?W!FPinrV{? zL8y#7DA-$3u3_N@!Q4Q_ga~U^_}e+XY}?u^#~#YM$H)La>>jQ#L^*;yg8}I3oTEpE zWrGTUhstjt;J+n@A2j?a*;VGw^b?dkdDAIxoOuTqSJpSodBem`yqqNKM8l~wET|yzJ;M^nFnnC2+eahytY0i)5=2gU1^(0TYr7)d`#{+>*}S6>J|7N z=zqd&wD*IDD7<%psBdAu5wZkAws?;bPeI4R;0JgI8k0r2}|}F)uX<(BE9aJwoWMtKR<_@B1!jQ7@;--m@u1rAt)T1Vz7d-BP4IqgX(&~S$4v=Sx*SVDe@kPGhD zyQYoI>7mVdicvS(w@o%5vaTmiDJ$Tw@58&M4EyZ2^ZB?de(l~al0j(*By={tweW%14a|0t+y{qmjG zdCD!}@m??OXdozKAcnOiEv1V2NLzo7LXYN!KTx|43 z+lN%D%47*@%c4~PF;&}E0J7#zV1qaTB4xe}e{%sHK-}zybQV7(Z|FzwE zLJqjwcHIc-2JJY#^bc2GLOvD<9|W?~3mb@IRIMt^(| zWIn049(tx*a}X{&a|{vtz!6v1W5`hdvLp|b=!ydTM9%@86u)rQ!?eSljRnRUM zUg*J}@2x57^@3Ux#*Xwvf~-v_Lu%Z(Qd2*_rgXupyHhFCDdekS2G>!9(yM&Up?D6L zjH0!TrRbqfOdRGxumOysby9SYN1jEF)&XBbi`KLT4?9V@PI=+2XP)ApP*hC5jJw10 zjj;?biexKLKRyHvwB%{vqToaZW#{gLe;v@r-XEsD`)iG3wBEHq z;B@V9bu*RO8ZjqwgYM>#%^@j`o{g_0KUX2%;TS7d7|~%2&&^_U#R=wTsKa(!wHsY@c>%k!NjvpnR^LS0I=i$w6U?LYqL6r<|m3i7lkZ z9^Zci>DMfw(3rp%nO1yWI|%S`1cQ1|B!fZjh29;a*XvvopDSqoerNs~3b)(|9}m7z ze*Vyb{>HrijWe1z1ok@Dn={<67N78!>$c#B7JFZ6cs~(RGcf%VI+w!?zxh+gzP8T+ zOAPZCKg-qr;7Hq2obdNm>(l$!YnZpEpfA3G%5Q;sX#?)(=a5`j&8aqoGi2It!wKNZV#$ccRe(W~6oe`KfY~vGS_=*q zboT(QtgadZ#KvA;@H;xdWefC-*ci-dyQw0tSaZ3##G89uOK!Asw|#$!e+CQb1EmDw%|2Dk*a28S|p%$kcvFnCwQv=LatpyyN$h z?ovLcz?(tZ216n0(`Sl?T;USZ8&31eG8jO_hj0XtOiFKp~ zLorr~M@Xn|-+9X^y`CRwnTVPYg&n07uVWy3!J^mZpG(oYnNso3HqObpcDNy3j0O#| zTL$yV8cde1iZFzt*YfQut<}glDhPJ$g zGhIf+P!T~HKY0|uQz+F$hjHMR6=`OKg#%|`%kEAA#-ac>J)*#$k1ZR7G~H$Hbb$rc z_``8d_%`t)W9d#wYK|RS>QR|Kal=l0&Qv^SA)HSy-qoE94SALszf^%u!Dk8S{QcGy zW&D`XK%Ao`+|xOtCd0hlQtK$o2=KGMZ+VAWje&o%_MAeEm=w$-+EOk8VgKrjrMk_< zTdaS!SQ|r-!_&ABg&g>9EJfOK&sA~qFPD(w#4;Qcg%}6w!|Xi6AIbU1x@r^=7c2

WrNSO<6FQ*47qL1YBYv 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ÝpdVeP9`Iro2aJSN)Y8nRx72{`RUXO~=o` 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�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 z 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

a+Q%G;5F{kgA~*2~)C`Ub~E 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�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

    7+y(1Og7+iY^iV$7h=E?e2Y4epR_W*0($s6z6 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