From de12370c46ddcc5d03a357f06c26d1ba744095a3 Mon Sep 17 00:00:00 2001 From: Krzysztof Wolski Date: Mon, 18 Sep 2023 09:28:01 +0200 Subject: [PATCH] POC WIP --- apps/data-exporter/.env.example | 9 + apps/data-exporter/.eslintrc | 4 + apps/data-exporter/.gitignore | 3 + apps/data-exporter/.graphqlrc.yml | 19 + apps/data-exporter/CHANGELOG.md | 364 + apps/data-exporter/README.md | 114 + apps/data-exporter/graphql/fragments/.gitkeep | 0 .../AttributeWithMappingFragment.graphql | 5 + .../CategoryWithMappingFragment.graphql | 11 + .../GoogleFeedProductVariantFragment.graphql | 68 + .../ProductVariantWebhookPayload.graphql | 8 + .../fragments/ProductWebhookPayload.graphql | 8 + apps/data-exporter/graphql/mutations/.gitkeep | 0 .../mutations/UpdateCategoryMapping.graphql | 7 + apps/data-exporter/graphql/queries/.gitkeep | 0 .../graphql/queries/FetchAppDetails.graphql | 9 + .../FetchAttributesWithMapping.graphql | 13 + .../FetchCategoriesWithMapping.graphql | 13 + .../queries/FetchProductCursors.graphql | 9 + .../queries/FetchProductDataForFeed.graphql | 13 + .../graphql/queries/ShopDetails.graphql | 6 + apps/data-exporter/graphql/schema.graphql | 29625 ++++++++++++++++ .../graphql/subscriptions/.gitkeep | 0 .../subscriptions/productCreated.graphql | 9 + .../subscriptions/productDeleted.graphql | 9 + .../subscriptions/productUpdated.graphql | 9 + .../productVariantCreated.graphql | 9 + .../productVariantDeleted.graphql | 10 + .../productVariantUpdated.graphql | 9 + apps/data-exporter/next-env.d.ts | 5 + apps/data-exporter/next.config.js | 28 + apps/data-exporter/package.json | 69 + apps/data-exporter/public/logo.png | Bin 0 -> 10094 bytes apps/data-exporter/sentry.client.config.ts | 37 + apps/data-exporter/sentry.edge.config.ts | 21 + apps/data-exporter/sentry.server.config.ts | 20 + .../src/lib/create-graphql-client.ts | 11 + .../data-exporter/src/lib/metadata-manager.ts | 95 + .../src/lib/theme-synchronizer.tsx | 25 + .../app-config-metadata-manager.ts | 18 + .../app-configuration/app-config.test.ts | 295 + .../modules/app-configuration/app-config.ts | 170 + .../app-configuration.router.ts | 231 + .../app-configuration/attribute-fetcher.ts | 49 + .../attribute-mapping-form.tsx | 137 + .../channels-config-accordion.tsx | 106 + .../channels/channels-fetcher.ts | 27 + .../channels/channels.router.ts | 18 + .../use-channels-existence-checking.ts | 17 + .../app-configuration/example-variant-data.ts | 58 + .../app-configuration/feed-preview-card.tsx | 44 + .../image-configuration-form.tsx | 98 + .../prepare-example-variant-data.ts | 19 + .../s3-configuration-form.tsx | 134 + .../title-formatting-form.tsx | 120 + .../categories-fetcher.test.ts | 168 + .../category-mapping/categories-fetcher.ts | 49 + .../category-mapping-input-schema.ts | 8 + .../category-mapping.router.ts | 60 + .../construct-category-breadcrumbs.tsx | 27 + .../google-product-categories.ts | 14195 ++++++++ .../ui/category-mapping-form.tsx | 90 + .../ui/category-mapping-preview.tsx | 50 + .../category-mapping/ui/category-mapping.tsx | 25 + .../feed-url/use-get-feed-api-url.test.tsx | 23 + .../modules/feed-url/use-get-feed-api-url.tsx | 13 + .../file-storage/s3/aws-region-list.ts | 31 + .../file-storage/s3/check-bucket-access.ts | 15 + .../src/modules/file-storage/s3/const.ts | 6 + .../s3/create-s3-client-from-configuration.ts | 16 + .../file-storage/s3/get-file-details.ts | 17 + .../modules/file-storage/s3/upload-file.ts | 18 + .../file-storage/s3/upload-multi-part.ts | 94 + .../file-storage/s3/upload-single-part.ts | 17 + .../modules/file-storage/s3/urls-and-names.ts | 28 + .../google-feed/attribute-mapping.test.ts | 268 + .../modules/google-feed/attribute-mapping.ts | 69 + .../modules/google-feed/fetch-product-data.ts | 99 + .../modules/google-feed/fetch-shop-data.ts | 31 + .../generate-google-xml-feed.test.ts | 176 + .../google-feed/generate-google-xml-feed.ts | 138 + .../get-google-feed-settings.test.ts | 61 + .../google-feed/get-google-feed-settings.ts | 52 + .../google-feed/get-related-media.test.ts | 128 + .../modules/google-feed/get-related-media.ts | 63 + .../modules/google-feed/price-mapping.test.ts | 60 + .../src/modules/google-feed/price-mapping.ts | 56 + .../google-feed/product-to-proxy.test.ts | 167 + .../modules/google-feed/product-to-proxy.ts | 179 + .../google-feed/shop-details-to-proxy.test.ts | 64 + .../google-feed/shop-details-to-proxy.ts | 32 + .../src/modules/google-feed/types.ts | 30 + .../render-handlebars-template.test.ts | 21 + .../render-handlebars-template.ts | 24 + .../transform-template-format.test.ts | 17 + .../transform-template-format.ts | 15 + .../metadata-cache/cache-configurator.ts | 33 + .../update-cache-for-configurations.ts | 33 + .../metadata-cache/update-cache-on-webhook.ts | 41 + .../src/modules/trpc/middlewares.ts | 32 + .../trpc/protected-client-procedure.ts | 127 + .../src/modules/trpc/trpc-app-router.ts | 12 + .../src/modules/trpc/trpc-client.ts | 36 + .../src/modules/trpc/trpc-context.ts | 14 + .../src/modules/trpc/trpc-server.ts | 13 + .../src/modules/ui/app-section.tsx | 36 + .../src/modules/ui/paragraph.tsx | 3 + apps/data-exporter/src/pages/_app.tsx | 43 + .../api/feed/[url]/[channel]/google.xml.ts | 235 + apps/data-exporter/src/pages/api/manifest.ts | 63 + apps/data-exporter/src/pages/api/register.ts | 24 + .../src/pages/api/trpc/[trpc].ts | 18 + .../src/pages/api/webhooks/product_created.ts | 41 + .../src/pages/api/webhooks/product_deleted.ts | 40 + .../src/pages/api/webhooks/product_updated.ts | 40 + .../api/webhooks/product_variant_created.ts | 41 + .../api/webhooks/product_variant_deleted.ts | 41 + .../api/webhooks/product_variant_updated.ts | 41 + apps/data-exporter/src/pages/categories.tsx | 25 + .../data-exporter/src/pages/configuration.tsx | 244 + apps/data-exporter/src/pages/index.tsx | 35 + apps/data-exporter/src/pages/not-ready.tsx | 31 + apps/data-exporter/src/pages/page.tsx | 24 + apps/data-exporter/src/pages/popup.tsx | 24 + apps/data-exporter/src/saleor-app.ts | 35 + apps/data-exporter/src/setup-tests.ts | 6 + apps/data-exporter/tsconfig.json | 20 + apps/data-exporter/turbo.json | 29 + apps/data-exporter/vitest.config.ts | 13 + pnpm-lock.yaml | 693 +- 130 files changed, 50796 insertions(+), 305 deletions(-) create mode 100644 apps/data-exporter/.env.example create mode 100644 apps/data-exporter/.eslintrc create mode 100644 apps/data-exporter/.gitignore create mode 100644 apps/data-exporter/.graphqlrc.yml create mode 100644 apps/data-exporter/CHANGELOG.md create mode 100644 apps/data-exporter/README.md create mode 100644 apps/data-exporter/graphql/fragments/.gitkeep create mode 100644 apps/data-exporter/graphql/fragments/AttributeWithMappingFragment.graphql create mode 100644 apps/data-exporter/graphql/fragments/CategoryWithMappingFragment.graphql create mode 100644 apps/data-exporter/graphql/fragments/GoogleFeedProductVariantFragment.graphql create mode 100644 apps/data-exporter/graphql/fragments/ProductVariantWebhookPayload.graphql create mode 100644 apps/data-exporter/graphql/fragments/ProductWebhookPayload.graphql create mode 100644 apps/data-exporter/graphql/mutations/.gitkeep create mode 100644 apps/data-exporter/graphql/mutations/UpdateCategoryMapping.graphql create mode 100644 apps/data-exporter/graphql/queries/.gitkeep create mode 100644 apps/data-exporter/graphql/queries/FetchAppDetails.graphql create mode 100644 apps/data-exporter/graphql/queries/FetchAttributesWithMapping.graphql create mode 100644 apps/data-exporter/graphql/queries/FetchCategoriesWithMapping.graphql create mode 100644 apps/data-exporter/graphql/queries/FetchProductCursors.graphql create mode 100644 apps/data-exporter/graphql/queries/FetchProductDataForFeed.graphql create mode 100644 apps/data-exporter/graphql/queries/ShopDetails.graphql create mode 100644 apps/data-exporter/graphql/schema.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/.gitkeep create mode 100644 apps/data-exporter/graphql/subscriptions/productCreated.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/productDeleted.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/productUpdated.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/productVariantCreated.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/productVariantDeleted.graphql create mode 100644 apps/data-exporter/graphql/subscriptions/productVariantUpdated.graphql create mode 100644 apps/data-exporter/next-env.d.ts create mode 100644 apps/data-exporter/next.config.js create mode 100644 apps/data-exporter/package.json create mode 100644 apps/data-exporter/public/logo.png create mode 100644 apps/data-exporter/sentry.client.config.ts create mode 100644 apps/data-exporter/sentry.edge.config.ts create mode 100644 apps/data-exporter/sentry.server.config.ts create mode 100644 apps/data-exporter/src/lib/create-graphql-client.ts create mode 100644 apps/data-exporter/src/lib/metadata-manager.ts create mode 100644 apps/data-exporter/src/lib/theme-synchronizer.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/app-config-metadata-manager.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/app-config.test.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/app-config.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/app-configuration.router.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/attribute-fetcher.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/attribute-mapping-form.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/channels-config-accordion.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/channels/channels-fetcher.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/channels/channels.router.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/channels/use-channels-existence-checking.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/example-variant-data.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/feed-preview-card.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/image-configuration-form.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/prepare-example-variant-data.ts create mode 100644 apps/data-exporter/src/modules/app-configuration/s3-configuration-form.tsx create mode 100644 apps/data-exporter/src/modules/app-configuration/title-formatting-form.tsx create mode 100644 apps/data-exporter/src/modules/category-mapping/categories-fetcher.test.ts create mode 100644 apps/data-exporter/src/modules/category-mapping/categories-fetcher.ts create mode 100644 apps/data-exporter/src/modules/category-mapping/category-mapping-input-schema.ts create mode 100644 apps/data-exporter/src/modules/category-mapping/category-mapping.router.ts create mode 100644 apps/data-exporter/src/modules/category-mapping/construct-category-breadcrumbs.tsx create mode 100644 apps/data-exporter/src/modules/category-mapping/google-product-categories.ts create mode 100644 apps/data-exporter/src/modules/category-mapping/ui/category-mapping-form.tsx create mode 100644 apps/data-exporter/src/modules/category-mapping/ui/category-mapping-preview.tsx create mode 100644 apps/data-exporter/src/modules/category-mapping/ui/category-mapping.tsx create mode 100644 apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.test.tsx create mode 100644 apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.tsx create mode 100644 apps/data-exporter/src/modules/file-storage/s3/aws-region-list.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/check-bucket-access.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/const.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/create-s3-client-from-configuration.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/get-file-details.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/upload-file.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/upload-multi-part.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/upload-single-part.ts create mode 100644 apps/data-exporter/src/modules/file-storage/s3/urls-and-names.ts create mode 100644 apps/data-exporter/src/modules/google-feed/attribute-mapping.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/attribute-mapping.ts create mode 100644 apps/data-exporter/src/modules/google-feed/fetch-product-data.ts create mode 100644 apps/data-exporter/src/modules/google-feed/fetch-shop-data.ts create mode 100644 apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.ts create mode 100644 apps/data-exporter/src/modules/google-feed/get-google-feed-settings.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/get-google-feed-settings.ts create mode 100644 apps/data-exporter/src/modules/google-feed/get-related-media.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/get-related-media.ts create mode 100644 apps/data-exporter/src/modules/google-feed/price-mapping.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/price-mapping.ts create mode 100644 apps/data-exporter/src/modules/google-feed/product-to-proxy.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/product-to-proxy.ts create mode 100644 apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.test.ts create mode 100644 apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.ts create mode 100644 apps/data-exporter/src/modules/google-feed/types.ts create mode 100644 apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.test.ts create mode 100644 apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.ts create mode 100644 apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.test.ts create mode 100644 apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.ts create mode 100644 apps/data-exporter/src/modules/metadata-cache/cache-configurator.ts create mode 100644 apps/data-exporter/src/modules/metadata-cache/update-cache-for-configurations.ts create mode 100644 apps/data-exporter/src/modules/metadata-cache/update-cache-on-webhook.ts create mode 100644 apps/data-exporter/src/modules/trpc/middlewares.ts create mode 100644 apps/data-exporter/src/modules/trpc/protected-client-procedure.ts create mode 100644 apps/data-exporter/src/modules/trpc/trpc-app-router.ts create mode 100644 apps/data-exporter/src/modules/trpc/trpc-client.ts create mode 100644 apps/data-exporter/src/modules/trpc/trpc-context.ts create mode 100644 apps/data-exporter/src/modules/trpc/trpc-server.ts create mode 100644 apps/data-exporter/src/modules/ui/app-section.tsx create mode 100644 apps/data-exporter/src/modules/ui/paragraph.tsx create mode 100644 apps/data-exporter/src/pages/_app.tsx create mode 100644 apps/data-exporter/src/pages/api/feed/[url]/[channel]/google.xml.ts create mode 100644 apps/data-exporter/src/pages/api/manifest.ts create mode 100644 apps/data-exporter/src/pages/api/register.ts create mode 100644 apps/data-exporter/src/pages/api/trpc/[trpc].ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_created.ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_deleted.ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_updated.ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_variant_created.ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_variant_deleted.ts create mode 100644 apps/data-exporter/src/pages/api/webhooks/product_variant_updated.ts create mode 100644 apps/data-exporter/src/pages/categories.tsx create mode 100644 apps/data-exporter/src/pages/configuration.tsx create mode 100644 apps/data-exporter/src/pages/index.tsx create mode 100644 apps/data-exporter/src/pages/not-ready.tsx create mode 100644 apps/data-exporter/src/pages/page.tsx create mode 100644 apps/data-exporter/src/pages/popup.tsx create mode 100644 apps/data-exporter/src/saleor-app.ts create mode 100644 apps/data-exporter/src/setup-tests.ts create mode 100644 apps/data-exporter/tsconfig.json create mode 100644 apps/data-exporter/turbo.json create mode 100644 apps/data-exporter/vitest.config.ts diff --git a/apps/data-exporter/.env.example b/apps/data-exporter/.env.example new file mode 100644 index 0000000..c25a2f2 --- /dev/null +++ b/apps/data-exporter/.env.example @@ -0,0 +1,9 @@ +APP_DEBUG=info + +# Local development variables. When developped locally with Saleor inside docker, these can be set to: +# APP_IFRAME_BASE_URL = http://localhost:3000, so Dashboard on host can access iframe +# APP_API_BASE_URL=http://host.docker.internal:3000 - so Saleor can reach App running on host, from the container. +# If developped with tunnels, set this empty, it will fallback to default Next's localhost:3000 +# https://docs.saleor.io/docs/3.x/developer/extending/apps/local-app-development +APP_IFRAME_BASE_URL= +APP_API_BASE_URL= \ No newline at end of file diff --git a/apps/data-exporter/.eslintrc b/apps/data-exporter/.eslintrc new file mode 100644 index 0000000..5470783 --- /dev/null +++ b/apps/data-exporter/.eslintrc @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": ["saleor"] +} diff --git a/apps/data-exporter/.gitignore b/apps/data-exporter/.gitignore new file mode 100644 index 0000000..19baec3 --- /dev/null +++ b/apps/data-exporter/.gitignore @@ -0,0 +1,3 @@ + +# Sentry Auth Token +.sentryclirc diff --git a/apps/data-exporter/.graphqlrc.yml b/apps/data-exporter/.graphqlrc.yml new file mode 100644 index 0000000..b0db306 --- /dev/null +++ b/apps/data-exporter/.graphqlrc.yml @@ -0,0 +1,19 @@ +schema: graphql/schema.graphql +documents: [graphql/**/*.graphql, src/**/*.ts, src/**/*.tsx] +extensions: + codegen: + overwrite: true + generates: + generated/graphql.ts: + config: + dedupeFragments: true + plugins: + - typescript + - typescript-operations + - typescript-urql: + documentVariablePrefix: "Untyped" + fragmentVariablePrefix: "Untyped" + - typed-document-node + generated/schema.graphql: + plugins: + - schema-ast diff --git a/apps/data-exporter/CHANGELOG.md b/apps/data-exporter/CHANGELOG.md new file mode 100644 index 0000000..068eae9 --- /dev/null +++ b/apps/data-exporter/CHANGELOG.md @@ -0,0 +1,364 @@ +# saleor-app-products-feed + +## 1.12.0 + +### Minor Changes + +- 261e9d1: Added additional images attribute to the feed for media uploaded to the product. + +### Patch Changes + +- 23e71bc: Fix typo on button label +- 261e9d1: Improved default resolution of the submitted images. Was: 500px, now it's 1024px. + Users can now configure the size in the app configuration. +- Updated dependencies [e8660e8] +- Updated dependencies [e8660e8] +- Updated dependencies [e8660e8] +- Updated dependencies [e8660e8] +- Updated dependencies [e8660e8] +- Updated dependencies [e8660e8] + - @saleor/apps-shared@1.9.0 + - @saleor/apps-ui@1.2.0 + +## 1.11.4 + +### Patch Changes + +- 2a1385b: Plaintext EditorJS renderer has been moved to the shared package. +- a81f061: Updated Macaw to pre-127 +- fcc37e7: Remove clsx package from the projects no longer using it. +- Updated dependencies [2a1385b] +- Updated dependencies [a81f061] +- Updated dependencies [fcc37e7] + - @saleor/apps-shared@1.8.1 + - @saleor/react-hook-form-macaw@0.2.5 + - @saleor/apps-ui@1.1.8 + +## 1.11.3 + +### Patch Changes + +- 8b3d961: Updated Macaw UI to pre.118 +- Updated dependencies [8b3d961] +- Updated dependencies [c50797e] + - @saleor/react-hook-form-macaw@0.2.4 + - @saleor/apps-shared@1.8.0 + - @saleor/apps-ui@1.1.7 + +## 1.11.2 + +### Patch Changes + +- 3002354: Added error logging for exceptions thrown at tRPC routes. + +## 1.11.1 + +### Patch Changes + +- bb504d9: Fixed error on loading configuration created in the previous version of the app. +- bb504d9: Fixed issue with saving changes in the title template form. +- bb504d9: Improved error logging in the tRPC API. + +## 1.11.0 + +### Minor Changes + +- 6a84b4b: Changed format of product URLs to Handlebars. Previous format can still be parsed, so this change does not affect existing configurations. + + Old format: `http://example.com/{variantId}` + New format: `http://example.com/{{variant.id}}` + +- 6a84b4b: Added item title customization using Handlebars. +- fc5e639: Feed format has been changed to leverage Product Group ID field: + - Product ID: feed items use SKU if available, product variant ID is used otherwise + - Product Group ID: product ID is used for all the items +- 0b0297e: Updated pricing attributes according to the Google guidelines. + + Was: + + - Price: base or discounted price + + Now: + + - Price: always the base price. Attribute skipped if amount is equal to 0. + - Sale price: discounted price. Attribute skipped if value is the same as base price + +- aece073: Added configuration for choosing which product attributes should be used for generating Google Product Feed. Supported feed attributes: Brand, Color, Size, Material, Pattern. + +### Patch Changes + +- 261957f: Updated dependencies: vite, vitest, eslint, prettier, dotenv, turbo, syncpack, changesets, lint staged +- Updated dependencies [261957f] + - @saleor/react-hook-form-macaw@0.2.3 + - @saleor/apps-shared@1.7.6 + - @saleor/apps-ui@1.1.6 + +## 1.10.3 + +### Patch Changes + +- 07999ea: Changed input type for region in the AWS credentials section. Region can be now selected from the list, instead of text input. +- 43d7e47: Added validation for AWS credentials. If provided configuration for S3 Bucket is invalid, it won't be saved. + +## 1.10.2 + +### Patch Changes + +- 2fab86b: Updated graphql package to 16.7.1 and @graphql-codegen related dependencies to the latest version. +- aa6fec1: Updated Macaw UI to pre-106 +- Updated dependencies [aa6fec1] +- Updated dependencies [aa6fec1] + - @saleor/react-hook-form-macaw@0.2.2 + - @saleor/apps-shared@1.7.5 + - @saleor/apps-ui@1.1.5 + +## 1.10.1 + +### Patch Changes + +- 70cb741: Update Zod to 3.21.4 +- e7c2d3a: Updated and ESLint dependencies +- 3c6cd4c: Updated the @saleor/app-sdk package to version 0.41.1. +- 6210447: Updated tRPC packages to 10.34.0 +- 6210447: Updated @tanstack/react-query 4.29.19 +- Updated dependencies [70cb741] +- Updated dependencies [e7c2d3a] +- Updated dependencies [3c6cd4c] +- Updated dependencies [6210447] + - @saleor/react-hook-form-macaw@0.2.1 + - @saleor/apps-shared@1.7.4 + - @saleor/apps-ui@1.1.4 + +## 1.10.0 + +### Minor Changes + +- a1f083c: Filled "about" field in App Manifest. Dashboard will display it in app details page now. +- 47102ba: Added additional ENV variables (see each app's .env.example), that can overwrite app base URL. This change allows easy apps development using Docker + +### Patch Changes + +- 2d77bca: Updated Next.js to 13.4.8 +- 6299e06: Update @saleor/app-sdk to 0.41.0 +- Updated dependencies [2d77bca] +- Updated dependencies [6299e06] + - @saleor/apps-shared@1.7.3 + - @saleor/apps-ui@1.1.3 + - @saleor/react-hook-form-macaw@0.2.0 + +## 1.9.0 + +### Minor Changes + +- 1dead1e: Included dedicated logo and attached it to App's manifest. From Saleor 3.15 the logo will be visible in the Dashboard during and after installation. +- 3462cc3: Improved helper text in S3 form - region field. Now it should be more explicit that only region code (like "eu-west-1") should be provided. +- e4497b9: Added test-id attributes to several meaningful elements. Now quering in automated tests are more stable +- e4497b9: Make Google Categories mapping lazy loaded, so the page loads immediately and forms add with a delay. Previously the page was stuck due to large chunk size + +### Patch Changes + +- 860bac4: Updated @saleor/app-sdk to 0.40.1 +- a1ad70e: Updated configuration and dependencies of GraphQL client - urql. + All applications use now unified config for creating the client. Also unused related packages has been removed. +- ec68ed5: Updated Sentry package and config. Set Sentry release to match package.json version. Now Sentry will use semver version instead a commit +- cb6ee29: Updated dependencies +- Updated dependencies [f96563f] +- Updated dependencies [f96563f] +- Updated dependencies [860bac4] +- Updated dependencies [a1ad70e] +- Updated dependencies [cb6ee29] +- Updated dependencies [a1ad70e] + - @saleor/react-hook-form-macaw@0.2.0 + - @saleor/apps-ui@1.1.2 + - @saleor/apps-shared@1.7.2 + +## 1.8.1 + +### Patch Changes + +- a8834a1: Unified graphql version to 16.6 +- a8834a1: Unified graphql codegen packages +- a8834a1: Removed unnecessary duplicated dependencies from apps and moved them to shared and root (types, eslint rules) +- a8834a1: Updated dev dependencies - Typescript, Eslint and Turborepo +- 928c727: Updated @saleor/macaw-ui to 0.8.0-pre.95. This version introduces change in spacing scale, so there may be slight changes in spacing +- Updated dependencies [a8834a1] +- Updated dependencies [a8834a1] +- Updated dependencies [a8834a1] +- Updated dependencies [a8834a1] +- Updated dependencies [a8834a1] +- Updated dependencies [928c727] + - @saleor/react-hook-form-macaw@0.1.2 + - @saleor/apps-shared@1.7.1 + - @saleor/apps-ui@1.1.1 + +## 1.8.0 + +### Minor Changes + +- 182bdd6: This version introduces major update of the App UI: + + - Added Macaw UI / next + - Rebuilt app's UI to match modern Saleor guidelines + - Moved S3 form to be configured once, globally + - Added tests and refactored App configuration/metadata (incompatible with previous version) + - Product-related webhooks are now refreshing cache responsible on indexing large databases + + App was not officially released yet, hence only minor update is introduced + +### Patch Changes + +- 0c2fc65: Update dev dependencies - Vite and Vitest. These changes will not affect runtime Apps, but can affect tests and builds +- Updated dependencies [0c2fc65] +- Updated dependencies [b75a664] + - @saleor/react-hook-form-macaw@0.1.1 + - @saleor/apps-shared@1.7.0 + +## 1.7.1 + +### Patch Changes + +- 6e69f4f: Update app-sdk to 0.39.1 +- Updated dependencies [6e69f4f] + - @saleor/apps-shared@1.6.1 + +## 1.7.0 + +### Minor Changes + +- 0c8717a: Generated feed XML can now be uploaded to the s3 bucket. + + Feed generation is now much faster thanks to implemented caching. + +- 4801803: Added Sentry config. If Sentry is configured in ENV, it will use default Sentry configuration for Next.js to send errors to the Sentry + +### Patch Changes + +- ce8d9de: Product description in the feed is now a plaintext instead of JSON. +- Updated dependencies [23b5c70] + - @saleor/apps-shared@1.6.0 + +## 1.6.2 + +### Patch Changes + +- c406318: Updated dep @saleor/app-sdk to 0.38.0 +- 2de2a40: Query for the product details run now in paralell to speed up overall feed generation +- Updated dependencies [c406318] + - @saleor/apps-shared@1.5.1 + +## 1.6.1 + +### Patch Changes + +- 8b22b1c: Restored Pino logger packages to each app, to fix failing logs in development. Also updated .env.example to contain up to date APP_LOG_LEVEL variable + +## 1.6.0 + +### Minor Changes + +- 830cfe9: Changed APP_DEBUG env to APP_LOG_LEVEL + +### Patch Changes + +- 830cfe9: Replaced internal logger implementation with shared logger +- Updated dependencies [830cfe9] + - @saleor/apps-shared@1.5.0 + +## 1.5.0 + +### Minor Changes + +- 57f6d41: Updated Manifest to contain up to date support, privacy, homepage and author fields + +### Patch Changes + +- 2c0df91: Added lint:fix script, so `eslint --fix` can be run deliberately +- e167e72: Update next.js to 13.3.0 +- 74174c4: Updated @saleor/app-sdk to 0.37.3 +- 2e51890: Update next.js to 13.3.0 +- 2e51890: Update @saleor/app-sdk to 0.37.2 +- 2e51890: Use useDashboardNotification hook from shared package, instead of direct AppBridge usage +- Updated dependencies [2c0df91] +- Updated dependencies [e167e72] +- Updated dependencies [74174c4] +- Updated dependencies [2e51890] +- Updated dependencies [2e51890] +- Updated dependencies [2e51890] + - @saleor/apps-shared@1.4.0 + +## 1.4.3 + +### Patch Changes + +- eca52ad: Replace "export default" with named exports + - @saleor/apps-shared@1.3.0 + +## 1.4.2 + +### Patch Changes + +- a811d30: Added default cache of feed file to 5 minutes. It can be overwritten by env variable. + +## 1.4.1 + +### Patch Changes + +- 5fad97c: Update the UI to the common theme +- f58043f: Add Google Products Category mapping + +## 1.4.0 + +### Minor Changes + +- 7cb3b89: Added "author" field to the Manifest, set it to Saleor Commerce, so Dashboard can display it too + +### Patch Changes + +- 7cb3b89: Replace apps to avoid AppPermission (use Permission for client permissions) and authData.domain (use saleorApiUrl) +- 7cb3b89: Updated @saleor/app-sdk to 0.37.1 + +## 1.3.2 + +### Patch Changes + +- e93a4dc: Updated GraphQL Code Generator package + +## 1.3.1 + +### Patch Changes + +- dca82bb: Update app-sdk to pre-0.34.0. Update Async Webhooks to use new API + +## 1.3.0 + +### Minor Changes + +- 2d23480: Remove TitleBar component from apps, because it is moved to Dashboard, outside of iframe context + +### Patch Changes + +- Updated dependencies [2d23480] + - @saleor/apps-shared@1.3.0 + +## 1.2.0 + +### Minor Changes + +- 289b42f: Breaking change for app maintainers: VercelAPL can no longer be set for the app since it's deprecated and will be removed in app-sdk 0.30.0. As a replacement, we recommend using Upstash APL or implementing your own. + Read more about APLs: https://github.com/saleor/saleor-app-sdk/blob/main/docs/apl.md + +### Patch Changes + +- 4e4257d: Ensure initially selected channel will not crash if no channels exist + +## 1.1.0 + +### Minor Changes + +- 1c9b2c4: Change public app names to be more readable + +### Patch Changes + +- ca3a030: Add products feed app +- Updated dependencies [5fc88ed] + - @saleor/apps-shared@1.2.0 diff --git a/apps/data-exporter/README.md b/apps/data-exporter/README.md new file mode 100644 index 0000000..88186bd --- /dev/null +++ b/apps/data-exporter/README.md @@ -0,0 +1,114 @@ +
+

Products feed

+
+ +
+

Share products data with the feed aggregators

+
+ +## About Saleor Invoices app + +- Create Google Merchant Feed XML + +## Development + +### Requirements + +Before you start, make sure you have installed: + +- [Node.js](https://nodejs.org/en/) +- [pnpm](https://pnpm.io/) +- [Saleor CLI](https://docs.saleor.io/docs/3.x/cli) - optional, but recommended + +### With CLI + +The easiest way to set up a Saleor app is by using the Saleor CLI. + +[Saleor CLI](https://github.com/saleor/saleor-cli) is designed to save you from the repetitive chores around Saleor development, including creating Apps. It will take the burden of spawning new apps locally, connecting them with Saleor environments, and establishing a tunnel for local development in seconds. + +[Full Saleor CLI reference](https://docs.saleor.io/docs/3.x/developer/cli) + +If you don't have a (free developer) Saleor Cloud account, create one with the following command: + +``` +saleor register +``` + +Now you're ready to create your first App: + +``` +saleor app create [your-app-name] +``` + +In this step, Saleor CLI will: + +- clone this repository to the specified folder +- install dependencies +- ask you whether you'd like to install the app in the selected Saleor environment +- create `.env` file +- start the app in development mode + +Having your app ready, the final thing you want to establish is a tunnel with your Saleor environment. Go to your app's directory first and run: + +``` +saleor app tunnel +``` + +Your local application should be available now to the outside world (Saleor instance) for accepting all the events via webhooks. + +A quick note: the next time you come back to your project, it is enough to launch your app in a standard way (and then launch your tunnel as described earlier): + +``` +pnpm dev +``` + +### Without CLI + +1. Install the dependencies by running: + +``` +pnpm install +``` + +2. Start the local server with: + +``` +pnpm dev +``` + +3. Expose local environment using tunnel: + Use tunneling tools like [localtunnel](https://github.com/localtunnel/localtunnel) or [ngrok](https://ngrok.com/). + +4. Install application at your dashboard: + +If you use Saleor Cloud or your local server is exposed, you can install your app by following this link: + +``` +[YOUR_SALEOR_DASHBOARD_URL]/apps/install?manifestUrl=[YOUR_APP_TUNNEL_MANIFEST_URL] +``` + +This template host manifest at `/api/manifest` + +You can also install application using GQL or command line. Follow the guide [how to install your app](https://docs.saleor.io/docs/3.x/developer/extending/apps/installing-apps#installation-using-graphql-api) to learn more. + +### Generated schema and typings + +Commands `build` and `dev` would generate schema and typed functions using Saleor's GraphQL endpoint. Commit the `generated` folder to your repo as they are necessary for queries and keeping track of the schema changes. + +[Learn more](https://www.graphql-code-generator.com/) about GraphQL code generation. + +### Storing registration data - APL + +During registration process Saleor API pass the auth token to the app. With this token App can query Saleor API with privileged access (depending on requested permissions during the installation). +To store this data, app-template use a different [APL interfaces](https://github.com/saleor/saleor-app-sdk/blob/main/docs/apl.md). + +The choice of the APL is done using `APL` environment variable. If value is not set, FileAPL is used. Available choices: + +- `file`: no additional setup is required. Good choice for local development. Can't be used for multi tenant-apps or be deployed (not intended for production) +- `upstash`: use [Upstash](https://upstash.com/) Redis as storage method. Free account required. Can be used for development and production and supports multi-tenancy. Requires `UPSTASH_URL` and `UPSTASH_TOKEN` environment variables to be set + +If you want to use your own database, you can implement your own APL. [Check the documentation to read more.](https://github.com/saleor/saleor-app-sdk/blob/main/docs/apl.md) + +### Environment variables + +- `FEED_CACHE_MAX_AGE`: Amount of seconds the the response will be cached for. Default time is 5 minutes. diff --git a/apps/data-exporter/graphql/fragments/.gitkeep b/apps/data-exporter/graphql/fragments/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/data-exporter/graphql/fragments/AttributeWithMappingFragment.graphql b/apps/data-exporter/graphql/fragments/AttributeWithMappingFragment.graphql new file mode 100644 index 0000000..6fbef00 --- /dev/null +++ b/apps/data-exporter/graphql/fragments/AttributeWithMappingFragment.graphql @@ -0,0 +1,5 @@ +fragment AttributeWithMappingFragment on Attribute { + id + name + slug +} diff --git a/apps/data-exporter/graphql/fragments/CategoryWithMappingFragment.graphql b/apps/data-exporter/graphql/fragments/CategoryWithMappingFragment.graphql new file mode 100644 index 0000000..bf48633 --- /dev/null +++ b/apps/data-exporter/graphql/fragments/CategoryWithMappingFragment.graphql @@ -0,0 +1,11 @@ +fragment CategoryWithMappingFragment on Category { + id + parent{ + name + parent{ + name + } + } + name + googleCategoryId: metafield(key: "google_category_id") +} diff --git a/apps/data-exporter/graphql/fragments/GoogleFeedProductVariantFragment.graphql b/apps/data-exporter/graphql/fragments/GoogleFeedProductVariantFragment.graphql new file mode 100644 index 0000000..8427568 --- /dev/null +++ b/apps/data-exporter/graphql/fragments/GoogleFeedProductVariantFragment.graphql @@ -0,0 +1,68 @@ +fragment GoogleFeedProductVariant on ProductVariant { + id + name + sku + pricing { + priceUndiscounted{ + gross { + currency + amount + } + } + price { + gross { + currency + amount + } + } + } + quantityAvailable + attributes { + attribute { + id + } + values { + value + name + } + } + product { + id + name + slug + description + seoDescription + media{ + id + alt + url(size: $imageSize) + type + } + variants{ + id + media{ + id + alt + url(size: $imageSize) + type + } + } + attributes{ + attribute{ + id + } + values{ + value + name + } + } + thumbnail(size: $imageSize) { + url + } + category { + id + name + googleCategoryId: metafield(key: "google_category_id") + } + } +} diff --git a/apps/data-exporter/graphql/fragments/ProductVariantWebhookPayload.graphql b/apps/data-exporter/graphql/fragments/ProductVariantWebhookPayload.graphql new file mode 100644 index 0000000..7f32150 --- /dev/null +++ b/apps/data-exporter/graphql/fragments/ProductVariantWebhookPayload.graphql @@ -0,0 +1,8 @@ +fragment ProductVariantWebhookPayload on ProductVariant { + channel + channelListings { + channel { + slug + } + } +} diff --git a/apps/data-exporter/graphql/fragments/ProductWebhookPayload.graphql b/apps/data-exporter/graphql/fragments/ProductWebhookPayload.graphql new file mode 100644 index 0000000..7a49bac --- /dev/null +++ b/apps/data-exporter/graphql/fragments/ProductWebhookPayload.graphql @@ -0,0 +1,8 @@ +fragment ProductWebhookPayload on Product { + channel + channelListings { + channel { + slug + } + } +} diff --git a/apps/data-exporter/graphql/mutations/.gitkeep b/apps/data-exporter/graphql/mutations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/data-exporter/graphql/mutations/UpdateCategoryMapping.graphql b/apps/data-exporter/graphql/mutations/UpdateCategoryMapping.graphql new file mode 100644 index 0000000..77279ce --- /dev/null +++ b/apps/data-exporter/graphql/mutations/UpdateCategoryMapping.graphql @@ -0,0 +1,7 @@ +mutation UpdateCategoryMapping($id: ID!, $googleCategoryId: String!) { + updateMetadata(id: $id, input: {key: "google_category_id", value: $googleCategoryId}) { + errors { + message + } + } +} diff --git a/apps/data-exporter/graphql/queries/.gitkeep b/apps/data-exporter/graphql/queries/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/data-exporter/graphql/queries/FetchAppDetails.graphql b/apps/data-exporter/graphql/queries/FetchAppDetails.graphql new file mode 100644 index 0000000..b4bad82 --- /dev/null +++ b/apps/data-exporter/graphql/queries/FetchAppDetails.graphql @@ -0,0 +1,9 @@ +query FetchAppDetails { + app { + id + privateMetadata { + key + value + } + } +} diff --git a/apps/data-exporter/graphql/queries/FetchAttributesWithMapping.graphql b/apps/data-exporter/graphql/queries/FetchAttributesWithMapping.graphql new file mode 100644 index 0000000..d02d666 --- /dev/null +++ b/apps/data-exporter/graphql/queries/FetchAttributesWithMapping.graphql @@ -0,0 +1,13 @@ +query FetchAttributesWithMapping($cursor: String){ + attributes(first: 100, after: $cursor){ + pageInfo{ + hasNextPage + endCursor + } + edges{ + node{ + ...AttributeWithMappingFragment + } + } + } +} diff --git a/apps/data-exporter/graphql/queries/FetchCategoriesWithMapping.graphql b/apps/data-exporter/graphql/queries/FetchCategoriesWithMapping.graphql new file mode 100644 index 0000000..0a36657 --- /dev/null +++ b/apps/data-exporter/graphql/queries/FetchCategoriesWithMapping.graphql @@ -0,0 +1,13 @@ +query FetchCategoriesWithMapping($cursor: String){ + categories(first: 100, after: $cursor){ + pageInfo{ + hasNextPage + endCursor + } + edges{ + node{ + ...CategoryWithMappingFragment + } + } + } +} diff --git a/apps/data-exporter/graphql/queries/FetchProductCursors.graphql b/apps/data-exporter/graphql/queries/FetchProductCursors.graphql new file mode 100644 index 0000000..66dc793 --- /dev/null +++ b/apps/data-exporter/graphql/queries/FetchProductCursors.graphql @@ -0,0 +1,9 @@ +query FetchProductCursors($first:Int!, $after: String, $channel: String!){ + productVariants(first:$first, after: $after, channel: $channel){ + pageInfo{ + hasNextPage + startCursor + endCursor + } + } +} diff --git a/apps/data-exporter/graphql/queries/FetchProductDataForFeed.graphql b/apps/data-exporter/graphql/queries/FetchProductDataForFeed.graphql new file mode 100644 index 0000000..b438a6f --- /dev/null +++ b/apps/data-exporter/graphql/queries/FetchProductDataForFeed.graphql @@ -0,0 +1,13 @@ +query FetchProductDataForFeed($first:Int!, $after: String, $channel: String!, $imageSize: Int = 1024){ + productVariants(first:$first, after: $after, channel: $channel){ + pageInfo{ + hasNextPage + endCursor + } + edges{ + node{ + ...GoogleFeedProductVariant + } + } + } +} diff --git a/apps/data-exporter/graphql/queries/ShopDetails.graphql b/apps/data-exporter/graphql/queries/ShopDetails.graphql new file mode 100644 index 0000000..d2a2d04 --- /dev/null +++ b/apps/data-exporter/graphql/queries/ShopDetails.graphql @@ -0,0 +1,6 @@ +query ShopDetails { + shop{ + name + description + } +} diff --git a/apps/data-exporter/graphql/schema.graphql b/apps/data-exporter/graphql/schema.graphql new file mode 100644 index 0000000..dcda887 --- /dev/null +++ b/apps/data-exporter/graphql/schema.graphql @@ -0,0 +1,29625 @@ +schema { + query: Query + mutation: Mutation + subscription: Subscription +} + +type Query { + """ + Look up a webhook by ID. Requires one of the following permissions: MANAGE_APPS, OWNER. + """ + webhook( + """ + ID of the webhook. + """ + id: ID! + ): Webhook + + """ + List of all available webhook events. + + Requires one of the following permissions: MANAGE_APPS. + """ + webhookEvents: [WebhookEvent!] + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `WebhookEventTypeAsyncEnum` and `WebhookEventTypeSyncEnum` to get available event types." + ) + + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS, MANAGE_SHIPPING. + """ + warehouse( + """ + ID of an warehouse + """ + id: ID! + ): Warehouse + + """ + List of warehouses. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS, MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + 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 + + """ + Lookup a translatable item by ID. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + translation( + """ + ID of the object to retrieve. + """ + id: ID! + + """ + Kind of the object to retrieve. + """ + kind: TranslatableKinds! + ): TranslatableItem + + """ + Look up a stock by ID + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + stock( + """ + ID of an warehouse + """ + id: ID! + ): Stock + + """ + List of stocks. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderSettings: OrderSettings + + """ + Gift card related settings from site settings. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardSettings: GiftCardSettings! + + """ + Look up a shipping zone by ID. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + digitalContent( + """ + ID of the digital content. + """ + id: ID! + ): DigitalContent + + """ + List of digital content. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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 + + """ + Sort products variants. + """ + sortBy: ProductVariantSortingInput + + """ + 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. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + payment( + """ + ID of the payment. + """ + id: ID! + ): Payment + + """ + List of payments. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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). + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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 @deprecated(reason: "This field will be removed in Saleor 4.0.") + + """ + 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. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCard( + """ + ID of the gift card. + """ + id: ID! + ): GiftCard + + """ + List of gift cards. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCards( + """ + Sort gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + sortBy: GiftCardSortingInput + + """ + Filtering options for gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + filter: GiftCardFilterInput + + """ + 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 gift card currencies. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardCurrencies: [String!]! + + """ + List of gift card tags. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardTags( + """ + Filtering options for gift card tags. + """ + filter: GiftCardTagFilterInput + + """ + 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 + ): GiftCardTagCountableConnection + + """ + Look up a plugin by ID. + + Requires one of the following permissions: MANAGE_PLUGINS. + """ + plugin( + """ + ID of the plugin. + """ + id: ID! + ): Plugin + + """ + List of plugins. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + sales( + """ + Filtering options for sales. + """ + filter: SaleFilterInput + + """ + Sort sales. + """ + sortBy: SaleSortingInput + + """ + Search sales by name, value or type. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `filter.search` input instead. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + vouchers( + """ + Filtering options for vouchers. + """ + filter: VoucherFilterInput + + """ + Sort voucher. + """ + sortBy: VoucherSortingInput + + """ + Search vouchers by name or code. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `filter.search` input instead. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + exportFile( + """ + ID of the export file job. + """ + id: ID! + ): ExportFile + + """ + List of export files. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + The checkout's token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): Checkout + + """ + List of checkouts. + + Requires one of the following permissions: MANAGE_CHECKOUTS. + """ + checkouts( + """ + Sort checkouts. + + Added in Saleor 3.1. + """ + sortBy: CheckoutSortingInput + + """ + Filtering options for checkouts. + + Added in Saleor 3.1. + """ + filter: CheckoutFilterInput + + """ + 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 + + """ + List of checkout lines. + + Requires one of the following permissions: MANAGE_CHECKOUTS. + """ + 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. + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_STAFF_USER. + """ + channel( + """ + ID of the channel. + """ + id: ID + ): Channel + + """ + List of all channels. + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_STAFF_USER. + """ + channels: [Channel!] + + """ + List of the shop's attributes. + """ + attributes( + """ + Filtering options for attributes. + """ + filter: AttributeFilterInput + + """ + Sorting options for attributes. + """ + sortBy: AttributeSortingInput + + """ + 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 + ): 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 + + Requires one of the following permissions: MANAGE_APPS. + """ + appsInstallations: [AppInstallation!]! + + """ + List of the apps. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER, MANAGE_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. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER AUTHENTICATED_APP. The authenticated app has access to its resources. Fetching different apps requires MANAGE_APPS permission. + """ + app( + """ + ID of the app. + """ + id: ID + ): App + + """ + List of all extensions. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER, AUTHENTICATED_APP. + """ + appExtensions( + """ + Filtering options for apps extensions. + """ + filter: AppExtensionFilterInput + + """ + 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 + ): AppExtensionCountableConnection + + """ + Look up an app extension by ID. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER, AUTHENTICATED_APP. + """ + appExtension( + """ + ID of the app extension. + """ + id: ID! + ): AppExtension + + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS, MANAGE_USERS. + """ + 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. + + Requires one of the following permissions: MANAGE_STAFF. + """ + 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. + + Requires one of the following permissions: MANAGE_STAFF. + """ + permissionGroup( + """ + ID of the group. + """ + id: ID! + ): Group + + """ + Return the currently authenticated user. + """ + me: User + + """ + List of the shop's staff users. + + Requires one of the following permissions: MANAGE_STAFF. + """ + 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. + + Requires one of the following permissions: MANAGE_STAFF, MANAGE_USERS, MANAGE_ORDERS. + """ + user( + """ + ID of the user. + """ + id: ID + + """ + Email address of the user. + """ + email: String + ): User + _entities(representations: [_Any]): [_Entity] + _service: _Service +} + +""" +Webhook. +""" +type Webhook implements Node { + id: ID! + name: String! + + """ + List of webhook events. + """ + events: [WebhookEvent!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `asyncEvents` or `syncEvents` instead." + ) + + """ + List of synchronous webhook events. + """ + syncEvents: [WebhookEventSync!]! + + """ + List of asynchronous webhook events. + """ + asyncEvents: [WebhookEventAsync!]! + app: App! + + """ + Event deliveries. + """ + eventDeliveries( + """ + Event delivery sorter. + """ + sortBy: EventDeliverySortingInput + + """ + Event delivery filter options. + """ + filter: EventDeliveryFilterInput + + """ + 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 + ): EventDeliveryCountableConnection + + """ + Target URL for webhook. + """ + targetUrl: String! + + """ + Informs if webhook is activated. + """ + isActive: Boolean! + + """ + Used to create a hash signature with each payload. + """ + secretKey: String + + """ + Used to define payloads for specific events. + """ + subscriptionQuery: String +} + +""" +An object with an ID +""" +interface Node { + """ + The ID of the object. + """ + id: ID! +} + +""" +Webhook event. +""" +type WebhookEvent { + """ + Display name of the event. + """ + name: String! + + """ + Internal name of the event type. + """ + eventType: WebhookEventTypeEnum! +} + +""" +Enum determining type of webhook. +""" +enum WebhookEventTypeEnum { + """ + All the events. + """ + ANY_EVENTS + + """ + A new app installed. + """ + APP_INSTALLED + + """ + An app updated. + """ + APP_UPDATED + + """ + An app deleted. + """ + APP_DELETED + + """ + An app status is changed. + """ + APP_STATUS_CHANGED + + """ + A new category created. + """ + CATEGORY_CREATED + + """ + A category is updated. + """ + CATEGORY_UPDATED + + """ + A category is deleted. + """ + CATEGORY_DELETED + + """ + A new channel created. + """ + CHANNEL_CREATED + + """ + A channel is updated. + """ + CHANNEL_UPDATED + + """ + A channel is deleted. + """ + CHANNEL_DELETED + + """ + A channel status is changed. + """ + CHANNEL_STATUS_CHANGED + + """ + A new gift card created. + """ + GIFT_CARD_CREATED + + """ + A gift card is updated. + """ + GIFT_CARD_UPDATED + + """ + A gift card is deleted. + """ + GIFT_CARD_DELETED + + """ + A gift card status is changed. + """ + GIFT_CARD_STATUS_CHANGED + + """ + A new menu created. + """ + MENU_CREATED + + """ + A menu is updated. + """ + MENU_UPDATED + + """ + A menu is deleted. + """ + MENU_DELETED + + """ + A new menu item created. + """ + MENU_ITEM_CREATED + + """ + A menu item is updated. + """ + MENU_ITEM_UPDATED + + """ + A menu item is deleted. + """ + MENU_ITEM_DELETED + + """ + 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 + DRAFT_ORDER_CREATED + DRAFT_ORDER_UPDATED + DRAFT_ORDER_DELETED + SALE_CREATED + SALE_UPDATED + SALE_DELETED + + """ + 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 collection is created. + """ + COLLECTION_CREATED + + """ + A collection is updated. + """ + COLLECTION_UPDATED + + """ + A collection is deleted. + """ + COLLECTION_DELETED + + """ + 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 + PRODUCT_VARIANT_OUT_OF_STOCK + PRODUCT_VARIANT_BACK_IN_STOCK + + """ + 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 + + """ + A fulfillment is cancelled. + """ + FULFILLMENT_CANCELED + + """ + User notification triggered. + """ + NOTIFY_USER + + """ + A new page is created. + """ + PAGE_CREATED + + """ + A page is updated. + """ + PAGE_UPDATED + + """ + A page is deleted. + """ + PAGE_DELETED + + """ + A new shipping price is created. + """ + SHIPPING_PRICE_CREATED + + """ + A shipping price is updated. + """ + SHIPPING_PRICE_UPDATED + + """ + A shipping price is deleted. + """ + SHIPPING_PRICE_DELETED + + """ + A new shipping zone is created. + """ + SHIPPING_ZONE_CREATED + + """ + A shipping zone is updated. + """ + SHIPPING_ZONE_UPDATED + + """ + A shipping zone is deleted. + """ + SHIPPING_ZONE_DELETED + TRANSACTION_ACTION_REQUEST + TRANSLATION_CREATED + TRANSLATION_UPDATED + + """ + A new warehouse created. + """ + WAREHOUSE_CREATED + + """ + A warehouse is updated. + """ + WAREHOUSE_UPDATED + + """ + A warehouse is deleted. + """ + WAREHOUSE_DELETED + + """ + A new voucher created. + """ + VOUCHER_CREATED + + """ + A voucher is updated. + """ + VOUCHER_UPDATED + + """ + A voucher is deleted. + """ + VOUCHER_DELETED + + """ + An observability event is created. + """ + OBSERVABILITY + PAYMENT_AUTHORIZE + PAYMENT_CAPTURE + PAYMENT_CONFIRM + PAYMENT_LIST_GATEWAYS + PAYMENT_PROCESS + PAYMENT_REFUND + PAYMENT_VOID + SHIPPING_LIST_METHODS_FOR_CHECKOUT + ORDER_FILTER_SHIPPING_METHODS + CHECKOUT_FILTER_SHIPPING_METHODS +} + +""" +Synchronous webhook event. +""" +type WebhookEventSync { + """ + Display name of the event. + """ + name: String! + + """ + Internal name of the event type. + """ + eventType: WebhookEventTypeSyncEnum! +} + +""" +Enum determining type of webhook. +""" +enum WebhookEventTypeSyncEnum { + PAYMENT_AUTHORIZE + PAYMENT_CAPTURE + PAYMENT_CONFIRM + PAYMENT_LIST_GATEWAYS + PAYMENT_PROCESS + PAYMENT_REFUND + PAYMENT_VOID + SHIPPING_LIST_METHODS_FOR_CHECKOUT + ORDER_FILTER_SHIPPING_METHODS + CHECKOUT_FILTER_SHIPPING_METHODS +} + +""" +Asynchronous webhook event. +""" +type WebhookEventAsync { + """ + Display name of the event. + """ + name: String! + + """ + Internal name of the event type. + """ + eventType: WebhookEventTypeAsyncEnum! +} + +""" +Enum determining type of webhook. +""" +enum WebhookEventTypeAsyncEnum { + """ + All the events. + """ + ANY_EVENTS + + """ + A new app installed. + """ + APP_INSTALLED + + """ + An app updated. + """ + APP_UPDATED + + """ + An app deleted. + """ + APP_DELETED + + """ + An app status is changed. + """ + APP_STATUS_CHANGED + + """ + A new category created. + """ + CATEGORY_CREATED + + """ + A category is updated. + """ + CATEGORY_UPDATED + + """ + A category is deleted. + """ + CATEGORY_DELETED + + """ + A new channel created. + """ + CHANNEL_CREATED + + """ + A channel is updated. + """ + CHANNEL_UPDATED + + """ + A channel is deleted. + """ + CHANNEL_DELETED + + """ + A channel status is changed. + """ + CHANNEL_STATUS_CHANGED + + """ + A new gift card created. + """ + GIFT_CARD_CREATED + + """ + A gift card is updated. + """ + GIFT_CARD_UPDATED + + """ + A gift card is deleted. + """ + GIFT_CARD_DELETED + + """ + A gift card status is changed. + """ + GIFT_CARD_STATUS_CHANGED + + """ + A new menu created. + """ + MENU_CREATED + + """ + A menu is updated. + """ + MENU_UPDATED + + """ + A menu is deleted. + """ + MENU_DELETED + + """ + A new menu item created. + """ + MENU_ITEM_CREATED + + """ + A menu item is updated. + """ + MENU_ITEM_UPDATED + + """ + A menu item is deleted. + """ + MENU_ITEM_DELETED + + """ + 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 + DRAFT_ORDER_CREATED + DRAFT_ORDER_UPDATED + DRAFT_ORDER_DELETED + SALE_CREATED + SALE_UPDATED + SALE_DELETED + + """ + 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 collection is created. + """ + COLLECTION_CREATED + + """ + A collection is updated. + """ + COLLECTION_UPDATED + + """ + A collection is deleted. + """ + COLLECTION_DELETED + + """ + 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 + PRODUCT_VARIANT_OUT_OF_STOCK + PRODUCT_VARIANT_BACK_IN_STOCK + + """ + 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 + + """ + A fulfillment is cancelled. + """ + FULFILLMENT_CANCELED + + """ + User notification triggered. + """ + NOTIFY_USER + + """ + A new page is created. + """ + PAGE_CREATED + + """ + A page is updated. + """ + PAGE_UPDATED + + """ + A page is deleted. + """ + PAGE_DELETED + + """ + A new shipping price is created. + """ + SHIPPING_PRICE_CREATED + + """ + A shipping price is updated. + """ + SHIPPING_PRICE_UPDATED + + """ + A shipping price is deleted. + """ + SHIPPING_PRICE_DELETED + + """ + A new shipping zone is created. + """ + SHIPPING_ZONE_CREATED + + """ + A shipping zone is updated. + """ + SHIPPING_ZONE_UPDATED + + """ + A shipping zone is deleted. + """ + SHIPPING_ZONE_DELETED + TRANSACTION_ACTION_REQUEST + TRANSLATION_CREATED + TRANSLATION_UPDATED + + """ + A new warehouse created. + """ + WAREHOUSE_CREATED + + """ + A warehouse is updated. + """ + WAREHOUSE_UPDATED + + """ + A warehouse is deleted. + """ + WAREHOUSE_DELETED + + """ + A new voucher created. + """ + VOUCHER_CREATED + + """ + A voucher is updated. + """ + VOUCHER_UPDATED + + """ + A voucher is deleted. + """ + VOUCHER_DELETED + + """ + An observability event is created. + """ + OBSERVABILITY +} + +""" +Represents app data. +""" +type App implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + List of the app's permissions. + """ + permissions: [Permission!] + + """ + The date and time when the app was created. + """ + created: DateTime + + """ + Determine if app will be set active or not. + """ + isActive: Boolean + + """ + Name of the app. + """ + name: String + + """ + Type of the app. + """ + type: AppTypeEnum + + """ + Last 4 characters of the tokens. + + Requires one of the following permissions: MANAGE_APPS, OWNER. + """ + tokens: [AppToken!] + + """ + List of webhooks assigned to this app. + + Requires one of the following permissions: MANAGE_APPS, OWNER. + """ + 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 + + """ + App's dashboard extensions. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + extensions: [AppExtension!]! +} + +interface ObjectWithMetadata { + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata +} + +type MetadataItem { + """ + Key of a metadata item. + """ + key: String! + + """ + Value of a metadata item. + """ + value: String! +} + +""" +Metadata is a map of key-value pairs, both keys and values are `String`. + +Example: +``` +{ + "key1": "value1", + "key2": "value2" +} +``` +""" +scalar Metadata + +""" +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 + IMPERSONATE_USER + MANAGE_APPS + MANAGE_OBSERVABILITY + MANAGE_CHANNELS + MANAGE_DISCOUNTS + MANAGE_PLUGINS + MANAGE_GIFT_CARD + MANAGE_MENUS + MANAGE_ORDERS + MANAGE_PAGES + MANAGE_PAGE_TYPES_AND_ATTRIBUTES + HANDLE_PAYMENTS + MANAGE_PRODUCTS + MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES + MANAGE_SHIPPING + MANAGE_SETTINGS + MANAGE_TRANSLATIONS + MANAGE_CHECKOUTS + HANDLE_CHECKOUTS +} + +""" +The `DateTime` scalar type represents a DateTime +value as specified by +[iso8601](https://en.wikipedia.org/wiki/ISO_8601). +""" +scalar DateTime + +""" +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 +} + +""" +Represents token data. +""" +type AppToken implements Node { + id: ID! + + """ + Name of the authenticated token. + """ + name: String + + """ + Last 4 characters of the token. + """ + authToken: String +} + +""" +Represents app data. +""" +type AppExtension implements Node { + id: ID! + + """ + List of the app extension's permissions. + """ + permissions: [Permission!]! + + """ + Label of the extension to show in the dashboard. + """ + label: String! + + """ + URL of a view where extension's iframe is placed. + """ + url: String! + + """ + Place where given extension will be mounted. + """ + mount: AppExtensionMountEnum! + + """ + Type of way how app extension will be opened. + """ + target: AppExtensionTargetEnum! + app: App! + + """ + JWT token used to authenticate by thridparty app extension. + """ + accessToken: String +} + +""" +All places where app extension can be mounted. +""" +enum AppExtensionMountEnum { + PRODUCT_OVERVIEW_CREATE + PRODUCT_OVERVIEW_MORE_ACTIONS + PRODUCT_DETAILS_MORE_ACTIONS + NAVIGATION_CATALOG + NAVIGATION_ORDERS + NAVIGATION_CUSTOMERS + NAVIGATION_DISCOUNTS + NAVIGATION_TRANSLATIONS + NAVIGATION_PAGES + ORDER_DETAILS_MORE_ACTIONS + ORDER_OVERVIEW_CREATE + ORDER_OVERVIEW_MORE_ACTIONS +} + +""" +All available ways of opening an app extension. + + POPUP - app's extension will be mounted as a popup window + APP_PAGE - redirect to app's page +""" +enum AppExtensionTargetEnum { + POPUP + APP_PAGE +} + +type EventDeliveryCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [EventDeliveryCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +""" +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 +} + +type EventDeliveryCountableEdge { + """ + The item at the end of the edge. + """ + node: EventDelivery! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Event delivery. +""" +type EventDelivery implements Node { + id: ID! + createdAt: DateTime! + + """ + Event delivery status. + """ + status: EventDeliveryStatusEnum! + + """ + Webhook event type. + """ + eventType: WebhookEventTypeEnum! + + """ + Event delivery attempts. + """ + attempts( + """ + Event delivery sorter + """ + sortBy: EventDeliveryAttemptSortingInput + + """ + 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 + ): EventDeliveryAttemptCountableConnection + + """ + Event payload. + """ + payload: String +} + +enum EventDeliveryStatusEnum { + PENDING + SUCCESS + FAILED +} + +type EventDeliveryAttemptCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [EventDeliveryAttemptCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type EventDeliveryAttemptCountableEdge { + """ + The item at the end of the edge. + """ + node: EventDeliveryAttempt! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Event delivery attempts. +""" +type EventDeliveryAttempt implements Node { + id: ID! + + """ + Event delivery creation date and time. + """ + createdAt: DateTime! + + """ + Task id for delivery attempt. + """ + taskId: String + + """ + Delivery attempt duration. + """ + duration: Float + + """ + Delivery attempt response content. + """ + response: String + + """ + Response headers for delivery attempt. + """ + responseHeaders: String + + """ + Delivery attempt response status code. + """ + responseStatusCode: Int + + """ + Request headers for delivery attempt. + """ + requestHeaders: String + + """ + Event delivery status. + """ + status: EventDeliveryStatusEnum! +} + +input EventDeliveryAttemptSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort attempts by the selected field. + """ + field: EventDeliveryAttemptSortField! +} + +enum OrderDirection { + """ + Specifies an ascending sort order. + """ + ASC + + """ + Specifies a descending sort order. + """ + DESC +} + +enum EventDeliveryAttemptSortField { + """ + Sort event delivery attempts by created at. + """ + CREATED_AT +} + +input EventDeliverySortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort deliveries by the selected field. + """ + field: EventDeliverySortField! +} + +enum EventDeliverySortField { + """ + Sort event deliveries by created at. + """ + CREATED_AT +} + +input EventDeliveryFilterInput { + status: EventDeliveryStatusEnum + eventType: WebhookEventTypeEnum +} + +scalar JSONString + +""" +An enumeration. +""" +enum WebhookSampleEventTypeEnum { + APP_INSTALLED + APP_UPDATED + APP_DELETED + APP_STATUS_CHANGED + CATEGORY_CREATED + CATEGORY_UPDATED + CATEGORY_DELETED + CHANNEL_CREATED + CHANNEL_UPDATED + CHANNEL_DELETED + CHANNEL_STATUS_CHANGED + GIFT_CARD_CREATED + GIFT_CARD_UPDATED + GIFT_CARD_DELETED + GIFT_CARD_STATUS_CHANGED + MENU_CREATED + MENU_UPDATED + MENU_DELETED + MENU_ITEM_CREATED + MENU_ITEM_UPDATED + MENU_ITEM_DELETED + ORDER_CREATED + ORDER_CONFIRMED + ORDER_FULLY_PAID + ORDER_UPDATED + ORDER_CANCELLED + ORDER_FULFILLED + DRAFT_ORDER_CREATED + DRAFT_ORDER_UPDATED + DRAFT_ORDER_DELETED + SALE_CREATED + SALE_UPDATED + SALE_DELETED + INVOICE_REQUESTED + INVOICE_DELETED + INVOICE_SENT + CUSTOMER_CREATED + CUSTOMER_UPDATED + COLLECTION_CREATED + COLLECTION_UPDATED + COLLECTION_DELETED + PRODUCT_CREATED + PRODUCT_UPDATED + PRODUCT_DELETED + PRODUCT_VARIANT_CREATED + PRODUCT_VARIANT_UPDATED + PRODUCT_VARIANT_DELETED + PRODUCT_VARIANT_OUT_OF_STOCK + PRODUCT_VARIANT_BACK_IN_STOCK + CHECKOUT_CREATED + CHECKOUT_UPDATED + FULFILLMENT_CREATED + FULFILLMENT_CANCELED + NOTIFY_USER + PAGE_CREATED + PAGE_UPDATED + PAGE_DELETED + SHIPPING_PRICE_CREATED + SHIPPING_PRICE_UPDATED + SHIPPING_PRICE_DELETED + SHIPPING_ZONE_CREATED + SHIPPING_ZONE_UPDATED + SHIPPING_ZONE_DELETED + TRANSACTION_ACTION_REQUEST + TRANSLATION_CREATED + TRANSLATION_UPDATED + WAREHOUSE_CREATED + WAREHOUSE_UPDATED + WAREHOUSE_DELETED + VOUCHER_CREATED + VOUCHER_UPDATED + VOUCHER_DELETED + OBSERVABILITY +} + +""" +Represents warehouse. +""" +type Warehouse implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + slug: String! + email: String! + isPrivate: Boolean! + address: Address! + + """ + Warehouse company name. + """ + companyName: String! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `Address.companyName` instead." + ) + + """ + Click and collect options: local, all or disabled. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + clickAndCollectOption: WarehouseClickAndCollectOptionEnum! + shippingZones( + """ + 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! +} + +""" +Represents user address data. +""" +type Address implements Node { + 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 +} + +type CountryDisplay { + """ + Country code. + """ + code: String! + + """ + Country name. + """ + country: String! + + """ + Country tax. + """ + vat: VAT +} + +""" +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!]! +} + +""" +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: String! +} + +""" +An enumeration. +""" +enum WarehouseClickAndCollectOptionEnum { + DISABLED + LOCAL + ALL +} + +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! +} + +""" +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 { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + default: Boolean! + + """ + 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: [ShippingMethodType!] + + """ + List of warehouses for shipping zone. + """ + warehouses: [Warehouse!]! + + """ + List of channels for shipping zone. + """ + channels: [Channel!]! + + """ + Description of a shipping zone. + """ + description: String +} + +""" +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 +} + +""" +Represents amount of money in specific currency. +""" +type Money { + """ + Currency code. + """ + currency: String! + + """ + Amount of money. + """ + amount: Float! +} + +""" +Shipping method are the methods you'll use to get customer's orders to them. They are directly exposed to the customers. +""" +type ShippingMethodType implements Node & ObjectWithMetadata { + """ + Shipping method ID. + """ + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + Shipping method name. + """ + name: String! + + """ + Shipping method description. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + channelListings: [ShippingMethodChannelListing!] + + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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 + + """ + Minimum order weight to use this shipping method. + """ + minimumOrderWeight: Weight + + """ + Maximum order weight to use this shipping method. + """ + maximumOrderWeight: Weight + + """ + Maximum number of days for delivery. + """ + maximumDeliveryDays: Int + + """ + Minimal number of days for delivery. + """ + minimumDeliveryDays: Int +} + +""" +An enumeration. +""" +enum ShippingMethodTypeEnum { + PRICE + WEIGHT +} + +type ShippingMethodTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String + + """ + Translated description of the shipping method. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString +} + +type LanguageDisplay { + """ + ISO 639 representation of the language name. + """ + code: LanguageCodeEnum! + + """ + Full name of the language. + """ + language: String! +} + +""" +An enumeration. +""" +enum LanguageCodeEnum { + AF + AF_NA + AF_ZA + AGQ + AGQ_CM + AK + AK_GH + AM + AM_ET + AR + AR_AE + AR_BH + AR_DJ + AR_DZ + AR_EG + AR_EH + AR_ER + AR_IL + AR_IQ + AR_JO + AR_KM + AR_KW + AR_LB + AR_LY + AR_MA + AR_MR + AR_OM + AR_PS + AR_QA + AR_SA + AR_SD + AR_SO + AR_SS + AR_SY + AR_TD + AR_TN + AR_YE + AS + AS_IN + ASA + ASA_TZ + AST + AST_ES + AZ + AZ_CYRL + AZ_CYRL_AZ + AZ_LATN + AZ_LATN_AZ + BAS + BAS_CM + BE + BE_BY + BEM + BEM_ZM + BEZ + BEZ_TZ + BG + BG_BG + BM + BM_ML + BN + BN_BD + BN_IN + BO + BO_CN + BO_IN + BR + BR_FR + BRX + BRX_IN + BS + BS_CYRL + BS_CYRL_BA + BS_LATN + BS_LATN_BA + CA + CA_AD + CA_ES + CA_ES_VALENCIA + CA_FR + CA_IT + CCP + CCP_BD + CCP_IN + CE + CE_RU + CEB + CEB_PH + CGG + CGG_UG + CHR + CHR_US + CKB + CKB_IQ + CKB_IR + CS + CS_CZ + CU + CU_RU + CY + CY_GB + DA + DA_DK + DA_GL + DAV + DAV_KE + DE + DE_AT + DE_BE + DE_CH + DE_DE + DE_IT + DE_LI + DE_LU + DJE + DJE_NE + DSB + DSB_DE + DUA + DUA_CM + DYO + DYO_SN + DZ + DZ_BT + EBU + EBU_KE + EE + EE_GH + EE_TG + EL + EL_CY + EL_GR + EN + EN_AE + EN_AG + EN_AI + EN_AS + EN_AT + EN_AU + EN_BB + EN_BE + EN_BI + EN_BM + EN_BS + EN_BW + EN_BZ + EN_CA + EN_CC + EN_CH + EN_CK + EN_CM + EN_CX + EN_CY + EN_DE + EN_DG + EN_DK + EN_DM + EN_ER + EN_FI + EN_FJ + EN_FK + EN_FM + EN_GB + EN_GD + EN_GG + EN_GH + EN_GI + EN_GM + EN_GU + EN_GY + EN_HK + EN_IE + EN_IL + EN_IM + EN_IN + EN_IO + EN_JE + EN_JM + EN_KE + EN_KI + EN_KN + EN_KY + EN_LC + EN_LR + EN_LS + EN_MG + EN_MH + EN_MO + EN_MP + EN_MS + EN_MT + EN_MU + EN_MW + EN_MY + EN_NA + EN_NF + EN_NG + EN_NL + EN_NR + EN_NU + EN_NZ + EN_PG + EN_PH + EN_PK + EN_PN + EN_PR + EN_PW + EN_RW + EN_SB + EN_SC + EN_SD + EN_SE + EN_SG + EN_SH + EN_SI + EN_SL + EN_SS + EN_SX + EN_SZ + EN_TC + EN_TK + EN_TO + EN_TT + EN_TV + EN_TZ + EN_UG + EN_UM + EN_US + EN_VC + EN_VG + EN_VI + EN_VU + EN_WS + EN_ZA + EN_ZM + EN_ZW + EO + ES + ES_AR + ES_BO + ES_BR + ES_BZ + ES_CL + ES_CO + ES_CR + ES_CU + ES_DO + ES_EA + ES_EC + ES_ES + ES_GQ + ES_GT + ES_HN + ES_IC + ES_MX + ES_NI + ES_PA + ES_PE + ES_PH + ES_PR + ES_PY + ES_SV + ES_US + ES_UY + ES_VE + ET + ET_EE + EU + EU_ES + EWO + EWO_CM + FA + FA_AF + FA_IR + FF + FF_ADLM + FF_ADLM_BF + FF_ADLM_CM + FF_ADLM_GH + FF_ADLM_GM + FF_ADLM_GN + FF_ADLM_GW + FF_ADLM_LR + FF_ADLM_MR + FF_ADLM_NE + FF_ADLM_NG + FF_ADLM_SL + FF_ADLM_SN + FF_LATN + FF_LATN_BF + FF_LATN_CM + FF_LATN_GH + FF_LATN_GM + FF_LATN_GN + FF_LATN_GW + FF_LATN_LR + FF_LATN_MR + FF_LATN_NE + FF_LATN_NG + FF_LATN_SL + FF_LATN_SN + FI + FI_FI + FIL + FIL_PH + FO + FO_DK + FO_FO + FR + FR_BE + FR_BF + FR_BI + FR_BJ + FR_BL + FR_CA + FR_CD + FR_CF + FR_CG + FR_CH + FR_CI + FR_CM + FR_DJ + FR_DZ + FR_FR + FR_GA + FR_GF + FR_GN + FR_GP + FR_GQ + FR_HT + FR_KM + FR_LU + FR_MA + FR_MC + FR_MF + FR_MG + FR_ML + FR_MQ + FR_MR + FR_MU + FR_NC + FR_NE + FR_PF + FR_PM + FR_RE + FR_RW + FR_SC + FR_SN + FR_SY + FR_TD + FR_TG + FR_TN + FR_VU + FR_WF + FR_YT + FUR + FUR_IT + FY + FY_NL + GA + GA_GB + GA_IE + GD + GD_GB + GL + GL_ES + GSW + GSW_CH + GSW_FR + GSW_LI + GU + GU_IN + GUZ + GUZ_KE + GV + GV_IM + HA + HA_GH + HA_NE + HA_NG + HAW + HAW_US + HE + HE_IL + HI + HI_IN + HR + HR_BA + HR_HR + HSB + HSB_DE + HU + HU_HU + HY + HY_AM + IA + ID + ID_ID + IG + IG_NG + II + II_CN + IS + IS_IS + IT + IT_CH + IT_IT + IT_SM + IT_VA + JA + JA_JP + JGO + JGO_CM + JMC + JMC_TZ + JV + JV_ID + KA + KA_GE + KAB + KAB_DZ + KAM + KAM_KE + KDE + KDE_TZ + KEA + KEA_CV + KHQ + KHQ_ML + KI + KI_KE + KK + KK_KZ + KKJ + KKJ_CM + KL + KL_GL + KLN + KLN_KE + KM + KM_KH + KN + KN_IN + KO + KO_KP + KO_KR + KOK + KOK_IN + KS + KS_ARAB + KS_ARAB_IN + KSB + KSB_TZ + KSF + KSF_CM + KSH + KSH_DE + KU + KU_TR + KW + KW_GB + KY + KY_KG + LAG + LAG_TZ + LB + LB_LU + LG + LG_UG + LKT + LKT_US + LN + LN_AO + LN_CD + LN_CF + LN_CG + LO + LO_LA + LRC + LRC_IQ + LRC_IR + LT + LT_LT + LU + LU_CD + LUO + LUO_KE + LUY + LUY_KE + LV + LV_LV + MAI + MAI_IN + MAS + MAS_KE + MAS_TZ + MER + MER_KE + MFE + MFE_MU + MG + MG_MG + MGH + MGH_MZ + MGO + MGO_CM + MI + MI_NZ + MK + MK_MK + ML + ML_IN + MN + MN_MN + MNI + MNI_BENG + MNI_BENG_IN + MR + MR_IN + MS + MS_BN + MS_ID + MS_MY + MS_SG + MT + MT_MT + MUA + MUA_CM + MY + MY_MM + MZN + MZN_IR + NAQ + NAQ_NA + NB + NB_NO + NB_SJ + ND + ND_ZW + NDS + NDS_DE + NDS_NL + NE + NE_IN + NE_NP + NL + NL_AW + NL_BE + NL_BQ + NL_CW + NL_NL + NL_SR + NL_SX + NMG + NMG_CM + NN + NN_NO + NNH + NNH_CM + NUS + NUS_SS + NYN + NYN_UG + OM + OM_ET + OM_KE + OR + OR_IN + OS + OS_GE + OS_RU + PA + PA_ARAB + PA_ARAB_PK + PA_GURU + PA_GURU_IN + PCM + PCM_NG + PL + PL_PL + PRG + PS + PS_AF + PS_PK + PT + PT_AO + PT_BR + PT_CH + PT_CV + PT_GQ + PT_GW + PT_LU + PT_MO + PT_MZ + PT_PT + PT_ST + PT_TL + QU + QU_BO + QU_EC + QU_PE + RM + RM_CH + RN + RN_BI + RO + RO_MD + RO_RO + ROF + ROF_TZ + RU + RU_BY + RU_KG + RU_KZ + RU_MD + RU_RU + RU_UA + RW + RW_RW + RWK + RWK_TZ + SAH + SAH_RU + SAQ + SAQ_KE + SAT + SAT_OLCK + SAT_OLCK_IN + SBP + SBP_TZ + SD + SD_ARAB + SD_ARAB_PK + SD_DEVA + SD_DEVA_IN + SE + SE_FI + SE_NO + SE_SE + SEH + SEH_MZ + SES + SES_ML + SG + SG_CF + SHI + SHI_LATN + SHI_LATN_MA + SHI_TFNG + SHI_TFNG_MA + SI + SI_LK + SK + SK_SK + SL + SL_SI + SMN + SMN_FI + SN + SN_ZW + SO + SO_DJ + SO_ET + SO_KE + SO_SO + SQ + SQ_AL + SQ_MK + SQ_XK + SR + SR_CYRL + SR_CYRL_BA + SR_CYRL_ME + SR_CYRL_RS + SR_CYRL_XK + SR_LATN + SR_LATN_BA + SR_LATN_ME + SR_LATN_RS + SR_LATN_XK + SU + SU_LATN + SU_LATN_ID + SV + SV_AX + SV_FI + SV_SE + SW + SW_CD + SW_KE + SW_TZ + SW_UG + TA + TA_IN + TA_LK + TA_MY + TA_SG + TE + TE_IN + TEO + TEO_KE + TEO_UG + TG + TG_TJ + TH + TH_TH + TI + TI_ER + TI_ET + TK + TK_TM + TO + TO_TO + TR + TR_CY + TR_TR + TT + TT_RU + TWQ + TWQ_NE + TZM + TZM_MA + UG + UG_CN + UK + UK_UA + UR + UR_IN + UR_PK + UZ + UZ_ARAB + UZ_ARAB_AF + UZ_CYRL + UZ_CYRL_UZ + UZ_LATN + UZ_LATN_UZ + VAI + VAI_LATN + VAI_LATN_LR + VAI_VAII + VAI_VAII_LR + VI + VI_VN + VO + VUN + VUN_TZ + WAE + WAE_CH + WO + WO_SN + XH + XH_ZA + XOG + XOG_UG + YAV + YAV_CM + YI + YO + YO_BJ + YO_NG + YUE + YUE_HANS + YUE_HANS_CN + YUE_HANT + YUE_HANT_HK + ZGH + ZGH_MA + ZH + ZH_HANS + ZH_HANS_CN + ZH_HANS_HK + ZH_HANS_MO + ZH_HANS_SG + ZH_HANT + ZH_HANT_HK + ZH_HANT_MO + ZH_HANT_TW + ZU + ZU_ZA +} + +""" +Represents shipping method channel listing. +""" +type ShippingMethodChannelListing implements Node { + id: ID! + channel: Channel! + maximumOrderPrice: Money + minimumOrderPrice: Money + price: Money +} + +""" +Represents channel. +""" +type Channel implements Node { + id: ID! + name: String! + isActive: Boolean! + currencyCode: String! + slug: String! + + """ + Whether a channel has associated orders. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + hasOrders: Boolean! + + """ + Default country for the channel. Default country can be used in checkout to determine the stock quantities or calculate taxes when the country was not explicitly provided. + + Added in Saleor 3.1. + """ + defaultCountry: CountryDisplay! +} + +""" +Represents shipping method postal code rule. +""" +type ShippingMethodPostalCodeRule implements Node { + """ + The ID of the object. + """ + id: ID! + + """ + Start address range. + """ + start: String + + """ + End address range. + """ + end: String + + """ + Inclusion type of the postal code rule. + """ + inclusionType: PostalCodeRuleInclusionTypeEnum +} + +""" +An enumeration. +""" +enum PostalCodeRuleInclusionTypeEnum { + INCLUDE + EXCLUDE +} + +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! +} + +""" +Represents an individual item for sale in the storefront. +""" +type Product implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + productType: ProductType! + slug: String! + category: Category + created: DateTime! + updatedAt: DateTime! + chargeTaxes: Boolean! + weight: Weight + defaultVariant: ProductVariant + rating: Float + + """ + Channel given to retrieve this product. Also used by federation gateway to resolve this object in a federated query. + """ + channel: String + + """ + Description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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: "This field will be removed in Saleor 4.0. Use the `mediaById` field instead." + ) + + """ + List of variants for the product. Requires the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + variants: [ProductVariant!] + + """ + List of media for the product. + """ + media: [ProductMedia!] + + """ + List of images for the product. + """ + images: [ProductImage!] + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `media` field instead." + ) + + """ + List of collections for the product. Requires the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `availableForPurchaseAt` field to fetch the available for purchase date." + ) + + """ + Date when product is available for purchase. + """ + availableForPurchaseAt: DateTime + + """ + Whether the product is available for purchase. + """ + isAvailableForPurchase: Boolean +} + +""" +Represents a type of product. It defines what attributes are available to products of this type. +""" +type ProductType implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + slug: String! + hasVariants: Boolean! + isShippingRequired: Boolean! + isDigital: Boolean! + weight: Weight + + """ + The product type kind. + """ + kind: ProductTypeKindEnum! + + """ + 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: "This field 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!] + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `assignedVariantAttributes` instead." + ) + + """ + Variant attributes of that product type with attached variant selection. + + Added in Saleor 3.1. + """ + assignedVariantAttributes( + """ + Define scope of returned attributes. + """ + variantSelection: VariantAttributeScope + ): [AssignedVariantAttribute!] + + """ + Product attributes of that product type. + """ + productAttributes: [Attribute!] + + """ + List of attributes which can be assigned to this product type. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 +} + +""" +Represents weight value in a specific weight unit. +""" +type Weight { + """ + Weight unit. + """ + unit: WeightUnitsEnum! + + """ + Weight value. + """ + value: Float! +} + +""" +An enumeration. +""" +enum WeightUnitsEnum { + G + LB + OZ + KG + TONNE +} + +""" +An enumeration. +""" +enum ProductTypeKindEnum { + NORMAL + GIFT_CARD +} + +""" +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 +} + +""" +Custom attribute of a product. Attributes can be assigned to products and variants at the product type level. +""" +type Attribute implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + 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. + """ + choices( + """ + Sort attribute choices. + """ + sortBy: AttributeChoicesSortingInput + + """ + Filtering options for attribute choices. + """ + filter: AttributeValueFilterInput + + """ + 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 + ): AttributeValueCountableConnection + + """ + Whether the attribute requires values to be passed or not. Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + valueRequired: Boolean! + + """ + Whether the attribute should be visible or not in storefront. Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + visibleInStorefront: Boolean! + + """ + Whether the attribute can be filtered in storefront. Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + filterableInStorefront: Boolean! + + """ + Whether the attribute can be filtered in dashboard. Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + filterableInDashboard: Boolean! + + """ + Whether the attribute can be displayed in the admin product list. Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + availableInGrid: Boolean! + + """ + The position of the attribute in the storefront navigation (0 by default). Requires one of the following permissions: MANAGE_PAGES, MANAGE_PAGE_TYPES_AND_ATTRIBUTES, MANAGE_PRODUCTS, MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + storefrontSearchPosition: Int! + + """ + Returns translated attribute fields for the given language code. + """ + translation( + """ + A language code to return the translation for attribute. + """ + languageCode: LanguageCodeEnum! + ): AttributeTranslation + + """ + Flag indicating that attribute has predefined choices. + """ + withChoices: Boolean! + productTypes( + """ + 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! + productVariantTypes( + """ + 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! +} + +""" +An enumeration. +""" +enum AttributeInputTypeEnum { + DROPDOWN + MULTISELECT + FILE + REFERENCE + NUMERIC + RICH_TEXT + SWATCH + BOOLEAN + DATE + DATE_TIME +} + +""" +An enumeration. +""" +enum AttributeEntityTypeEnum { + PAGE + PRODUCT +} + +""" +An enumeration. +""" +enum AttributeTypeEnum { + PRODUCT_TYPE + PAGE_TYPE +} + +""" +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 +} + +type AttributeValueCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [AttributeValueCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type AttributeValueCountableEdge { + """ + The item at the end of the edge. + """ + node: AttributeValue! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +""" +Represents a value of an attribute. +""" +type AttributeValue implements Node { + id: ID! + + """ + Name of a value displayed in the interface. + """ + name: String + + """ + Internal representation of a value (unique per attribute). + """ + slug: String + + """ + Represent value of the attribute value (e.g. color values for swatch attributes). + """ + 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 of the attribute value, includes formatting. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString + + """ + Represents the boolean value of the attribute value. + """ + boolean: Boolean + + """ + Represents the date value of the attribute value. + """ + date: Date + + """ + Represents the date/time value of the attribute value. + """ + dateTime: DateTime +} + +type AttributeValueTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String! + + """ + Attribute value. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString +} + +type File { + """ + The URL of the file. + """ + url: String! + + """ + Content type of the file. + """ + contentType: String +} + +""" +The `Date` scalar type represents a Date +value as specified by +[iso8601](https://en.wikipedia.org/wiki/ISO_8601). +""" +scalar Date + +input AttributeChoicesSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort attribute choices by the selected field. + """ + field: AttributeChoicesSortField! +} + +enum AttributeChoicesSortField { + """ + Sort attribute choice by name. + """ + NAME + + """ + Sort attribute choice by slug. + """ + SLUG +} + +input AttributeValueFilterInput { + search: String + ids: [ID!] +} + +type AttributeTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String! +} + +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! +} + +enum VariantAttributeScope { + ALL + VARIANT_SELECTION + NOT_VARIANT_SELECTION +} + +""" +Represents assigned attribute to variant with variant selection attached. + +Added in Saleor 3.1. +""" +type AssignedVariantAttribute { + """ + Attribute assigned to variant. + """ + attribute: Attribute! + + """ + Determines, whether assigned attribute is allowed for variant selection. Supported variant types for variant selection are: ['dropdown', 'boolean', 'swatch', 'numeric'] + """ + variantSelection: Boolean! +} + +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! +} + +input AttributeFilterInput { + valueRequired: Boolean + isVariantOnly: Boolean + visibleInStorefront: Boolean + filterableInStorefront: Boolean + filterableInDashboard: Boolean + availableInGrid: Boolean + metadata: [MetadataFilter!] + search: String + ids: [ID!] + type: AttributeTypeEnum + inCollection: ID + inCategory: ID + + """ + Specifies the channel by which the data should be filtered. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String +} + +input MetadataFilter { + """ + Key of a metadata item. + """ + key: String! + + """ + Value of a metadata item. + """ + value: String +} + +""" +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 { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + slug: String! + parent: Category + level: Int! + + """ + Description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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. Requires the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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 +} + +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! +} + +""" +Represents an image. +""" +type Image { + """ + The URL of the image. + """ + url: String! + + """ + Alt text for an image. + """ + alt: String +} + +type CategoryTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + seoTitle: String + seoDescription: String + name: String + + """ + Translated description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Translated description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `description` field instead." + ) +} + +""" +Represents a version of a product such as different size or color. +""" +type ProductVariant implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + sku: String + product: Product! + trackInventory: Boolean! + quantityLimitPerCustomer: Int + weight: Weight + + """ + Channel given to retrieve this product variant. Also used by federation gateway to resolve this object in a federated query. + """ + channel: String + + """ + List of price information in channels for the product. + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_STAFF_USER. + """ + 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!]! + + """ + Gross margin percentage value. + """ + margin: Int + + """ + Total quantity ordered. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + revenue(period: ReportingPeriod): TaxedMoney + + """ + List of images for the product variant. + """ + images: [ProductImage!] + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `media` field 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + digitalContent: DigitalContent + + """ + Stocks for the product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + 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 + + """ + Two-letter ISO 3166-1 country code. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `address` argument instead. + """ + countryCode: CountryCode + ): [Stock!] + + """ + Quantity of a product available for sale in one checkout. Field value will be `null` when no `limitQuantityPerCheckout` in global settings has been set, and `productVariant` stocks are not tracked. + """ + 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 + + """ + 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. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `address` argument instead. + """ + countryCode: CountryCode + ): Int + + """ + Preorder data for product variant. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorder: PreorderData + created: DateTime! + updatedAt: DateTime! +} + +""" +Represents product varaint channel listing. +""" +type ProductVariantChannelListing implements Node { + id: ID! + channel: Channel! + price: Money + + """ + Cost price of the variant. + """ + costPrice: Money + + """ + Gross margin percentage value. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + margin: Int + + """ + Preorder variant data. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorderThreshold: PreorderThreshold +} + +""" +Represents preorder variant data for channel. +""" +type PreorderThreshold { + """ + Preorder threshold for product variant in this channel. + """ + quantity: Int + + """ + Number of sold product variant in this channel. + """ + soldUnits: Int! +} + +""" +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 +} + +""" +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! +} + +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 +} + +""" +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 +} + +""" +Represents a custom attribute. +""" +type SelectedAttribute { + """ + Name of an attribute displayed in the interface. + """ + attribute: Attribute! + + """ + Values of an attribute. + """ + values: [AttributeValue!]! +} + +enum ReportingPeriod { + TODAY + THIS_MONTH +} + +""" +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! +} + +""" +Represents a product media. +""" +type ProductMedia implements Node { + id: ID! + sortOrder: Int + alt: String! + type: ProductMediaType! + oembedData: JSONString! + + """ + The URL of the media. + """ + url( + """ + Size of the image. + """ + size: Int + ): String! +} + +""" +An enumeration. +""" +enum ProductMediaType { + IMAGE + VIDEO +} + +type ProductVariantTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String! +} + +type DigitalContent implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + useDefaultSettings: Boolean! + automaticFulfillment: Boolean! + contentFile: String! + maxDownloads: Int + urlValidDays: Int + + """ + List of URLs for the digital variant. + """ + urls: [DigitalContentUrl!] + + """ + Product variant assigned to digital content. + """ + productVariant: ProductVariant! +} + +type DigitalContentUrl implements Node { + id: ID! + content: DigitalContent! + created: DateTime! + downloadNum: Int! + + """ + URL for digital content. + """ + url: String + + """ + UUID of digital content. + """ + token: UUID! +} + +scalar UUID + +""" +Represents stock. +""" +type Stock implements Node { + id: ID! + warehouse: Warehouse! + productVariant: ProductVariant! + + """ + Quantity of a product in the warehouse's possession, including the allocated stock that is waiting for shipment. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + quantity: Int! + + """ + Quantity allocated for orders. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + quantityAllocated: Int! + + """ + Quantity reserved for checkouts. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + quantityReserved: Int! +} + +""" +Represents preorder settings for product variant. +""" +type PreorderData { + """ + The global preorder threshold for product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + globalThreshold: Int + + """ + Total number of sold product variant during preorder. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + globalSoldUnits: Int! + + """ + Preorder end date. + """ + endDate: DateTime +} + +""" +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 +} + +""" +Represents a range of monetary values. +""" +type TaxedMoneyRange { + """ + Lower bound of a price range. + """ + start: TaxedMoney + + """ + Upper bound of a price range. + """ + stop: TaxedMoney +} + +""" +Represents product channel listing. +""" +type ProductChannelListing implements Node { + id: ID! + publicationDate: Date + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `publishedAt` field to fetch the publication date." + ) + + """ + The product publication date time. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + isPublished: Boolean! + channel: Channel! + visibleInListings: Boolean! + availableForPurchase: Date + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `availableForPurchaseAt` field to fetch the available for purchase date." + ) + + """ + The product available for purchase date time. + + Added in Saleor 3.3. + """ + availableForPurchaseAt: DateTime + + """ + The price of the cheapest variant (including discounts). + """ + discountedPrice: Money + + """ + Purchase cost of product. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + purchaseCost: MoneyRange + + """ + Range of margin percentage value. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 +} + +type Margin { + start: Int + stop: Int +} + +""" +Represents a collection of products. +""" +type Collection implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + slug: String! + + """ + Channel given to retrieve this collection. Also used by federation gateway to resolve this object in a federated query. + """ + channel: String + + """ + Description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + channelListings: [CollectionChannelListing!] +} + +input ProductFilterInput { + isPublished: Boolean + collections: [ID!] + categories: [ID!] + hasCategory: Boolean + attributes: [AttributeInput!] + stockAvailability: StockAvailability + stocks: ProductStockFilterInput + search: String + metadata: [MetadataFilter!] + price: PriceRangeInput + minimalPrice: PriceRangeInput + updatedAt: DateTimeRangeInput + productTypes: [ID!] + giftCard: Boolean + ids: [ID!] + hasPreorderedVariants: Boolean + + """ + Specifies the channel by which the data should be filtered. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + 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 + + """ + The date/time range that the returned values should be in. + """ + dateTime: DateTimeRangeInput + + """ + The date range that the returned values should be in. In case of date/time attributes, the UTC midnight of the given date is used. + """ + date: DateRangeInput + + """ + The boolean value of the attribute. + """ + boolean: Boolean +} + +input IntRangeInput { + """ + Value greater than or equal to. + """ + gte: Int + + """ + Value less than or equal to. + """ + lte: Int +} + +input DateTimeRangeInput { + """ + Start date. + """ + gte: DateTime + + """ + End date. + """ + lte: DateTime +} + +input DateRangeInput { + """ + Start date. + """ + gte: Date + + """ + End date. + """ + lte: Date +} + +enum StockAvailability { + IN_STOCK + OUT_OF_STOCK +} + +input ProductStockFilterInput { + warehouseIds: [ID!] + quantity: IntRangeInput +} + +input PriceRangeInput { + """ + Price greater than or equal to. + """ + gte: Float + + """ + Price less than or equal to. + """ + lte: Float +} + +input ProductOrder { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + 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. + + This option requires a channel filter to work as the values can vary between channels. + """ + PRICE + + """ + Sort products by a minimal price of a product's variant. + + This option requires a channel filter to work as the values can vary between channels. + """ + MINIMAL_PRICE + + """ + Sort products by update date. + """ + LAST_MODIFIED + + """ + Sort products by update date. + """ + DATE + + """ + Sort products by type. + """ + TYPE + + """ + Sort products by publication status. + + This option requires a channel filter to work as the values can vary between channels. + """ + PUBLISHED + + """ + Sort products by publication date. + + This option requires a channel filter to work as the values can vary between channels. + """ + PUBLICATION_DATE + + """ + Sort products by publication date. + + This option requires a channel filter to work as the values can vary between channels. + """ + PUBLISHED_AT + + """ + Sort products by update date. + """ + LAST_MODIFIED_AT + + """ + Sort products by collection. Note: This option is available only for the `Collection.products` query. + + This option requires a channel filter to work as the values can vary between channels. + """ + COLLECTION + + """ + Sort products by rating. + """ + RATING +} + +type CollectionTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + seoTitle: String + seoDescription: String + name: String + + """ + Translated description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Translated description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `description` field instead." + ) +} + +""" +Represents collection channel listing. +""" +type CollectionChannelListing implements Node { + id: ID! + publicationDate: Date + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `publishedAt` field to fetch the publication date." + ) + + """ + The collection publication date. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + isPublished: Boolean! + channel: Channel! +} + +type ProductTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + seoTitle: String + seoDescription: String + name: String + + """ + Translated description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Translated description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `description` field instead." + ) +} + +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! +} + +input WarehouseFilterInput { + clickAndCollectOption: WarehouseClickAndCollectOptionEnum + search: String + ids: [ID!] + isPrivate: Boolean +} + +input WarehouseSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort warehouses by the selected field. + """ + field: WarehouseSortField! +} + +enum WarehouseSortField { + """ + Sort warehouses by name. + """ + NAME +} + +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! +} + +union TranslatableItem = + ProductTranslatableContent + | CollectionTranslatableContent + | CategoryTranslatableContent + | AttributeTranslatableContent + | AttributeValueTranslatableContent + | ProductVariantTranslatableContent + | PageTranslatableContent + | ShippingMethodTranslatableContent + | SaleTranslatableContent + | VoucherTranslatableContent + | MenuItemTranslatableContent + +type ProductTranslatableContent implements Node { + id: ID! + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Description of the product. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) + + """ + List of product attribute values that can be translated. + """ + attributeValues: [AttributeValueTranslatableContent!]! +} + +type AttributeValueTranslatableContent implements Node { + id: ID! + name: String! + + """ + Attribute value. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString + + """ + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type CollectionTranslatableContent implements Node { + id: ID! + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Description of the collection. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type CategoryTranslatableContent implements Node { + id: ID! + seoTitle: String + seoDescription: String + name: String! + + """ + Description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Description of the category. + + Rich text format. For reference see https://editorjs.io/ + """ + descriptionJson: JSONString + @deprecated( + reason: "This field 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type AttributeTranslatableContent implements Node { + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type ProductVariantTranslatableContent implements Node { + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) + + """ + List of product variant attribute values that can be translated. + """ + attributeValues: [AttributeValueTranslatableContent!]! +} + +type PageTranslatableContent implements Node { + id: ID! + seoTitle: String + seoDescription: String + title: String! + + """ + Content of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString + + """ + Content of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + contentJson: JSONString + @deprecated( + reason: "This field 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) + + """ + List of page content attribute values that can be translated. + """ + attributeValues: [AttributeValueTranslatableContent!]! +} + +type PageTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + seoTitle: String + seoDescription: String + title: String + + """ + Translated content of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString + + """ + Translated description of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + contentJson: JSONString + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `content` field instead." + ) +} + +""" +A static page that can be manually added by a shop operator through the dashboard. +""" +type Page implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + seoTitle: String + seoDescription: String + title: String! + + """ + Content of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString + publicationDate: Date + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `publishedAt` field to fetch the publication date." + ) + + """ + The page publication date. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + isPublished: Boolean! + slug: String! + pageType: PageType! + created: DateTime! + + """ + Content of the page. + + Rich text format. For reference see https://editorjs.io/ + """ + contentJson: JSONString! + @deprecated( + reason: "This field 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!]! +} + +""" +Represents a type of page. It defines what attributes are available to pages of this type. +""" +type PageType implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + slug: String! + + """ + Page attributes of that page type. + """ + attributes: [Attribute!] + + """ + Attributes that can be assigned to the page type. + + Requires one of the following permissions: MANAGE_PAGES. + """ + 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. + + Requires one of the following permissions: MANAGE_PAGES. + """ + hasPages: Boolean +} + +type ShippingMethodTranslatableContent implements Node { + id: ID! + name: String! + + """ + Description of the shipping method. + + Rich text format. For reference see https://editorjs.io/ + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingMethod: ShippingMethodType + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type SaleTranslatableContent implements Node { + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + sale: Sale + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type SaleTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String +} + +""" +Sales allow creating discounts for categories, collections or products and are visible to all the customers. +""" +type Sale implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + type: SaleType! + startDate: DateTime! + endDate: DateTime + created: DateTime! + updatedAt: 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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 product variants this sale applies to. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + variants( + """ + 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 + + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + channelListings: [SaleChannelListing!] + + """ + Sale value. + """ + discountValue: Float + + """ + Currency code for sale. + """ + currency: String +} + +enum SaleType { + FIXED + PERCENTAGE +} + +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! +} + +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! +} + +""" +Represents sale channel listing. +""" +type SaleChannelListing implements Node { + id: ID! + channel: Channel! + discountValue: Float! + currency: String! +} + +type VoucherTranslatableContent implements Node { + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucher: Voucher + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type VoucherTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String +} + +""" +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 & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String + code: String! + usageLimit: Int + used: Int! + startDate: DateTime! + endDate: DateTime + applyOncePerOrder: Boolean! + applyOncePerCustomer: Boolean! + onlyForStaff: Boolean! + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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 product variants this voucher applies to. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + variants( + """ + 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 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 + + """ + Determines a type of discount for voucher - value or percentage + """ + discountValueType: DiscountValueTypeEnum! + + """ + Voucher value. + """ + discountValue: Float + + """ + Currency code for voucher. + """ + currency: String + + """ + Minimum order value to apply voucher. + """ + minSpent: Money + + """ + Determines a type of voucher. + """ + type: VoucherTypeEnum! + + """ + List of availability in channels for the voucher. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + channelListings: [VoucherChannelListing!] +} + +enum DiscountValueTypeEnum { + FIXED + PERCENTAGE +} + +enum VoucherTypeEnum { + SHIPPING + ENTIRE_ORDER + SPECIFIC_PRODUCT +} + +""" +Represents voucher channel listing. +""" +type VoucherChannelListing implements Node { + id: ID! + channel: Channel! + discountValue: Float! + currency: String! + minSpent: Money +} + +type MenuItemTranslatableContent implements Node { + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Get model fields from the root level queries." + ) +} + +type MenuItemTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + name: String! +} + +""" +Represents a single item of the related menu. Can store categories, collection or pages. +""" +type MenuItem implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + menu: Menu! + parent: MenuItem + category: Category + + """ + A collection associated with this menu item. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + collection: Collection + + """ + A page associated with this menu item. Requires one of the following permissions to include unpublished items: MANAGE_PAGES. + """ + page: Page + level: Int! + 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 +} + +""" +Represents a single menu - an object that is used to help navigate through the store. +""" +type Menu implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + name: String! + slug: String! + items: [MenuItem!] +} + +enum TranslatableKinds { + ATTRIBUTE + ATTRIBUTE_VALUE + CATEGORY + COLLECTION + MENU_ITEM + PAGE + PRODUCT + SALE + SHIPPING_METHOD + VARIANT + VOUCHER +} + +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! +} + +input StockFilterInput { + """ + """ + quantity: Float + search: String +} + +""" +Represents a shop resource containing general shop data and configuration. +""" +type Shop { + """ + List of available payment gateways. + """ + availablePaymentGateways( + """ + A currency for which gateways will be returned. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `channel` argument instead. + """ + 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 all currencies supported by shop's channels. + + Added in Saleor 3.1. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER, AUTHENTICATED_APP. + """ + channelCurrencies: [String!]! + + """ + List of countries available in the shop. + """ + countries( + """ + A language code to return the translation for. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + languageCode: LanguageCodeEnum + + """ + Filtering options for countries + """ + filter: CountryFilterInput + ): [CountryDisplay!]! + + """ + Shop's default country. + """ + defaultCountry: CountryDisplay + + """ + Default shop's email sender's name. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + defaultMailSenderName: String + + """ + Default shop's email sender's address. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + 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! + + """ + Automatically approve all new fulfillments. + + Added in Saleor 3.1. + """ + fulfillmentAutoApprove: Boolean! + + """ + Allow to approve fulfillments which are unpaid. + + Added in Saleor 3.1. + """ + fulfillmentAllowUnpaid: 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. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + automaticFulfillmentDigitalProducts: Boolean + + """ + Default number of minutes stock will be reserved for anonymous checkout or null when stock reservation is disabled. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + reserveStockDurationAnonymousUser: Int + + """ + Default number of minutes stock will be reserved for authenticated checkout or null when stock reservation is disabled. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + reserveStockDurationAuthenticatedUser: Int + + """ + Default number of maximum line quantity in single checkout (per single checkout line). + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + limitQuantityPerCheckout: Int + + """ + Default number of max downloads per digital content URL. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + defaultDigitalMaxDownloads: Int + + """ + Default number of days which digital content URL will be valid. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + defaultDigitalUrlValidDays: Int + + """ + Company address. + """ + companyAddress: Address + + """ + URL of a view where customers can set their password. + """ + customerSetPasswordUrl: String + + """ + List of staff notification recipients. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + staffNotificationRecipients: [StaffNotificationRecipient!] + + """ + Resource limitations and current usage if any set for a shop + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER. + """ + limits: LimitInfo! + + """ + Saleor API version. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER, AUTHENTICATED_APP. + """ + version: String! +} + +""" +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!]! +} + +""" +Payment gateway client configuration key and value pair. +""" +type GatewayConfigLine { + """ + Gateway config key. + """ + field: String! + + """ + Gateway config value for key. + """ + value: String +} + +type ExternalAuthentication { + """ + ID of external authentication plugin. + """ + id: String! + + """ + Name of external authentication plugin. + """ + name: String +} + +""" +Shipping methods that can be used as means of shipping for orders and checkouts. +""" +type ShippingMethod implements Node & ObjectWithMetadata { + """ + Unique ID of ShippingMethod available for Order. + """ + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + Type of the shipping method. + """ + type: ShippingMethodTypeEnum + @deprecated(reason: "This field will be removed in Saleor 4.0.") + + """ + Shipping method name. + """ + name: String! + + """ + Shipping method description. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString + + """ + Maximum delivery days for this shipping method. + """ + maximumDeliveryDays: Int + + """ + Minimum delivery days for this shipping method. + """ + minimumDeliveryDays: Int + + """ + Maximum order weight for this shipping method. + """ + maximumOrderWeight: Weight + @deprecated(reason: "This field will be removed in Saleor 4.0.") + + """ + Minimum order weight for this shipping method. + """ + minimumOrderWeight: Weight + @deprecated(reason: "This field will be removed in Saleor 4.0.") + + """ + Returns translated shipping method fields for the given language code. + """ + translation( + """ + A language code to return the translation for shipping method. + """ + languageCode: LanguageCodeEnum! + ): ShippingMethodTranslation + + """ + The price of selected shipping method. + """ + price: Money! + + """ + Maximum order price for this shipping method. + """ + maximumOrderPrice: Money + + """ + Minimal order price for this shipping method. + """ + minimumOrderPrice: Money + + """ + Describes if this shipping method is active and can be selected. + """ + active: Boolean! + + """ + Message connected to this shipping method. + """ + message: String +} + +input CountryFilterInput { + """ + Boolean for filtering countries by having shipping zone assigned.If 'true', return countries with shipping zone assigned.If 'false', return countries without any shipping zone assigned.If the argument is not provided (null), return all countries. + """ + attachedToShippingZones: Boolean +} + +""" +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! +} + +type ShopTranslation implements Node { + id: ID! + + """ + Translation language. + """ + language: LanguageDisplay! + headerText: String! + description: String! +} + +""" +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 { + id: ID! + + """ + Returns a user subscribed to email notifications. + """ + user: User + + """ + Returns email address of a user subscribed to email notifications. + """ + email: String + + """ + Determines if a notification active. + """ + active: Boolean +} + +""" +Represents user data. +""" +type User implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + email: String! + firstName: String! + lastName: String! + isStaff: Boolean! + isActive: Boolean! + + """ + List of all user's addresses. + """ + addresses: [Address!] + + """ + Returns the last open checkout of this user. + """ + checkout: Checkout + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `checkoutTokens` 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!] + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `checkoutIds` instead." + ) + + """ + Returns the checkout ID's assigned to this user. + """ + checkoutIds( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): [ID!] + + """ + 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 + + """ + A note about the customer. + + Requires one of the following permissions: MANAGE_USERS, MANAGE_STAFF. + """ + note: String + + """ + List of user's orders. Requires one of the following permissions: MANAGE_STAFF, OWNER. + """ + 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. + + Requires one of the following permissions: MANAGE_USERS, MANAGE_STAFF. + """ + 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! + defaultShippingAddress: Address + defaultBillingAddress: Address + lastLogin: DateTime + dateJoined: DateTime! + updatedAt: DateTime! +} + +""" +Checkout object. +""" +type Checkout implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + created: DateTime! + lastChange: DateTime! + user: User + channel: Channel! + billingAddress: Address + shippingAddress: Address + note: String! + discount: Money + discountName: String + translatedDiscountName: String + voucherCode: String + + """ + Shipping methods that can be used with this checkout. + """ + availableShippingMethods: [ShippingMethod!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `shippingMethods` instead." + ) + + """ + Shipping methods that can be used with this checkout. + """ + shippingMethods: [ShippingMethod!]! + + """ + Collection points that can be used for this order. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + availableCollectionPoints: [Warehouse!]! + + """ + List of available payment gateways. + """ + availablePaymentGateways: [PaymentGateway!]! + + """ + Email of a customer. + """ + email: String + + """ + List of gift cards associated with this checkout. + """ + giftCards: [GiftCard!]! + + """ + Returns True, if checkout requires shipping. + """ + isShippingRequired: Boolean! + + """ + The number of items purchased. + """ + quantity: Int! + + """ + Date when oldest stock reservation for this checkout expires or null if no stock is reserved. + + Added in Saleor 3.1. + """ + stockReservationExpires: DateTime + + """ + 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 + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `deliveryMethod` instead." + ) + + """ + The delivery method selected for this checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + deliveryMethod: DeliveryMethod + + """ + 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! + + """ + List of transactions for the checkout. Requires one of the following permissions: MANAGE_CHECKOUTS, HANDLE_PAYMENTS. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + transactions: [TransactionItem!] +} + +""" +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 & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + Code in format which allows displaying in a user interface. + """ + displayCode: String! + + """ + Last 4 characters of gift card code. + """ + last4CodeChars: String! + + """ + Gift card code. Can be fetched by a staff member with MANAGE_GIFT_CARD when gift card wasn't yet used and by the gift card owner. + """ + code: String! + created: DateTime! + + """ + The user who bought or issued a gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + createdBy: User + + """ + The customer who used a gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + usedBy: User + + """ + Email address of the user who bought or issued gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_USERS, OWNER. + """ + createdByEmail: String + + """ + Email address of the customer who used a gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + usedByEmail: String + lastUsedOn: DateTime + expiryDate: Date + + """ + App which created the gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_APPS, OWNER. + """ + app: App + + """ + Related gift card product. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + product: Product + + """ + List of events associated with the gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + events( + """ + Filtering options for gift card events. + """ + filter: GiftCardEventFilterInput + ): [GiftCardEvent!]! + + """ + The gift card tag. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + tags: [GiftCardTag!]! + + """ + Slug of the channel where the gift card was bought. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + boughtInChannel: String + isActive: Boolean! + initialBalance: Money + currentBalance: Money + + """ + The customer who bought a gift card. + """ + user: User + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `createdBy` field instead." + ) + + """ + End date of gift card. + """ + endDate: DateTime + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `expiryDate` field instead." + ) + + """ + Start date of gift card. + """ + startDate: DateTime + @deprecated(reason: "This field will be removed in Saleor 4.0.") +} + +""" +History log of the gift card. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type GiftCardEvent implements Node { + id: ID! + + """ + Date when event happened at in ISO 8601 format. + """ + date: DateTime + + """ + Gift card event type. + """ + type: GiftCardEventsEnum + + """ + User who performed the action. Requires one of the following permissions: MANAGE_USERS, MANAGE_STAFF, OWNER. + """ + user: User + + """ + App that performed the action. Requires one of the following permissions: MANAGE_APPS, OWNER. + """ + app: App + + """ + Content of the event. + """ + message: String + + """ + Email of the customer. + """ + email: String + + """ + The order ID where gift card was used or bought. + """ + orderId: ID + + """ + User-friendly number of an order where gift card was used or bought. + """ + orderNumber: String + + """ + The list of gift card tags. + """ + tags: [String!] + + """ + The list of old gift card tags. + """ + oldTags: [String!] + + """ + The gift card balance. + """ + balance: GiftCardEventBalance + + """ + The gift card expiry date. + """ + expiryDate: Date + + """ + Previous gift card expiry date. + """ + oldExpiryDate: Date +} + +""" +An enumeration. +""" +enum GiftCardEventsEnum { + ISSUED + BOUGHT + UPDATED + ACTIVATED + DEACTIVATED + BALANCE_RESET + EXPIRY_DATE_UPDATED + TAGS_UPDATED + SENT_TO_CUSTOMER + RESENT + NOTE_ADDED + USED_IN_ORDER +} + +type GiftCardEventBalance { + """ + Initial balance of the gift card. + """ + initialBalance: Money + + """ + Current balance of the gift card. + """ + currentBalance: Money! + + """ + Previous initial balance of the gift card. + """ + oldInitialBalance: Money + + """ + Previous current balance of the gift card. + """ + oldCurrentBalance: Money +} + +input GiftCardEventFilterInput { + type: GiftCardEventsEnum + orders: [ID!] +} + +""" +The gift card tag. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type GiftCardTag implements Node { + id: ID! + name: String! +} + +""" +Represents an item in the checkout. +""" +type CheckoutLine implements Node { + id: ID! + variant: ProductVariant! + quantity: Int! + + """ + The unit price of the checkout line, with taxes and discounts. + """ + unitPrice: TaxedMoney! + + """ + The unit price of the checkout line, without discounts. + """ + undiscountedUnitPrice: Money! + + """ + The sum of the checkout line price, taxes and discounts. + """ + totalPrice: TaxedMoney! + + """ + The sum of the checkout line price, without discounts. + """ + undiscountedTotalPrice: Money! + + """ + Indicates whether the item need to be delivered. + """ + requiresShipping: Boolean! +} + +""" +Represents a delivery method chosen for the checkout. `Warehouse` type is used when checkout is marked as "click and collect" and `ShippingMethod` otherwise. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +union DeliveryMethod = Warehouse | ShippingMethod + +""" +Represents a payment transaction. + +Added in Saleor 3.4. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type TransactionItem implements Node & ObjectWithMetadata { + """ + The ID of the object. + """ + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + createdAt: DateTime! + modifiedAt: DateTime! + + """ + List of actions that can be performed in the current state of a payment. + """ + actions: [TransactionActionEnum!]! + + """ + Total amount authorized for this payment. + """ + authorizedAmount: Money! + + """ + Total amount refunded for this payment. + """ + refundedAmount: Money! + + """ + Total amount voided for this payment. + """ + voidedAmount: Money! + + """ + Total amount charged for this payment. + """ + chargedAmount: Money! + + """ + Status of transaction. + """ + status: String! + + """ + Type of transaction. + """ + type: String! + + """ + Reference of transaction. + """ + reference: String! + + """ + List of all transaction's events. + """ + events: [TransactionEvent!]! +} + +""" +Represents possible actions on payment transaction. + + The following actions are possible: + CHARGE - Represents the charge action. + REFUND - Represents a refund action. + VOID - Represents a void action. +""" +enum TransactionActionEnum { + CHARGE + REFUND + VOID +} + +""" +Represents transaction's event. +""" +type TransactionEvent implements Node { + """ + The ID of the object. + """ + id: ID! + createdAt: DateTime! + + """ + Status of transaction's event. + """ + status: TransactionStatus! + + """ + Reference of transaction's event. + """ + reference: String! + + """ + Name of the transaction's event. + """ + name: String +} + +""" +An enumeration. +""" +enum TransactionStatus { + PENDING + SUCCESS + FAILURE +} + +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! +} + +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! +} + +""" +Represents an order in the shop. +""" +type Order implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + created: DateTime! + updatedAt: DateTime! + status: OrderStatus! + + """ + User who placed the order. This field is set only for orders placed by authenticated users. Can be fetched for orders created in Saleor 3.2 and later, for other orders requires one of the following permissions: MANAGE_USERS, MANAGE_ORDERS, OWNER. + """ + user: User + trackingClientId: String! + + """ + Billing address. The full data can be access for orders created in Saleor 3.2 and later, for other orders requires one of the following permissions: MANAGE_ORDERS, OWNER. + """ + billingAddress: Address + + """ + Shipping address. The full data can be access for orders created in Saleor 3.2 and later, for other orders requires one of the following permissions: MANAGE_ORDERS, OWNER. + """ + shippingAddress: Address + shippingMethodName: String + collectionPointName: String + channel: Channel! + + """ + 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!] + @deprecated( + reason: "Use `shippingMethods`, this field will be removed in 4.0" + ) + + """ + Shipping methods related to this order. + """ + shippingMethods: [ShippingMethod!]! + + """ + Collection points that can be used for this order. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + availableCollectionPoints: [Warehouse!]! + + """ + List of order invoices. Can be fetched for orders created in Saleor 3.2 and later, for other orders requires one of the following permissions: MANAGE_ORDERS, OWNER. + """ + 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! + + """ + The authorize status of the order. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + authorizeStatus: OrderAuthorizeStatusEnum! + + """ + The charge status of the order. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + chargeStatus: OrderChargeStatusEnum! + + """ + List of transactions for the order. Requires one of the following permissions: MANAGE_ORDERS, HANDLE_PAYMENTS. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + transactions: [TransactionItem!]! + + """ + List of payments for the order. + """ + payments: [Payment!]! + + """ + Total amount of the order. + """ + total: TaxedMoney! + + """ + Undiscounted total amount of the order. + """ + undiscountedTotal: TaxedMoney! + + """ + Shipping method for this order. + """ + shippingMethod: ShippingMethod + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `deliveryMethod` instead." + ) + + """ + Total price of shipping. + """ + shippingPrice: TaxedMoney! + shippingTaxRate: Float! + token: String! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `id` instead." + ) + voucher: Voucher + + """ + List of user gift cards. + """ + giftCards: [GiftCard!]! + displayGrossPrices: Boolean! + customerNote: String! + weight: Weight! + redirectUrl: String + + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + events: [OrderEvent!]! + + """ + The difference between the paid and the order total amount. + """ + totalBalance: Money! + + """ + Email address of the customer. The full data can be access for orders created in Saleor 3.2 and later, for other orders requires one of the following permissions: MANAGE_ORDERS, OWNER. + """ + userEmail: String + + """ + Returns True, if order requires shipping. + """ + isShippingRequired: Boolean! + + """ + The delivery method selected for this checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + deliveryMethod: DeliveryMethod + languageCode: String! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `languageCodeEnum` field to fetch the language code. " + ) + + """ + Order language code. + """ + languageCodeEnum: LanguageCodeEnum! + + """ + Returns applied discount. + """ + discount: Money + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `discounts` field instead." + ) + + """ + Discount name. + """ + discountName: String + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `discounts` field instead." + ) + + """ + Translated discount name. + """ + translatedDiscountName: String + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use the `discounts` field instead. " + ) + + """ + List of all discounts assigned to the order. + """ + discounts: [OrderDiscount!]! + + """ + List of errors that occurred during order validation. + """ + errors: [OrderError!]! +} + +""" +An enumeration. +""" +enum OrderStatus { + DRAFT + UNCONFIRMED + UNFULFILLED + PARTIALLY_FULFILLED + PARTIALLY_RETURNED + RETURNED + FULFILLED + CANCELED +} + +""" +Represents order fulfillment. +""" +type Fulfillment implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + fulfillmentOrder: Int! + status: FulfillmentStatus! + trackingNumber: String! + created: DateTime! + + """ + List of lines for the fulfillment. + """ + lines: [FulfillmentLine!] + + """ + User-friendly fulfillment status. + """ + statusDisplay: String + + """ + Warehouse from fulfillment was fulfilled. + """ + warehouse: Warehouse +} + +""" +An enumeration. +""" +enum FulfillmentStatus { + FULFILLED + REFUNDED + RETURNED + REPLACED + REFUNDED_AND_RETURNED + CANCELED + WAITING_FOR_APPROVAL +} + +""" +Represents line of the fulfillment. +""" +type FulfillmentLine implements Node { + id: ID! + quantity: Int! + orderLine: OrderLine +} + +""" +Represents order line of particular order. +""" +type OrderLine implements Node { + id: ID! + productName: String! + variantName: String! + productSku: String + productVariantId: 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. Requires one of the following permissions to include the unpublished items: MANAGE_ORDERS, MANAGE_DISCOUNTS, MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + allocations: [Allocation!] + + """ + A quantity of items remaining to be fulfilled. + + Added in Saleor 3.1. + """ + quantityToFulfill: Int! + + """ + Type of the discount: fixed or percent + """ + unitDiscountType: DiscountValueTypeEnum +} + +""" +Positive Decimal scalar implementation. + +Should be used in places where value must be positive. +""" +scalar PositiveDecimal + +""" +Represents allocation. +""" +type Allocation implements Node { + id: ID! + + """ + Quantity allocated for orders. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + quantity: Int! + + """ + The warehouse were items were allocated. + + Requires one of the following permissions: MANAGE_PRODUCTS, MANAGE_ORDERS. + """ + warehouse: Warehouse! +} + +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 +} + +""" +Represents an Invoice. +""" +type Invoice implements ObjectWithMetadata & Job & Node { + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + + """ + Job status. + """ + status: JobStatusEnum! + createdAt: DateTime! + updatedAt: DateTime! + message: String + + """ + The ID of the object. + """ + id: ID! + number: String + externalUrl: String + + """ + URL to download an invoice. + """ + url: String +} + +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 OrderOriginEnum { + CHECKOUT + DRAFT + REISSUE +} + +""" +An enumeration. +""" +enum PaymentChargeStatusEnum { + NOT_CHARGED + PENDING + PARTIALLY_CHARGED + FULLY_CHARGED + PARTIALLY_REFUNDED + FULLY_REFUNDED + REFUSED + CANCELLED +} + +""" +Determine a current authorize status for order. + + We treat the order as fully authorized when the sum of authorized and charged funds + cover the order.total. + We treat the order as partially authorized when the sum of authorized and charged + funds covers only part of the order.total + We treat the order as not authorized when the sum of authorized and charged funds is + 0. + + NONE - the funds are not authorized + PARTIAL - the funds that are authorized or charged don't cover fully the order's + total + FULL - the funds that are authorized or charged fully cover the order's total +""" +enum OrderAuthorizeStatusEnum { + NONE + PARTIAL + FULL +} + +""" +Determine the current charge status for the order. + + We treat the order as overcharged when the charged amount is bigger that order.total + We treat the order as fully charged when the charged amount is equal to order.total. + We treat the order as partially charged when the charged amount covers only part of + the order.total + + NONE - the funds are not charged. + PARTIAL - the funds that are charged don't cover the order's total + FULL - the funds that are charged fully cover the order's total + OVERCHARGED - the charged funds are bigger than order's total +""" +enum OrderChargeStatusEnum { + NONE + PARTIAL + FULL + OVERCHARGED +} + +""" +Represents a payment of a given type. +""" +type Payment implements Node & ObjectWithMetadata { + id: ID! + + """ + List of private metadata items. Requires staff permissions to access. + """ + privateMetadata: [MetadataItem!]! + + """ + A single key from private metadata. Requires staff permissions to access. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafield(key: String!): String + + """ + Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + privateMetafields(keys: [String!]): Metadata + + """ + List of public metadata items. Can be accessed without permissions. + """ + metadata: [MetadataItem!]! + + """ + A single key from public metadata. + + Tip: Use GraphQL aliases to fetch multiple keys. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafield(key: String!): String + + """ + Public metadata. Use `keys` to control which fields you want to include. The default is to include everything. + + Added in Saleor 3.3. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + metafields(keys: [String!]): Metadata + gateway: String! + isActive: Boolean! + created: DateTime! + modified: DateTime! + token: String! + checkout: Checkout + order: Order + paymentMethodType: String! + + """ + IP address of the user who created the payment. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + customerIpAddress: String + + """ + Internal payment status. + """ + chargeStatus: PaymentChargeStatusEnum! + + """ + List of actions that can be performed in the current state of a payment. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + actions: [OrderAction!]! + + """ + Total amount of the payment. + """ + total: Money + + """ + Total amount captured for this payment. + """ + capturedAmount: Money + + """ + List of all transactions within this payment. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + transactions: [Transaction!] + + """ + Maximum amount of money that can be captured. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + availableCaptureAmount: Money + + """ + Maximum amount of money that can be refunded. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + availableRefundAmount: Money + + """ + The details of the card used for this payment. + """ + creditCard: CreditCard +} + +""" +An object representing a single payment. +""" +type Transaction implements Node { + 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 + AUTH + PENDING + ACTION_TO_CONFIRM + REFUND + REFUND_ONGOING + CAPTURE + VOID + CONFIRM + CANCEL +} + +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 +} + +""" +History log of the order. +""" +type OrderEvent implements Node { + 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 + + """ + App that performed the action. Requires of of the following permissions: MANAGE_APPS, MANAGE_ORDERS, OWNER. + """ + app: App + + """ + 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 reference from the payment provider. + """ + 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 + + """ + The status of payment's transaction. + """ + status: TransactionStatus + + """ + The reference of payment's transaction. + """ + reference: String +} + +""" +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 + ORDER_LINE_PRODUCT_DELETED + ORDER_LINE_VARIANT_DELETED + UPDATED_ADDRESS + EMAIL_SENT + CONFIRMED + PAYMENT_AUTHORIZED + PAYMENT_CAPTURED + EXTERNAL_SERVICE_NOTIFICATION + PAYMENT_REFUNDED + PAYMENT_VOIDED + PAYMENT_FAILED + TRANSACTION_EVENT + TRANSACTION_CAPTURE_REQUESTED + TRANSACTION_REFUND_REQUESTED + TRANSACTION_VOID_REQUESTED + INVOICE_REQUESTED + INVOICE_GENERATED + INVOICE_UPDATED + INVOICE_SENT + FULFILLMENT_CANCELED + FULFILLMENT_RESTOCKED_ITEMS + FULFILLMENT_FULFILLED_ITEMS + FULFILLMENT_REFUNDED + FULFILLMENT_RETURNED + FULFILLMENT_REPLACED + FULFILLMENT_AWAITS_APPROVAL + TRACKING_UPDATED + NOTE_ADDED + OTHER +} + +""" +An enumeration. +""" +enum OrderEventsEmailsEnum { + PAYMENT_CONFIRMATION + CONFIRMED + SHIPPING_CONFIRMATION + TRACKING_UPDATED + ORDER_CONFIRMATION + ORDER_CANCEL + ORDER_REFUND + FULFILLMENT_CONFIRMATION + DIGITAL_LINKS +} + +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 +} + +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 +} + +""" +Contains all details related to the applied discount to the order. +""" +type OrderDiscount implements Node { + id: ID! + type: OrderDiscountType! + name: String + translatedName: String + + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + reason: String + + """ + Returns amount of discount. + """ + amount: Money! +} + +""" +An enumeration. +""" +enum OrderDiscountType { + VOUCHER + MANUAL +} + +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 + + """ + List of order line IDs that cause the error. + """ + orderLines: [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 + CANNOT_FULFILL_UNPAID_ORDER + CAPTURE_INACTIVE_PAYMENT + GIFT_CARD_LINE + 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 + MISSING_TRANSACTION_ACTION_REQUEST_WEBHOOK +} + +""" +An enumeration. +""" +enum AddressTypeEnum { + BILLING + SHIPPING +} + +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!] +} + +""" +Represents permission group data. +""" +type Group implements Node { + id: ID! + name: String! + + """ + List of group users + + Requires one of the following permissions: MANAGE_STAFF. + """ + users: [User!] + + """ + List of group permissions + """ + permissions: [Permission!] + + """ + True, if the currently authenticated user has rights to manage a group. + """ + userCanManage: Boolean! +} + +""" +History log of the customer. +""" +type CustomerEvent implements Node { + 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 + + """ + App that performed the action. + """ + app: App + + """ + 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 +} + +""" +Represents a payment source stored for user in payment gateway, such as credit card. +""" +type PaymentSource { + """ + Payment gateway name. + """ + gateway: String! + + """ + ID of stored payment method. + """ + paymentMethodId: String + + """ + Stored credit card details if available. + """ + creditCardInfo: CreditCard + + """ + List of public metadata items. + + Added in Saleor 3.1. + + Can be accessed without permissions. + """ + metadata: [MetadataItem!]! +} + +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 +} + +""" +Order related settings from site settings. +""" +type OrderSettings { + automaticallyConfirmAllNewOrders: Boolean! + automaticallyFulfillNonShippableGiftCard: Boolean! +} + +""" +Gift card related settings from site settings. +""" +type GiftCardSettings { + """ + The gift card expiry type settings. + """ + expiryType: GiftCardSettingsExpiryTypeEnum! + + """ + The gift card expiry period settings. + """ + expiryPeriod: TimePeriod +} + +""" +An enumeration. +""" +enum GiftCardSettingsExpiryTypeEnum { + NEVER_EXPIRE + EXPIRY_PERIOD +} + +type TimePeriod { + """ + The length of the period. + """ + amount: Int! + + """ + The type of the period. + """ + type: TimePeriodTypeEnum! +} + +""" +An enumeration. +""" +enum TimePeriodTypeEnum { + DAY + WEEK + MONTH + YEAR +} + +input ShippingZoneFilterInput { + search: String + channels: [ID!] +} + +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! +} + +input CategoryFilterInput { + search: String + metadata: [MetadataFilter!] + ids: [ID!] +} + +input CategorySortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String + + """ + Sort categories by the selected field. + """ + field: CategorySortField! +} + +enum CategorySortField { + """ + Sort categories by name. + """ + NAME + + """ + Sort categories by product count. + """ + PRODUCT_COUNT + + """ + Sort categories by subcategory count. + """ + SUBCATEGORY_COUNT +} + +input CollectionFilterInput { + published: CollectionPublished + search: String + metadata: [MetadataFilter!] + ids: [ID!] + + """ + Specifies the channel by which the data should be filtered. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String +} + +enum CollectionPublished { + PUBLISHED + HIDDEN +} + +input CollectionSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String + + """ + Sort collections by the selected field. + """ + field: CollectionSortField! +} + +enum CollectionSortField { + """ + Sort collections by name. + """ + NAME + + """ + Sort collections by availability. + + This option requires a channel filter to work as the values can vary between channels. + """ + AVAILABILITY + + """ + Sort collections by product count. + """ + PRODUCT_COUNT + + """ + Sort collections by publication date. + + This option requires a channel filter to work as the values can vary between channels. + """ + PUBLICATION_DATE + + """ + Sort collections by publication date. + + This option requires a channel filter to work as the values can vary between channels. + """ + PUBLISHED_AT +} + +input ProductTypeFilterInput { + search: String + configurable: ProductTypeConfigurable + productType: ProductTypeEnum + metadata: [MetadataFilter!] + kind: ProductTypeKindEnum + ids: [ID!] +} + +enum ProductTypeConfigurable { + CONFIGURABLE + SIMPLE +} + +enum ProductTypeEnum { + DIGITAL + SHIPPABLE +} + +input ProductTypeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort product types by the selected field. + """ + field: ProductTypeSortField! +} + +enum ProductTypeSortField { + """ + Sort products by name. + """ + NAME + + """ + Sort products by type. + """ + DIGITAL + + """ + Sort products by shipping. + """ + SHIPPING_REQUIRED +} + +input ProductVariantFilterInput { + search: String + sku: [String!] + metadata: [MetadataFilter!] + isPreorder: Boolean + updatedAt: DateTimeRangeInput +} + +input ProductVariantSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort productVariants by the selected field. + """ + field: ProductVariantSortField! +} + +enum ProductVariantSortField { + """ + Sort products variants by last modified at. + """ + LAST_MODIFIED_AT +} + +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! +} + +input PaymentFilterInput { + checkouts: [ID!] +} + +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! +} + +input PageSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort pages by the selected field. + """ + field: PageSortField! +} + +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. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + PUBLICATION_DATE + + """ + Sort pages by publication date. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + PUBLISHED_AT +} + +input PageFilterInput { + search: String + metadata: [MetadataFilter!] + pageTypes: [ID!] + ids: [ID!] +} + +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! +} + +input PageTypeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort page types by the selected field. + """ + field: PageTypeSortField! +} + +enum PageTypeSortField { + """ + Sort page types by name. + """ + NAME + + """ + Sort page types by slug. + """ + SLUG +} + +input PageTypeFilterInput { + search: String +} + +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! +} + +input OrderSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort orders by the selected field. + """ + field: OrderSortField! +} + +enum OrderSortField { + """ + Sort orders by number. + """ + NUMBER + + """ + Sort orders by creation date. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + CREATION_DATE + + """ + Sort orders by creation date. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + CREATED_AT + + """ + Sort orders by last modified at. + """ + LAST_MODIFIED_AT + + """ + Sort orders by customer. + """ + CUSTOMER + + """ + Sort orders by payment. + """ + PAYMENT + + """ + Sort orders by fulfillment status. + """ + FULFILLMENT_STATUS +} + +input OrderFilterInput { + paymentStatus: [PaymentChargeStatusEnum!] + status: [OrderStatusFilter!] + customer: String + created: DateRangeInput + search: String + metadata: [MetadataFilter!] + channels: [ID!] + authorizeStatus: [OrderAuthorizeStatusEnum!] + chargeStatus: [OrderChargeStatusEnum!] + updatedAt: DateTimeRangeInput + isClickAndCollect: Boolean + isPreorder: Boolean + ids: [ID!] + giftCardUsed: Boolean + giftCardBought: Boolean + numbers: [String!] +} + +enum OrderStatusFilter { + READY_TO_FULFILL + READY_TO_CAPTURE + UNFULFILLED + UNCONFIRMED + PARTIALLY_FULFILLED + FULFILLED + CANCELED +} + +input OrderDraftFilterInput { + customer: String + created: DateRangeInput + search: String + metadata: [MetadataFilter!] + channels: [ID!] +} + +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! +} + +input MenuSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort menus by the selected field. + """ + field: MenuSortField! +} + +enum MenuSortField { + """ + Sort menus by name. + """ + NAME + + """ + Sort menus by items count. + """ + ITEMS_COUNT +} + +input MenuFilterInput { + search: String + slug: [String!] + metadata: [MetadataFilter!] +} + +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! +} + +input MenuItemSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort menu items by the selected field. + """ + field: MenuItemsSortField! +} + +enum MenuItemsSortField { + """ + Sort menu items by name. + """ + NAME +} + +input MenuItemFilterInput { + search: String + metadata: [MetadataFilter!] +} + +input GiftCardSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort gift cards by the selected field. + """ + field: GiftCardSortField! +} + +enum GiftCardSortField { + """ + Sort orders by product. + """ + PRODUCT + + """ + Sort orders by used by. + """ + USED_BY + + """ + Sort orders by current balance. + """ + CURRENT_BALANCE +} + +input GiftCardFilterInput { + isActive: Boolean + metadata: [MetadataFilter!] + tags: [String!] + products: [ID!] + usedBy: [ID!] + used: Boolean + currency: String + currentBalance: PriceRangeInput + initialBalance: PriceRangeInput + code: String +} + +type GiftCardTagCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [GiftCardTagCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type GiftCardTagCountableEdge { + """ + The item at the end of the edge. + """ + node: GiftCardTag! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +input GiftCardTagFilterInput { + search: String +} + +""" +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!] +} + +""" +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 +} + +""" +An enumeration. +""" +enum ConfigurationTypeFieldEnum { + STRING + MULTILINE + BOOLEAN + SECRET + PASSWORD + SECRETMULTILINE + OUTPUT +} + +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! +} + +input PluginFilterInput { + statusInChannels: PluginStatusInChannelsInput + search: String + type: PluginConfigurationType +} + +input PluginStatusInChannelsInput { + active: Boolean! + channels: [ID!]! +} + +enum PluginConfigurationType { + PER_CHANNEL + GLOBAL +} + +input PluginSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort plugins by the selected field. + """ + field: PluginSortField! +} + +enum PluginSortField { + NAME + IS_ACTIVE +} + +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! +} + +input SaleFilterInput { + status: [DiscountStatusEnum!] + saleType: DiscountValueTypeEnum + started: DateTimeRangeInput + search: String + metadata: [MetadataFilter!] + updatedAt: DateTimeRangeInput +} + +enum DiscountStatusEnum { + ACTIVE + EXPIRED + SCHEDULED +} + +input SaleSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String + + """ + Sort sales by the selected field. + """ + field: SaleSortField! +} + +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. + + This option requires a channel filter to work as the values can vary between channels. + """ + VALUE + + """ + Sort sales by type. + """ + TYPE + + """ + Sort sales by created at. + """ + CREATED_AT + + """ + Sort sales by last modified at. + """ + LAST_MODIFIED_AT +} + +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! +} + +input VoucherFilterInput { + status: [DiscountStatusEnum!] + timesUsed: IntRangeInput + discountType: [VoucherDiscountType!] + started: DateTimeRangeInput + search: String + metadata: [MetadataFilter!] +} + +enum VoucherDiscountType { + FIXED + PERCENTAGE + SHIPPING +} + +input VoucherSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Specifies the channel in which to sort the data. + + DEPRECATED: this field will be removed in Saleor 4.0. Use root-level channel argument instead. + """ + channel: String + + """ + Sort vouchers by the selected field. + """ + field: VoucherSortField! +} + +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. + + This option requires a channel filter to work as the values can vary between channels. + """ + VALUE + + """ + Sort vouchers by type. + """ + TYPE + + """ + Sort vouchers by usage limit. + """ + USAGE_LIMIT + + """ + Sort vouchers by minimum spent amount. + + This option requires a channel filter to work as the values can vary between channels. + """ + MINIMUM_SPENT_AMOUNT +} + +""" +Represents a job data of exported file. +""" +type ExportFile implements Node & Job { + 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 + + """ + The URL of field to download. + """ + url: String + + """ + List of events associated with the export. + """ + events: [ExportEvent!] + user: User + app: App +} + +""" +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. Requires one of the following permissions: OWNER, MANAGE_STAFF. + """ + user: User + + """ + App which performed the action. Requires one of the following permissions: OWNER, MANAGE_APPS. + """ + 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 +} + +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 +} + +input ExportFileSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort export file by the selected field. + """ + field: ExportFileSortField! +} + +enum ExportFileSortField { + STATUS + CREATED_AT + UPDATED_AT + LAST_MODIFIED_AT +} + +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! +} + +input CheckoutSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort checkouts by the selected field. + """ + field: CheckoutSortField! +} + +enum CheckoutSortField { + """ + Sort checkouts by creation date. + """ + CREATION_DATE + + """ + Sort checkouts by customer. + """ + CUSTOMER + + """ + Sort checkouts by payment. + """ + PAYMENT +} + +input CheckoutFilterInput { + customer: String + created: DateRangeInput + search: String + metadata: [MetadataFilter!] + channels: [ID!] +} + +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! +} + +input AttributeSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort attributes by the selected field. + """ + field: AttributeSortField! +} + +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 +} + +""" +Represents ongoing installation of app. +""" +type AppInstallation implements Node & Job { + 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 + appName: String! + manifestUrl: String! +} + +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! +} + +input AppFilterInput { + search: String + isActive: Boolean + type: AppTypeEnum +} + +input AppSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort apps by the selected field. + """ + field: AppSortField! +} + +enum AppSortField { + """ + Sort apps by name. + """ + NAME + + """ + Sort apps by creation date. + """ + CREATION_DATE +} + +type AppExtensionCountableConnection { + """ + Pagination data for this connection. + """ + pageInfo: PageInfo! + edges: [AppExtensionCountableEdge!]! + + """ + A total count of items in the collection. + """ + totalCount: Int +} + +type AppExtensionCountableEdge { + """ + The item at the end of the edge. + """ + node: AppExtension! + + """ + A cursor for use in pagination. + """ + cursor: String! +} + +input AppExtensionFilterInput { + mount: [AppExtensionMountEnum!] + target: AppExtensionTargetEnum +} + +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! +} + +type ChoiceValue { + raw: String + verbose: String +} + +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 CustomerFilterInput { + dateJoined: DateRangeInput + numberOfOrders: IntRangeInput + placedOrders: DateRangeInput + search: String + metadata: [MetadataFilter!] + updatedAt: DateTimeRangeInput +} + +input UserSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort users by the selected field. + """ + field: UserSortField! +} + +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 + + """ + Sort users by created at. + """ + CREATED_AT + + """ + Sort users by last modified at. + """ + LAST_MODIFIED_AT +} + +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! +} + +input PermissionGroupFilterInput { + search: String + ids: [ID!] +} + +input PermissionGroupSortingInput { + """ + Specifies the direction in which to sort products. + """ + direction: OrderDirection! + + """ + Sort permission group by the selected field. + """ + field: PermissionGroupSortField! +} + +enum PermissionGroupSortField { + """ + Sort permission group accounts by name. + """ + NAME +} + +input StaffUserInput { + status: StaffMemberStatus + search: String + ids: [ID!] +} + +enum StaffMemberStatus { + """ + User account has been activated. + """ + ACTIVE + + """ + User account has not been activated yet. + """ + DEACTIVATED +} + +type Mutation { + """ + Creates a new webhook subscription. + + Requires one of the following permissions: MANAGE_APPS, AUTHENTICATED_APP. + """ + webhookCreate( + """ + Fields required to create a webhook. + """ + input: WebhookCreateInput! + ): WebhookCreate + + """ + Deletes a webhook subscription. + + Requires one of the following permissions: MANAGE_APPS, AUTHENTICATED_APP. + """ + webhookDelete( + """ + ID of a webhook to delete. + """ + id: ID! + ): WebhookDelete + + """ + Updates a webhook subscription. + + Requires one of the following permissions: MANAGE_APPS. + """ + webhookUpdate( + """ + ID of a webhook to update. + """ + id: ID! + + """ + Fields required to update a webhook. + """ + input: WebhookUpdateInput! + ): WebhookUpdate + + """ + Retries event delivery. + + Requires one of the following permissions: MANAGE_APPS. + """ + eventDeliveryRetry( + """ + ID of the event delivery to retry. + """ + id: ID! + ): EventDeliveryRetry + + """ + Creates new warehouse. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + createWarehouse( + """ + Fields required to create warehouse. + """ + input: WarehouseCreateInput! + ): WarehouseCreate + + """ + Updates given warehouse. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + updateWarehouse( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + Fields required to update warehouse. + """ + input: WarehouseUpdateInput! + ): WarehouseUpdate + + """ + Deletes selected warehouse. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + deleteWarehouse( + """ + ID of a warehouse to delete. + """ + id: ID! + ): WarehouseDelete + + """ + Add shipping zone to given warehouse. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + assignWarehouseShippingZone( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + List of shipping zone IDs. + """ + shippingZoneIds: [ID!]! + ): WarehouseShippingZoneAssign + + """ + Remove shipping zone from given warehouse. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + unassignWarehouseShippingZone( + """ + ID of a warehouse to update. + """ + id: ID! + + """ + List of shipping zone IDs. + """ + shippingZoneIds: [ID!]! + ): WarehouseShippingZoneUnassign + + """ + Creates a new staff notification recipient. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + staffNotificationRecipientCreate( + """ + Fields required to create a staff notification recipient. + """ + input: StaffNotificationRecipientInput! + ): StaffNotificationRecipientCreate + + """ + Updates a staff notification recipient. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + 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. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + staffNotificationRecipientDelete( + """ + ID of a staff notification recipient to delete. + """ + id: ID! + ): StaffNotificationRecipientDelete + + """ + Updates site domain of the shop. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + shopDomainUpdate( + """ + Fields required to update site. + """ + input: SiteDomainInput + ): ShopDomainUpdate + + """ + Updates shop settings. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + shopSettingsUpdate( + """ + Fields required to update shop settings. + """ + input: ShopSettingsInput! + ): ShopSettingsUpdate + + """ + Fetch tax rates. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + shopFetchTaxRates: ShopFetchTaxRates + + """ + Creates/updates translations for shop settings. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + 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. + + Requires one of the following permissions: MANAGE_SETTINGS. + """ + shopAddressUpdate( + """ + Fields required to update shop address. + """ + input: AddressInput + ): ShopAddressUpdate + + """ + Update shop order settings. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderSettingsUpdate( + """ + Fields required to update shop order settings. + """ + input: OrderSettingsUpdateInput! + ): OrderSettingsUpdate + + """ + Update gift card settings. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardSettingsUpdate( + """ + Fields required to update gift card settings. + """ + input: GiftCardSettingsUpdateInput! + ): GiftCardSettingsUpdate + + """ + Manage shipping method's availability in channels. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingPriceCreate( + """ + Fields required to create a shipping price. + """ + input: ShippingPriceInput! + ): ShippingPriceCreate + + """ + Deletes a shipping price. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingPriceDelete( + """ + ID of a shipping price to delete. + """ + id: ID! + ): ShippingPriceDelete + + """ + Deletes shipping prices. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingPriceBulkDelete( + """ + List of shipping price IDs to delete. + """ + ids: [ID!]! + ): ShippingPriceBulkDelete + + """ + Updates a new shipping price. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingPriceUpdate( + """ + ID of a shipping price to update. + """ + id: ID! + + """ + Fields required to update a shipping price. + """ + input: ShippingPriceInput! + ): ShippingPriceUpdate + + """ + Creates/updates translations for a shipping method. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + shippingPriceTranslate( + """ + ShippingMethodType ID or ShippingMethodTranslatableContent ID. + """ + id: ID! + input: ShippingPriceTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ShippingPriceTranslate + + """ + Exclude products from shipping price. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingPriceExcludeProducts( + """ + ID of a shipping price. + """ + id: ID! + + """ + Exclude products input. + """ + input: ShippingPriceExcludeProductsInput! + ): ShippingPriceExcludeProducts + + """ + Remove product from excluded list for shipping price. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingZoneCreate( + """ + Fields required to create a shipping zone. + """ + input: ShippingZoneCreateInput! + ): ShippingZoneCreate + + """ + Deletes a shipping zone. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingZoneDelete( + """ + ID of a shipping zone to delete. + """ + id: ID! + ): ShippingZoneDelete + + """ + Deletes shipping zones. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + shippingZoneBulkDelete( + """ + List of shipping zone IDs to delete. + """ + ids: [ID!]! + ): ShippingZoneBulkDelete + + """ + Updates a new shipping zone. + + Requires one of the following permissions: MANAGE_SHIPPING. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + productAttributeAssign( + """ + The operations to perform. + """ + operations: [ProductAttributeAssignInput!]! + + """ + ID of the product type to assign the attributes into. + """ + productTypeId: ID! + ): ProductAttributeAssign + + """ + Update attributes assigned to product variant for given product type. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + productAttributeAssignmentUpdate( + """ + The operations to perform. + """ + operations: [ProductAttributeAssignmentUpdateInput!]! + + """ + ID of the product type to assign the attributes into. + """ + productTypeId: ID! + ): ProductAttributeAssignmentUpdate + + """ + Un-assign attributes from a given product type. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + categoryDelete( + """ + ID of a category to delete. + """ + id: ID! + ): CategoryDelete + + """ + Deletes categories. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + categoryBulkDelete( + """ + List of category IDs to delete. + """ + ids: [ID!]! + ): CategoryBulkDelete + + """ + Updates a category. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + categoryUpdate( + """ + ID of a category to update. + """ + id: ID! + + """ + Fields required to update a category. + """ + input: CategoryInput! + ): CategoryUpdate + + """ + Creates/updates translations for a category. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + categoryTranslate( + """ + Category ID or CategoryTranslatableContent ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): CategoryTranslate + + """ + Adds products to a collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionAddProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + List of product IDs. + """ + products: [ID!]! + ): CollectionAddProducts + + """ + Creates a new collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionCreate( + """ + Fields required to create a collection. + """ + input: CollectionCreateInput! + ): CollectionCreate + + """ + Deletes a collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionDelete( + """ + ID of a collection to delete. + """ + id: ID! + ): CollectionDelete + + """ + Reorder the products of a collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionReorderProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + The collection products position operations. + """ + moves: [MoveProductInput!]! + ): CollectionReorderProducts + + """ + Deletes collections. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionBulkDelete( + """ + List of collection IDs to delete. + """ + ids: [ID!]! + ): CollectionBulkDelete + + """ + Remove products from a collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionRemoveProducts( + """ + ID of a collection. + """ + collectionId: ID! + + """ + List of product IDs. + """ + products: [ID!]! + ): CollectionRemoveProducts + + """ + Updates a collection. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + collectionUpdate( + """ + ID of a collection to update. + """ + id: ID! + + """ + Fields required to update a collection. + """ + input: CollectionInput! + ): CollectionUpdate + + """ + Creates/updates translations for a collection. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + collectionTranslate( + """ + Collection ID or CollectionTranslatableContent ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): CollectionTranslate + + """ + Manage collection's availability in channels. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productCreate( + """ + Fields required to create a product. + """ + input: ProductCreateInput! + ): ProductCreate + + """ + Deletes a product. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productDelete( + """ + ID of a product to delete. + """ + id: ID! + ): ProductDelete + + """ + Deletes products. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productBulkDelete( + """ + List of product IDs to delete. + """ + ids: [ID!]! + ): ProductBulkDelete + + """ + Updates an existing product. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productUpdate( + """ + ID of a product to update. + """ + id: ID! + + """ + Fields required to update a product. + """ + input: ProductInput! + ): ProductUpdate + + """ + Creates/updates translations for a product. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + productTranslate( + """ + Product ID or ProductTranslatableContent ID. + """ + id: ID! + input: TranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ProductTranslate + + """ + Manage product's availability in channels. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productMediaDelete( + """ + ID of a product media to delete. + """ + id: ID! + ): ProductMediaDelete + + """ + Deletes product media. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productMediaBulkDelete( + """ + List of product media IDs to delete. + """ + ids: [ID!]! + ): ProductMediaBulkDelete + + """ + Changes ordering of the product media. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + productTypeCreate( + """ + Fields required to create a product type. + """ + input: ProductTypeInput! + ): ProductTypeCreate + + """ + Deletes a product type. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + productTypeDelete( + """ + ID of a product type to delete. + """ + id: ID! + ): ProductTypeDelete + + """ + Deletes product types. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + productTypeBulkDelete( + """ + List of product type IDs to delete. + """ + ids: [ID!]! + ): ProductTypeBulkDelete + + """ + Updates an existing product type. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + digitalContentDelete( + """ + ID of a product variant with digital content to remove. + """ + variantId: ID! + ): DigitalContentDelete + + """ + Update digital content. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + digitalContentUrlCreate( + """ + Fields required to create a new url. + """ + input: DigitalContentUrlCreateInput! + ): DigitalContentUrlCreate + + """ + Creates a new variant for a product. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productVariantCreate( + """ + Fields required to create a product variant. + """ + input: ProductVariantCreateInput! + ): ProductVariantCreate + + """ + Deletes a product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productVariantDelete( + """ + ID of a product variant to delete. + """ + id: ID! + ): ProductVariantDelete + + """ + Creates product variants for a given product. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productVariantBulkDelete( + """ + List of product variant IDs to delete. + """ + ids: [ID!]! + ): ProductVariantBulkDelete + + """ + Creates stocks for product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productVariantStocksDelete( + """ + ID of product variant for which stocks will be deleted. + """ + variantId: ID! + warehouseIds: [ID!] + ): ProductVariantStocksDelete + + """ + Update stocks for product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 a product variant. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + productVariantTranslate( + """ + ProductVariant ID or ProductVariantTranslatableContent ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): ProductVariantTranslate + + """ + Manage product variant prices in channels. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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 + + """ + Deactivates product variant preorder. It changes all preorder allocation into regular allocation. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + productVariantPreorderDeactivate( + """ + ID of a variant which preorder should be deactivated. + """ + id: ID! + ): ProductVariantPreorderDeactivate + + """ + Assign an media to a product variant. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + paymentCapture( + """ + Transaction amount. + """ + amount: PositiveDecimal + + """ + Payment ID. + """ + paymentId: ID! + ): PaymentCapture + + """ + Refunds the captured payment amount. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + paymentRefund( + """ + Transaction amount. + """ + amount: PositiveDecimal + + """ + Payment ID. + """ + paymentId: ID! + ): PaymentRefund + + """ + Voids the authorized payment. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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 + + """ + Check payment balance. + """ + paymentCheckBalance( + """ + Fields required to check payment balance. + """ + input: PaymentCheckBalanceInput! + ): PaymentCheckBalance + + """ + Create transaction for checkout or order. Requires the following permissions: AUTHENTICATED_APP and HANDLE_PAYMENTS. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + transactionCreate( + """ + The ID of the checkout or order. + """ + id: ID! + + """ + Input data required to create a new transaction object. + """ + transaction: TransactionCreateInput! + + """ + Data that defines a transaction event. + """ + transactionEvent: TransactionEventInput + ): TransactionCreate + + """ + Create transaction for checkout or order. Requires the following permissions: AUTHENTICATED_APP and HANDLE_PAYMENTS. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + transactionUpdate( + """ + The ID of the transaction. + """ + id: ID! + + """ + Input data required to create a new transaction object. + """ + transaction: TransactionUpdateInput + + """ + Data that defines a transaction transaction. + """ + transactionEvent: TransactionEventInput + ): TransactionUpdate + + """ + Request an action for payment transaction. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: HANDLE_PAYMENTS, MANAGE_ORDERS. + """ + transactionRequestAction( + """ + Determines the action type. + """ + actionType: TransactionActionEnum! + + """ + Transaction request amount. If empty for refund or capture, maximal possible amount will be used. + """ + amount: PositiveDecimal + + """ + The ID of the transaction. + """ + id: ID! + ): TransactionRequestAction + + """ + Creates a new page. + + Requires one of the following permissions: MANAGE_PAGES. + """ + pageCreate( + """ + Fields required to create a page. + """ + input: PageCreateInput! + ): PageCreate + + """ + Deletes a page. + + Requires one of the following permissions: MANAGE_PAGES. + """ + pageDelete( + """ + ID of a page to delete. + """ + id: ID! + ): PageDelete + + """ + Deletes pages. + + Requires one of the following permissions: MANAGE_PAGES. + """ + pageBulkDelete( + """ + List of page IDs to delete. + """ + ids: [ID!]! + ): PageBulkDelete + + """ + Publish pages. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_PAGES. + """ + pageUpdate( + """ + ID of a page to update. + """ + id: ID! + + """ + Fields required to update a page. + """ + input: PageInput! + ): PageUpdate + + """ + Creates/updates translations for a page. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + pageTranslate( + """ + Page ID or PageTranslatableContent ID. + """ + id: ID! + input: PageTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): PageTranslate + + """ + Create a new page type. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + pageTypeCreate( + """ + Fields required to create page type. + """ + input: PageTypeCreateInput! + ): PageTypeCreate + + """ + Update page type. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + pageTypeUpdate( + """ + ID of the page type to update. + """ + id: ID + + """ + Fields required to update page type. + """ + input: PageTypeUpdateInput! + ): PageTypeUpdate + + """ + Delete a page type. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + pageTypeDelete( + """ + ID of the page type to delete. + """ + id: ID! + ): PageTypeDelete + + """ + Delete page types. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + pageTypeBulkDelete( + """ + List of page type IDs to delete + """ + ids: [ID!]! + ): PageTypeBulkDelete + + """ + Assign attributes to a given page type. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + 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. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + 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. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + pageTypeReorderAttributes( + """ + The list of attribute reordering operations. + """ + moves: [ReorderInput!]! + + """ + ID of a page type. + """ + pageTypeId: ID! + ): PageTypeReorderAttributes + + """ + Reorder page attribute values. + + Requires one of the following permissions: MANAGE_PAGES. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderComplete( + """ + ID of the order that will be completed. + """ + id: ID! + ): DraftOrderComplete + + """ + Creates a new draft order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderCreate( + """ + Fields required to create an order. + """ + input: DraftOrderCreateInput! + ): DraftOrderCreate + + """ + Deletes a draft order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderDelete( + """ + ID of a draft order to delete. + """ + id: ID! + ): DraftOrderDelete + + """ + Deletes draft orders. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderBulkDelete( + """ + List of draft order IDs to delete. + """ + ids: [ID!]! + ): DraftOrderBulkDelete + + """ + Deletes order lines. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderLinesBulkDelete( + """ + List of order lines IDs to delete. + """ + ids: [ID!]! + ): DraftOrderLinesBulkDelete + @deprecated(reason: "This field will be removed in Saleor 4.0.") + + """ + Updates a draft order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + draftOrderUpdate( + """ + ID of a draft order to update. + """ + id: ID! + + """ + Fields required to update an order. + """ + input: DraftOrderInput! + ): DraftOrderUpdate + + """ + Adds note to the order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderCancel( + """ + ID of the order to cancel. + """ + id: ID! + ): OrderCancel + + """ + Capture an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderConfirm( + """ + ID of an order to confirm. + """ + id: ID! + ): OrderConfirm + + """ + Creates new fulfillments for an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfill( + """ + Fields required to create a fulfillment. + """ + input: OrderFulfillInput! + + """ + ID of the order to be fulfilled. + """ + order: ID + ): OrderFulfill + + """ + Cancels existing fulfillment and optionally restocks items. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfillmentCancel( + """ + ID of a fulfillment to cancel. + """ + id: ID! + + """ + Fields required to cancel a fulfillment. + """ + input: FulfillmentCancelInput + ): FulfillmentCancel + + """ + Approve existing fulfillment. + + Added in Saleor 3.1. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfillmentApprove( + """ + True if stock could be exceeded. + """ + allowStockToBeExceeded: Boolean = false + + """ + ID of a fulfillment to approve. + """ + id: ID! + + """ + True if confirmation email should be send. + """ + notifyCustomer: Boolean! + ): FulfillmentApprove + + """ + Updates a fulfillment for an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfillmentUpdateTracking( + """ + ID of a fulfillment to update. + """ + id: ID! + + """ + Fields required to update a fulfillment. + """ + input: FulfillmentUpdateTrackingInput! + ): FulfillmentUpdateTracking + + """ + Refund products. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfillmentRefundProducts( + """ + Fields required to create an refund fulfillment. + """ + input: OrderRefundProductsInput! + + """ + ID of the order to be refunded. + """ + order: ID! + ): FulfillmentRefundProducts + + """ + Return products. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderFulfillmentReturnProducts( + """ + Fields required to return products. + """ + input: OrderReturnProductsInput! + + """ + ID of the order to be returned. + """ + order: ID! + ): FulfillmentReturnProducts + + """ + Create order lines for an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderLineDelete( + """ + ID of the order line to delete. + """ + id: ID! + ): OrderLineDelete + + """ + Updates an order line of an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderDiscountDelete( + """ + ID of a discount to remove. + """ + discountId: ID! + ): OrderDiscountDelete + + """ + Update discount for the order line. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderLineDiscountRemove( + """ + ID of a order line to remove its discount + """ + orderLineId: ID! + ): OrderLineDiscountRemove + + """ + Mark order as manually paid. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderMarkAsPaid( + """ + ID of the order to mark paid. + """ + id: ID! + + """ + The external transaction reference. + """ + transactionReference: String + ): OrderMarkAsPaid + + """ + Refund an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderRefund( + """ + Amount of money to refund. + """ + amount: PositiveDecimal! + + """ + ID of the order to refund. + """ + id: ID! + ): OrderRefund + + """ + Updates an order. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. Requires shipping method ID to update, when null is passed then currently assigned shipping method is removed. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderVoid( + """ + ID of the order to void. + """ + id: ID! + ): OrderVoid + + """ + Cancels orders. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + orderBulkCancel( + """ + List of orders IDs to cancel. + """ + ids: [ID!]! + ): OrderBulkCancel + + """ + Delete metadata of an object. To use it, you need to have access to the modified object. + """ + deleteMetadata( + """ + ID or token (for Order and Checkout) of an object to update. + """ + id: ID! + + """ + Metadata keys to delete. + """ + keys: [String!]! + ): DeleteMetadata + + """ + Delete object's private metadata. To use it, you need to be an authenticated staff user or an app and have access to the modified object. + """ + deletePrivateMetadata( + """ + ID or token (for Order and Checkout) of an object to update. + """ + id: ID! + + """ + Metadata keys to delete. + """ + keys: [String!]! + ): DeletePrivateMetadata + + """ + Updates metadata of an object. To use it, you need to have access to the modified object. + """ + updateMetadata( + """ + ID or token (for Order and Checkout) of an object to update. + """ + id: ID! + + """ + Fields required to update the object's metadata. + """ + input: [MetadataInput!]! + ): UpdateMetadata + + """ + Updates private metadata of an object. To use it, you need to be an authenticated staff user or an app and have access to the modified object. + """ + updatePrivateMetadata( + """ + ID or token (for Order and Checkout) of an object to update. + """ + id: ID! + + """ + Fields required to update the object's metadata. + """ + input: [MetadataInput!]! + ): UpdatePrivateMetadata + + """ + Assigns storefront's navigation menus. + + Requires one of the following permissions: MANAGE_MENUS, MANAGE_SETTINGS. + """ + assignNavigation( + """ + ID of the menu. + """ + menu: ID + + """ + Type of the navigation bar to assign the menu to. + """ + navigationType: NavigationType! + ): AssignNavigation + + """ + Creates a new Menu. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuCreate( + """ + Fields required to create a menu. + """ + input: MenuCreateInput! + ): MenuCreate + + """ + Deletes a menu. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuDelete( + """ + ID of a menu to delete. + """ + id: ID! + ): MenuDelete + + """ + Deletes menus. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuBulkDelete( + """ + List of menu IDs to delete. + """ + ids: [ID!]! + ): MenuBulkDelete + + """ + Updates a menu. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuUpdate( + """ + ID of a menu to update. + """ + id: ID! + + """ + Fields required to update a menu. + """ + input: MenuInput! + ): MenuUpdate + + """ + Creates a new menu item. + + Requires one of the following permissions: MANAGE_MENUS. + """ + 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. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuItemDelete( + """ + ID of a menu item to delete. + """ + id: ID! + ): MenuItemDelete + + """ + Deletes menu items. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuItemBulkDelete( + """ + List of menu item IDs to delete. + """ + ids: [ID!]! + ): MenuItemBulkDelete + + """ + Updates a menu item. + + Requires one of the following permissions: MANAGE_MENUS. + """ + 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 a menu item. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + menuItemTranslate( + """ + MenuItem ID or MenuItemTranslatableContent ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): MenuItemTranslate + + """ + Moves items of menus. + + Requires one of the following permissions: MANAGE_MENUS. + """ + menuItemMove( + """ + ID of the menu. + """ + menu: ID! + + """ + The menu position data. + """ + moves: [MenuItemMoveInput!]! + ): MenuItemMove + + """ + Request an invoice for the order using plugin. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + invoiceRequestDelete( + """ + ID of an invoice to request the deletion. + """ + id: ID! + ): InvoiceRequestDelete + + """ + Creates a ready to send invoice. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + invoiceCreate( + """ + Fields required when creating an invoice. + """ + input: InvoiceCreateInput! + + """ + ID of the order related to invoice. + """ + orderId: ID! + ): InvoiceCreate + + """ + Deletes an invoice. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + invoiceDelete( + """ + ID of an invoice to delete. + """ + id: ID! + ): InvoiceDelete + + """ + Updates an invoice. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + 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. + + Requires one of the following permissions: MANAGE_ORDERS. + """ + invoiceSendNotification( + """ + ID of an invoice to be sent. + """ + id: ID! + ): InvoiceSendNotification + + """ + Activate a gift card. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardActivate( + """ + ID of a gift card to activate. + """ + id: ID! + ): GiftCardActivate + + """ + Creates a new gift card. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardCreate( + """ + Fields required to create a gift card. + """ + input: GiftCardCreateInput! + ): GiftCardCreate + + """ + Delete gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardDelete( + """ + ID of the gift card to delete. + """ + id: ID! + ): GiftCardDelete + + """ + Deactivate a gift card. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardDeactivate( + """ + ID of a gift card to deactivate. + """ + id: ID! + ): GiftCardDeactivate + + """ + Update a gift card. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardUpdate( + """ + ID of a gift card to update. + """ + id: ID! + + """ + Fields required to update a gift card. + """ + input: GiftCardUpdateInput! + ): GiftCardUpdate + + """ + Resend a gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardResend( + """ + Fields required to resend a gift card. + """ + input: GiftCardResendInput! + ): GiftCardResend + + """ + Adds note to the gift card. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardAddNote( + """ + ID of the gift card to add a note for. + """ + id: ID! + + """ + Fields required to create a note for the gift card. + """ + input: GiftCardAddNoteInput! + ): GiftCardAddNote + + """ + Create gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardBulkCreate( + """ + Fields required to create gift cards. + """ + input: GiftCardBulkCreateInput! + ): GiftCardBulkCreate + + """ + Delete gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardBulkDelete( + """ + List of gift card IDs to delete. + """ + ids: [ID!]! + ): GiftCardBulkDelete + + """ + Activate gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardBulkActivate( + """ + List of gift card IDs to activate. + """ + ids: [ID!]! + ): GiftCardBulkActivate + + """ + Deactivate gift cards. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + giftCardBulkDeactivate( + """ + List of gift card IDs to deactivate. + """ + ids: [ID!]! + ): GiftCardBulkDeactivate + + """ + Update plugin configuration. + + Requires one of the following permissions: MANAGE_PLUGINS. + """ + pluginUpdate( + """ + ID of a channel for which the data should be modified. + """ + channelId: ID + + """ + ID of plugin to update. + """ + id: ID! + + """ + Fields required to update a plugin configuration. + """ + input: PluginUpdateInput! + ): PluginUpdate + + """ + Trigger sending a notification with the notify plugin method. Serializes nodes provided as ids parameter and includes this data in the notification payload. + + Added in Saleor 3.1. + """ + externalNotificationTrigger( + """ + Channel slug. Saleor will send a notification within a provided channel. Please, make sure that necessary plugins are active. + """ + channel: String! + + """ + Input for External Notification Trigger. + """ + input: ExternalNotificationTriggerInput! + + """ + The ID of notification plugin. + """ + pluginId: String + ): ExternalNotificationTrigger + + """ + Creates a new sale. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + saleCreate( + """ + Fields required to create a sale. + """ + input: SaleInput! + ): SaleCreate + + """ + Deletes a sale. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + saleDelete( + """ + ID of a sale to delete. + """ + id: ID! + ): SaleDelete + + """ + Deletes sales. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + saleBulkDelete( + """ + List of sale IDs to delete. + """ + ids: [ID!]! + ): SaleBulkDelete + + """ + Updates a sale. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + saleCataloguesRemove( + """ + ID of a sale. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of sale. + """ + input: CatalogueInput! + ): SaleRemoveCatalogues + + """ + Creates/updates translations for a sale. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + saleTranslate( + """ + Sale ID or SaleTranslatableContent ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): SaleTranslate + + """ + Manage sale's availability in channels. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + saleChannelListingUpdate( + """ + ID of a sale to update. + """ + id: ID! + + """ + Fields required to update sale channel listings. + """ + input: SaleChannelListingInput! + ): SaleChannelListingUpdate + + """ + Creates a new voucher. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucherCreate( + """ + Fields required to create a voucher. + """ + input: VoucherInput! + ): VoucherCreate + + """ + Deletes a voucher. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucherDelete( + """ + ID of a voucher to delete. + """ + id: ID! + ): VoucherDelete + + """ + Deletes vouchers. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucherBulkDelete( + """ + List of voucher IDs to delete. + """ + ids: [ID!]! + ): VoucherBulkDelete + + """ + Updates a voucher. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + 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. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucherCataloguesRemove( + """ + ID of a voucher. + """ + id: ID! + + """ + Fields required to modify catalogue IDs of voucher. + """ + input: CatalogueInput! + ): VoucherRemoveCatalogues + + """ + Creates/updates translations for a voucher. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + voucherTranslate( + """ + Voucher ID or VoucherTranslatableContent ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): VoucherTranslate + + """ + Manage voucher's availability in channels. + + Requires one of the following permissions: MANAGE_DISCOUNTS. + """ + voucherChannelListingUpdate( + """ + ID of a voucher to update. + """ + id: ID! + + """ + Fields required to update voucher channel listings. + """ + input: VoucherChannelListingInput! + ): VoucherChannelListingUpdate + + """ + Export products to csv file. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + exportProducts( + """ + Fields required to export product data. + """ + input: ExportProductsInput! + ): ExportProducts + + """ + Export gift cards to csv file. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + + Requires one of the following permissions: MANAGE_GIFT_CARD. + """ + exportGiftCards( + """ + Fields required to export gift cards data. + """ + input: ExportGiftCardsInput! + ): ExportGiftCards + + """ + 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 + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_STAFF_USER. + """ + fileUpload( + """ + Represents a file in a multipart request. + """ + file: Upload! + ): FileUpload + + """ + Adds a gift card or a voucher to a checkout. + """ + checkoutAddPromoCode( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Gift card code or voucher code. + """ + promoCode: String! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutAddPromoCode + + """ + Update billing address in the existing checkout. + """ + checkoutBillingAddressUpdate( + """ + The billing address of the checkout. + """ + billingAddress: AddressInput! + + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): 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( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: 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. + + DEPRECATED: this field will be removed in Saleor 4.0. Use checkoutPaymentCreate for this action. + """ + storeSource: Boolean = false + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutComplete + + """ + Create a new checkout. + """ + checkoutCreate( + """ + Fields required to create checkout. + """ + input: CheckoutCreateInput! + ): CheckoutCreate + + """ + Sets the customer as the owner of the checkout. + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_USER. + """ + checkoutCustomerAttach( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + ID of customer to attach to checkout. Can be used to attach customer to checkout by staff or app. Requires IMPERSONATE_USER permission. + """ + customerId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutCustomerAttach + + """ + Removes the user assigned as the owner of the checkout. + + Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_USER. + """ + checkoutCustomerDetach( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutCustomerDetach + + """ + Updates email address in the existing checkout object. + """ + checkoutEmailUpdate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + email. + """ + email: String! + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutEmailUpdate + + """ + Deletes a CheckoutLine. + """ + checkoutLineDelete( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + ID of the checkout line to delete. + """ + lineId: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutLineDelete + @deprecated( + reason: "DEPRECATED: Will be removed in Saleor 4.0. Use `checkoutLinesDelete` instead." + ) + + """ + Deletes checkout lines. + """ + checkoutLinesDelete( + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + A list of checkout lines. + """ + linesIds: [ID!]! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutLinesDelete + + """ + Adds a checkout line to the existing checkout.If line was already in checkout, its quantity will be increased. + """ + checkoutLinesAdd( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLineInput!]! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutLinesAdd + + """ + Updates checkout line in the existing checkout. + """ + checkoutLinesUpdate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + A list of checkout lines, each containing information about an item in the checkout. + """ + lines: [CheckoutLineUpdateInput!]! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutLinesUpdate + + """ + Remove a gift card or a voucher from a checkout. + """ + checkoutRemovePromoCode( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Gift card code or voucher code. + """ + promoCode: String + + """ + Gift card or voucher ID. + """ + promoCodeId: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutRemovePromoCode + + """ + Create a new payment for given checkout. + """ + checkoutPaymentCreate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Data required to create a new payment. + """ + input: PaymentInput! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutPaymentCreate + + """ + Update shipping address in the existing checkout. + """ + checkoutShippingAddressUpdate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + The mailing address to where the checkout will be shipped. + """ + shippingAddress: AddressInput! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutShippingAddressUpdate + + """ + Updates the shipping method of the checkout. + """ + checkoutShippingMethodUpdate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Shipping method. + """ + shippingMethodId: ID! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutShippingMethodUpdate + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `checkoutDeliveryMethodUpdate` instead." + ) + + """ + Updates the delivery method (shipping method or pick up point) of the checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + checkoutDeliveryMethodUpdate( + """ + Delivery Method ID (`Warehouse` ID or `ShippingMethod` ID). + """ + deliveryMethodId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutDeliveryMethodUpdate + + """ + Update language code in the existing checkout. + """ + checkoutLanguageCodeUpdate( + """ + The ID of the checkout. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + checkoutId: ID + + """ + The checkout's ID. + + Added in Saleor 3.4. + """ + id: ID + + """ + New language code. + """ + languageCode: LanguageCodeEnum! + + """ + Checkout token. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `id` instead. + """ + token: UUID + ): CheckoutLanguageCodeUpdate + + """ + Create new order from existing checkout. Requires the following permissions: AUTHENTICATED_APP and HANDLE_CHECKOUTS. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + orderCreateFromCheckout( + """ + ID of a checkout that will be converted to an order. + """ + id: ID! + + """ + Determines if checkout should be removed after creating an order. Default true. + """ + removeCheckout: Boolean = true + ): OrderCreateFromCheckout + + """ + Creates new channel. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + channelCreate( + """ + Fields required to create channel. + """ + input: ChannelCreateInput! + ): ChannelCreate + + """ + Update a channel. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + 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. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + channelDelete( + """ + ID of a channel to delete. + """ + id: ID! + + """ + Fields required to delete a channel. + """ + input: ChannelDeleteInput + ): ChannelDelete + + """ + Activate a channel. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + channelActivate( + """ + ID of the channel to activate. + """ + id: ID! + ): ChannelActivate + + """ + Deactivate a channel. + + Requires one of the following permissions: MANAGE_CHANNELS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + attributeDelete( + """ + ID of an attribute to delete. + """ + id: ID! + ): AttributeDelete + + """ + Updates attribute. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + attributeUpdate( + """ + ID of an attribute to update. + """ + id: ID! + + """ + Fields required to update an attribute. + """ + input: AttributeUpdateInput! + ): AttributeUpdate + + """ + Creates/updates translations for an attribute. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + attributeTranslate( + """ + Attribute ID or AttributeTranslatableContent ID. + """ + id: ID! + input: NameTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): AttributeTranslate + + """ + Deletes attributes. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + attributeBulkDelete( + """ + List of attribute IDs to delete. + """ + ids: [ID!]! + ): AttributeBulkDelete + + """ + Deletes values of attributes. + + Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. + """ + attributeValueBulkDelete( + """ + List of attribute value IDs to delete. + """ + ids: [ID!]! + ): AttributeValueBulkDelete + + """ + Creates a value for an attribute. + + Requires one of the following permissions: MANAGE_PRODUCTS. + """ + 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. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + attributeValueDelete( + """ + ID of a value to delete. + """ + id: ID! + ): AttributeValueDelete + + """ + Updates value of an attribute. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + attributeValueUpdate( + """ + ID of an AttributeValue to update. + """ + id: ID! + + """ + Fields required to update an AttributeValue. + """ + input: AttributeValueUpdateInput! + ): AttributeValueUpdate + + """ + Creates/updates translations for an attribute value. + + Requires one of the following permissions: MANAGE_TRANSLATIONS. + """ + attributeValueTranslate( + """ + AttributeValue ID or AttributeValueTranslatableContent ID. + """ + id: ID! + input: AttributeValueTranslationInput! + + """ + Translation language code. + """ + languageCode: LanguageCodeEnum! + ): AttributeValueTranslate + + """ + Reorder the values of an attribute. + + Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. + """ + attributeReorderValues( + """ + ID of an attribute. + """ + attributeId: ID! + + """ + The list of reordering operations for given attribute values. + """ + moves: [ReorderInput!]! + ): AttributeReorderValues + + """ + Creates a new app. Requires the following permissions: AUTHENTICATED_STAFF_USER and MANAGE_APPS. + """ + appCreate( + """ + Fields required to create a new app. + """ + input: AppInput! + ): AppCreate + + """ + Updates an existing app. + + Requires one of the following permissions: MANAGE_APPS. + """ + appUpdate( + """ + ID of an app to update. + """ + id: ID! + + """ + Fields required to update an existing app. + """ + input: AppInput! + ): AppUpdate + + """ + Deletes an app. + + Requires one of the following permissions: MANAGE_APPS. + """ + appDelete( + """ + ID of an app to delete. + """ + id: ID! + ): AppDelete + + """ + Creates a new token. + + Requires one of the following permissions: MANAGE_APPS. + """ + appTokenCreate( + """ + Fields required to create a new auth token. + """ + input: AppTokenInput! + ): AppTokenCreate + + """ + Deletes an authentication token assigned to app. + + Requires one of the following permissions: MANAGE_APPS. + """ + 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. Requires the following permissions: AUTHENTICATED_STAFF_USER and MANAGE_APPS. + """ + appInstall( + """ + Fields required to install a new app. + """ + input: AppInstallInput! + ): AppInstall + + """ + Retry failed installation of new app. + + Requires one of the following permissions: MANAGE_APPS. + """ + appRetryInstall( + """ + Determine if app will be set active or not. + """ + activateAfterInstallation: Boolean = true + + """ + ID of failed installation. + """ + id: ID! + ): AppRetryInstall + + """ + Delete failed installation. + + Requires one of the following permissions: MANAGE_APPS. + """ + appDeleteFailedInstallation( + """ + ID of failed installation to delete. + """ + id: ID! + ): AppDeleteFailedInstallation + + """ + Fetch and validate manifest. + + Requires one of the following permissions: MANAGE_APPS. + """ + appFetchManifest(manifestUrl: String!): AppFetchManifest + + """ + Activate the app. + + Requires one of the following permissions: MANAGE_APPS. + """ + appActivate( + """ + ID of app to activate. + """ + id: ID! + ): AppActivate + + """ + Deactivate the app. + + Requires one of the following permissions: MANAGE_APPS. + """ + 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. + + Requires one of the following permissions: 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. + + Requires one of the following permissions: AUTHENTICATED_USER. + """ + passwordChange( + """ + New user password. + """ + newPassword: String! + + """ + Current user password. + """ + oldPassword: String! + ): PasswordChange + + """ + Request email change of the logged in user. + + Requires one of the following permissions: AUTHENTICATED_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. + + Requires one of the following permissions: AUTHENTICATED_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. + + Requires one of the following permissions: AUTHENTICATED_USER. + """ + 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. Requires one of the following permissions: MANAGE_USERS, IS_OWNER. + """ + 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. Requires one of the following permissions: MANAGE_USERS, IS_OWNER. + """ + accountAddressDelete( + """ + ID of the address to delete. + """ + id: ID! + ): AccountAddressDelete + + """ + Sets a default address for the authenticated user. + + Requires one of the following permissions: 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. + + Requires one of the following permissions: AUTHENTICATED_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. + + Requires one of the following permissions: AUTHENTICATED_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. + + Requires one of the following permissions: AUTHENTICATED_USER. + """ + accountDelete( + """ + A one-time token required to remove account. Sent by email using AccountRequestDeletion mutation. + """ + token: String! + ): AccountDelete + + """ + Creates user address. + + Requires one of the following permissions: MANAGE_USERS. + """ + addressCreate( + """ + Fields required to create address. + """ + input: AddressInput! + + """ + ID of a user to create address for. + """ + userId: ID! + ): AddressCreate + + """ + Updates an address. + + Requires one of the following permissions: MANAGE_USERS. + """ + addressUpdate( + """ + ID of the address to update. + """ + id: ID! + + """ + Fields required to update the address. + """ + input: AddressInput! + ): AddressUpdate + + """ + Deletes an address. + + Requires one of the following permissions: MANAGE_USERS. + """ + addressDelete( + """ + ID of the address to delete. + """ + id: ID! + ): AddressDelete + + """ + Sets a default address for the given user. + + Requires one of the following permissions: MANAGE_USERS. + """ + 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. + + Requires one of the following permissions: MANAGE_USERS. + """ + customerCreate( + """ + Fields required to create a customer. + """ + input: UserCreateInput! + ): CustomerCreate + + """ + Updates an existing customer. + + Requires one of the following permissions: MANAGE_USERS. + """ + customerUpdate( + """ + ID of a customer to update. + """ + id: ID! + + """ + Fields required to update a customer. + """ + input: CustomerInput! + ): CustomerUpdate + + """ + Deletes a customer. + + Requires one of the following permissions: MANAGE_USERS. + """ + customerDelete( + """ + ID of a customer to delete. + """ + id: ID! + ): CustomerDelete + + """ + Deletes customers. + + Requires one of the following permissions: MANAGE_USERS. + """ + customerBulkDelete( + """ + List of user IDs to delete. + """ + ids: [ID!]! + ): CustomerBulkDelete + + """ + Creates a new staff user. + + Requires one of the following permissions: MANAGE_STAFF. + """ + staffCreate( + """ + Fields required to create a staff user. + """ + input: StaffCreateInput! + ): StaffCreate + + """ + Updates an existing staff user. + + Requires one of the following permissions: MANAGE_STAFF. + """ + staffUpdate( + """ + ID of a staff user to update. + """ + id: ID! + + """ + Fields required to update a staff user. + """ + input: StaffUpdateInput! + ): StaffUpdate + + """ + Deletes a staff user. + + Requires one of the following permissions: MANAGE_STAFF. + """ + staffDelete( + """ + ID of a staff user to delete. + """ + id: ID! + ): StaffDelete + + """ + Deletes staff users. + + Requires one of the following permissions: MANAGE_STAFF. + """ + 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 + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER. + """ + userAvatarUpdate( + """ + Represents an image file in a multipart request. + """ + image: Upload! + ): UserAvatarUpdate + + """ + Deletes a user avatar. Only for staff members. + + Requires one of the following permissions: AUTHENTICATED_STAFF_USER. + """ + userAvatarDelete: UserAvatarDelete + + """ + Activate or deactivate users. + + Requires one of the following permissions: MANAGE_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. + + Requires one of the following permissions: MANAGE_STAFF. + """ + permissionGroupCreate( + """ + Input fields to create permission group. + """ + input: PermissionGroupCreateInput! + ): PermissionGroupCreate + + """ + Update permission group. + + Requires one of the following permissions: MANAGE_STAFF. + """ + permissionGroupUpdate( + """ + ID of the group to update. + """ + id: ID! + + """ + Input fields to create permission group. + """ + input: PermissionGroupUpdateInput! + ): PermissionGroupUpdate + + """ + Delete permission group. + + Requires one of the following permissions: MANAGE_STAFF. + """ + permissionGroupDelete( + """ + ID of the group to delete. + """ + id: ID! + ): PermissionGroupDelete +} + +""" +Creates a new webhook subscription. + +Requires one of the following permissions: MANAGE_APPS, AUTHENTICATED_APP. +""" +type WebhookCreate { + webhookErrors: [WebhookError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +input WebhookCreateInput { + """ + The name of the webhook. + """ + name: String + + """ + The url to receive the payload. + """ + targetUrl: String + + """ + The events that webhook wants to subscribe. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `asyncEvents` or `syncEvents` instead. + """ + events: [WebhookEventTypeEnum!] + + """ + The asynchronous events that webhook wants to subscribe. + """ + asyncEvents: [WebhookEventTypeAsyncEnum!] + + """ + The synchronous events that webhook wants to subscribe. + """ + syncEvents: [WebhookEventTypeSyncEnum!] + + """ + 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 + + """ + Subscription query used to define a webhook payload. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + query: String +} + +""" +Deletes a webhook subscription. + +Requires one of the following permissions: MANAGE_APPS, AUTHENTICATED_APP. +""" +type WebhookDelete { + webhookErrors: [WebhookError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [WebhookError!]! + webhook: Webhook +} + +""" +Updates a webhook subscription. + +Requires one of the following permissions: MANAGE_APPS. +""" +type WebhookUpdate { + webhookErrors: [WebhookError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `asyncEvents` or `syncEvents` instead. + """ + events: [WebhookEventTypeEnum!] + + """ + The asynchronous events that webhook wants to subscribe. + """ + asyncEvents: [WebhookEventTypeAsyncEnum!] + + """ + The synchronous events that webhook wants to subscribe. + """ + syncEvents: [WebhookEventTypeSyncEnum!] + + """ + 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 + + """ + Subscription query used to define a webhook payload. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + query: String +} + +""" +Retries event delivery. + +Requires one of the following permissions: MANAGE_APPS. +""" +type EventDeliveryRetry { + """ + Event delivery. + """ + delivery: EventDelivery + errors: [WebhookError!]! +} + +""" +Creates new warehouse. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type WarehouseCreate { + warehouseErrors: [WarehouseError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 WarehouseCreateInput { + """ + Warehouse slug. + """ + slug: String + + """ + The email address of the warehouse. + """ + email: String + + """ + Warehouse name. + """ + name: String! + + """ + Address of the warehouse. + """ + address: AddressInput! + + """ + Shipping zones supported by the warehouse. + """ + shippingZones: [ID!] +} + +""" +Updates given warehouse. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type WarehouseUpdate { + warehouseErrors: [WarehouseError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [WarehouseError!]! + warehouse: Warehouse +} + +input WarehouseUpdateInput { + """ + Warehouse slug. + """ + slug: String + + """ + The email address of the warehouse. + """ + email: String + + """ + Warehouse name. + """ + name: String + + """ + Address of the warehouse. + """ + address: AddressInput + + """ + Click and collect options: local, all or disabled. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + clickAndCollectOption: WarehouseClickAndCollectOptionEnum + + """ + Visibility of warehouse stocks. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + isPrivate: Boolean +} + +""" +Deletes selected warehouse. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type WarehouseDelete { + warehouseErrors: [WarehouseError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [WarehouseError!]! + warehouse: Warehouse +} + +""" +Add shipping zone to given warehouse. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type WarehouseShippingZoneAssign { + warehouseErrors: [WarehouseError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [WarehouseError!]! + warehouse: Warehouse +} + +""" +Remove shipping zone from given warehouse. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type WarehouseShippingZoneUnassign { + warehouseErrors: [WarehouseError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [WarehouseError!]! + warehouse: Warehouse +} + +""" +Creates a new staff notification recipient. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type StaffNotificationRecipientCreate { + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +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 +} + +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. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type StaffNotificationRecipientUpdate { + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +""" +Delete staff notification recipient. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type StaffNotificationRecipientDelete { + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! + staffNotificationRecipient: StaffNotificationRecipient +} + +""" +Updates site domain of the shop. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type ShopDomainUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! +} + +input SiteDomainInput { + """ + Domain name for shop. + """ + domain: String + + """ + Shop site name. + """ + name: String +} + +""" +Updates shop settings. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type ShopSettingsUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 + + """ + Enable automatic approval of all new fulfillments. + + Added in Saleor 3.1. + """ + fulfillmentAutoApprove: Boolean + + """ + Enable ability to approve fulfillments which are unpaid. + + Added in Saleor 3.1. + """ + fulfillmentAllowUnpaid: 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 + + """ + Default number of minutes stock will be reserved for anonymous checkout. Enter 0 or null to disable. + + Added in Saleor 3.1. + """ + reserveStockDurationAnonymousUser: Int + + """ + Default number of minutes stock will be reserved for authenticated checkout. Enter 0 or null to disable. + + Added in Saleor 3.1. + """ + reserveStockDurationAuthenticatedUser: Int + + """ + Default number of maximum line quantity in single checkout. Minimum possible value is 1, default value is 50. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + limitQuantityPerCheckout: Int +} + +""" +Fetch tax rates. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type ShopFetchTaxRates { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! +} + +""" +Creates/updates translations for shop settings. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type ShopSettingsTranslate { + """ + Updated shop settings. + """ + shop: Shop + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! +} + +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 + INVALID + NOT_FOUND + REQUIRED +} + +input ShopSettingsTranslationInput { + headerText: String + description: String +} + +""" +Update the shop's address. If the `null` value is passed, the currently selected address will be deleted. + +Requires one of the following permissions: MANAGE_SETTINGS. +""" +type ShopAddressUpdate { + """ + Updated shop. + """ + shop: Shop + shopErrors: [ShopError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShopError!]! +} + +""" +Update shop order settings. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderSettingsUpdate { + """ + Order settings. + """ + orderSettings: OrderSettings + orderSettingsErrors: [OrderSettingsError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderSettingsError!]! +} + +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 +} + +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 + + """ + When enabled, all non-shippable gift card orders will be fulfilled automatically. + """ + automaticallyFulfillNonShippableGiftCard: Boolean +} + +""" +Update gift card settings. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardSettingsUpdate { + """ + Gift card settings. + """ + giftCardSettings: GiftCardSettings + errors: [GiftCardSettingsError!]! +} + +type GiftCardSettingsError { + """ + 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: GiftCardSettingsErrorCode! +} + +""" +An enumeration. +""" +enum GiftCardSettingsErrorCode { + INVALID + REQUIRED + GRAPHQL_ERROR +} + +input GiftCardSettingsUpdateInput { + """ + Defines gift card default expiry settings. + """ + expiryType: GiftCardSettingsExpiryTypeEnum + + """ + Defines gift card expiry period. + """ + expiryPeriod: TimePeriodInputType +} + +input TimePeriodInputType { + """ + The length of the period. + """ + amount: Int! + + """ + The type of the period. + """ + type: TimePeriodTypeEnum! +} + +""" +Manage shipping method's availability in channels. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingMethodChannelListingUpdate { + """ + An updated shipping method instance. + """ + shippingMethod: ShippingMethodType + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +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 +} + +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!] +} + +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 +} + +""" +Creates a new shipping price. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceCreate { + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingMethod: ShippingMethodType + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +input ShippingPriceInput { + """ + Name of the shipping method. + """ + name: String + + """ + Shipping method description. + """ + 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 +} + +scalar WeightScalar + +input ShippingPostalCodeRulesCreateInputRange { + """ + Start range of the postal code. + """ + start: String! + + """ + End range of the postal code. + """ + end: String +} + +""" +Deletes a shipping price. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceDelete { + """ + A shipping method to delete. + """ + shippingMethod: ShippingMethodType + + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +""" +Deletes shipping prices. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +""" +Updates a new shipping price. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceUpdate { + """ + A shipping zone to which the shipping method belongs. + """ + shippingZone: ShippingZone + shippingMethod: ShippingMethodType + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +""" +Creates/updates translations for a shipping method. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type ShippingPriceTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + shippingMethod: ShippingMethodType +} + +input ShippingPriceTranslationInput { + name: String + + """ + Translated shipping method description. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString +} + +""" +Exclude products from shipping price. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceExcludeProducts { + """ + A shipping method with new list of excluded products. + """ + shippingMethod: ShippingMethodType + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +input ShippingPriceExcludeProductsInput { + """ + List of products which will be excluded. + """ + products: [ID!]! +} + +""" +Remove product from excluded list for shipping price. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingPriceRemoveProductFromExclude { + """ + A shipping method with new list of excluded products. + """ + shippingMethod: ShippingMethodType + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +""" +Creates a new shipping zone. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingZoneCreate { + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingZoneDelete { + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! + shippingZone: ShippingZone +} + +""" +Deletes shipping zones. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingZoneBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ShippingError!]! +} + +""" +Updates a new shipping zone. + +Requires one of the following permissions: MANAGE_SHIPPING. +""" +type ShippingZoneUpdate { + shippingErrors: [ShippingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Assign attributes to a given product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductAttributeAssign { + """ + The updated product type. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +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 + MEDIA_ALREADY_ASSIGNED + 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 + PREORDER_VARIANT_CANNOT_BE_DEACTIVATED +} + +input ProductAttributeAssignInput { + """ + The ID of the attribute to assign. + """ + id: ID! + + """ + The attribute type to be assigned as. + """ + type: ProductAttributeType! + + """ + Whether attribute is allowed in variant selection. Allowed types are: ['dropdown', 'boolean', 'swatch', 'numeric']. + + Added in Saleor 3.1. + """ + variantSelection: Boolean +} + +enum ProductAttributeType { + PRODUCT + VARIANT +} + +""" +Update attributes assigned to product variant for given product type. + +Added in Saleor 3.1. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductAttributeAssignmentUpdate { + """ + The updated product type. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +input ProductAttributeAssignmentUpdateInput { + """ + The ID of the attribute to assign. + """ + id: ID! + + """ + Whether attribute is allowed in variant selection. Allowed types are: ['dropdown', 'boolean', 'swatch', 'numeric']. + + Added in Saleor 3.1. + """ + variantSelection: Boolean! +} + +""" +Un-assign attributes from a given product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductAttributeUnassign { + """ + The updated product type. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Creates a new category. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CategoryCreate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + category: Category +} + +input CategoryInput { + """ + Category description. + + Rich text format. For reference see https://editorjs.io/ + """ + 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 +} + +input SeoInput { + """ + SEO title. + """ + title: String + + """ + SEO description. + """ + description: String +} + +""" +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 + +""" +Deletes a category. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CategoryDelete { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + category: Category +} + +""" +Deletes categories. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CategoryBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Updates a category. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CategoryUpdate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + category: Category +} + +""" +Creates/updates translations for a category. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type CategoryTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + category: Category +} + +input TranslationInput { + seoTitle: String + seoDescription: String + name: String + + """ + Translated description. + + Rich text format. For reference see https://editorjs.io/ + """ + description: JSONString +} + +""" +Adds products to a collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionAddProducts { + """ + Collection to which products will be added. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! +} + +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 +} + +""" +Creates a new collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionCreate { + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. + + Rich text format. For reference see https://editorjs.io/ + """ + 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. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + publicationDate: Date + + """ + List of products to be added to the collection. + """ + products: [ID!] +} + +""" +Deletes a collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionDelete { + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! + collection: Collection +} + +""" +Reorder the products of a collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionReorderProducts { + """ + Collection from which products are reordered. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! +} + +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 +} + +""" +Deletes collections. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! +} + +""" +Remove products from a collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionRemoveProducts { + """ + Collection from which products will be removed. + """ + collection: Collection + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! +} + +""" +Updates a collection. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionUpdate { + collectionErrors: [CollectionError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionError!]! + collection: Collection +} + +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. + + Rich text format. For reference see https://editorjs.io/ + """ + 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. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + publicationDate: Date +} + +""" +Creates/updates translations for a collection. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type CollectionTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + collection: Collection +} + +""" +Manage collection's availability in channels. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type CollectionChannelListingUpdate { + """ + An updated collection instance. + """ + collection: Collection + collectionChannelListingErrors: [CollectionChannelListingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CollectionChannelListingError!]! +} + +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!] +} + +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!] +} + +input PublishableChannelListingInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Determines if object is visible to customers. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `publishedAt` field instead. + """ + publicationDate: Date + + """ + Publication date time. ISO 8601 standard. + + Added in Saleor 3.3. + """ + publishedAt: DateTime +} + +""" +Creates a new product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductCreate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. + + Rich text format. For reference see https://editorjs.io/ + """ + 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! +} + +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 + + """ + Represents the boolean value of the attribute value. + """ + boolean: Boolean + + """ + Represents the date value of the attribute value. + """ + date: Date + + """ + Represents the date/time value of the attribute value. + """ + dateTime: DateTime +} + +""" +Deletes a product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductDelete { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + product: Product +} + +""" +Deletes products. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Updates an existing product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductUpdate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + product: Product +} + +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. + + Rich text format. For reference see https://editorjs.io/ + """ + 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 +} + +""" +Creates/updates translations for a product. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type ProductTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + product: Product +} + +""" +Manage product's availability in channels. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductChannelListingUpdate { + """ + An updated product instance. + """ + product: Product + productChannelListingErrors: [ProductChannelListingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductChannelListingError!]! +} + +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!] +} + +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!] +} + +input ProductChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Determines if object is visible to customers. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `publishedAt` field instead. + """ + publicationDate: Date + + """ + Publication date time. ISO 8601 standard. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + + """ + 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. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `availableForPurchaseAt` field instead. + """ + availableForPurchaseDate: Date + + """ + A start date time from which a product will be available for purchase. When not set and `isAvailable` is set to True, the current day is assumed. + + Added in Saleor 3.3. + """ + availableForPurchaseAt: DateTime + + """ + List of variants to which the channel should be assigned. + """ + addVariants: [ID!] + + """ + List of variants from which the channel should be unassigned. + """ + removeVariants: [ID!] +} + +""" +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 + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductMediaCreate { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +""" +Reorder the variants of a product. Mutation updates updated_at on product and triggers PRODUCT_UPDATED webhook. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantReorder { + product: Product + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +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 +} + +""" +Deletes a product media. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductMediaDelete { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Deletes product media. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductMediaBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Changes ordering of the product media. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductMediaReorder { + product: Product + media: [ProductMedia!] + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Updates a product media. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductMediaUpdate { + product: Product + media: ProductMedia + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +input ProductMediaUpdateInput { + """ + Alt text for a product media. + """ + alt: String +} + +""" +Creates a new product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductTypeCreate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + productType: ProductType +} + +input ProductTypeInput { + """ + Name of the product type. + """ + name: String + + """ + Product type slug. + """ + slug: String + + """ + The product type kind. + """ + kind: ProductTypeKindEnum + + """ + 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 +} + +""" +Deletes a product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductTypeDelete { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + productType: ProductType +} + +""" +Deletes product types. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductTypeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Updates an existing product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductTypeUpdate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + productType: ProductType +} + +""" +Reorder the attributes of a product type. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type ProductTypeReorderAttributes { + """ + Product type from which attributes are reordered. + """ + productType: ProductType + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Reorder product attribute values. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductReorderAttributeValues { + """ + Product from which attribute values are reordered. + """ + product: Product + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +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 + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type DigitalContentCreate { + variant: ProductVariant + content: DigitalContent + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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! +} + +""" +Remove digital content assigned to given variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type DigitalContentDelete { + variant: ProductVariant + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Update digital content. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type DigitalContentUpdate { + variant: ProductVariant + content: DigitalContent + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +""" +Generate new URL to digital content. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type DigitalContentUrlCreate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + digitalContentUrl: DigitalContentUrl +} + +input DigitalContentUrlCreateInput { + """ + Digital content ID which URL will belong to. + """ + content: ID! +} + +""" +Creates a new variant for a product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantCreate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 + + """ + Determines if variant is in preorder. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorder: PreorderSettingsInput + + """ + Determines maximum quantity of `ProductVariant`,that can be bought in a single checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + quantityLimitPerCustomer: Int + + """ + Product ID of which type is the variant. + """ + product: ID! + + """ + Stocks of a product available for sale. + """ + stocks: [StockInput!] +} + +input PreorderSettingsInput { + """ + The global threshold for preorder variant. + """ + globalThreshold: Int + + """ + The end date for preorder. + """ + endDate: DateTime +} + +input StockInput { + """ + Warehouse in which stock is located. + """ + warehouse: ID! + + """ + Quantity of items available for sell. + """ + quantity: Int! +} + +""" +Deletes a product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantDelete { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + productVariant: ProductVariant +} + +""" +Creates product variants for a given product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantBulkCreate { + """ + Returns how many objects were created. + """ + count: Int! + + """ + List of the created variants. + """ + productVariants: [ProductVariant!]! + bulkProductErrors: [BulkProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [BulkProductError!]! +} + +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!] +} + +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 + + """ + Determines if variant is in preorder. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorder: PreorderSettingsInput + + """ + Determines maximum quantity of `ProductVariant`,that can be bought in a single checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + quantityLimitPerCustomer: Int + + """ + Stocks of a product available for sale. + """ + stocks: [StockInput!] + + """ + List of prices assigned to channels. + """ + channelListings: [ProductVariantChannelListingAddInput!] +} + +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!] + + """ + The boolean value of an attribute to resolve. If the passed value is non-existent, it will be created. + """ + boolean: Boolean +} + +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 + + """ + The threshold for preorder variant in channel. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorderThreshold: Int +} + +""" +Deletes product variants. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Creates stocks for product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantStocksCreate { + """ + Updated product variant. + """ + productVariant: ProductVariant + bulkStockErrors: [BulkStockError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [BulkStockError!]! +} + +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 +} + +""" +Delete stocks from product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantStocksDelete { + """ + Updated product variant. + """ + productVariant: ProductVariant + stockErrors: [StockError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [StockError!]! +} + +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 +} + +""" +Update stocks for product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantStocksUpdate { + """ + Updated product variant. + """ + productVariant: ProductVariant + bulkStockErrors: [BulkStockError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [BulkStockError!]! +} + +""" +Updates an existing variant for product. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantUpdate { + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! + productVariant: ProductVariant +} + +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 + + """ + Determines if variant is in preorder. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + preorder: PreorderSettingsInput + + """ + Determines maximum quantity of `ProductVariant`,that can be bought in a single checkout. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + quantityLimitPerCustomer: Int +} + +""" +Set default variant for a product. Mutation triggers PRODUCT_UPDATED webhook. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantSetDefault { + product: Product + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Creates/updates translations for a product variant. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type ProductVariantTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + productVariant: ProductVariant +} + +input NameTranslationInput { + name: String +} + +""" +Manage product variant prices in channels. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantChannelListingUpdate { + """ + An updated product variant instance. + """ + variant: ProductVariant + productChannelListingErrors: [ProductChannelListingError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductChannelListingError!]! +} + +""" +Reorder product variant attribute values. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantReorderAttributeValues { + """ + Product variant from which attribute values are reordered. + """ + productVariant: ProductVariant + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Deactivates product variant preorder. It changes all preorder allocation into regular allocation. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ProductVariantPreorderDeactivate { + """ + Product variant with ended preorder. + """ + productVariant: ProductVariant + errors: [ProductError!]! +} + +""" +Assign an media to a product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type VariantMediaAssign { + productVariant: ProductVariant + media: ProductMedia + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Unassign an media from a product variant. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type VariantMediaUnassign { + productVariant: ProductVariant + media: ProductMedia + productErrors: [ProductError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ProductError!]! +} + +""" +Captures the authorized payment amount. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type PaymentCapture { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PaymentError!]! +} + +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! + + """ + List of varint IDs which causes the error. + """ + variants: [ID!] +} + +""" +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 + BALANCE_CHECK_ERROR + CHECKOUT_EMAIL_NOT_SET + UNAVAILABLE_VARIANT_IN_CHANNEL + NO_CHECKOUT_LINES +} + +""" +Refunds the captured payment amount. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type PaymentRefund { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PaymentError!]! +} + +""" +Voids the authorized payment. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type PaymentVoid { + """ + Updated payment. + """ + payment: Payment + paymentErrors: [PaymentError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PaymentError!]! +} + +""" +Initializes payment process when it is required by gateway. +""" +type PaymentInitialize { + initializedPayment: PaymentInitialized + paymentErrors: [PaymentError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +""" +Check payment balance. +""" +type PaymentCheckBalance { + """ + Response from the gateway. + """ + data: JSONString + paymentErrors: [PaymentError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PaymentError!]! +} + +input PaymentCheckBalanceInput { + """ + An ID of a payment gateway to check. + """ + gatewayId: String! + + """ + Payment method name. + """ + method: String! + + """ + Slug of a channel for which the data should be returned. + """ + channel: String! + + """ + Information about card. + """ + card: CardInput! +} + +input CardInput { + """ + Payment method nonce, a token returned by the appropriate provider's SDK. + """ + code: String! + + """ + Card security code. + """ + cvc: String + + """ + Information about currency and amount. + """ + money: MoneyInput! +} + +input MoneyInput { + """ + Currency code. + """ + currency: String! + + """ + Amount of money. + """ + amount: PositiveDecimal! +} + +""" +Create transaction for checkout or order. Requires the following permissions: AUTHENTICATED_APP and HANDLE_PAYMENTS. + +Added in Saleor 3.4. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type TransactionCreate { + transaction: TransactionItem + errors: [TransactionCreateError!]! +} + +type TransactionCreateError { + """ + 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: TransactionCreateErrorCode! +} + +""" +An enumeration. +""" +enum TransactionCreateErrorCode { + INVALID + GRAPHQL_ERROR + NOT_FOUND + INCORRECT_CURRENCY + METADATA_KEY_REQUIRED +} + +input TransactionCreateInput { + """ + Status of the transaction. + """ + status: String! + + """ + Payment type used for this transaction. + """ + type: String! + + """ + Reference of the transaction. + """ + reference: String + + """ + List of all possible actions for the transaction + """ + availableActions: [TransactionActionEnum!] + + """ + Amount authorized by this transaction. + """ + amountAuthorized: MoneyInput + + """ + Amount charged by this transaction. + """ + amountCharged: MoneyInput + + """ + Amount refunded by this transaction. + """ + amountRefunded: MoneyInput + + """ + Amount voided by this transaction. + """ + amountVoided: MoneyInput + + """ + Payment public metadata. + """ + metadata: [MetadataInput!] + + """ + Payment private metadata. + """ + privateMetadata: [MetadataInput!] +} + +input MetadataInput { + """ + Key of a metadata item. + """ + key: String! + + """ + Value of a metadata item. + """ + value: String! +} + +input TransactionEventInput { + """ + Current status of the payment transaction. + """ + status: TransactionStatus! + + """ + Reference of the transaction. + """ + reference: String + + """ + Name of the transaction. + """ + name: String +} + +""" +Create transaction for checkout or order. Requires the following permissions: AUTHENTICATED_APP and HANDLE_PAYMENTS. + +Added in Saleor 3.4. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type TransactionUpdate { + transaction: TransactionItem + errors: [TransactionUpdateError!]! +} + +type TransactionUpdateError { + """ + 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: TransactionUpdateErrorCode! +} + +""" +An enumeration. +""" +enum TransactionUpdateErrorCode { + INVALID + GRAPHQL_ERROR + NOT_FOUND + INCORRECT_CURRENCY + METADATA_KEY_REQUIRED +} + +input TransactionUpdateInput { + """ + Status of the transaction. + """ + status: String + + """ + Payment type used for this transaction. + """ + type: String + + """ + Reference of the transaction. + """ + reference: String + + """ + List of all possible actions for the transaction + """ + availableActions: [TransactionActionEnum!] + + """ + Amount authorized by this transaction. + """ + amountAuthorized: MoneyInput + + """ + Amount charged by this transaction. + """ + amountCharged: MoneyInput + + """ + Amount refunded by this transaction. + """ + amountRefunded: MoneyInput + + """ + Amount voided by this transaction. + """ + amountVoided: MoneyInput + + """ + Payment public metadata. + """ + metadata: [MetadataInput!] + + """ + Payment private metadata. + """ + privateMetadata: [MetadataInput!] +} + +""" +Request an action for payment transaction. + +Added in Saleor 3.4. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: HANDLE_PAYMENTS, MANAGE_ORDERS. +""" +type TransactionRequestAction { + transaction: TransactionItem + errors: [TransactionRequestActionError!]! +} + +type TransactionRequestActionError { + """ + 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: TransactionRequestActionErrorCode! +} + +""" +An enumeration. +""" +enum TransactionRequestActionErrorCode { + INVALID + GRAPHQL_ERROR + NOT_FOUND + MISSING_TRANSACTION_ACTION_REQUEST_WEBHOOK +} + +""" +Creates a new page. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageCreate { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 PageCreateInput { + """ + Page internal name. + """ + slug: String + + """ + Page title. + """ + title: String + + """ + Page content. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString + + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + Determines if page is visible in the storefront. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `publishedAt` field instead. + """ + publicationDate: String + + """ + Publication date time. ISO 8601 standard. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + + """ + Search engine optimization fields. + """ + seo: SeoInput + + """ + ID of the page type that page belongs to. + """ + pageType: ID! +} + +""" +Deletes a page. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageDelete { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! + page: Page +} + +""" +Deletes pages. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Publish pages. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageBulkPublish { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Updates an existing page. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageUpdate { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! + page: Page +} + +input PageInput { + """ + Page internal name. + """ + slug: String + + """ + Page title. + """ + title: String + + """ + Page content. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString + + """ + List of attributes. + """ + attributes: [AttributeValueInput!] + + """ + Determines if page is visible in the storefront. + """ + isPublished: Boolean + + """ + Publication date. ISO 8601 standard. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `publishedAt` field instead. + """ + publicationDate: String + + """ + Publication date time. ISO 8601 standard. + + Added in Saleor 3.3. + """ + publishedAt: DateTime + + """ + Search engine optimization fields. + """ + seo: SeoInput +} + +""" +Creates/updates translations for a page. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type PageTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + page: PageTranslatableContent +} + +input PageTranslationInput { + seoTitle: String + seoDescription: String + title: String + + """ + Translated page content. + + Rich text format. For reference see https://editorjs.io/ + """ + content: JSONString +} + +""" +Create a new page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageTypeCreate { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Update page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageTypeUpdate { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Delete a page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageTypeDelete { + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! + pageType: PageType +} + +""" +Delete page types. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageTypeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Assign attributes to a given page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageAttributeAssign { + """ + The updated page type. + """ + pageType: PageType + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Unassign attributes from a given page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageAttributeUnassign { + """ + The updated page type. + """ + pageType: PageType + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Reorder the attributes of a page type. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type PageTypeReorderAttributes { + """ + Page type from which attributes are reordered. + """ + pageType: PageType + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Reorder page attribute values. + +Requires one of the following permissions: MANAGE_PAGES. +""" +type PageReorderAttributeValues { + """ + Page from which attribute values are reordered. + """ + page: Page + pageErrors: [PageError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PageError!]! +} + +""" +Completes creating an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderComplete { + """ + Completed order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Creates a new draft order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderCreate { + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! + order: Order +} + +input DraftOrderCreateInput { + """ + Billing address of the customer. + """ + billingAddress: AddressInput + + """ + Customer associated with the draft order. + """ + 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. + """ + channelId: 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!] +} + +input OrderLineCreateInput { + """ + Number of variant items ordered. + """ + quantity: Int! + + """ + Product variant ID. + """ + variantId: ID! +} + +""" +Deletes a draft order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderDelete { + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! + order: Order +} + +""" +Deletes draft orders. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Deletes order lines. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderLinesBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Updates a draft order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type DraftOrderUpdate { + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! + order: Order +} + +input DraftOrderInput { + """ + Billing address of the customer. + """ + billingAddress: AddressInput + + """ + Customer associated with the draft order. + """ + 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. + """ + channelId: ID + + """ + URL of a view where users should be redirected to see the order details. URL in RFC 1808 format. + """ + redirectUrl: String +} + +""" +Adds note to the order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderAddNote { + """ + Order with the note added. + """ + order: Order + + """ + Order note created. + """ + event: OrderEvent + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +input OrderAddNoteInput { + """ + Note message. + """ + message: String! +} + +""" +Cancel an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderCancel { + """ + Canceled order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Capture an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderCapture { + """ + Captured order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Confirms an unconfirmed order by changing status to unfulfilled. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderConfirm { + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Creates new fulfillments for an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderFulfill { + """ + List of created fulfillments. + """ + fulfillments: [Fulfillment!] + + """ + Fulfilled order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 + + """ + If true, then allow proceed fulfillment when stock is exceeded. + """ + allowStockToBeExceeded: Boolean = false +} + +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! +} + +""" +Cancels existing fulfillment and optionally restocks items. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type FulfillmentCancel { + """ + A canceled fulfillment. + """ + fulfillment: Fulfillment + + """ + Order which fulfillment was cancelled. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +input FulfillmentCancelInput { + """ + ID of a warehouse where items will be restocked. Optional when fulfillment is in WAITING_FOR_APPROVAL state. + """ + warehouseId: ID +} + +""" +Approve existing fulfillment. + +Added in Saleor 3.1. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type FulfillmentApprove { + """ + An approved fulfillment. + """ + fulfillment: Fulfillment + + """ + Order which fulfillment was approved. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Updates a fulfillment for an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type FulfillmentUpdateTracking { + """ + A fulfillment with updated tracking. + """ + fulfillment: Fulfillment + + """ + Order for which fulfillment was updated. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +input FulfillmentUpdateTrackingInput { + """ + Fulfillment tracking number. + """ + trackingNumber: String + + """ + If true, send an email notification to the customer. + """ + notifyCustomer: Boolean = false +} + +""" +Refund products. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type FulfillmentRefundProducts { + """ + A refunded fulfillment. + """ + fulfillment: Fulfillment + + """ + Order which fulfillment was refunded. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +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 OrderRefundLineInput { + """ + The ID of the order line to refund. + """ + orderLineId: ID! + + """ + The number of items to be refunded. + """ + quantity: Int! +} + +input OrderRefundFulfillmentLineInput { + """ + The ID of the fulfillment line to refund. + """ + fulfillmentLineId: ID! + + """ + The number of items to be refunded. + """ + quantity: Int! +} + +""" +Return products. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +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 +} + +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 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 +} + +""" +Create order lines for an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderLinesCreate { + """ + Related order. + """ + order: Order + + """ + List of added order lines. + """ + orderLines: [OrderLine!] + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Deletes an order line from an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderLineDelete { + """ + A related order. + """ + order: Order + + """ + An order line that was deleted. + """ + orderLine: OrderLine + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Updates an order line of an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderLineUpdate { + """ + Related order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! + orderLine: OrderLine +} + +input OrderLineInput { + """ + Number of variant items ordered. + """ + quantity: Int! +} + +""" +Adds discount to the order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderDiscountAdd { + """ + Order which has been discounted. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +""" +Update discount for the order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderDiscountUpdate { + """ + Order which has been discounted. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Remove discount from the order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderDiscountDelete { + """ + Order which has removed discount. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Update discount for the order line. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderLineDiscountUpdate { + """ + Order line which has been discounted. + """ + orderLine: OrderLine + + """ + Order which is related to the discounted line. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Remove discount applied to the order line. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Mark order as manually paid. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderMarkAsPaid { + """ + Order marked as paid. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Refund an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderRefund { + """ + A refunded order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Updates an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderUpdate { + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. Requires shipping method ID to update, when null is passed then currently assigned shipping method is removed. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderUpdateShipping { + """ + Order with updated shipping method. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +input OrderUpdateShippingInput { + """ + ID of the selected shipping method, pass null to remove currently assigned shipping method. + """ + shippingMethod: ID +} + +""" +Void an order. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderVoid { + """ + A voided order. + """ + order: Order + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Cancels orders. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type OrderBulkCancel { + """ + Returns how many objects were affected. + """ + count: Int! + orderErrors: [OrderError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [OrderError!]! +} + +""" +Delete metadata of an object. To use it, you need to have access to the modified object. +""" +type DeleteMetadata { + metadataErrors: [MetadataError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +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 + NOT_UPDATED +} + +""" +Delete object's private metadata. To use it, you need to be an authenticated staff user or an app and have access to the modified object. +""" +type DeletePrivateMetadata { + metadataErrors: [MetadataError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Updates metadata of an object. To use it, you need to have access to the modified object. +""" +type UpdateMetadata { + metadataErrors: [MetadataError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Updates private metadata of an object. To use it, you need to be an authenticated staff user or an app and have access to the modified object. +""" +type UpdatePrivateMetadata { + metadataErrors: [MetadataError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MetadataError!]! + item: ObjectWithMetadata +} + +""" +Assigns storefront's navigation menus. + +Requires one of the following permissions: MANAGE_MENUS, MANAGE_SETTINGS. +""" +type AssignNavigation { + """ + Assigned navigation menu. + """ + menu: Menu + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! +} + +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 +} + +enum NavigationType { + """ + Main storefront navigation. + """ + MAIN + + """ + Secondary storefront navigation. + """ + SECONDARY +} + +""" +Creates a new Menu. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuCreate { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +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 +} + +""" +Deletes a menu. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuDelete { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! + menu: Menu +} + +""" +Deletes menus. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! +} + +""" +Updates a menu. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuUpdate { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! + menu: Menu +} + +input MenuInput { + """ + Name of the menu. + """ + name: String + + """ + Slug of the menu. + """ + slug: String +} + +""" +Creates a new menu item. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuItemCreate { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuItemDelete { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! + menuItem: MenuItem +} + +""" +Deletes menu items. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuItemBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! +} + +""" +Updates a menu item. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuItemUpdate { + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [MenuError!]! + menuItem: MenuItem +} + +""" +Creates/updates translations for a menu item. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type MenuItemTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + menuItem: MenuItem +} + +""" +Moves items of menus. + +Requires one of the following permissions: MANAGE_MENUS. +""" +type MenuItemMove { + """ + Assigned menu to move within. + """ + menu: Menu + menuErrors: [MenuError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +""" +Request an invoice for the order using plugin. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceRequest { + """ + Order related to an invoice. + """ + order: Order + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 + NO_INVOICE_PLUGIN +} + +""" +Requests deletion of an invoice. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceRequestDelete { + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Creates a ready to send invoice. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceCreate { + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [InvoiceError!]! + invoice: Invoice +} + +input InvoiceCreateInput { + """ + Invoice number. + """ + number: String! + + """ + URL of an invoice to download. + """ + url: String! +} + +""" +Deletes an invoice. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceDelete { + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Updates an invoice. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceUpdate { + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [InvoiceError!]! + invoice: Invoice +} + +input UpdateInvoiceInput { + """ + Invoice number + """ + number: String + + """ + URL of an invoice to download. + """ + url: String +} + +""" +Send an invoice notification to the customer. + +Requires one of the following permissions: MANAGE_ORDERS. +""" +type InvoiceSendNotification { + invoiceErrors: [InvoiceError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [InvoiceError!]! + invoice: Invoice +} + +""" +Activate a gift card. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardActivate { + """ + Activated gift card. + """ + giftCard: GiftCard + giftCardErrors: [GiftCardError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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! + + """ + List of tag values that cause the error. + """ + tags: [String!] +} + +""" +An enumeration. +""" +enum GiftCardErrorCode { + ALREADY_EXISTS + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED + UNIQUE + EXPIRED_GIFT_CARD + DUPLICATED_INPUT_ITEM +} + +""" +Creates a new gift card. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardCreate { + giftCardErrors: [GiftCardError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [GiftCardError!]! + giftCard: GiftCard +} + +input GiftCardCreateInput { + """ + The gift card tags to add. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + addTags: [String!] + + """ + The gift card expiry date. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + expiryDate: Date + + """ + Start date of the gift card in ISO 8601 format. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + startDate: Date + + """ + End date of the gift card in ISO 8601 format. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `expiryDate` from `expirySettings` instead. + """ + endDate: Date + + """ + Balance of the gift card. + """ + balance: PriceInput! + + """ + Email of the customer to whom gift card will be sent. + """ + userEmail: String + + """ + Slug of a channel from which the email should be sent. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + channel: String + + """ + Determine if gift card is active. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + isActive: Boolean! + + """ + Code to use the gift card. + + DEPRECATED: this field will be removed in Saleor 4.0. The code is now auto generated. + """ + code: String + + """ + The gift card note from the staff member. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + note: String +} + +input PriceInput { + """ + Currency code. + """ + currency: String! + + """ + Amount of money. + """ + amount: PositiveDecimal! +} + +""" +Delete gift card. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardDelete { + giftCardErrors: [GiftCardError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [GiftCardError!]! + giftCard: GiftCard +} + +""" +Deactivate a gift card. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardDeactivate { + """ + Deactivated gift card. + """ + giftCard: GiftCard + giftCardErrors: [GiftCardError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [GiftCardError!]! +} + +""" +Update a gift card. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardUpdate { + giftCardErrors: [GiftCardError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [GiftCardError!]! + giftCard: GiftCard +} + +input GiftCardUpdateInput { + """ + The gift card tags to add. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + addTags: [String!] + + """ + The gift card expiry date. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + expiryDate: Date + + """ + Start date of the gift card in ISO 8601 format. + + DEPRECATED: this field will be removed in Saleor 4.0. + """ + startDate: Date + + """ + End date of the gift card in ISO 8601 format. + + DEPRECATED: this field will be removed in Saleor 4.0. Use `expiryDate` from `expirySettings` instead. + """ + endDate: Date + + """ + The gift card tags to remove. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + removeTags: [String!] + + """ + The gift card balance amount. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + balanceAmount: PositiveDecimal +} + +""" +Resend a gift card. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardResend { + """ + Gift card which has been sent. + """ + giftCard: GiftCard + errors: [GiftCardError!]! +} + +input GiftCardResendInput { + """ + ID of a gift card to resend. + """ + id: ID! + + """ + Email to which gift card should be send. + """ + email: String + + """ + Slug of a channel from which the email should be sent. + """ + channel: String! +} + +""" +Adds note to the gift card. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardAddNote { + """ + Gift card with the note added. + """ + giftCard: GiftCard + + """ + Gift card note created. + """ + event: GiftCardEvent + errors: [GiftCardError!]! +} + +input GiftCardAddNoteInput { + """ + Note message. + """ + message: String! +} + +""" +Create gift cards. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardBulkCreate { + """ + Returns how many objects were created. + """ + count: Int! + + """ + List of created gift cards. + """ + giftCards: [GiftCard!]! + errors: [GiftCardError!]! +} + +input GiftCardBulkCreateInput { + """ + The number of cards to issue. + """ + count: Int! + + """ + Balance of the gift card. + """ + balance: PriceInput! + + """ + The gift card tags. + """ + tags: [String!] + + """ + The gift card expiry date. + """ + expiryDate: Date + + """ + Determine if gift card is active. + """ + isActive: Boolean! +} + +""" +Delete gift cards. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + errors: [GiftCardError!]! +} + +""" +Activate gift cards. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardBulkActivate { + """ + Returns how many objects were affected. + """ + count: Int! + errors: [GiftCardError!]! +} + +""" +Deactivate gift cards. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type GiftCardBulkDeactivate { + """ + Returns how many objects were affected. + """ + count: Int! + errors: [GiftCardError!]! +} + +""" +Update plugin configuration. + +Requires one of the following permissions: MANAGE_PLUGINS. +""" +type PluginUpdate { + plugin: Plugin + pluginsErrors: [PluginError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PluginError!]! +} + +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 PluginUpdateInput { + """ + Indicates whether the plugin should be enabled. + """ + active: Boolean + + """ + Configuration of the plugin. + """ + configuration: [ConfigurationItemInput!] +} + +input ConfigurationItemInput { + """ + Name of the field to update. + """ + name: String! + + """ + Value of the given field to update. + """ + value: String +} + +""" +Trigger sending a notification with the notify plugin method. Serializes nodes provided as ids parameter and includes this data in the notification payload. + +Added in Saleor 3.1. +""" +type ExternalNotificationTrigger { + errors: [ExternalNotificationError!]! +} + +type ExternalNotificationError { + """ + 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: ExternalNotificationErrorCodes! +} + +""" +An enumeration. +""" +enum ExternalNotificationErrorCodes { + REQUIRED + INVALID_MODEL_TYPE + NOT_FOUND + CHANNEL_INACTIVE +} + +input ExternalNotificationTriggerInput { + """ + The list of customers or orders node IDs that will be serialized and included in the notification payload. + """ + ids: [ID!]! + + """ + Additional payload that will be merged with the one based on the bussines object ID. + """ + extraPayload: JSONString + + """ + External event type. This field is passed to a plugin as an event type. + """ + externalEventType: String! +} + +""" +Creates a new sale. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleCreate { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + sale: Sale +} + +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 +} + +input SaleInput { + """ + Voucher name. + """ + name: String + + """ + Fixed or percentage. + """ + type: DiscountValueTypeEnum + + """ + Value of the voucher. + """ + value: PositiveDecimal + + """ + Products related to the discount. + """ + products: [ID!] + variants: [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 +} + +""" +Deletes a sale. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleDelete { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + sale: Sale +} + +""" +Deletes sales. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +""" +Updates a sale. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleUpdate { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + sale: Sale +} + +""" +Adds products, categories, collections to a voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleAddCatalogues { + """ + Sale of which catalogue IDs will be modified. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +input CatalogueInput { + """ + Products related to the discount. + """ + products: [ID!] + + """ + Categories related to the discount. + """ + categories: [ID!] + + """ + Collections related to the discount. + """ + collections: [ID!] + + """ + Product variant related to the discount. + + Added in Saleor 3.1. + """ + variants: [ID!] +} + +""" +Removes products, categories, collections from a sale. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleRemoveCatalogues { + """ + Sale of which catalogue IDs will be modified. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +""" +Creates/updates translations for a sale. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type SaleTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + sale: Sale +} + +""" +Manage sale's availability in channels. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type SaleChannelListingUpdate { + """ + An updated sale instance. + """ + sale: Sale + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +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!] +} + +input SaleChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + The value of the discount. + """ + discountValue: PositiveDecimal! +} + +""" +Creates a new voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherCreate { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + voucher: Voucher +} + +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!] + + """ + Variants discounted by the voucher. + + Added in Saleor 3.1. + """ + variants: [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 + + """ + Voucher can be used only by staff user. + """ + onlyForStaff: Boolean + + """ + Limit number of times this voucher can be used in total. + """ + usageLimit: Int +} + +""" +Deletes a voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherDelete { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + voucher: Voucher +} + +""" +Deletes vouchers. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +""" +Updates a voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherUpdate { + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! + voucher: Voucher +} + +""" +Adds products, categories, collections to a voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherAddCatalogues { + """ + Voucher of which catalogue IDs will be modified. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +""" +Removes products, categories, collections from a voucher. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherRemoveCatalogues { + """ + Voucher of which catalogue IDs will be modified. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +""" +Creates/updates translations for a voucher. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type VoucherTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + voucher: Voucher +} + +""" +Manage voucher's availability in channels. + +Requires one of the following permissions: MANAGE_DISCOUNTS. +""" +type VoucherChannelListingUpdate { + """ + An updated voucher instance. + """ + voucher: Voucher + discountErrors: [DiscountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [DiscountError!]! +} + +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!] +} + +input VoucherChannelListingAddInput { + """ + ID of a channel. + """ + channelId: ID! + + """ + Value of the voucher. + """ + discountValue: PositiveDecimal + + """ + Min purchase amount required to apply the voucher. + """ + minAmountSpent: PositiveDecimal +} + +""" +Export products to csv file. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type ExportProducts { + """ + The newly created export file job which is responsible for export data. + """ + exportFile: ExportFile + exportErrors: [ExportError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ExportError!]! +} + +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 { + GRAPHQL_ERROR + INVALID + NOT_FOUND + REQUIRED +} + +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 +} + +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!] +} + +enum ProductFieldEnum { + NAME + DESCRIPTION + PRODUCT_TYPE + CATEGORY + PRODUCT_WEIGHT + COLLECTIONS + CHARGE_TAXES + PRODUCT_MEDIA + VARIANT_ID + VARIANT_SKU + VARIANT_WEIGHT + VARIANT_MEDIA +} + +""" +An enumeration. +""" +enum FileTypesEnum { + CSV + XLSX +} + +""" +Export gift cards to csv file. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. + +Requires one of the following permissions: MANAGE_GIFT_CARD. +""" +type ExportGiftCards { + """ + The newly created export file job which is responsible for export data. + """ + exportFile: ExportFile + errors: [ExportError!]! +} + +input ExportGiftCardsInput { + """ + Determine which gift cards should be exported. + """ + scope: ExportScope! + + """ + Filtering options for gift cards. + """ + filter: GiftCardFilterInput + + """ + List of gift cards IDs to export. + """ + ids: [ID!] + + """ + Type of exported file. + """ + fileType: FileTypesEnum! +} + +""" +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 + +Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_STAFF_USER. +""" +type FileUpload { + uploadedFile: File + uploadErrors: [UploadError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [UploadError!]! +} + +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 +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] + + """ + List of line Ids which cause the error. + """ + lines: [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 + DELIVERY_METHOD_NOT_APPLICABLE + SHIPPING_METHOD_NOT_SET + SHIPPING_NOT_REQUIRED + TAX_ERROR + UNIQUE + VOUCHER_NOT_APPLICABLE + GIFT_CARD_NOT_APPLICABLE + ZERO_QUANTITY + MISSING_CHANNEL_SLUG + CHANNEL_INACTIVE + UNAVAILABLE_VARIANT_IN_CHANNEL + EMAIL_NOT_SET + NO_LINES +} + +""" +Update billing address in the existing checkout. +""" +type CheckoutBillingAddressUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +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. + """ + created: Boolean + @deprecated( + reason: "This field will be removed in Saleor 4.0. Always returns `true`." + ) + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 +} + +input CheckoutLineInput { + """ + The number of items purchased. + """ + quantity: Int! + + """ + ID of the product variant. + """ + variantId: ID! + + """ + Custom price of the item. Can be set only by apps with `HANDLE_CHECKOUTS` permission. When the line with the same variant will be provided multiple times, the last price will be used. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + price: PositiveDecimal +} + +""" +Sets the customer as the owner of the checkout. + +Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_USER. +""" +type CheckoutCustomerAttach { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Removes the user assigned as the owner of the checkout. + +Requires one of the following permissions: AUTHENTICATED_APP, AUTHENTICATED_USER. +""" +type CheckoutCustomerDetach { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Updates email address in the existing checkout object. +""" +type CheckoutEmailUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Deletes a CheckoutLine. +""" +type CheckoutLineDelete { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Deletes checkout lines. +""" +type CheckoutLinesDelete { + """ + An updated checkout. + """ + checkout: Checkout + errors: [CheckoutError!]! +} + +""" +Adds a checkout line to the existing checkout.If line was already in checkout, its quantity will be increased. +""" +type CheckoutLinesAdd { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Updates checkout line in the existing checkout. +""" +type CheckoutLinesUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +input CheckoutLineUpdateInput { + """ + The number of items purchased. Optional for apps, required for any other users. + """ + quantity: Int + + """ + ID of the product variant. + """ + variantId: ID! + + """ + Custom price of the item. Can be set only by apps with `HANDLE_CHECKOUTS` permission. When the line with the same variant will be provided multiple times, the last price will be used. + + Added in Saleor 3.1. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + price: PositiveDecimal +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PaymentError!]! +} + +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 + + """ + Payment store type. + + Added in Saleor 3.1. + """ + storePaymentMethod: StorePaymentMethodEnum = NONE + + """ + User public metadata. + + Added in Saleor 3.1. + """ + metadata: [MetadataInput!] +} + +""" +Enum representing the type of a payment storage in a gateway. +""" +enum StorePaymentMethodEnum { + """ + On session storage type. The payment is stored only to be reused when the customer is present in the checkout flow. + """ + ON_SESSION + + """ + Off session storage type. The payment is stored to be reused even if the customer is absent. + """ + OFF_SESSION + + """ + Storage is disabled. The payment is not stored. + """ + NONE +} + +""" +Update shipping address in the existing checkout. +""" +type CheckoutShippingAddressUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Updates the shipping method of the checkout. +""" +type CheckoutShippingMethodUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Updates the delivery method (shipping method or pick up point) of the checkout. + +Added in Saleor 3.1. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type CheckoutDeliveryMethodUpdate { + """ + An updated checkout. + """ + checkout: Checkout + errors: [CheckoutError!]! +} + +""" +Update language code in the existing checkout. +""" +type CheckoutLanguageCodeUpdate { + """ + An updated checkout. + """ + checkout: Checkout + checkoutErrors: [CheckoutError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [CheckoutError!]! +} + +""" +Create new order from existing checkout. Requires the following permissions: AUTHENTICATED_APP and HANDLE_CHECKOUTS. + +Added in Saleor 3.2. + +Note: this API is currently in Feature Preview and can be subject to changes at later point. +""" +type OrderCreateFromCheckout { + """ + Placed order. + """ + order: Order + errors: [OrderCreateFromCheckoutError!]! +} + +type OrderCreateFromCheckoutError { + """ + 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: OrderCreateFromCheckoutErrorCode! + + """ + List of variant IDs which causes the error. + """ + variants: [ID!] + + """ + List of line Ids which cause the error. + """ + lines: [ID!] +} + +""" +An enumeration. +""" +enum OrderCreateFromCheckoutErrorCode { + GRAPHQL_ERROR + CHECKOUT_NOT_FOUND + CHANNEL_INACTIVE + INSUFFICIENT_STOCK + VOUCHER_NOT_APPLICABLE + GIFT_CARD_NOT_APPLICABLE + TAX_ERROR + SHIPPING_METHOD_NOT_SET + BILLING_ADDRESS_NOT_SET + SHIPPING_ADDRESS_NOT_SET + INVALID_SHIPPING_METHOD + NO_LINES + EMAIL_NOT_SET + UNAVAILABLE_VARIANT_IN_CHANNEL +} + +""" +Creates new channel. + +Requires one of the following permissions: MANAGE_CHANNELS. +""" +type ChannelCreate { + channelErrors: [ChannelError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ChannelError!]! + channel: Channel +} + +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 + CHANNELS_CURRENCY_MUST_BE_THE_SAME + CHANNEL_WITH_ORDERS + DUPLICATED_INPUT_ITEM +} + +input ChannelCreateInput { + """ + isActive flag. + """ + isActive: Boolean + + """ + Name of the channel. + """ + name: String! + + """ + Slug of the channel. + """ + slug: String! + + """ + Currency of the channel. + """ + currencyCode: String! + + """ + Default country for the channel. Default country can be used in checkout to determine the stock quantities or calculate taxes when the country was not explicitly provided. + + Added in Saleor 3.1. + """ + defaultCountry: CountryCode! + + """ + List of shipping zones to assign to the channel. + """ + addShippingZones: [ID!] +} + +""" +Update a channel. + +Requires one of the following permissions: MANAGE_CHANNELS. +""" +type ChannelUpdate { + channelErrors: [ChannelError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ChannelError!]! + channel: Channel +} + +input ChannelUpdateInput { + """ + isActive flag. + """ + isActive: Boolean + + """ + Name of the channel. + """ + name: String + + """ + Slug of the channel. + """ + slug: String + + """ + Default country for the channel. Default country can be used in checkout to determine the stock quantities or calculate taxes when the country was not explicitly provided. + + Added in Saleor 3.1. + """ + defaultCountry: CountryCode + + """ + List of shipping zones to assign to the channel. + """ + addShippingZones: [ID!] + + """ + List of shipping zones to unassign from the channel. + """ + removeShippingZones: [ID!] +} + +""" +Delete a channel. Orders associated with the deleted channel will be moved to the target channel. Checkouts, product availability, and pricing will be removed. + +Requires one of the following permissions: MANAGE_CHANNELS. +""" +type ChannelDelete { + channelErrors: [ChannelError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ChannelError!]! + channel: Channel +} + +input ChannelDeleteInput { + """ + ID of channel to migrate orders from origin channel. + """ + channelId: ID! +} + +""" +Activate a channel. + +Requires one of the following permissions: MANAGE_CHANNELS. +""" +type ChannelActivate { + """ + Activated channel. + """ + channel: Channel + channelErrors: [ChannelError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ChannelError!]! +} + +""" +Deactivate a channel. + +Requires one of the following permissions: MANAGE_CHANNELS. +""" +type ChannelDeactivate { + """ + Deactivated channel. + """ + channel: Channel + channelErrors: [ChannelError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [ChannelError!]! +} + +""" +Creates an attribute. +""" +type AttributeCreate { + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! +} + +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 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 +} + +input AttributeValueCreateInput { + """ + Represent value of the attribute value (e.g. color values for swatch attributes). + """ + value: String + + """ + Represents the text of the attribute value, includes formatting. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString + + """ + URL of the file attribute. Every time, a new value is created. + """ + fileUrl: String + + """ + File content type. + """ + contentType: String + + """ + Name of a value displayed in the interface. + """ + name: String! +} + +""" +Deletes an attribute. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type AttributeDelete { + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! + attribute: Attribute +} + +""" +Updates attribute. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type AttributeUpdate { + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: [AttributeValueUpdateInput!] + + """ + 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 +} + +input AttributeValueUpdateInput { + """ + Represent value of the attribute value (e.g. color values for swatch attributes). + """ + value: String + + """ + Represents the text of the attribute value, includes formatting. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString + + """ + URL of the file attribute. Every time, a new value is created. + """ + fileUrl: String + + """ + File content type. + """ + contentType: String + + """ + Name of a value displayed in the interface. + """ + name: String +} + +""" +Creates/updates translations for an attribute. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type AttributeTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + attribute: Attribute +} + +""" +Deletes attributes. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type AttributeBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! +} + +""" +Deletes values of attributes. + +Requires one of the following permissions: MANAGE_PAGE_TYPES_AND_ATTRIBUTES. +""" +type AttributeValueBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! +} + +""" +Creates a value for an attribute. + +Requires one of the following permissions: MANAGE_PRODUCTS. +""" +type AttributeValueCreate { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +""" +Deletes a value of an attribute. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type AttributeValueDelete { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +""" +Updates value of an attribute. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type AttributeValueUpdate { + """ + The updated attribute. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! + attributeValue: AttributeValue +} + +""" +Creates/updates translations for an attribute value. + +Requires one of the following permissions: MANAGE_TRANSLATIONS. +""" +type AttributeValueTranslate { + translationErrors: [TranslationError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [TranslationError!]! + attributeValue: AttributeValue +} + +input AttributeValueTranslationInput { + name: String + + """ + Translated text. + + Rich text format. For reference see https://editorjs.io/ + """ + richText: JSONString +} + +""" +Reorder the values of an attribute. + +Requires one of the following permissions: MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES. +""" +type AttributeReorderValues { + """ + Attribute from which values are reordered. + """ + attribute: Attribute + attributeErrors: [AttributeError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AttributeError!]! +} + +""" +Creates a new app. Requires the following permissions: AUTHENTICATED_STAFF_USER and MANAGE_APPS. +""" +type AppCreate { + """ + The newly created authentication token. + """ + authToken: String + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + app: App +} + +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 +} + +input AppInput { + """ + Name of the app. + """ + name: String + + """ + List of permission code names to assign to this app. + """ + permissions: [PermissionEnum!] +} + +""" +Updates an existing app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppUpdate { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + app: App +} + +""" +Deletes an app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppDelete { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + app: App +} + +""" +Creates a new token. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppTokenCreate { + """ + The newly created authentication token. + """ + authToken: String + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + appToken: AppToken +} + +input AppTokenInput { + """ + Name of the token. + """ + name: String + + """ + ID of app. + """ + app: ID! +} + +""" +Deletes an authentication token assigned to app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppTokenDelete { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + appToken: AppToken +} + +""" +Verify provided app token. +""" +type AppTokenVerify { + """ + Determine if token is valid or not. + """ + valid: Boolean! + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! +} + +""" +Install new app by using app manifest. Requires the following permissions: AUTHENTICATED_STAFF_USER and MANAGE_APPS. +""" +type AppInstall { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Retry failed installation of new app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppRetryInstall { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + appInstallation: AppInstallation +} + +""" +Delete failed installation. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppDeleteFailedInstallation { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + appInstallation: AppInstallation +} + +""" +Fetch and validate manifest. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppFetchManifest { + manifest: Manifest + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! +} + +""" +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 + extensions: [AppManifestExtension!]! +} + +type AppManifestExtension { + """ + List of the app extension's permissions. + """ + permissions: [Permission!]! + + """ + Label of the extension to show in the dashboard. + """ + label: String! + + """ + URL of a view where extension's iframe is placed. + """ + url: String! + + """ + Place where given extension will be mounted. + """ + mount: AppExtensionMountEnum! + + """ + Type of way how app extension will be opened. + """ + target: AppExtensionTargetEnum! +} + +""" +Activate the app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppActivate { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + app: App +} + +""" +Deactivate the app. + +Requires one of the following permissions: MANAGE_APPS. +""" +type AppDeactivate { + appErrors: [AppError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AppError!]! + app: App +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +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 + ACCOUNT_NOT_CONFIRMED +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +The `GenericScalar` scalar type represents a generic +GraphQL scalar value that could be: +String, Boolean, Int, Float, List or Object. +""" +scalar GenericScalar + +""" +Deactivate all JWT tokens of the currently authenticated user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type DeactivateAllUserTokens { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Prepare external authentication url for user by custom plugin. +""" +type ExternalAuthenticationUrl { + """ + The data returned by authentication plugin. + """ + authenticationData: JSONString + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Logout user by custom plugin. +""" +type ExternalLogout { + """ + The data returned by authentication plugin. + """ + logoutData: JSONString + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Sends an email with the account password modification link. +""" +type RequestPasswordReset { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Confirm user account with token sent by email during registration. +""" +type ConfirmAccount { + """ + An activated user account. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +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: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Change the password of the logged in user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type PasswordChange { + """ + A user instance with a new password. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Request email change of the logged in user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type RequestEmailChange { + """ + A user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Confirm the email change of the logged-in user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type ConfirmEmailChange { + """ + A user instance with a new email. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Create a new address for the customer. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type AccountAddressCreate { + """ + A user instance for which the address was created. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Updates an address of the logged-in user. Requires one of the following permissions: MANAGE_USERS, IS_OWNER. +""" +type AccountAddressUpdate { + """ + A user object for which the address was edited. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Delete an address of the logged-in user. Requires one of the following permissions: MANAGE_USERS, IS_OWNER. +""" +type AccountAddressDelete { + """ + A user instance for which the address was deleted. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Sets a default address for the authenticated user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type AccountSetDefaultAddress { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Register a new user. +""" +type AccountRegister { + """ + Informs whether users need to confirm their email address. + """ + requiresConfirmation: Boolean + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +input AccountRegisterInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + User language code. + """ + languageCode: LanguageCodeEnum + + """ + 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 public metadata. + """ + metadata: [MetadataInput!] + + """ + Slug of a channel which will be used to notify users. Optional when only one channel exists. + """ + channel: String +} + +""" +Updates the account of the logged-in user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type AccountUpdate { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +input AccountInput { + """ + Given name. + """ + firstName: String + + """ + Family name. + """ + lastName: String + + """ + User language code. + """ + languageCode: LanguageCodeEnum + + """ + Billing address of the customer. + """ + defaultBillingAddress: AddressInput + + """ + Shipping address of the customer. + """ + defaultShippingAddress: AddressInput +} + +""" +Sends an email with the account removal link for the logged-in user. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type AccountRequestDeletion { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Remove user account. + +Requires one of the following permissions: AUTHENTICATED_USER. +""" +type AccountDelete { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +""" +Creates user address. + +Requires one of the following permissions: MANAGE_USERS. +""" +type AddressCreate { + """ + A user instance for which the address was created. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Updates an address. + +Requires one of the following permissions: MANAGE_USERS. +""" +type AddressUpdate { + """ + A user object for which the address was edited. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Deletes an address. + +Requires one of the following permissions: MANAGE_USERS. +""" +type AddressDelete { + """ + A user instance for which the address was deleted. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + address: Address +} + +""" +Sets a default address for the given user. + +Requires one of the following permissions: MANAGE_USERS. +""" +type AddressSetDefault { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Creates a new customer. + +Requires one of the following permissions: MANAGE_USERS. +""" +type CustomerCreate { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +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 +} + +""" +Updates an existing customer. + +Requires one of the following permissions: MANAGE_USERS. +""" +type CustomerUpdate { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +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 +} + +""" +Deletes a customer. + +Requires one of the following permissions: MANAGE_USERS. +""" +type CustomerDelete { + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! + user: User +} + +""" +Deletes customers. + +Requires one of the following permissions: MANAGE_USERS. +""" +type CustomerBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Creates a new staff user. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type StaffCreate { + staffErrors: [StaffError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +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 +} + +""" +Updates an existing staff user. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type StaffUpdate { + staffErrors: [StaffError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Deletes a staff user. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type StaffDelete { + staffErrors: [StaffError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [StaffError!]! + user: User +} + +""" +Deletes staff users. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type StaffBulkDelete { + """ + Returns how many objects were affected. + """ + count: Int! + staffErrors: [StaffError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [StaffError!]! +} + +""" +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 + +Requires one of the following permissions: AUTHENTICATED_STAFF_USER. +""" +type UserAvatarUpdate { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Deletes a user avatar. Only for staff members. + +Requires one of the following permissions: AUTHENTICATED_STAFF_USER. +""" +type UserAvatarDelete { + """ + An updated user instance. + """ + user: User + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Activate or deactivate users. + +Requires one of the following permissions: MANAGE_USERS. +""" +type UserBulkSetActive { + """ + Returns how many objects were affected. + """ + count: Int! + accountErrors: [AccountError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [AccountError!]! +} + +""" +Create new permission group. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type PermissionGroupCreate { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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 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! +} + +""" +Update permission group. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type PermissionGroupUpdate { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + 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!] +} + +""" +Delete permission group. + +Requires one of the following permissions: MANAGE_STAFF. +""" +type PermissionGroupDelete { + permissionGroupErrors: [PermissionGroupError!]! + @deprecated( + reason: "This field will be removed in Saleor 4.0. Use `errors` field instead." + ) + errors: [PermissionGroupError!]! + group: Group +} + +type Subscription { + """ + Look up subscription event. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + event: Event +} + +interface Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App +} + +union IssuingPrincipal = App | User + +""" +An enumeration. +""" +enum DistanceUnitsEnum { + CM + M + KM + FT + YD + INCH +} + +""" +An enumeration. +""" +enum AreaUnitsEnum { + SQ_CM + SQ_M + SQ_KM + SQ_FT + SQ_YD + SQ_INCH +} + +""" +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 +} + +type AppInstalled implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The application the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + app: App +} + +type AppUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The application the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + app: App +} + +type AppDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The application the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + app: App +} + +type AppStatusChanged implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The application the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + app: App +} + +type CategoryCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The category the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type CategoryUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The category the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type CategoryDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The category the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type ChannelCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The channel the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + channel: Channel +} + +type ChannelUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The channel the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + channel: Channel +} + +type ChannelDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The channel the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + channel: Channel +} + +type ChannelStatusChanged implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The channel the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + channel: Channel +} + +type GiftCardCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The gift card the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + giftCard: GiftCard +} + +type GiftCardUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The gift card the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + giftCard: GiftCard +} + +type GiftCardDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The gift card the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + giftCard: GiftCard +} + +type GiftCardStatusChanged implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The gift card the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + giftCard: GiftCard +} + +type MenuCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menu( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Menu +} + +type MenuUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menu( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Menu +} + +type MenuDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menu( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Menu +} + +type MenuItemCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu item the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menuItem( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): MenuItem +} + +type MenuItemUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu item the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menuItem( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): MenuItem +} + +type MenuItemDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The menu item the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + menuItem( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): MenuItem +} + +type OrderCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type OrderUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type OrderConfirmed implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type OrderFullyPaid implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type OrderCancelled implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type OrderFulfilled implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type DraftOrderCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type DraftOrderUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type DraftOrderDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The order the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type ProductCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + product( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Product + + """ + The category of the product. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type ProductUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + product( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Product + + """ + The category of the product. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type ProductDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + product( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Product + + """ + The category of the product. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + category: Category +} + +type ProductVariantCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product variant the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + productVariant( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant +} + +type ProductVariantUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product variant the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + productVariant( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant +} + +type ProductVariantOutOfStock implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product variant the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + productVariant( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant + + """ + Look up a warehouse. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + warehouse: Warehouse +} + +type ProductVariantBackInStock implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product variant the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + productVariant( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant + + """ + Look up a warehouse. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + warehouse: Warehouse +} + +type ProductVariantDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The product variant the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + productVariant( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ProductVariant +} + +type SaleCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The sale the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + sale( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Sale +} + +type SaleUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The sale the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + sale( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Sale +} + +type SaleDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The sale the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + sale( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Sale +} + +type InvoiceRequested implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The invoice the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + invoice: Invoice +} + +type InvoiceDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The invoice the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + invoice: Invoice +} + +type InvoiceSent implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The invoice the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + invoice: Invoice +} + +type FulfillmentCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The fulfillment the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + fulfillment: Fulfillment + + """ + The order the fulfillment belongs to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type FulfillmentCanceled implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The fulfillment the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + fulfillment: Fulfillment + + """ + The order the fulfillment belongs to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + order: Order +} + +type CustomerCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The user the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + user: User +} + +type CustomerUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The user the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + user: User +} + +type CollectionCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The collection the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + collection( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Collection +} + +type CollectionUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The collection the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + collection( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Collection +} + +type CollectionDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The collection the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + collection( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Collection +} + +type CheckoutCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The checkout the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + checkout: Checkout +} + +type CheckoutUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The checkout the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + checkout: Checkout +} + +type PageCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The page the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + page: Page +} + +type PageUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The page the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + page: Page +} + +type PageDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The page the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + page: Page +} + +type ShippingPriceCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping method the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingMethod( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingMethodType + + """ + The shipping zone the shipping method belongs to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type ShippingPriceUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping method the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingMethod( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingMethodType + + """ + The shipping zone the shipping method belongs to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type ShippingPriceDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping method the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingMethod( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingMethodType + + """ + The shipping zone the shipping method belongs to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type ShippingZoneCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping zone the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type ShippingZoneUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping zone the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type ShippingZoneDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The shipping zone the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + shippingZone( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): ShippingZone +} + +type TransactionActionRequest implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + Look up a transaction. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + transaction: TransactionItem + + """ + Requested action data. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + action: TransactionAction! +} + +type TransactionAction { + """ + Determines the action type. + """ + actionType: TransactionActionEnum! + + """ + Transaction request amount. Null when action type is VOID. + """ + amount: PositiveDecimal +} + +type TranslationCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The translation the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + translation: TranslationTypes +} + +union TranslationTypes = + ProductTranslation + | CollectionTranslation + | CategoryTranslation + | AttributeTranslation + | AttributeValueTranslation + | ProductVariantTranslation + | PageTranslation + | ShippingMethodTranslation + | SaleTranslation + | VoucherTranslation + | MenuItemTranslation + +type TranslationUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The translation the event relates to. + + Added in Saleor 3.2. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + translation: TranslationTypes +} + +type VoucherCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The voucher the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + voucher( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Voucher +} + +type VoucherUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The voucher the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + voucher( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Voucher +} + +type VoucherDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The voucher the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + voucher( + """ + Slug of a channel for which the data should be returned. + """ + channel: String + ): Voucher +} + +type WarehouseCreated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The warehouse the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + warehouse: Warehouse +} + +type WarehouseUpdated implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The warehouse the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + warehouse: Warehouse +} + +type WarehouseDeleted implements Event { + """ + Time of the event. + """ + issuedAt: DateTime + + """ + Saleor version that triggered the event. + """ + version: String + + """ + The user or application that triggered the event. + """ + issuingPrincipal: IssuingPrincipal + + """ + The application receiving the webhook. + """ + recipient: App + + """ + The warehouse the event relates to. + + Added in Saleor 3.4. + + Note: this API is currently in Feature Preview and can be subject to changes at later point. + """ + warehouse: Warehouse +} + +""" +_Any value scalar as defined by Federation spec. +""" +scalar _Any + +""" +_Entity union as defined by Federation spec. +""" +union _Entity = + App + | Address + | User + | Group + | ProductVariant + | Product + | ProductType + | Collection + | Category + | ProductMedia + | PageType + +""" +_Service manifest as defined by Federation spec. +""" +type _Service { + sdl: String +} diff --git a/apps/data-exporter/graphql/subscriptions/.gitkeep b/apps/data-exporter/graphql/subscriptions/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/data-exporter/graphql/subscriptions/productCreated.graphql b/apps/data-exporter/graphql/subscriptions/productCreated.graphql new file mode 100644 index 0000000..f55430a --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productCreated.graphql @@ -0,0 +1,9 @@ +subscription ProductCreated { + event { + ... on ProductCreated { + product { + ...ProductWebhookPayload + } + } + } +} diff --git a/apps/data-exporter/graphql/subscriptions/productDeleted.graphql b/apps/data-exporter/graphql/subscriptions/productDeleted.graphql new file mode 100644 index 0000000..dda49e0 --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productDeleted.graphql @@ -0,0 +1,9 @@ +subscription ProductDeleted { + event { + ... on ProductDeleted { + product { + ...ProductWebhookPayload + } + } + } +} diff --git a/apps/data-exporter/graphql/subscriptions/productUpdated.graphql b/apps/data-exporter/graphql/subscriptions/productUpdated.graphql new file mode 100644 index 0000000..9d76752 --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productUpdated.graphql @@ -0,0 +1,9 @@ +subscription ProductUpdated { + event { + ... on ProductUpdated { + product { + ...ProductWebhookPayload + } + } + } +} diff --git a/apps/data-exporter/graphql/subscriptions/productVariantCreated.graphql b/apps/data-exporter/graphql/subscriptions/productVariantCreated.graphql new file mode 100644 index 0000000..81fbf7d --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productVariantCreated.graphql @@ -0,0 +1,9 @@ +subscription ProductVariantCreated { + event { + ... on ProductVariantCreated { + productVariant { + ...ProductVariantWebhookPayload + } + } + } +} diff --git a/apps/data-exporter/graphql/subscriptions/productVariantDeleted.graphql b/apps/data-exporter/graphql/subscriptions/productVariantDeleted.graphql new file mode 100644 index 0000000..a313a68 --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productVariantDeleted.graphql @@ -0,0 +1,10 @@ +subscription ProductVariantDeleted { + event { + ... on ProductVariantDeleted { + productVariant { + ...ProductVariantWebhookPayload + } + } + + } +} diff --git a/apps/data-exporter/graphql/subscriptions/productVariantUpdated.graphql b/apps/data-exporter/graphql/subscriptions/productVariantUpdated.graphql new file mode 100644 index 0000000..301ac99 --- /dev/null +++ b/apps/data-exporter/graphql/subscriptions/productVariantUpdated.graphql @@ -0,0 +1,9 @@ +subscription ProductVariantUpdated { + event { + ... on ProductVariantUpdated { + productVariant { + ...ProductVariantWebhookPayload + } + } + } +} diff --git a/apps/data-exporter/next-env.d.ts b/apps/data-exporter/next-env.d.ts new file mode 100644 index 0000000..4f11a03 --- /dev/null +++ b/apps/data-exporter/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/apps/data-exporter/next.config.js b/apps/data-exporter/next.config.js new file mode 100644 index 0000000..6c8dd36 --- /dev/null +++ b/apps/data-exporter/next.config.js @@ -0,0 +1,28 @@ +const { withSentryConfig } = require("@sentry/nextjs"); + +const isSentryPropertiesInEnvironment = + process.env.SENTRY_AUTH_TOKEN && process.env.SENTRY_PROJECT && process.env.SENTRY_ORG; + +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + transpilePackages: ["@saleor/apps-shared", "@saleor/apps-ui", "@saleor/react-hook-form-macaw"], +}; + +const configWithSentry = withSentryConfig( + nextConfig, + { + silent: true, + org: process.env.SENTRY_ORG, + project: process.env.SENTRY_PROJECT, + }, + { + widenClientFileUpload: true, + transpileClientSDK: true, + tunnelRoute: "/monitoring", + hideSourceMaps: true, + disableLogger: true, + } +); + +module.exports = isSentryPropertiesInEnvironment ? configWithSentry : nextConfig; diff --git a/apps/data-exporter/package.json b/apps/data-exporter/package.json new file mode 100644 index 0000000..6e3db30 --- /dev/null +++ b/apps/data-exporter/package.json @@ -0,0 +1,69 @@ +{ + "name": "saleor-app-data-exporter", + "version": "0.0.0", + "scripts": { + "build": "pnpm generate && next build", + "dev": "pnpm generate && NODE_OPTIONS='--inspect' next dev", + "fetch-schema": "curl https://raw.githubusercontent.com/saleor/saleor/${npm_package_saleor_schemaVersion}/saleor/graphql/schema.graphql > graphql/schema.graphql", + "generate": "graphql-codegen", + "lint": "next lint", + "lint:fix": "eslint --fix .", + "start": "next start", + "test": "vitest" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.332.0", + "@hookform/resolvers": "^3.3.1", + "@saleor/app-sdk": "0.43.1", + "@saleor/apps-shared": "workspace:*", + "@saleor/apps-ui": "workspace:*", + "@saleor/macaw-ui": "0.8.0-pre.127", + "@saleor/react-hook-form-macaw": "workspace:*", + "@sentry/nextjs": "7.67.0", + "@tanstack/react-query": "4.29.19", + "@trpc/client": "10.38.1", + "@trpc/next": "10.38.1", + "@trpc/react-query": "10.38.1", + "@trpc/server": "10.38.1", + "@urql/exchange-auth": "^2.1.4", + "@vitejs/plugin-react": "4.0.4", + "fast-xml-parser": "^4.0.15", + "graphql": "16.7.1", + "graphql-tag": "^2.12.6", + "handlebars": "^4.7.7", + "jsdom": "^20.0.3", + "next": "13.4.8", + "pino": "^8.14.1", + "pino-pretty": "^10.0.0", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-hook-form": "^7.43.9", + "react-is": "^18.2.0", + "urql": "^4.0.4", + "usehooks-ts": "^2.9.1", + "vite": "4.4.8", + "vitest": "0.34.1", + "zod": "3.21.4" + }, + "devDependencies": { + "@graphql-codegen/cli": "5.0.0", + "@graphql-codegen/introspection": "4.0.0", + "@graphql-codegen/schema-ast": "4.0.0", + "@graphql-codegen/typed-document-node": "5.0.1", + "@graphql-codegen/typescript": "4.0.1", + "@graphql-codegen/typescript-operations": "4.0.1", + "@graphql-codegen/typescript-urql": "3.7.3", + "@graphql-typed-document-node/core": "3.2.0", + "@testing-library/react": "^14.0.0", + "@testing-library/react-hooks": "^8.0.1", + "@types/react": "18.2.5", + "@types/react-dom": "18.2.5", + "eslint": "8.46.0", + "eslint-config-saleor": "workspace:*", + "typescript": "5.1.6" + }, + "private": true, + "saleor": { + "schemaVersion": "3.10" + } +} diff --git a/apps/data-exporter/public/logo.png b/apps/data-exporter/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..65447a8c5b6191235ab8f9a59c2554170cdf5a5e GIT binary patch literal 10094 zcmdsdXH?VA*XJZeiqcU8q=_O3C?HLd5(Gr)ReBMWE=77x6n|6!3r%SOMLLKINDoR; zKzi>Y(u+tBA=%;o-?QgD`(mFr`#k6DzR1aZXYPEa-FxSjiPF_pqdU%V8~{Lf`<9A6 z07zIw0%}V5x8>hYfPXX|w@keNIKguCLx9(5Y_JmHrLT4alyq_~!Vi>#l9mzxW$`D7 zcaH%eKyh0|$VAlRj8hi8>3F>kma4ij+?#nqABvJzrx~a9*F#S`ho**oPzEW#wjbO*9v8Q%shn zgh|CcK^qBifVfp%E3zw%ma9MoO@+RRI~*~mXd1D5QJndp7XyUNMF zB;CNf?Y~m#-y$T$5YwC1BZTQH$*rHZzU0kj(RD4*%~=zDd-cR>me-X3QnJjdIt8v2 zfioCYl;1j2+#mXfsL2Cfuc5_9LOx6-KB`Ay1?oRZ4gOU$DtZ+>Iw}vUgpz3LLmxOR zj>PloI)TV5nCs=CL#{mF@`4&;-g%&sPhMFZJRSXr+(!da^b?hETi{QVamN0{VAYO8 zA^~Az))I66PjfCeX7;;bb}tfLw0T-|+U0v(C`gH=*fd{_Xe*$k&0!8EDJpKBX`XJ7 zU?(DMD(<8?Ro;B_B165q?>L%s+Dp2;-u@*I*wQXcwE8Sv&a-@93g>{B4*rgDdFado z60&kNkn*O;y>U#yoI!DapaMj}iIkmxFVQmIPvJ!m%A|WjD-V5YV6}IQZO3YJJ@(oq zgf|JS?j)grVd22&mE=2(rc@wI5p0cc-oO_jv5h={vPnc4|C9plst~yyfdaHo2BnI1 z$fO3$>=_Ayyu|*Db|$%MQ2PuC*x;V#2CPP85PoabygNAaZsHhY82Od&asULRO;cS= z9~@*W%!LhHVCG4~+b)Pb5WQ)){Yg_8cn2PGt)BoCms*y{e|{Hdrgsim`7q%3d&!PS zuyofd=*Pegg+)1%ahXH|^5XqU>Q8z!0}oPOBjkp>mqD3(y@QvG36I+^BLojA(8aM` z?&U)kYm1MPi$R)J@ij$902WeJjXBzLi$Dsbkf1FeWjLJtm1^ZbHJ?kc{fGgM;XC(R zwsws`2MK{QeOG|2Ek)YwFn}NWh6n|p#rewx|LS=zw#$0hs_J){)~^X23q!R0o+x@}*mqAsB5*IEFfM%T&brt0fba*tP2xe!~ z`xYm&e9ZyCrqzyRPy=CR@GSO@a4{Q4^}B658u0CVbRG~<2WW-SVxEsE0QOBK`}Gk3 zJ1)ZETnWFwb!2Cuz&$mHKuZI_v$F^QuABz|9e&jK4C*CzW&n7Vp+>uR>;HeE9~xr+ zsLEJO?R)+t1~@hP3|+ukX*YyOr^{|?&(HsI&(QR^h~V`S|I8p-B|cIA@M;K-Z7U*q za%*y$K~fF%xa>`9U)H(SzQQ+l&0RX)3TpLcI>GykzI@k(lP}#qvu2l4M9eM(azOT#cSN>2W z^Ha~N0>{tI&4HvjI+y4dETb#Ng}}{aZL4%w`W<=!Z0H%QhcAC%rT9VrvkFBU-KOb= zhr{yuadPyZ!)*^6G;^mEQY+RcGjB3*-EN(fdxZ^*Hn?FIUQfy}%2{JK3uu3_we+Y= zrH&d%eR5sY$`={)Ye=f7t1V?gVgt{JB7;%;r!jkGx$X@`5&H=NI@xkaG@WX;s4^{S zYLcXmeC;sS9u)KNuvXt}x2;-0?{W}u&U;EHqqiipr~FaX$G!H+{kqQrBh)5}Nc0bp z%T8SD&9*xXlI9|-A(-{$eA*LpCxFj6&@Jve>yLb0TJ$6E#4+qB6L5Z4bY-keMu#7_ z-!?jZ=HNu$X#~zbVFWB3`@bT*PzG?U7Jd)Ri04l9{pn4eJQ#bdl2$x?0V>itaq0AP*1sKU+g@M%i%h((g}0) z|E{$dXC&iir9&jD&y=qW2Z^mJdP~NhK1+pjMFNVml%&|*;>)2Hvc;wG>^`(b8)aF0 zA=h`gG{^kb*HK}isf#YJ_T)9D4hUS$E&*#fA&-Hs5CU6oX3_Ci#@$5XP2e!hjDsLZJ{F|Uogeup;qf#~|`6AtW^VbrZD6;q-_ zd{JiKw4y2Mk(wf*uX!ctywRol-BR*Qm=`y(hEFp%_|P)l-xqs#3ht^r73YRw>GA5t0$dL1N4+jAmvXhFPE@xr5+shkcYFH+ zvH4}!+;Vg`CY@wdpOojU5`jRAQUgQ#)o;b=QSw$hyy7Xv9SvJ0ve#N}A-{kuWbijWee36D_3q=+oMk%7V9`1__rbr<794 zv_qMvEJT)jFbmt$-D(2|O1t-gHIM-E z;f0h~|MdhW-uSxT@}@FKkaInFR)qr<5yz?HWi

m4P(p`MPN+C0hqXExbt!(GFu zAQT1EWdy_KOyVEkDs|8JC{Ad3j`~>cK>pdU5p=VadHWpDje5i;*%~O}xQ6-VxK!B# zFT9VHzt$OcBoo$$cLTE_gix8?dSk!NK@8%fu}p0!L%p6JyL>;H@kU5z^V zcBsB&4u8s!-x<(-w!o+5&D154aC_BzflKaU^iBe2#9iV>zP23P)E}|M2m2lf=Zj2` zkFFa1k(r>7@)S=c(;0cz0W2d!YV^F8Nd4WrvOaU^+L;Y)2Ahx}FWWPC+L^-pM@YjD zFA@~aJ@Ajetj()O7p%T!lDBuqvH6;n5Bwy1?j?bRn31CE+Qxo=N}cgf(FQv%>`%N- zV(s-1ICtA=xsW;6(a&yg9pWovrP@pcN&~(0YmtlLOgg)N9&R>9HwsFxuSRA-t7DDIjk=|dBhdO z@a{ z9rbQ)`?+O2W?d%Pt&0SP=iLf2iNl9Z@CKn-n%?09DylZ{X6@UVIAHm~2hhjdtOL9V zP0B7m2>I#$U7<(Xx--Ec#u@xL3((&Or$Wp*PLI@fV&&0m0iHM7vx?$tcEdP9#X+b$ek?k~FGq;MpOS$Rj|Yi0^?S zq3nP~as*mIs);T}+4U%}P$qaF`p{RAefYgw`EFn=4d_;OQFHUD<{60$0hz<^FX-tY z!Itg{AtJ3wNy)SG7}PlE_@))>YYCk4wWJc2Lu$}{&YnCgBwasQf8!L+4T2&*VjfnK zGRBUSAev!#Pi@Us6ia0}5CeeM$=_X{_m$RMDT_`cz?|dn5BxN@oCYpE_DJ{V;O)?p zlc;k&(ufi9+&Zn=X_`i#-}q~N)d({0l;4^A{t46Qeg1Cp3PK|S}z zZngcrfKh+z0ET?CYqgSffi@!Id$4y{%BqODS!YY`k=$A{ zw$blWCfbspvds(doE9?V(SDbRxE<0vT7!$ij%Jj3R0v?7Uqp|+Vt-#Ou}4|WfZZF} z9|pij!$A?X{mcSR;X)*i1;+}Pl=DFr7=pZBf0|qkGvxp3S@uSN*-%vg4H@BIB%CDW z#5NPkZW>(%B4H-FS=(NdBXZ4TchSLKZk4PY3(Vz=qWubf1?+{5=owA`1X_ z+Z#E18(>Yl5$Kl-sBbUfOmGy~3q3T?1mH|>Q30(tEWD7LI-Wt`n*!(zIO1O$H9OY@8e0;3`DI~HD1 z2#kfmngVDm2#kQhue7nX5SRi2Ur7f65co9&_J+WG051uF7a_1Jz&iCJ(Dbkf58yv9 z!bx2IpS1t6s10kCAOfuYKNbrif!n`n|F>eCH}Xj97-vynITulm3J6egg9=>hrRfev z0*im>!Na#KxP27(jN}5d>H_FZ8sKqE7JN(8#?G;T>EqtunM6AHaRJ~@EdX8zS;T8C zfE9+rbwc1&2n=^E4FXFez-47BP}N7%4Gma}a0r~sf*XOrv|Ipk%=iDSl=7G!q(H(d zxY7Ty_!%;c1mqIPFdmPzvG$Nlj?02+B%BuHl9S#5e+*6wa*4(Qz{bG2T!3@Qq5zlQ zvEW|8VV}?ge?>?PPo5tVA3zH3e^X5Azy(tS4;n7;Clq2phPVwW`r*z!Hbm{4y%Zg4?E%g(Dr?;jU_RH=~^gEZr0bv_rF=9ut!GgWe@oaCddT_ z4d9WH%D5HrZ!)?2w-(}uF)TcW8UVY=T8&Ve5+N}eVGH1?W$=TAOn9ZGtl}?3(ba}5naJM|KX_mPf z!}%=+pd(nX9&x%i?Q-L>Z_z+kqE+1tX@c2(;QNK*o(jmz+F+?;KtQjQ&~so=5?2=> zgqS_5R#uD8z0xGng;|}FbCkKPd+khGp>Zcg_r-yQGirTY{PNZc(iEhfH$1nm?{I0_ zk-g>86}+U4ej09s9EBF(&D*nI=Io}>ZJkT_v##I=-N@KPLqv+}>bJiMH}$QL94X%w zd6Os4h763f(>*sIg))CBbfCe7+hXM=ray6NFr~^AX*C!b@)bDiJY6>^rj?D|O3eYkpJ=GXGN zrjftrt_$?KO5ZB6p2{-`FSwDmz7a7+OqE=)4f9~Pym1f{#6Dnv$SdOtDjYjMQb}KE?QON($7bHuC#=WKDemcMp4TRcP%r0C$#%o4(=om z^2xm;44#HD0w1&OD})G^bejA0+4tR0PtOor5cQ3%(+1o745>1AWbmDahROvcCC$5> z{SsH(=mksT;`j>$K>s){Sug0p5pQaem(c+-*;KM&Z7(DpZKv~XM*F2R$#qqKd*Vr3=pTP= z8A<*;R6nT*ClxLWP?FhJ2;~+Mky(Nyx%>4FyPRSN>(Eh0KpR{%mG$)ps;;%Uwhv8s zW{M8pCs?)>%DXL9`&m*HdhAgRsXDAfZ>BIZOwnzV>sKtx)_5=(SDLe|w<16{(7SOk zXN?i9y&A6j~%Ue;9 zyxS#3p807#`XaBcQoGL55TTv8^AxMZB=a<#pNEO4(>kTD7}6Ro={_lyFLELVAwVjb zsiNQTGtOai#4Mg$?v1x-;H7)mm02RQcaV(??QoP6dWKWMg1l>Xk`@n;Z4sS{yk&?rB3}8|&SI6(O|o zxU1bAt2r%&!C{_*s?6JpWyCP2?&h0ad6eFn^rqo!qzG!8FpltQKEa#1Q8@piyuXPX z+>7B~g}MqOzv2?e2O7W;*ZK8vXYI=*jK>CkYTTaBo|e2?qj<|Gui$w1K;8G&l}az} z#?-n1F?CvErl8wWS;qBmR7{oyH7d-FdC5w=C9N&CA@Y>f%@m_vm}^WYf4y!hUo>Kj z+--^&BB>B^Fy)tvi#&Q6$w|=h+qtxDz8od0IH4`s%j+t=oHK7VI=1Mar#{Y!Ie5vl z*p6pE70Fe~y^^MVwU0iYZI|G z@nkd+iE7?X`QE4WE09*SYNPIJ9ASfdf3PAwT~YCnA4pmdf5oNOE(;HL8@vlmPvkz6 zMVLtDDwWSLU}O-E7V~h`=Z$Qb`e(CLOXl?bO@@<7rPeZALRyBXPV0CUf$KV+EA-fj zWu`2df{TUG%RLDon4c-`T{ZXF3&;~QubZ|7AKz`b&b9P+JdBeXyoyZ4i@KWhRh=Ew z8W*c4bnMip`}}zoEv>3VPr|VguhV!*Z;bOvV-Rh*+h^a9h0{4^Ld)_&Pq(FH&TCu;r!!wQMpM%hYZ|7&_v4SW8&A8 z`Ea6oH9#|R_uG-Pa=NLy;d`?Uyv!+W@iA1QBPac{iVlA8os8x3%m~_RpZ8gSInmg0WYG15aZ^}#p0#=C7vA>m$pY(Qr*|cE;}2TLIfzuy(E0exi#nx1 z%8PMS>cFYs9%?k1rn9`9fnSgBiz;8eGJ2+lq1E*IhuVt9$UqhVvjfAJ2DTJy5lXTUVXx-nlvFcbCQpf%lJr3J zReiKwTutLGMw~Me+$&gNCnq+oRGvZ2jAND9_NtWxM`aH-g2TQm*=R96y>qF3egzPq zLH)Few{jkDGFrB~{m4I3Xa07=JXJk468e~{pXl$fQ`%OLmq=foTBmq8BVTgWDDiUl z9Ugh+iscVYjIjF9x%7bU;5zM&_{Uh%wvv4PRnpT5UFN&fJBc!WqrU^?S=JO9J+@-c zsj|t+y&pP9O6&1tjY^6VYkjj(mHd=Xo zmpVo|4fbc=XOv-Nd-m(Xi`yRlxY$0i!uO-g83hGqzSCq))(WoBfX;$up6FD_Wc`(sS3c%c;FcUE|U zrmB`aKgJ`(nts$SGMtYdlDWpHnPbk^^)v8^8}EWb$RGWeQ|FQ?GpK1Awincxsi6rc zj{i**oXMXh3C?H)#EWrhBT@e^=DBF!H_KRM;*yWT@{ge-3t(=;;IS2l)k8a>uP`Xe zzXT0(?rXj?_m;|k=E&qEwkMrmNQ41(?fX|@FfAMUatqJx+;?M+Wd;Ot9~!KPK53) z5}b-w$7d3oPe|+OohbXcZr(NaZPXCPyF{cZZ(bX4dPG~W7Stc!U=OplA&fG^DWGT<+OFF-y=0J4Q zAuCHcFMq)oFUHNN363>|6Pi5BVs@aXtW(XKrpTf~a-wWz&U>>rwfDme#hef& zu?!|Lq5E=OBJ|^7Ep$b(w$g)i6qaRj@ArtzjWcIhFQmlTxo0fZX2#X|^onH0KxtzU zH(%}?zR7|gccl1l6*I@Y0qtK$$?iSf8h)6&wr`0ryM2@s|75m^*L4x(x&_eEqxm7h z3*$Ab^1Fri&w0e$t@FKvq ztM8BA1*E?OWBG@bG{CX`&H>fN*Y17tNFu;;%5fb%5?Qaf5Q+ej<5DayNq2UKjC;RLe-4|PLrs{~FZ9XUT(1LSlK0pFc7$qgfSq%)PC1N-LE?!Li!l&2%}aT4`6VVq4=kh|cN7Ic zQbRc8P*J{q5kIR#XGxG!e$WnJWNBXi;Jb$6Zaw%D6z?9GHSib93mhM_^@*k*Mr2)V z@Q;2AKz~-DetN&mZ+?MZERkSmvP>LwKPz%^|%bl4Qmc( zf7_GqE~q!`5~~0eGtd>F${-AAnU`!GGo}Tem*K82{h$DN8`&XeMep)b_Uh5oP2u=i zR{-)N3KK{*W=^jac7NykRTxyuAVAnsHWkU@yOA)kT(1~SeQ^kYSRTD*?$(sl>T&cQ z(YQjvzhoj1#&W`PCagC5OWj7LCPXuRkMVlbQ>(8|X#zan@wDBhCM8+y4PXo<8%u|X zOS7E^IC8Z3zGBO;oU()&GG!%7^ufdnv*IZ&fX18*BM%S`MI8naywnKLE#SpQ{F;VD zGa>=b){7ICDbRc4$(5lM>1NiDfAVd=PPq;eMF(C2Mku*;s{A%C8-4J67xMjYxVz-l z<$K+57bOMdM}*D`n;X+=rLnx{Lx8#u%NB)oPO@r5ZDSn@baDtB>Rj;-kNo!DyRLWK z!u;ULW-evurF=?&cjb%}_`6dui^+%YiISZG=+K25OdY1%W4f)H!S3|$e$oCtJ3%Xe_)!UPUHN~Qz#ughs6ckG?z{E-NUNAbQ zkoE)tINnMuFqAilC-n9mrmX7Rw?X3Xc^25{u?D=ieDY`}TYmUoufLqLC8l)}cF7eJ z+M;sXg{i(d2#IHiY5g)ovC_QbCr@uo&O9y=EI{qPh400*({11ep||PN$ezaHPFy;x qI}FiE+xXf$qvbh|Es0*+WQ4fh0}~aMWoWMfa9dSdrR0Xq) { + return createGraphQLClient({ + saleorApiUrl: authData.saleorApiUrl, + token: authData.token, + }); + }, +}; diff --git a/apps/data-exporter/src/lib/metadata-manager.ts b/apps/data-exporter/src/lib/metadata-manager.ts new file mode 100644 index 0000000..63c8ccc --- /dev/null +++ b/apps/data-exporter/src/lib/metadata-manager.ts @@ -0,0 +1,95 @@ +import { EncryptedMetadataManager, MetadataEntry } from "@saleor/app-sdk/settings-manager"; +import { Client, gql } from "urql"; +import { + FetchAppDetailsDocument, + FetchAppDetailsQuery, + UpdateAppMetadataDocument, +} from "../../generated/graphql"; + +gql` + mutation UpdateAppMetadata($id: ID!, $input: [MetadataInput!]!) { + updatePrivateMetadata(id: $id, input: $input) { + item { + privateMetadata { + key + value + } + } + } + } +`; + +gql` + query FetchAppDetails { + app { + id + privateMetadata { + key + value + } + } + } +`; + +export async function fetchAllMetadata(client: Client): Promise { + const { error, data } = await client + .query(FetchAppDetailsDocument, {}) + .toPromise(); + + if (error) { + return []; + } + + return data?.app?.privateMetadata.map((md) => ({ key: md.key, value: md.value })) || []; +} + +export async function mutateMetadata(client: Client, metadata: MetadataEntry[]) { + // to update the metadata, ID is required + const { error: idQueryError, data: idQueryData } = await client + .query(FetchAppDetailsDocument, {}) + .toPromise(); + + if (idQueryError) { + throw new Error( + "Could not fetch the app id. Please check if auth data for the client are valid." + ); + } + + const appId = idQueryData?.app?.id; + + if (!appId) { + throw new Error("Could not fetch the app ID"); + } + + const { error: mutationError, data: mutationData } = await client + .mutation(UpdateAppMetadataDocument, { + id: appId, + input: metadata, + }) + .toPromise(); + + if (mutationError) { + throw new Error(`Mutation error: ${mutationError.message}`); + } + + return ( + mutationData?.updatePrivateMetadata?.item?.privateMetadata.map((md) => ({ + key: md.key, + value: md.value, + })) || [] + ); +} + +export const createSettingsManager = (client: Client) => { + /* + * EncryptedMetadataManager gives you interface to manipulate metadata and cache values in memory. + * We recommend it for production, because all values are encrypted. + * If your use case require plain text values, you can use MetadataManager. + */ + return new EncryptedMetadataManager({ + // Secret key should be randomly created for production and set as environment variable + encryptionKey: process.env.SECRET_KEY!, + fetchMetadata: () => fetchAllMetadata(client), + mutateMetadata: (metadata) => mutateMetadata(client, metadata), + }); +}; diff --git a/apps/data-exporter/src/lib/theme-synchronizer.tsx b/apps/data-exporter/src/lib/theme-synchronizer.tsx new file mode 100644 index 0000000..3386f49 --- /dev/null +++ b/apps/data-exporter/src/lib/theme-synchronizer.tsx @@ -0,0 +1,25 @@ +import { useAppBridge } from "@saleor/app-sdk/app-bridge"; +import { useTheme } from "@saleor/macaw-ui/next"; +import { useEffect } from "react"; + +// todo move to shared +export function ThemeSynchronizer() { + const { appBridgeState } = useAppBridge(); + const { setTheme } = useTheme(); + + useEffect(() => { + if (!setTheme || !appBridgeState?.theme) { + return; + } + + if (appBridgeState.theme === "light") { + setTheme("defaultLight"); + } + + if (appBridgeState.theme === "dark") { + setTheme("defaultDark"); + } + }, [appBridgeState?.theme, setTheme]); + + return null; +} diff --git a/apps/data-exporter/src/modules/app-configuration/app-config-metadata-manager.ts b/apps/data-exporter/src/modules/app-configuration/app-config-metadata-manager.ts new file mode 100644 index 0000000..19562cb --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/app-config-metadata-manager.ts @@ -0,0 +1,18 @@ +import { SettingsManager } from "@saleor/app-sdk/settings-manager"; + +export class AppConfigMetadataManager { + private readonly metadataKey = "app-config-v1"; + + constructor(private settingsManager: SettingsManager) {} + + get() { + return this.settingsManager.get(this.metadataKey); + } + + set(stringMetadata: string) { + return this.settingsManager.set({ + key: this.metadataKey, + value: stringMetadata, + }); + } +} diff --git a/apps/data-exporter/src/modules/app-configuration/app-config.test.ts b/apps/data-exporter/src/modules/app-configuration/app-config.test.ts new file mode 100644 index 0000000..2506583 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/app-config.test.ts @@ -0,0 +1,295 @@ +import { describe, expect, it } from "vitest"; +import { AppConfig, RootConfig } from "./app-config"; + +const exampleChannelConfig: RootConfig["channelConfig"] = { + test: { + storefrontUrls: { + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }, + }, +}; + +const exampleS3Config: RootConfig["s3"] = { + accessKeyId: "example-access-key", + bucketName: "example-bucket-name", + region: "eu-west-1", + secretAccessKey: "example-secret-key", +}; + +const exampleAttributeMappingConfig: RootConfig["attributeMapping"] = { + brandAttributeIds: ["brand-attribute-1"], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: [], +}; + +const exampleTitleTemplate: RootConfig["titleTemplate"] = + "Example {{ variant.product.name }} - {{ variant.name }}"; + +const exampleImageSize: RootConfig["imageSize"] = 1024; + +const exampleConfiguration: RootConfig = { + channelConfig: exampleChannelConfig, + s3: exampleS3Config, + attributeMapping: exampleAttributeMappingConfig, + titleTemplate: exampleTitleTemplate, + imageSize: exampleImageSize, +}; + +describe("AppConfig", function () { + describe("Construction", () => { + it("Constructs configuration with default values, when empty object is passed as initial data", () => { + const instance = new AppConfig(); + + expect(instance.getRootConfig()).toEqual({ + channelConfig: {}, + s3: null, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: [], + }, + titleTemplate: "{{variant.product.name}} - {{variant.name}}", + imageSize: 1024, + }); + }); + + it("Constructs configuration, when valid initial state is passed", () => { + const instance = new AppConfig(exampleConfiguration); + + expect(instance.getRootConfig()).toEqual(exampleConfiguration); + }); + + it("Fill attribute mapping, image size and title template with default values, when initial data are lacking those fields", () => { + const configurationWithoutMapping = structuredClone(exampleConfiguration); + + // @ts-expect-error: Simulating data before the migration + delete configurationWithoutMapping.attributeMapping; + // @ts-expect-error + delete configurationWithoutMapping.titleTemplate; + // @ts-expect-error + delete configurationWithoutMapping.imageSize; + + const instance = new AppConfig(configurationWithoutMapping as any); // Casting used to prevent TS from reporting an error + + expect(instance.getRootConfig()).toEqual({ + ...exampleConfiguration, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: [], + }, + titleTemplate: "{{variant.product.name}} - {{variant.name}}", + imageSize: 1024, + }); + }); + + it("Fails construction if invalid state provided", () => { + expect( + () => + new AppConfig({ + // @ts-expect-error + foo: "bar", + }), + ).toThrow(); + }); + + it("Parses from string", () => { + const instance1 = new AppConfig({ + s3: { + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }, + channelConfig: {}, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: [], + }, + titleTemplate: "{{ variant.name }}", + imageSize: 1024, + }); + + const serialized = instance1.serialize(); + + const instance2 = AppConfig.parse(serialized); + + expect(instance2.getRootConfig()).toEqual({ + s3: { + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }, + channelConfig: {}, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: [], + }, + titleTemplate: "{{ variant.name }}", + imageSize: 1024, + }); + }); + }); + + describe("getters", () => { + const instance = new AppConfig({ + s3: { + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }, + channelConfig: { + test: { + storefrontUrls: { + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }, + }, + }, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: ["size-id"], + }, + titleTemplate: "{{ variant.product.name }} - {{ variant.name }}", + imageSize: 1024, + }); + + it("getRootConfig returns root config data", () => { + expect(instance.getRootConfig()).toEqual({ + s3: { + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }, + channelConfig: { + test: { + storefrontUrls: { + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }, + }, + }, + attributeMapping: { + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: ["size-id"], + }, + titleTemplate: "{{ variant.product.name }} - {{ variant.name }}", + imageSize: 1024, + }); + }); + + it("getUrlsForChannel gets data for given channel or undefined if doesn't exist", () => { + expect(instance.getUrlsForChannel("test")).toEqual({ + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }); + + expect(instance.getUrlsForChannel("not-existing")).toBeUndefined(); + }); + + it("getS3Config gets s3 data", () => { + expect(instance.getS3Config()).toEqual({ + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }); + }); + + it("getAttributeMapping gets attribute data", () => { + expect(instance.getAttributeMapping()).toEqual({ + brandAttributeIds: [], + colorAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + sizeAttributeIds: ["size-id"], + }); + }); + }); + + describe("setters", () => { + it("setS3 sets valid config to s3 key and rejects invalid config", () => { + const instance = new AppConfig(); + + instance.setS3({ + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }); + + expect(instance.getS3Config()).toEqual({ + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }); + + // @ts-expect-error + expect(() => instance.setS3({ foo: "bar" })).toThrowError(); + }); + + it("setChannelUrls sets valid config to channelConfig[channelSlug] and rejects invalid config", () => { + const instance = new AppConfig(); + + instance.setChannelUrls("test", { + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }); + + expect(instance.getUrlsForChannel("test")).toEqual({ + productStorefrontUrl: "https://example.com", + storefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + }); + + // @ts-expect-error + expect(() => instance.setChannelUrls("channel", "foo")).toThrowError(); + }); + }); + + it("Serializes to string", () => { + const instance = new AppConfig(); + + instance.setS3({ + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }); + + const serialized = instance.serialize(); + + /** + * Only way to check if serialization works is to deserialize. Order of serialized fields is not given so string cant be asserted. + * JSON.parse can be used but its testing implementation details + */ + expect(AppConfig.parse(serialized).getS3Config()).toEqual({ + region: "region", + bucketName: "bucket", + accessKeyId: "access", + secretAccessKey: "secret", + }); + }); +}); diff --git a/apps/data-exporter/src/modules/app-configuration/app-config.ts b/apps/data-exporter/src/modules/app-configuration/app-config.ts new file mode 100644 index 0000000..712ad96 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/app-config.ts @@ -0,0 +1,170 @@ +import { createLogger } from "@saleor/apps-shared"; +import { z } from "zod"; + +const imageSizeFieldSchema = z.coerce.number().gte(256).default(1024); + +export const imageSizeInputSchema = z.object({ + imageSize: imageSizeFieldSchema, +}); + +export type ImageSizeInput = z.infer; + +const titleTemplateFieldSchema = z.string().default("{{variant.product.name}} - {{variant.name}}"); + +export const titleTemplateInputSchema = z.object({ + titleTemplate: titleTemplateFieldSchema, +}); + +export type TitleTemplateInput = z.infer; + +const attributeMappingSchema = z.object({ + brandAttributeIds: z.array(z.string()).default([]), + colorAttributeIds: z.array(z.string()).default([]), + sizeAttributeIds: z.array(z.string()).default([]), + materialAttributeIds: z.array(z.string()).default([]), + patternAttributeIds: z.array(z.string()).default([]), +}); + +const s3ConfigSchema = z.object({ + bucketName: z.string().min(1), + secretAccessKey: z.string().min(1), + accessKeyId: z.string().min(1), + region: z.string().min(1), +}); + +const urlConfigurationSchema = z.object({ + storefrontUrl: z.string().min(1).url(), + productStorefrontUrl: z.string().min(1).url(), +}); + +const rootAppConfigSchema = z.object({ + s3: s3ConfigSchema.nullable(), + titleTemplate: titleTemplateFieldSchema + .optional() + .default(titleTemplateFieldSchema.parse(undefined)), + imageSize: imageSizeFieldSchema.optional().default(imageSizeFieldSchema.parse(undefined)), + attributeMapping: attributeMappingSchema + .nullable() + .optional() + .default(attributeMappingSchema.parse({})), + channelConfig: z.record(z.object({ storefrontUrls: urlConfigurationSchema })), +}); + +export const AppConfigSchema = { + root: rootAppConfigSchema, + s3Bucket: s3ConfigSchema, + channelUrls: urlConfigurationSchema, + attributeMapping: attributeMappingSchema, +}; + +export type RootConfig = z.infer; + +export type ChannelUrlsConfig = z.infer; + +const logger = createLogger({ name: "AppConfig" }); + +export class AppConfig { + private rootData: RootConfig = { + channelConfig: {}, + s3: null, + attributeMapping: attributeMappingSchema.parse({}), + titleTemplate: titleTemplateFieldSchema.parse(undefined), + imageSize: imageSizeFieldSchema.parse(undefined), + }; + + constructor(initialData?: RootConfig) { + if (initialData) { + try { + this.rootData = rootAppConfigSchema.parse(initialData); + } catch (e) { + logger.error(e, "Could not parse initial data"); + throw new Error("Can't load the configuration"); + } + } + } + + static parse(serializedSchema: string) { + return new AppConfig(JSON.parse(serializedSchema)); + } + + getRootConfig() { + return this.rootData; + } + + serialize() { + return JSON.stringify(this.rootData); + } + + setS3(s3Config: z.infer) { + try { + this.rootData.s3 = s3ConfigSchema.parse(s3Config); + + return this; + } catch (e) { + logger.info(e, "Invalid S3 config provided"); + throw new Error("Invalid S3 config provided"); + } + } + + setAttributeMapping(attributeMapping: z.infer) { + try { + this.rootData.attributeMapping = attributeMappingSchema.parse(attributeMapping); + + return this; + } catch (e) { + logger.info(e, "Invalid mapping config provided"); + throw new Error("Invalid mapping config provided"); + } + } + + setChannelUrls(channelSlug: string, urlsConfig: z.infer) { + try { + const parsedConfig = urlConfigurationSchema.parse(urlsConfig); + + this.rootData.channelConfig[channelSlug] = { + storefrontUrls: parsedConfig, + }; + + return this; + } catch (e) { + logger.info(e, "Invalid channels config provided"); + throw new Error("Invalid channels config provided"); + } + } + + getUrlsForChannel(channelSlug: string) { + try { + return this.rootData.channelConfig[channelSlug].storefrontUrls; + } catch (e) { + return undefined; + } + } + + getS3Config() { + return this.rootData.s3; + } + + getAttributeMapping() { + return this.rootData.attributeMapping; + } + + setTitleTemplate(titleTemplate: z.infer) { + this.rootData.titleTemplate = titleTemplate; + + return this; + } + + getTitleTemplate() { + return this.rootData.titleTemplate; + } + + setImageSize(imageSize: z.infer) { + this.rootData.imageSize = imageSize; + + return this; + } + + getImageSize() { + return this.rootData.imageSize; + } +} diff --git a/apps/data-exporter/src/modules/app-configuration/app-configuration.router.ts b/apps/data-exporter/src/modules/app-configuration/app-configuration.router.ts new file mode 100644 index 0000000..4b2fd13 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/app-configuration.router.ts @@ -0,0 +1,231 @@ +import { router } from "../trpc/trpc-server"; +import { protectedClientProcedure } from "../trpc/protected-client-procedure"; +import { createLogger } from "@saleor/apps-shared"; + +import { updateCacheForConfigurations } from "../metadata-cache/update-cache-for-configurations"; +import { AppConfigSchema, imageSizeInputSchema, titleTemplateInputSchema } from "./app-config"; +import { z } from "zod"; +import { createS3ClientFromConfiguration } from "../file-storage/s3/create-s3-client-from-configuration"; +import { checkBucketAccess } from "../file-storage/s3/check-bucket-access"; +import { TRPCError } from "@trpc/server"; +import { AttributeFetcher } from "./attribute-fetcher"; +import { renderHandlebarsTemplate } from "../handlebarsTemplates/render-handlebars-template"; +import { prepareExampleVariantData } from "./prepare-example-variant-data"; + +export const appConfigurationRouter = router({ + /** + * Prefer fetching all to avoid unnecessary calls. Routes are cached by react-query + */ + fetch: protectedClientProcedure.query(async ({ ctx: { logger, getConfig } }) => { + logger.debug("Fetching configuration"); + + try { + const configuration = await getConfig(); + + logger.debug("Configuration fetched"); + return configuration.getRootConfig(); + } catch (e) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Can't fetch the configuration", + }); + } + }), + testS3BucketConfiguration: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(AppConfigSchema.s3Bucket) + .mutation(async ({ ctx: { saleorApiUrl }, input }) => { + const logger = createLogger({ saleorApiUrl: saleorApiUrl }); + + logger.debug("Validate the credentials"); + + const s3Client = createS3ClientFromConfiguration(input); + + try { + await checkBucketAccess({ + bucketName: input.bucketName, + s3Client, + }); + logger.debug("Verification succeeded"); + } catch { + logger.debug("Validation failed"); + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Could not access the S3 bucket using the provided credentials", + }); + } + }), + + setS3BucketConfiguration: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(AppConfigSchema.s3Bucket) + .mutation(async ({ ctx: { saleorApiUrl, getConfig, appConfigMetadataManager }, input }) => { + const logger = createLogger({ saleorApiUrl: saleorApiUrl }); + + logger.debug("Validate credentials"); + + const s3Client = createS3ClientFromConfiguration(input); + + try { + await checkBucketAccess({ + bucketName: input.bucketName, + s3Client, + }); + } catch { + logger.debug("Validation failed"); + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Could not access the S3 bucket using the provided credentials", + }); + } + + logger.debug("Credentials validated, saving"); + + const config = await getConfig(); + + config.setS3(input); + + await appConfigMetadataManager.set(config.serialize()); + + logger.debug("Config saved"); + + return null; + }), + setChannelsUrls: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input( + z.object({ + channelSlug: z.string(), + urls: AppConfigSchema.channelUrls, + }), + ) + .mutation( + async ({ + ctx: { getConfig, apiClient, saleorApiUrl, appConfigMetadataManager, logger }, + input, + }) => { + const config = await getConfig(); + + /** + * TODO Check if this has to run, once its cached, it should be invalidated by webhooks only. + * + * But this operation isn't expensive and users will not continuously save this form + */ + await updateCacheForConfigurations({ + client: apiClient, + channelsSlugs: [input.channelSlug], + saleorApiUrl: saleorApiUrl, + }); + + logger.debug({ channel: input.channelSlug }, "Updated cache for channel"); + + config.setChannelUrls(input.channelSlug, input.urls); + + await appConfigMetadataManager.set(config.serialize()); + + logger.debug("Saved config"); + + return null; + }, + ), + setAttributeMapping: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(AppConfigSchema.attributeMapping) + .mutation(async ({ ctx: { getConfig, appConfigMetadataManager, logger }, input }) => { + logger.debug("Setting attribute mapping"); + const config = await getConfig(); + + config.setAttributeMapping(input); + + await appConfigMetadataManager.set(config.serialize()); + logger.debug("Attribute map set"); + return null; + }), + getAttributes: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .query(async ({ ctx: { logger, apiClient } }) => { + const fetcher = new AttributeFetcher(apiClient); + + const result = await fetcher.fetchAllAttributes().catch((e) => { + logger.error(e, "Can't fetch the attributes"); + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Can't fetch the attributes", + }); + }); + + logger.debug("Returning attributes"); + + return result; + }), + setImageSize: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(imageSizeInputSchema) + .mutation(async ({ ctx: { getConfig, appConfigMetadataManager, logger }, input }) => { + logger.debug("Setting image size"); + const config = await getConfig(); + + config.setImageSize(input.imageSize); + + await appConfigMetadataManager.set(config.serialize()); + + logger.debug("image size set"); + return null; + }), + + setTitleTemplate: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(titleTemplateInputSchema) + .mutation(async ({ ctx: { getConfig, appConfigMetadataManager, logger }, input }) => { + logger.debug("Setting title template"); + const config = await getConfig(); + + // Test render to prevent saving invalid template + try { + renderHandlebarsTemplate({ + data: {}, + template: input.titleTemplate, + }); + } catch (err) { + logger.debug({ error: err }, "Template render failed"); + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Submitted template is invalid", + }); + } + + config.setTitleTemplate(input.titleTemplate); + + await appConfigMetadataManager.set(config.serialize()); + + logger.debug("Template title set"); + return null; + }), + + renderTemplate: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(titleTemplateInputSchema) + .mutation(async ({ ctx: { getConfig, logger }, input }) => { + logger.debug(input, "renderTemplate called"); + const config = await getConfig(); + + try { + const title = renderHandlebarsTemplate({ + data: prepareExampleVariantData({ + attributeMapping: config.getAttributeMapping(), + }), + template: input.titleTemplate, + }); + + logger.debug("Title rendered succeeded"); + + return { title }; + } catch (err) { + logger.debug({ error: err }, "Template render failed"); + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Submitted template is invalid", + }); + } + }), +}); diff --git a/apps/data-exporter/src/modules/app-configuration/attribute-fetcher.ts b/apps/data-exporter/src/modules/app-configuration/attribute-fetcher.ts new file mode 100644 index 0000000..9b63c06 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/attribute-fetcher.ts @@ -0,0 +1,49 @@ +import { Client } from "urql"; +import { + AttributeWithMappingFragmentFragment, + FetchAttributesWithMappingDocument, +} from "../../../generated/graphql"; + +export class AttributeFetcher { + constructor(private apiClient: Pick) {} + + private async fetchRecursivePage( + accumulator: AttributeWithMappingFragmentFragment[], + cursor?: string + ): Promise { + const result = await this.apiClient + .query(FetchAttributesWithMappingDocument, { + cursor, + }) + .toPromise(); + + if (result.error) { + throw new Error(result.error.message); + } + + if (!result.data) { + // todo sentry + throw new Error("Empty attributes data"); + } + + accumulator = [...accumulator, ...(result.data.attributes?.edges.map((c) => c.node) ?? [])]; + + const hasNextPage = result.data.attributes?.pageInfo.hasNextPage; + const endCursor = result.data.attributes?.pageInfo.endCursor; + + if (hasNextPage && endCursor) { + return this.fetchRecursivePage(accumulator, endCursor); + } else { + return accumulator; + } + } + + /** + * Fetches all attribute pages - standard page is max 100 items + */ + async fetchAllAttributes(): Promise { + let attributes: AttributeWithMappingFragmentFragment[] = []; + + return this.fetchRecursivePage(attributes, undefined); + } +} diff --git a/apps/data-exporter/src/modules/app-configuration/attribute-mapping-form.tsx b/apps/data-exporter/src/modules/app-configuration/attribute-mapping-form.tsx new file mode 100644 index 0000000..67f2f4c --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/attribute-mapping-form.tsx @@ -0,0 +1,137 @@ +import { AppConfigSchema, RootConfig } from "./app-config"; +import { useForm } from "react-hook-form"; + +import { Box, Button, Text } from "@saleor/macaw-ui/next"; + +import React, { useCallback, useMemo } from "react"; +import { Multiselect } from "@saleor/react-hook-form-macaw"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { trpcClient } from "../trpc/trpc-client"; +import { useDashboardNotification } from "@saleor/apps-shared"; +import { AttributeWithMappingFragmentFragment } from "../../../generated/graphql"; + +type AttributeMappingConfiguration = Exclude; + +type Props = { + initialData: AttributeMappingConfiguration; + attributes: AttributeWithMappingFragmentFragment[]; + onSubmit(data: AttributeMappingConfiguration): Promise; +}; + +export const AttributeMappingConfigurationForm = (props: Props) => { + const { handleSubmit, control } = useForm({ + defaultValues: props.initialData, + resolver: zodResolver(AppConfigSchema.attributeMapping), + }); + + const options = props.attributes.map((a) => ({ value: a.id, label: a.name || a.id })) || []; + + return ( + { + props.onSubmit(data); + })} + > + + + + + + + + + + ); +}; + +export const ConnectedAttributeMappingForm = () => { + const { notifyError, notifySuccess } = useDashboardNotification(); + + const { data: attributes, isLoading: isAttributesLoading } = + trpcClient.appConfiguration.getAttributes.useQuery(); + + const { data, isLoading: isConfigurationLoading } = trpcClient.appConfiguration.fetch.useQuery(); + + const isLoading = isAttributesLoading || isConfigurationLoading; + + const { mutate } = trpcClient.appConfiguration.setAttributeMapping.useMutation({ + onSuccess() { + notifySuccess("Success", "Updated attribute mapping"); + }, + onError() { + notifyError("Error", "Failed to update, please refresh and try again"); + }, + }); + + const handleSubmit = useCallback( + async (data: AttributeMappingConfiguration) => { + mutate(data); + }, + [mutate] + ); + + const formData: AttributeMappingConfiguration = useMemo(() => { + if (data?.attributeMapping) { + return data.attributeMapping; + } + + return { + colorAttributeIds: [], + sizeAttributeIds: [], + brandAttributeIds: [], + patternAttributeIds: [], + materialAttributeIds: [], + }; + }, [data]); + + if (isLoading) { + return Loading...; + } + + const showForm = !isLoading && attributes?.length; + + return ( + <> + {showForm ? ( + + ) : ( + Loading + )} + + ); +}; diff --git a/apps/data-exporter/src/modules/app-configuration/channels-config-accordion.tsx b/apps/data-exporter/src/modules/app-configuration/channels-config-accordion.tsx new file mode 100644 index 0000000..1074a4a --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/channels-config-accordion.tsx @@ -0,0 +1,106 @@ +import { Accordion, Box, Button, Divider, PropsWithBox, Text } from "@saleor/macaw-ui/next"; +import { Input } from "@saleor/react-hook-form-macaw"; +import { trpcClient } from "../trpc/trpc-client"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { AppConfigSchema, ChannelUrlsConfig } from "./app-config"; +import { FeedPreviewCard } from "./feed-preview-card"; +import { useDashboardNotification } from "@saleor/apps-shared"; + +const ChannelConfigForm = ({ channelSlug, ...props }: PropsWithBox<{ channelSlug: string }>) => { + const { notifySuccess, notifyError } = useDashboardNotification(); + + const { data: appConfig } = trpcClient.appConfiguration.fetch.useQuery(); + + const channelConfig = appConfig?.channelConfig[channelSlug]; + + const { mutate } = trpcClient.appConfiguration.setChannelsUrls.useMutation({ + onSuccess() { + notifySuccess("Success"); + }, + onError() { + notifyError("Failed saving configuration.", "Refresh the page and try again"); + }, + }); + + const { control, handleSubmit } = useForm({ + resolver: zodResolver(AppConfigSchema.channelUrls), + defaultValues: { + productStorefrontUrl: channelConfig?.storefrontUrls.productStorefrontUrl ?? "", + storefrontUrl: channelConfig?.storefrontUrls.storefrontUrl ?? "", + }, + }); + + return ( + { + mutate({ + urls: data, + channelSlug, + }); + })} + as={"form"} + display={"grid"} + gap={3} + {...props} + > + + Configure channel URLs + + + + + + + + ); +}; + +export const ChannelsConfigAccordion = () => { + const { data, isLoading } = trpcClient.channels.fetch.useQuery(); + + if (isLoading) { + return Loading...; + } + + return ( + + {data?.map((channel) => ( + + + {channel.name} + + + + + + + + + ))} + + ); +}; diff --git a/apps/data-exporter/src/modules/app-configuration/channels/channels-fetcher.ts b/apps/data-exporter/src/modules/app-configuration/channels/channels-fetcher.ts new file mode 100644 index 0000000..42317f6 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/channels/channels-fetcher.ts @@ -0,0 +1,27 @@ +import { Client, gql } from "urql"; +import { FetchChannelsDocument } from "../../../../generated/graphql"; + +gql` + fragment Channel on Channel { + name + id + slug + } + + query FetchChannels { + channels { + ...Channel + } + } +`; + +export class ChannelsFetcher { + constructor(private client: Client) {} + + fetchChannels() { + return this.client + .query(FetchChannelsDocument, {}) + .toPromise() + .then((r) => r.data?.channels ?? null); + } +} diff --git a/apps/data-exporter/src/modules/app-configuration/channels/channels.router.ts b/apps/data-exporter/src/modules/app-configuration/channels/channels.router.ts new file mode 100644 index 0000000..84c07ef --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/channels/channels.router.ts @@ -0,0 +1,18 @@ +import { router } from "../../trpc/trpc-server"; +import { protectedClientProcedure } from "../../trpc/protected-client-procedure"; +import { ChannelsFetcher } from "./channels-fetcher"; +import { ChannelFragment } from "../../../../generated/graphql"; + +export const channelsRouter = router({ + fetch: protectedClientProcedure.query( + async ({ ctx: { logger, apiClient } }): Promise => { + const fetcher = new ChannelsFetcher(apiClient); + + logger.debug("Fetching channels"); + const channels = fetcher.fetchChannels().then((channels) => channels ?? []); + + logger.debug("Channels fetched successfully"); + return channels; + }, + ), +}); diff --git a/apps/data-exporter/src/modules/app-configuration/channels/use-channels-existence-checking.ts b/apps/data-exporter/src/modules/app-configuration/channels/use-channels-existence-checking.ts new file mode 100644 index 0000000..96a4cc3 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/channels/use-channels-existence-checking.ts @@ -0,0 +1,17 @@ +import { trpcClient } from "../../trpc/trpc-client"; +import { useRouter } from "next/router"; +import { useEffect } from "react"; + +/** + * This app requires channels to exist, so redirect to error page if channels don't exist + */ +export const useChannelsExistenceChecking = () => { + const channels = trpcClient.channels.fetch.useQuery(); + const router = useRouter(); + + useEffect(() => { + if (channels.isSuccess && channels.data.length === 0) { + router.push("/not-ready"); + } + }, [channels.data, channels.isSuccess, router]); +}; diff --git a/apps/data-exporter/src/modules/app-configuration/example-variant-data.ts b/apps/data-exporter/src/modules/app-configuration/example-variant-data.ts new file mode 100644 index 0000000..379b8c8 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/example-variant-data.ts @@ -0,0 +1,58 @@ +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; + +export const exampleVariantData: GoogleFeedProductVariantFragment = { + id: "UHJvZHVjdFZhcmlhbnQ6MzYx", + name: "M", + sku: "218223580", + pricing: { + price: { + gross: { + currency: "USD", + amount: 45, + }, + }, + }, + quantityAvailable: 50, + attributes: [ + { + attribute: { + id: "QXR0cmlidXRlOjM4", + }, + values: [ + { + value: "", + name: "M", + }, + ], + }, + ], + product: { + id: "UHJvZHVjdDoxMzc=", + name: "Blue Polygon Shirt", + slug: "blue-polygon-shirt", + description: + '{"time": 1653425319677, "blocks": [{"id": "sMEIn2NR8s", "data": {"text": "Ever have those days where you feel a bit geometric? Can\'t quite shape yourself up right? Show your different sides with a Saleor styles."}, "type": "paragraph"}], "version": "2.22.2"}', + seoDescription: "", + attributes: [ + { + attribute: { + id: "QXR0cmlidXRlOjM2", + }, + values: [ + { + value: "", + name: "Cotton", + }, + ], + }, + ], + thumbnail: { + url: "https://example.eu.saleor.cloud/media/thumbnails/products/saleor-blue-polygon-tee-front_thumbnail_256.png", + }, + category: { + id: "Q2F0ZWdvcnk6Mzk=", + name: "T-shirts", + googleCategoryId: "42", + }, + }, +}; diff --git a/apps/data-exporter/src/modules/app-configuration/feed-preview-card.tsx b/apps/data-exporter/src/modules/app-configuration/feed-preview-card.tsx new file mode 100644 index 0000000..99674f0 --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/feed-preview-card.tsx @@ -0,0 +1,44 @@ +import { actions, useAppBridge } from "@saleor/app-sdk/app-bridge"; +import { Box, Button, Input, PropsWithBox, Text } from "@saleor/macaw-ui/next"; +import { useGetFeedApiUrl } from "../feed-url/use-get-feed-api-url"; + +interface FeedPreviewCardProps { + channelSlug: string; +} + +export const FeedPreviewCard = ({ channelSlug, ...props }: PropsWithBox) => { + const { appBridge } = useAppBridge(); + + const googleFeedUrl = useGetFeedApiUrl(channelSlug); + + if (!googleFeedUrl) { + // Should never happen + return null; + } + + const openUrlInNewTab = async (url: string) => { + await appBridge?.dispatch(actions.Redirect({ to: url, newContext: true })); + }; + + return ( + + + Test your feed + + { + e.target.select(); + }} + helperText="Dedicated URL for your Google Merchant Feed. Click to select and copy." + /> + + + + + + ); +}; diff --git a/apps/data-exporter/src/modules/app-configuration/image-configuration-form.tsx b/apps/data-exporter/src/modules/app-configuration/image-configuration-form.tsx new file mode 100644 index 0000000..908ad7e --- /dev/null +++ b/apps/data-exporter/src/modules/app-configuration/image-configuration-form.tsx @@ -0,0 +1,98 @@ +import { ImageSizeInput, imageSizeInputSchema } from "./app-config"; +import { useForm } from "react-hook-form"; + +import { Box, Button, Text } from "@saleor/macaw-ui/next"; + +import React, { useCallback, useMemo } from "react"; +import { Select } from "@saleor/react-hook-form-macaw"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { trpcClient } from "../trpc/trpc-client"; +import { useDashboardNotification } from "@saleor/apps-shared"; + +type Props = { + initialData: ImageSizeInput; + onSubmit(data: ImageSizeInput): Promise; +}; + +const imageSizeOptions = [ + { value: "256", label: "256px" }, + { value: "512", label: "512px" }, + { value: "1024", label: "1024px" }, + { value: "2048", label: "2048px" }, + { value: "4096", label: "4096px" }, +]; + +export const ImageConfigurationForm = (props: Props) => { + const { handleSubmit, control, formState } = useForm({ + defaultValues: props.initialData, + resolver: zodResolver(imageSizeInputSchema), + }); + + return ( + + + + + + + + + {props.preview?.length && {props.preview}} + + + + + + ); +}; + +export const ConnectedTitleFormattingForm = () => { + const { notifyError, notifySuccess } = useDashboardNotification(); + const [preview, setPreview] = useState(); + + const { data, isLoading } = trpcClient.appConfiguration.fetch.useQuery(); + + const { mutate } = trpcClient.appConfiguration.setTitleTemplate.useMutation({ + onSuccess() { + notifySuccess("Success", "Updated title template"); + }, + onError() { + notifyError("Error", "Failed to update, please refresh and try again"); + }, + }); + + const { mutate: previewMutate } = trpcClient.appConfiguration.renderTemplate.useMutation({ + onSuccess(data) { + setPreview(data.title); + }, + onError() { + notifyError("Error", "Template invalid"); + }, + }); + + const handleSubmit = useCallback( + async (data: TitleTemplateInput) => { + mutate(data); + }, + [mutate], + ); + + const handlePreview = useCallback( + async (data: TitleTemplateInput) => { + previewMutate(data); + }, + [previewMutate], + ); + + const formData: TitleTemplateInput = useMemo(() => { + if (data?.titleTemplate) { + return { + titleTemplate: data.titleTemplate, + }; + } + + return titleTemplateInputSchema.parse({}); + }, [data]); + + if (isLoading) { + return Loading...; + } + + return ( + <> + {!isLoading ? ( + + ) : ( + Loading + )} + + ); +}; diff --git a/apps/data-exporter/src/modules/category-mapping/categories-fetcher.test.ts b/apps/data-exporter/src/modules/category-mapping/categories-fetcher.test.ts new file mode 100644 index 0000000..9bbf0ee --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/categories-fetcher.test.ts @@ -0,0 +1,168 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { CategoriesFetcher } from "./categories-fetcher"; +import { Client, OperationResult } from "urql"; +import { FetchCategoriesWithMappingQuery } from "../../../generated/graphql"; + +type FetchResult = OperationResult; + +const generateCategoryEdgeMock = (uniqueIncrement: number) => { + return { + node: { + name: `Category ${uniqueIncrement}`, + id: `cat-${uniqueIncrement}`, + googleCategoryId: `${uniqueIncrement * 2}`, + }, + }; +}; + +const generateArr = (length: number) => new Array(length).fill(null).map((_, index) => index); + +const wait = () => new Promise((res) => setTimeout(res, 100)); + +describe("CategoriesFetcher", () => { + const mockQueryPromise = vi.fn(); + + const mockClient: Pick = { + // @ts-ignore - It's hard to mock urql mocks - but it can be improved + query() { + return { + toPromise: mockQueryPromise, + }; + }, + }; + + const instance = new CategoriesFetcher(mockClient); + + beforeEach(() => { + vi.resetAllMocks(); + }); + + it("Fetches single page of categories correctly", async () => { + mockQueryPromise.mockImplementationOnce(async () => { + const data: FetchCategoriesWithMappingQuery = { + categories: { + pageInfo: { + endCursor: undefined, + hasNextPage: false, + }, + edges: [generateCategoryEdgeMock(1), generateCategoryEdgeMock(2)], + }, + }; + + return { + error: undefined, + data: data, + } as FetchResult; + }); + + const result = await instance.fetchAllCategories(); + + expect(result).toEqual([ + { + googleCategoryId: "2", + id: "cat-1", + name: "Category 1", + }, + { + googleCategoryId: "4", + id: "cat-2", + name: "Category 2", + }, + ]); + }); + + it("Fetches 3 pages correctly and merges them", async () => { + mockQueryPromise.mockImplementationOnce(async () => { + await wait(); + + return { + error: undefined, + data: { + categories: { + edges: generateArr(100).map((index) => generateCategoryEdgeMock(index)), + pageInfo: { + hasNextPage: true, + endCursor: "cat-99", + }, + }, + }, + } as FetchResult; + }); + + mockQueryPromise.mockImplementationOnce(async () => { + await wait(); + + return { + error: undefined, + data: { + categories: { + edges: generateArr(100) + .map((index) => index + 100) + .map((index) => generateCategoryEdgeMock(index)), + pageInfo: { + hasNextPage: true, + endCursor: "cat-199", + }, + }, + }, + } as FetchResult; + }); + + mockQueryPromise.mockImplementationOnce(async () => { + await wait(); + + return { + error: undefined, + data: { + categories: { + edges: generateArr(100) + .map((index) => index + 200) + .map((index) => generateCategoryEdgeMock(index)), + pageInfo: { + hasNextPage: false, + endCursor: undefined, + }, + }, + }, + } as FetchResult; + }); + + const result = await instance.fetchAllCategories(); + + expect(result).toHaveLength(300); + + /** + * Some indexes assertions + */ + [0, 5, 99, 299].forEach((index) => { + expect(result[index]).toEqual({ + googleCategoryId: `${index * 2}`, + id: `cat-${index}`, + name: `Category ${index}`, + }); + }); + }); + + it("Returns empty array if not categories returned from the API", async () => { + mockQueryPromise.mockImplementationOnce(async () => { + const data: FetchCategoriesWithMappingQuery = { + categories: { + pageInfo: { + endCursor: undefined, + hasNextPage: false, + }, + edges: [], + }, + }; + + return { + error: undefined, + data: data, + } as FetchResult; + }); + + const result = await instance.fetchAllCategories(); + + expect(result).toEqual([]); + }); +}); diff --git a/apps/data-exporter/src/modules/category-mapping/categories-fetcher.ts b/apps/data-exporter/src/modules/category-mapping/categories-fetcher.ts new file mode 100644 index 0000000..934c492 --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/categories-fetcher.ts @@ -0,0 +1,49 @@ +import { Client } from "urql"; +import { + CategoryWithMappingFragmentFragment, + FetchCategoriesWithMappingDocument, +} from "../../../generated/graphql"; + +export class CategoriesFetcher { + constructor(private apiClient: Pick) {} + + private async fetchRecursivePage( + accumulator: CategoryWithMappingFragmentFragment[], + cursor?: string + ): Promise { + const result = await this.apiClient + .query(FetchCategoriesWithMappingDocument, { + cursor, + }) + .toPromise(); + + if (result.error) { + throw new Error(result.error.message); + } + + if (!result.data) { + // todo sentry + throw new Error("Empty categories data"); + } + + accumulator = [...accumulator, ...(result.data.categories?.edges.map((c) => c.node) ?? [])]; + + const hasNextPage = result.data.categories?.pageInfo.hasNextPage; + const endCursor = result.data.categories?.pageInfo.endCursor; + + if (hasNextPage && endCursor) { + return this.fetchRecursivePage(accumulator, endCursor); + } else { + return accumulator; + } + } + + /** + * Fetches all categories pages - standard page is max 100 items + */ + async fetchAllCategories(): Promise { + let categories: CategoryWithMappingFragmentFragment[] = []; + + return this.fetchRecursivePage(categories, undefined); + } +} diff --git a/apps/data-exporter/src/modules/category-mapping/category-mapping-input-schema.ts b/apps/data-exporter/src/modules/category-mapping/category-mapping-input-schema.ts new file mode 100644 index 0000000..0ef9678 --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/category-mapping-input-schema.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; + +export const SetCategoryMappingInputSchema = z.object({ + categoryId: z.string().min(0), + googleCategoryId: z.string().optional(), +}); + +export type SetCategoryMappingInputType = z.infer; diff --git a/apps/data-exporter/src/modules/category-mapping/category-mapping.router.ts b/apps/data-exporter/src/modules/category-mapping/category-mapping.router.ts new file mode 100644 index 0000000..b6001f5 --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/category-mapping.router.ts @@ -0,0 +1,60 @@ +import { router } from "../trpc/trpc-server"; +import { protectedClientProcedure } from "../trpc/protected-client-procedure"; +import { SetCategoryMappingInputSchema } from "./category-mapping-input-schema"; +import { UpdateCategoryMappingDocument } from "../../../generated/graphql"; +import { TRPCError } from "@trpc/server"; +import { CategoriesFetcher } from "./categories-fetcher"; + +export const categoryMappingRouter = router({ + /** + * Get all the category mappings to Google categories from its public metadata + */ + getCategoryMappings: protectedClientProcedure.query( + async ({ ctx: { logger, apiClient }, input }) => { + const categoriesFetcher = new CategoriesFetcher(apiClient); + + const result = await categoriesFetcher.fetchAllCategories().catch((e) => { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Can't fetch the categories", + }); + }); + + logger.debug("Returning categories"); + + return result; + } + ), + /** + * Sets the Google category mapping for a given category in its public metadata + */ + setCategoryMapping: protectedClientProcedure + .meta({ requiredClientPermissions: ["MANAGE_APPS"] }) + .input(SetCategoryMappingInputSchema) + .mutation(async ({ ctx: { logger, apiClient }, input }) => { + const { error } = await apiClient + .mutation(UpdateCategoryMappingDocument, { + id: input.categoryId, + googleCategoryId: input.googleCategoryId || "", + }) + .toPromise(); + + logger.debug( + { + input, + }, + "Updated category mapping" + ); + + if (error) { + logger.error(`Error during the GraphqlAPI call: ${error.message}`); + + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Can't save the category", + }); + } + + return; + }), +}); diff --git a/apps/data-exporter/src/modules/category-mapping/construct-category-breadcrumbs.tsx b/apps/data-exporter/src/modules/category-mapping/construct-category-breadcrumbs.tsx new file mode 100644 index 0000000..593159b --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/construct-category-breadcrumbs.tsx @@ -0,0 +1,27 @@ +import { CategoryWithMappingFragmentFragment } from "../../../generated/graphql"; +import React from "react"; +import { Box, ChevronRightIcon, Text } from "@saleor/macaw-ui/next"; + +export const constructCategoryBreadcrumbs = (category: CategoryWithMappingFragmentFragment) => + [category.parent?.parent?.name, category.parent?.name, category.name].filter((segment) => + Boolean(segment) + ); + +export const CategoryBreadcrumbs = (props: { category: CategoryWithMappingFragmentFragment }) => { + const breadcrumbs = constructCategoryBreadcrumbs(props.category); + + return ( + + {breadcrumbs.map((category, index) => { + const isLast = index === breadcrumbs.length - 1; + + return ( + + {category} + {!isLast && } + + ); + })} + + ); +}; diff --git a/apps/data-exporter/src/modules/category-mapping/google-product-categories.ts b/apps/data-exporter/src/modules/category-mapping/google-product-categories.ts new file mode 100644 index 0000000..b62c1fd --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/google-product-categories.ts @@ -0,0 +1,14195 @@ +export const GoogleProductCategories = [ + { id: "1", name: "Animals & Pet Supplies" }, + { id: "3237", name: "Animals & Pet Supplies > Live Animals" }, + { id: "2", name: "Animals & Pet Supplies > Pet Supplies" }, + { id: "3", name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies" }, + { + id: "7385", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories", + }, + { + id: "499954", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories > Bird Cage Bird Baths", + }, + { + id: "7386", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cage Accessories > Bird Cage Food & Water Dishes", + }, + { + id: "4989", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Cages & Stands", + }, + { id: "4990", name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Food" }, + { + id: "7398", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Gyms & Playstands", + }, + { + id: "4991", + name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Ladders & Perches", + }, + { id: "4992", name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Toys" }, + { id: "4993", name: "Animals & Pet Supplies > Pet Supplies > Bird Supplies > Bird Treats" }, + { id: "4", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies" }, + { id: "5082", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Apparel" }, + { id: "4433", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Beds" }, + { id: "3367", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food" }, + { + id: "543684", + name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food > Non-prescription Cat Food", + }, + { + id: "543683", + name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Food > Prescription Cat Food", + }, + { id: "4997", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Furniture" }, + { + id: "500059", + name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Furniture Accessories", + }, + { id: "4999", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter" }, + { + id: "8069", + name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Box Liners", + }, + { + id: "7142", + name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Box Mats", + }, + { id: "5000", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Litter Boxes" }, + { id: "5001", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Toys" }, + { id: "5002", name: "Animals & Pet Supplies > Pet Supplies > Cat Supplies > Cat Treats" }, + { id: "5", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies" }, + { id: "5004", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Apparel" }, + { id: "4434", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Beds" }, + { + id: "7372", + name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Diaper Pads & Liners", + }, + { id: "499900", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Diapers" }, + { id: "3530", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food" }, + { + id: "543682", + name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food > Non-prescription Dog Food", + }, + { + id: "543681", + name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Food > Prescription Dog Food", + }, + { id: "5094", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Houses" }, + { + id: "7428", + name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Kennel & Run Accessories", + }, + { id: "7274", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Kennels & Runs" }, + { id: "5010", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Toys" }, + { id: "8123", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Treadmills" }, + { id: "5011", name: "Animals & Pet Supplies > Pet Supplies > Dog Supplies > Dog Treats" }, + { id: "6", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies" }, + { + id: "505303", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium & Pond Tubing", + }, + { + id: "505307", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Air Stones & Diffusers", + }, + { + id: "500038", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Cleaning Supplies", + }, + { id: "5019", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Decor" }, + { id: "5020", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Filters" }, + { + id: "505306", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Fish Nets", + }, + { + id: "5021", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Gravel & Substrates", + }, + { id: "5079", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Lighting" }, + { + id: "6951", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Overflow Boxes", + }, + { id: "5023", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Stands" }, + { + id: "500062", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Temperature Controllers", + }, + { + id: "5161", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquarium Water Treatments", + }, + { id: "3238", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquariums" }, + { + id: "6085", + name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Aquatic Plant Fertilizers", + }, + { id: "6403", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Fish Feeders" }, + { id: "5024", name: "Animals & Pet Supplies > Pet Supplies > Fish Supplies > Fish Food" }, + { id: "6983", name: "Animals & Pet Supplies > Pet Supplies > Pet Agility Equipment" }, + { id: "6811", name: "Animals & Pet Supplies > Pet Supplies > Pet Apparel Hangers" }, + { id: "500084", name: "Animals & Pet Supplies > Pet Supplies > Pet Bed Accessories" }, + { id: "5092", name: "Animals & Pet Supplies > Pet Supplies > Pet Bells & Charms" }, + { id: "6978", name: "Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors" }, + { + id: "6980", + name: "Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Glucose Meters", + }, + { + id: "6982", + name: "Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Pedometers", + }, + { + id: "6981", + name: "Animals & Pet Supplies > Pet Supplies > Pet Biometric Monitors > Pet Thermometers", + }, + { id: "7143", name: "Animals & Pet Supplies > Pet Supplies > Pet Bowl Mats" }, + { id: "8513", name: "Animals & Pet Supplies > Pet Supplies > Pet Bowl Stands" }, + { id: "6252", name: "Animals & Pet Supplies > Pet Supplies > Pet Bowls, Feeders & Waterers" }, + { id: "500026", name: "Animals & Pet Supplies > Pet Supplies > Pet Carrier & Crate Accessories" }, + { id: "6251", name: "Animals & Pet Supplies > Pet Supplies > Pet Carriers & Crates" }, + { id: "6250", name: "Animals & Pet Supplies > Pet Supplies > Pet Collars & Harnesses" }, + { id: "6321", name: "Animals & Pet Supplies > Pet Supplies > Pet Containment Systems" }, + { id: "505811", name: "Animals & Pet Supplies > Pet Supplies > Pet Door Accessories" }, + { id: "4497", name: "Animals & Pet Supplies > Pet Supplies > Pet Doors" }, + { id: "8050", name: "Animals & Pet Supplies > Pet Supplies > Pet Eye Drops & Lubricants" }, + { id: "8068", name: "Animals & Pet Supplies > Pet Supplies > Pet First Aid & Emergency Kits" }, + { id: "6248", name: "Animals & Pet Supplies > Pet Supplies > Pet Flea & Tick Control" }, + { id: "5162", name: "Animals & Pet Supplies > Pet Supplies > Pet Food Containers" }, + { id: "5163", name: "Animals & Pet Supplies > Pet Supplies > Pet Food Scoops" }, + { id: "6383", name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies" }, + { + id: "6385", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Combs & Brushes", + }, + { + id: "503733", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Fragrances & Deodorizing Sprays", + }, + { + id: "6384", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Hair Clippers & Trimmers", + }, + { + id: "8167", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Hair Dryers", + }, + { + id: "7318", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Nail Polish", + }, + { + id: "7319", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Nail Tools", + }, + { + id: "6406", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Shampoo & Conditioner", + }, + { + id: "499917", + name: "Animals & Pet Supplies > Pet Supplies > Pet Grooming Supplies > Pet Wipes", + }, + { id: "500110", name: "Animals & Pet Supplies > Pet Supplies > Pet Heating Pad Accessories" }, + { id: "499743", name: "Animals & Pet Supplies > Pet Supplies > Pet Heating Pads" }, + { id: "5093", name: "Animals & Pet Supplies > Pet Supplies > Pet ID Tags" }, + { id: "6253", name: "Animals & Pet Supplies > Pet Supplies > Pet Leash Extensions" }, + { id: "6249", name: "Animals & Pet Supplies > Pet Supplies > Pet Leashes" }, + { id: "5145", name: "Animals & Pet Supplies > Pet Supplies > Pet Medical Collars" }, + { id: "6861", name: "Animals & Pet Supplies > Pet Supplies > Pet Medical Tape & Bandages" }, + { id: "5086", name: "Animals & Pet Supplies > Pet Supplies > Pet Medicine" }, + { id: "5144", name: "Animals & Pet Supplies > Pet Supplies > Pet Muzzles" }, + { id: "7144", name: "Animals & Pet Supplies > Pet Supplies > Pet Oral Care Supplies" }, + { id: "5087", name: "Animals & Pet Supplies > Pet Supplies > Pet Playpens" }, + { id: "6973", name: "Animals & Pet Supplies > Pet Supplies > Pet Steps & Ramps" }, + { id: "6276", name: "Animals & Pet Supplies > Pet Supplies > Pet Strollers" }, + { id: "7396", name: "Animals & Pet Supplies > Pet Supplies > Pet Sunscreen" }, + { id: "505314", name: "Animals & Pet Supplies > Pet Supplies > Pet Training Aids" }, + { + id: "505313", + name: "Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Clickers & Treat Dispensers", + }, + { + id: "505304", + name: "Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Pad Holders", + }, + { + id: "6846", + name: "Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Pads", + }, + { + id: "505311", + name: "Animals & Pet Supplies > Pet Supplies > Pet Training Aids > Pet Training Sprays & Solutions", + }, + { id: "5081", name: "Animals & Pet Supplies > Pet Supplies > Pet Vitamins & Supplements" }, + { + id: "502982", + name: "Animals & Pet Supplies > Pet Supplies > Pet Waste Bag Dispensers & Holders", + }, + { id: "8070", name: "Animals & Pet Supplies > Pet Supplies > Pet Waste Bags" }, + { + id: "505297", + name: "Animals & Pet Supplies > Pet Supplies > Pet Waste Disposal Systems & Tools", + }, + { id: "7", name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies" }, + { + id: "5026", + name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Food", + }, + { + id: "5027", + name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitat Accessories", + }, + { + id: "5028", + name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitat Heating & Lighting", + }, + { + id: "5029", + name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Habitats", + }, + { + id: "5030", + name: "Animals & Pet Supplies > Pet Supplies > Reptile & Amphibian Supplies > Reptile & Amphibian Substrates", + }, + { id: "5013", name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies" }, + { + id: "5014", + name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Bedding", + }, + { + id: "5015", + name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Food", + }, + { + id: "5016", + name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Habitat Accessories", + }, + { + id: "5017", + name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Habitats & Cages", + }, + { + id: "7517", + name: "Animals & Pet Supplies > Pet Supplies > Small Animal Supplies > Small Animal Treats", + }, + { id: "8474", name: "Animals & Pet Supplies > Pet Supplies > Vehicle Pet Barriers" }, + { id: "166", name: "Apparel & Accessories" }, + { id: "1604", name: "Apparel & Accessories > Clothing" }, + { id: "5322", name: "Apparel & Accessories > Clothing > Activewear" }, + { id: "3951", name: "Apparel & Accessories > Clothing > Activewear > American Football Pants" }, + { id: "5697", name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear" }, + { + id: "3128", + name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Bibs", + }, + { + id: "3455", + name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Jerseys", + }, + { + id: "3188", + name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Shorts & Briefs", + }, + { + id: "6087", + name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Skinsuits", + }, + { + id: "3729", + name: "Apparel & Accessories > Clothing > Activewear > Bicycle Activewear > Bicycle Tights", + }, + { id: "5378", name: "Apparel & Accessories > Clothing > Activewear > Boxing Shorts" }, + { + id: "499979", + name: "Apparel & Accessories > Clothing > Activewear > Dance Dresses, Skirts & Costumes", + }, + { id: "5460", name: "Apparel & Accessories > Clothing > Activewear > Hunting Clothing" }, + { + id: "5462", + name: "Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Ghillie Suits", + }, + { + id: "5461", + name: "Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Hunting & Fishing Vests", + }, + { + id: "5552", + name: "Apparel & Accessories > Clothing > Activewear > Hunting Clothing > Hunting & Tactical Pants", + }, + { id: "5379", name: "Apparel & Accessories > Clothing > Activewear > Martial Arts Shorts" }, + { + id: "5517", + name: "Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing", + }, + { + id: "6006", + name: "Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Jackets", + }, + { + id: "7003", + name: "Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Pants", + }, + { + id: "5463", + name: "Apparel & Accessories > Clothing > Activewear > Motorcycle Protective Clothing > Motorcycle Suits", + }, + { id: "5555", name: "Apparel & Accessories > Clothing > Activewear > Paintball Clothing" }, + { id: "182", name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing" }, + { + id: "5408", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Bottoms", + }, + { + id: "5549", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Diaper Covers", + }, + { + id: "5424", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Dresses", + }, + { + id: "5425", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Outerwear", + }, + { + id: "5622", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Outfits", + }, + { + id: "5412", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Sleepwear", + }, + { + id: "5423", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Socks & Tights", + }, + { + id: "5409", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Swimwear", + }, + { + id: "5410", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby & Toddler Tops", + }, + { + id: "5411", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Baby One-Pieces", + }, + { + id: "5621", + name: "Apparel & Accessories > Clothing > Baby & Toddler Clothing > Toddler Underwear", + }, + { id: "2271", name: "Apparel & Accessories > Clothing > Dresses" }, + { id: "5182", name: "Apparel & Accessories > Clothing > One-Pieces" }, + { id: "5250", name: "Apparel & Accessories > Clothing > One-Pieces > Jumpsuits & Rompers" }, + { id: "5490", name: "Apparel & Accessories > Clothing > One-Pieces > Leotards & Unitards" }, + { id: "7132", name: "Apparel & Accessories > Clothing > One-Pieces > Overalls" }, + { id: "203", name: "Apparel & Accessories > Clothing > Outerwear" }, + { id: "5506", name: "Apparel & Accessories > Clothing > Outerwear > Chaps" }, + { id: "5598", name: "Apparel & Accessories > Clothing > Outerwear > Coats & Jackets" }, + { id: "5514", name: "Apparel & Accessories > Clothing > Outerwear > Rain Pants" }, + { id: "3066", name: "Apparel & Accessories > Clothing > Outerwear > Rain Suits" }, + { id: "5909", name: "Apparel & Accessories > Clothing > Outerwear > Snow Pants & Suits" }, + { id: "1831", name: "Apparel & Accessories > Clothing > Outerwear > Vests" }, + { id: "7313", name: "Apparel & Accessories > Clothing > Outfit Sets" }, + { id: "204", name: "Apparel & Accessories > Clothing > Pants" }, + { id: "212", name: "Apparel & Accessories > Clothing > Shirts & Tops" }, + { id: "207", name: "Apparel & Accessories > Clothing > Shorts" }, + { id: "1581", name: "Apparel & Accessories > Clothing > Skirts" }, + { id: "6229", name: "Apparel & Accessories > Clothing > Skirts > Knee-Length Skirts" }, + { id: "6228", name: "Apparel & Accessories > Clothing > Skirts > Long Skirts" }, + { id: "2331", name: "Apparel & Accessories > Clothing > Skirts > Mini Skirts" }, + { id: "5344", name: "Apparel & Accessories > Clothing > Skorts" }, + { id: "208", name: "Apparel & Accessories > Clothing > Sleepwear & Loungewear" }, + { id: "5713", name: "Apparel & Accessories > Clothing > Sleepwear & Loungewear > Loungewear" }, + { id: "5513", name: "Apparel & Accessories > Clothing > Sleepwear & Loungewear > Nightgowns" }, + { id: "2580", name: "Apparel & Accessories > Clothing > Sleepwear & Loungewear > Pajamas" }, + { id: "2302", name: "Apparel & Accessories > Clothing > Sleepwear & Loungewear > Robes" }, + { id: "1594", name: "Apparel & Accessories > Clothing > Suits" }, + { id: "5183", name: "Apparel & Accessories > Clothing > Suits > Pant Suits" }, + { id: "1516", name: "Apparel & Accessories > Clothing > Suits > Skirt Suits" }, + { id: "1580", name: "Apparel & Accessories > Clothing > Suits > Tuxedos" }, + { id: "211", name: "Apparel & Accessories > Clothing > Swimwear" }, + { id: "5388", name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing" }, + { + id: "6031", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Dirndls", + }, + { + id: "5674", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Hakama Trousers", + }, + { + id: "6227", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Japanese Black Formal Wear", + }, + { + id: "5673", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimono Outerwear", + }, + { + id: "5678", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimono Outerwear > Haori Jackets", + }, + { + id: "5677", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimono Outerwear > Kimono Coats", + }, + { + id: "5343", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos", + }, + { + id: "5684", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Bridal Kimonos", + }, + { + id: "5683", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Casual Kimonos", + }, + { + id: "5682", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Furisode Kimonos", + }, + { + id: "5681", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Iromuji Kimonos", + }, + { + id: "5680", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Komon Kimonos", + }, + { + id: "5679", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Kimonos > Tomesode & Houmongi Kimonos", + }, + { + id: "5483", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Religious Ceremonial Clothing", + }, + { + id: "8149", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Religious Ceremonial Clothing > Baptism & Communion Dresses", + }, + { + id: "8248", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Saris & Lehengas", + }, + { + id: "7281", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Traditional Leather Pants", + }, + { + id: "5676", + name: "Apparel & Accessories > Clothing > Traditional & Ceremonial Clothing > Yukata", + }, + { id: "213", name: "Apparel & Accessories > Clothing > Underwear & Socks" }, + { id: "7207", name: "Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories" }, + { + id: "7208", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Bra Strap Pads", + }, + { + id: "7211", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Bra Straps & Extenders", + }, + { + id: "7210", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Breast Enhancing Inserts", + }, + { + id: "7209", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Bra Accessories > Breast Petals & Concealers", + }, + { id: "214", name: "Apparel & Accessories > Clothing > Underwear & Socks > Bras" }, + { id: "215", name: "Apparel & Accessories > Clothing > Underwear & Socks > Hosiery" }, + { id: "5327", name: "Apparel & Accessories > Clothing > Underwear & Socks > Jock Straps" }, + { id: "1772", name: "Apparel & Accessories > Clothing > Underwear & Socks > Lingerie" }, + { + id: "2563", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories", + }, + { + id: "2160", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories > Garter Belts", + }, + { + id: "1675", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Lingerie Accessories > Garters", + }, + { id: "1807", name: "Apparel & Accessories > Clothing > Underwear & Socks > Long Johns" }, + { + id: "2963", + name: "Apparel & Accessories > Clothing > Underwear & Socks > Petticoats & Pettipants", + }, + { id: "1578", name: "Apparel & Accessories > Clothing > Underwear & Socks > Shapewear" }, + { id: "209", name: "Apparel & Accessories > Clothing > Underwear & Socks > Socks" }, + { id: "2745", name: "Apparel & Accessories > Clothing > Underwear & Socks > Undershirts" }, + { id: "2562", name: "Apparel & Accessories > Clothing > Underwear & Socks > Underwear" }, + { id: "5834", name: "Apparel & Accessories > Clothing > Underwear & Socks > Underwear Slips" }, + { id: "2306", name: "Apparel & Accessories > Clothing > Uniforms" }, + { + id: "5484", + name: "Apparel & Accessories > Clothing > Uniforms > Contractor Pants & Coveralls", + }, + { id: "5878", name: "Apparel & Accessories > Clothing > Uniforms > Flight Suits" }, + { id: "7235", name: "Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms" }, + { + id: "7237", + name: "Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Hats", + }, + { + id: "2396", + name: "Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Jackets", + }, + { + id: "7236", + name: "Apparel & Accessories > Clothing > Uniforms > Food Service Uniforms > Chef's Pants", + }, + { id: "5949", name: "Apparel & Accessories > Clothing > Uniforms > Military Uniforms" }, + { id: "206", name: "Apparel & Accessories > Clothing > Uniforms > School Uniforms" }, + { id: "3414", name: "Apparel & Accessories > Clothing > Uniforms > Security Uniforms" }, + { id: "3598", name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms" }, + { + id: "3888", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > American Football Uniforms", + }, + { + id: "3191", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Baseball Uniforms", + }, + { + id: "3439", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Basketball Uniforms", + }, + { + id: "3683", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Cheerleading Uniforms", + }, + { + id: "3724", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Cricket Uniforms", + }, + { + id: "3958", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Hockey Uniforms", + }, + { + id: "4003", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Martial Arts Uniforms", + }, + { + id: "3253", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Officiating Uniforms", + }, + { + id: "5564", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Soccer Uniforms", + }, + { + id: "3379", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Softball Uniforms", + }, + { + id: "3852", + name: "Apparel & Accessories > Clothing > Uniforms > Sports Uniforms > Wrestling Uniforms", + }, + { id: "2292", name: "Apparel & Accessories > Clothing > Uniforms > White Coats" }, + { id: "5441", name: "Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses" }, + { + id: "5330", + name: "Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses > Bridal Party Dresses", + }, + { + id: "5329", + name: "Apparel & Accessories > Clothing > Wedding & Bridal Party Dresses > Wedding Dresses", + }, + { id: "167", name: "Apparel & Accessories > Clothing Accessories" }, + { id: "5942", name: "Apparel & Accessories > Clothing Accessories > Arm Warmers & Sleeves" }, + { + id: "5422", + name: "Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories", + }, + { + id: "5623", + name: "Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Belts", + }, + { + id: "5624", + name: "Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Gloves & Mittens", + }, + { + id: "5625", + name: "Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby & Toddler Hats", + }, + { + id: "5626", + name: "Apparel & Accessories > Clothing Accessories > Baby & Toddler Clothing Accessories > Baby Protective Wear", + }, + { id: "1786", name: "Apparel & Accessories > Clothing Accessories > Balaclavas" }, + { id: "168", name: "Apparel & Accessories > Clothing Accessories > Bandanas & Headties" }, + { + id: "543586", + name: "Apparel & Accessories > Clothing Accessories > Bandanas & Headties > Bandanas", + }, + { + id: "543587", + name: "Apparel & Accessories > Clothing Accessories > Bandanas & Headties > Hair Care Wraps", + }, + { id: "3913", name: "Apparel & Accessories > Clothing Accessories > Belt Buckles" }, + { id: "169", name: "Apparel & Accessories > Clothing Accessories > Belts" }, + { id: "5443", name: "Apparel & Accessories > Clothing Accessories > Bridal Accessories" }, + { + id: "5446", + name: "Apparel & Accessories > Clothing Accessories > Bridal Accessories > Bridal Veils", + }, + { id: "6985", name: "Apparel & Accessories > Clothing Accessories > Button Studs" }, + { id: "6984", name: "Apparel & Accessories > Clothing Accessories > Collar Stays" }, + { id: "193", name: "Apparel & Accessories > Clothing Accessories > Cufflinks" }, + { id: "5114", name: "Apparel & Accessories > Clothing Accessories > Decorative Fans" }, + { id: "6238", name: "Apparel & Accessories > Clothing Accessories > Earmuffs" }, + { id: "170", name: "Apparel & Accessories > Clothing Accessories > Gloves & Mittens" }, + { id: "171", name: "Apparel & Accessories > Clothing Accessories > Hair Accessories" }, + { + id: "8451", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Bun & Volume Shapers", + }, + { + id: "2477", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Combs", + }, + { + id: "4057", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Extensions", + }, + { + id: "1948", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Forks & Sticks", + }, + { + id: "6183", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Nets", + }, + { + id: "502988", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips", + }, + { + id: "543646", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Barrettes", + }, + { + id: "543645", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Hair Claws & Clips", + }, + { + id: "543644", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Pins, Claws & Clips > Hair Pins", + }, + { + id: "5915", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Hair Wreaths", + }, + { + id: "1662", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Headbands", + }, + { + id: "1483", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Ponytail Holders", + }, + { id: "5914", name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Tiaras" }, + { + id: "7305", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories", + }, + { + id: "7307", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories > Wig Caps", + }, + { + id: "7306", + name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Wig Accessories > Wig Glue & Tape", + }, + { id: "181", name: "Apparel & Accessories > Clothing Accessories > Hair Accessories > Wigs" }, + { id: "7133", name: "Apparel & Accessories > Clothing Accessories > Hand Muffs" }, + { id: "5207", name: "Apparel & Accessories > Clothing Accessories > Handkerchiefs" }, + { id: "173", name: "Apparel & Accessories > Clothing Accessories > Hats" }, + { id: "2020", name: "Apparel & Accessories > Clothing Accessories > Headwear" }, + { id: "7054", name: "Apparel & Accessories > Clothing Accessories > Headwear > Fascinators" }, + { id: "1922", name: "Apparel & Accessories > Clothing Accessories > Headwear > Headdresses" }, + { id: "5939", name: "Apparel & Accessories > Clothing Accessories > Headwear > Turbans" }, + { id: "5941", name: "Apparel & Accessories > Clothing Accessories > Leg Warmers" }, + { id: "6268", name: "Apparel & Accessories > Clothing Accessories > Leis" }, + { + id: "502987", + name: "Apparel & Accessories > Clothing Accessories > Maternity Belts & Support Bands", + }, + { id: "7230", name: "Apparel & Accessories > Clothing Accessories > Neck Gaiters" }, + { id: "176", name: "Apparel & Accessories > Clothing Accessories > Neckties" }, + { id: "4179", name: "Apparel & Accessories > Clothing Accessories > Pinback Buttons" }, + { id: "499972", name: "Apparel & Accessories > Clothing Accessories > Sashes" }, + { id: "177", name: "Apparel & Accessories > Clothing Accessories > Scarves & Shawls" }, + { + id: "543673", + name: "Apparel & Accessories > Clothing Accessories > Scarves & Shawls > Scarves", + }, + { + id: "543674", + name: "Apparel & Accessories > Clothing Accessories > Scarves & Shawls > Shawls", + }, + { id: "178", name: "Apparel & Accessories > Clothing Accessories > Sunglasses" }, + { id: "179", name: "Apparel & Accessories > Clothing Accessories > Suspenders" }, + { id: "180", name: "Apparel & Accessories > Clothing Accessories > Tie Clips" }, + { + id: "5390", + name: "Apparel & Accessories > Clothing Accessories > Traditional Clothing Accessories", + }, + { + id: "5688", + name: "Apparel & Accessories > Clothing Accessories > Traditional Clothing Accessories > Kimono Underclothes", + }, + { + id: "5686", + name: "Apparel & Accessories > Clothing Accessories > Traditional Clothing Accessories > Obi Accessories", + }, + { + id: "5687", + name: "Apparel & Accessories > Clothing Accessories > Traditional Clothing Accessories > Obis", + }, + { + id: "5685", + name: "Apparel & Accessories > Clothing Accessories > Traditional Clothing Accessories > Tabi Socks", + }, + { id: "1893", name: "Apparel & Accessories > Clothing Accessories > Wristbands" }, + { id: "184", name: "Apparel & Accessories > Costumes & Accessories" }, + { id: "5192", name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories" }, + { + id: "7304", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Bald Caps", + }, + { + id: "8017", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Accessory Sets", + }, + { + id: "5907", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Capes", + }, + { + id: "8200", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Gloves", + }, + { + id: "5426", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Hats", + }, + { + id: "500118", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Special Effects", + }, + { + id: "500008", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Costume Tobacco Products", + }, + { + id: "8018", + name: "Apparel & Accessories > Costumes & Accessories > Costume Accessories > Pretend Jewelry", + }, + { id: "5387", name: "Apparel & Accessories > Costumes & Accessories > Costume Shoes" }, + { id: "5193", name: "Apparel & Accessories > Costumes & Accessories > Costumes" }, + { id: "5194", name: "Apparel & Accessories > Costumes & Accessories > Masks" }, + { id: "6552", name: "Apparel & Accessories > Handbag & Wallet Accessories" }, + { id: "6460", name: "Apparel & Accessories > Handbag & Wallet Accessories > Checkbook Covers" }, + { id: "175", name: "Apparel & Accessories > Handbag & Wallet Accessories > Keychains" }, + { id: "6277", name: "Apparel & Accessories > Handbag & Wallet Accessories > Lanyards" }, + { id: "5841", name: "Apparel & Accessories > Handbag & Wallet Accessories > Wallet Chains" }, + { id: "6551", name: "Apparel & Accessories > Handbags, Wallets & Cases" }, + { id: "6170", name: "Apparel & Accessories > Handbags, Wallets & Cases > Badge & Pass Holders" }, + { id: "6169", name: "Apparel & Accessories > Handbags, Wallets & Cases > Business Card Cases" }, + { id: "3032", name: "Apparel & Accessories > Handbags, Wallets & Cases > Handbags" }, + { id: "2668", name: "Apparel & Accessories > Handbags, Wallets & Cases > Wallets & Money Clips" }, + { id: "188", name: "Apparel & Accessories > Jewelry" }, + { id: "189", name: "Apparel & Accessories > Jewelry > Anklets" }, + { id: "190", name: "Apparel & Accessories > Jewelry > Body Jewelry" }, + { id: "191", name: "Apparel & Accessories > Jewelry > Bracelets" }, + { id: "197", name: "Apparel & Accessories > Jewelry > Brooches & Lapel Pins" }, + { id: "192", name: "Apparel & Accessories > Jewelry > Charms & Pendants" }, + { id: "194", name: "Apparel & Accessories > Jewelry > Earrings" }, + { id: "6463", name: "Apparel & Accessories > Jewelry > Jewelry Sets" }, + { id: "196", name: "Apparel & Accessories > Jewelry > Necklaces" }, + { id: "200", name: "Apparel & Accessories > Jewelry > Rings" }, + { id: "5122", name: "Apparel & Accessories > Jewelry > Watch Accessories" }, + { id: "5123", name: "Apparel & Accessories > Jewelry > Watch Accessories > Watch Bands" }, + { + id: "7471", + name: "Apparel & Accessories > Jewelry > Watch Accessories > Watch Stickers & Decals", + }, + { id: "6870", name: "Apparel & Accessories > Jewelry > Watch Accessories > Watch Winders" }, + { id: "201", name: "Apparel & Accessories > Jewelry > Watches" }, + { id: "1933", name: "Apparel & Accessories > Shoe Accessories" }, + { id: "5567", name: "Apparel & Accessories > Shoe Accessories > Boot Liners" }, + { id: "7078", name: "Apparel & Accessories > Shoe Accessories > Gaiters" }, + { id: "5385", name: "Apparel & Accessories > Shoe Accessories > Shoe Covers" }, + { id: "1856", name: "Apparel & Accessories > Shoe Accessories > Shoelaces" }, + { id: "2427", name: "Apparel & Accessories > Shoe Accessories > Spurs" }, + { id: "187", name: "Apparel & Accessories > Shoes" }, + { id: "8", name: "Arts & Entertainment" }, + { id: "499969", name: "Arts & Entertainment > Event Tickets" }, + { id: "5710", name: "Arts & Entertainment > Hobbies & Creative Arts" }, + { id: "16", name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts" }, + { + id: "505370", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits", + }, + { + id: "505374", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Candle Making Kits", + }, + { + id: "4778", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Drawing & Painting Kits", + }, + { + id: "6382", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Fabric Repair Kits", + }, + { + id: "6989", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Incense Making Kits", + }, + { + id: "502979", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Jewelry Making Kits", + }, + { + id: "6829", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Mosaic Kits", + }, + { + id: "7096", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Needlecraft Kits", + }, + { + id: "503758", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Scrapbooking & Stamping Kits", + }, + { + id: "4986", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Craft Kits > Toy Craft Kits", + }, + { + id: "505372", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials", + }, + { + id: "24", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper", + }, + { + id: "505399", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Cardstock & Scrapbooking Paper", + }, + { + id: "543510", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Cardstock & Scrapbooking Paper > Cardstock", + }, + { + id: "543511", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Cardstock & Scrapbooking Paper > Scrapbooking Paper", + }, + { + id: "2532", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Construction Paper", + }, + { + id: "8168", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Craft Foil", + }, + { + id: "505400", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Drawing & Painting Paper", + }, + { + id: "2967", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Origami Paper", + }, + { + id: "6110", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Transfer Paper", + }, + { + id: "2741", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Art & Craft Paper > Vellum Paper", + }, + { + id: "505380", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures", + }, + { + id: "4226", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Buttons & Snaps", + }, + { + id: "505408", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Clasps & Hooks", + }, + { + id: "505409", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Eyelets & Grommets", + }, + { + id: "6145", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Hook and Loop Fasteners", + }, + { + id: "500056", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Zipper Pulls", + }, + { + id: "4174", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Fasteners & Closures > Zippers", + }, + { + id: "505378", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze", + }, + { + id: "505417", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Art & Craft Paint", + }, + { + id: "500094", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Art Fixatives", + }, + { + id: "505416", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Art Ink", + }, + { + id: "499879", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Ceramic & Pottery Glazes", + }, + { + id: "505415", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Craft Dyes", + }, + { + id: "505414", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Ink Pads", + }, + { + id: "6558", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Paint, Ink & Glaze > Paint Mediums", + }, + { + id: "505381", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Shapes & Bases", + }, + { + id: "6117", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Shapes & Bases > Craft Foam & Styrofoam", + }, + { + id: "505404", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Shapes & Bases > Craft Wood & Shapes", + }, + { + id: "505403", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Shapes & Bases > Papier Mache Shapes", + }, + { + id: "504419", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Craft Shapes & Bases > Wreath & Floral Frames", + }, + { + id: "505376", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets", + }, + { + id: "503745", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets > Craft & Office Glue", + }, + { + id: "36", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets > Craft Magnets", + }, + { + id: "505419", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets > Decorative Tape", + }, + { + id: "7192", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets > Floral Tape", + }, + { + id: "6418", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Adhesives & Magnets > Fusible Tape", + }, + { + id: "505382", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Fibers", + }, + { + id: "6540", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Fibers > Jewelry & Beading Cord", + }, + { + id: "49", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Fibers > Thread & Floss", + }, + { + id: "6140", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Fibers > Unspun Fiber", + }, + { + id: "2669", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Fibers > Yarn", + }, + { + id: "505377", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Wire", + }, + { + id: "5062", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Wire > Craft Pipe Cleaners", + }, + { + id: "505418", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Wire > Floral Wire", + }, + { + id: "6102", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Crafting Wire > Jewelry & Beading Wire", + }, + { + id: "505379", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims", + }, + { + id: "6955", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Appliques & Patches", + }, + { + id: "32", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Beads", + }, + { + id: "505413", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Bows & Yo-Yos", + }, + { + id: "4054", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Decorative Stickers", + }, + { + id: "6146", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Elastic", + }, + { + id: "505411", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Feathers", + }, + { + id: "5996", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Jewelry Findings", + }, + { + id: "198", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Loose Stones", + }, + { + id: "5982", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Rhinestones & Flatbacks", + }, + { + id: "505412", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Ribbons & Trim", + }, + { + id: "505410", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Sequins & Glitter", + }, + { + id: "1927", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embellishments & Trims > Sew-in Labels", + }, + { + id: "6121", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Embossing Powder", + }, + { + id: "6142", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Filling & Padding Material", + }, + { + id: "505407", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Filling & Padding Material > Batting & Stuffing", + }, + { + id: "505406", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Filling & Padding Material > Filling Pellets", + }, + { + id: "505405", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Filling & Padding Material > Pillow Forms", + }, + { + id: "505383", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Leather & Vinyl", + }, + { + id: "44", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials", + }, + { + id: "3692", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Clay & Modeling Dough", + }, + { + id: "543628", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Clay & Modeling Dough > Clay", + }, + { + id: "543629", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Clay & Modeling Dough > Modeling Dough", + }, + { + id: "505401", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Papier Mache Mixes", + }, + { + id: "505804", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Plaster Gauze", + }, + { + id: "505402", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Pottery & Sculpting Materials > Pottery Slips", + }, + { + id: "505375", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Raw Candle Wax", + }, + { + id: "505384", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles", + }, + { + id: "505397", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Crafting Canvas", + }, + { + id: "505398", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Crafting Canvas > Needlecraft Canvas", + }, + { + id: "19", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Crafting Canvas > Painting Canvas", + }, + { + id: "6144", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Crafting Canvas > Plastic Canvas", + }, + { + id: "47", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Fabric", + }, + { + id: "7076", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Interfacing", + }, + { + id: "505396", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Textiles > Printable Fabric", + }, + { + id: "7403", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Wick Tabs", + }, + { + id: "7402", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Materials > Wicks", + }, + { + id: "504643", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories", + }, + { + id: "232168", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Craft Knife Blades", + }, + { + id: "4580", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Craft Machine Cases & Covers", + }, + { + id: "505286", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Sewing Machine Extension Tables", + }, + { + id: "5120", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Sewing Machine Feet", + }, + { + id: "503348", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Sewing Machine Replacement Parts", + }, + { + id: "6136", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Spinning Wheel Accessories", + }, + { + id: "499918", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tool Accessories > Stamp Blocks", + }, + { + id: "504639", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools", + }, + { + id: "6152", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Blocking Mats", + }, + { + id: "6151", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Blocking Wires", + }, + { + id: "505391", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Color Mixing Tools", + }, + { + id: "1653", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Color Mixing Tools > Palette Knives", + }, + { + id: "1719", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Color Mixing Tools > Palettes", + }, + { + id: "504640", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools", + }, + { + id: "504641", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Craft & Office Scissors", + }, + { + id: "504642", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Craft Cutters & Embossers", + }, + { + id: "5136", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Craft Knives", + }, + { + id: "6119", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Craft Scoring Tools", + }, + { + id: "7340", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Embossing Heat Tools", + }, + { + id: "6122", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Embossing Pens & Styluses", + }, + { + id: "6161", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Seam Rippers", + }, + { + id: "6447", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Cutting & Embossing Tools > Thread & Yarn Cutters", + }, + { + id: "505386", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Decoration Makers", + }, + { + id: "505392", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools", + }, + { + id: "18", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Art Brushes", + }, + { + id: "6126", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Brayer Rollers", + }, + { + id: "4032", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Decorative Stamps", + }, + { + id: "3083", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Drafting Compasses", + }, + { + id: "6125", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Screen Printing Squeegees", + }, + { + id: "5883", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Stencil Machines", + }, + { + id: "2671", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Stencils & Die Cuts", + }, + { + id: "6160", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Stitch Markers & Counters", + }, + { + id: "6157", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Textile Art Gauges & Rulers", + }, + { + id: "505420", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Craft Measuring & Marking Tools > Wood Burning Tools", + }, + { + id: "5137", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Cutting Mats", + }, + { + id: "6150", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Dress Forms", + }, + { + id: "6133", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Felting Pads & Mats", + }, + { + id: "6158", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Frames, Hoops & Stretchers", + }, + { + id: "4073", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Glue Guns", + }, + { + id: "5921", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Light Boxes", + }, + { + id: "505393", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks", + }, + { + id: "6127", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks > Crochet Hooks", + }, + { + id: "5992", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks > Hand-Sewing Needles", + }, + { + id: "6139", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks > Knitting Needles", + }, + { + id: "6168", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks > Latch & Locker Hooks", + }, + { + id: "4579", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Needles & Hooks > Sewing Machine Needles", + }, + { + id: "6101", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Safety Pins", + }, + { + id: "6159", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Straight Pins", + }, + { + id: "505388", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines", + }, + { + id: "6134", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines > Felting Needles & Machines", + }, + { + id: "505422", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines > Hand Looms", + }, + { + id: "505421", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines > Mechanical Looms", + }, + { + id: "615", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines > Sewing Machines", + }, + { + id: "6137", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Textile Craft Machines > Spinning Wheels", + }, + { + id: "6156", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thimbles & Sewing Palms", + }, + { + id: "543639", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thimbles & Sewing Palms > Sewing Palms", + }, + { + id: "543638", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thimbles & Sewing Palms > Thimbles", + }, + { + id: "505387", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools", + }, + { + id: "6164", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Fiber Cards & Brushes", + }, + { + id: "6138", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Hand Spindles", + }, + { + id: "6163", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Needle Threaders", + }, + { + id: "6155", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Thread & Yarn Guides", + }, + { + id: "6154", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Thread & Yarn Spools", + }, + { + id: "6153", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Thread, Yarn & Bobbin Winders", + }, + { + id: "6167", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Weaving Beaters", + }, + { + id: "6166", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Art & Crafting Tools > Thread & Yarn Tools > Weaving Shuttles", + }, + { + id: "505369", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Craft Organization", + }, + { + id: "505394", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Craft Organization > Needle, Pin & Hook Organizers", + }, + { + id: "499971", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Craft Organization > Sewing Baskets & Kits", + }, + { + id: "505395", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Craft Organization > Thread & Yarn Organizers", + }, + { + id: "505371", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds", + }, + { + id: "6999", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds > Beading Patterns", + }, + { + id: "8007", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds > Craft Molds", + }, + { + id: "6135", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds > Felting Molds", + }, + { + id: "505373", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds > Needlecraft Patterns", + }, + { + id: "3697", + name: "Arts & Entertainment > Hobbies & Creative Arts > Arts & Crafts > Crafting Patterns & Molds > Sewing Patterns", + }, + { id: "216", name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles" }, + { + id: "3599", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Autographs", + }, + { + id: "217", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Coins & Currency", + }, + { + id: "543607", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Coins & Currency > Collectible Banknotes", + }, + { + id: "543606", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Coins & Currency > Collectible Coins", + }, + { + id: "6997", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Trading Cards", + }, + { + id: "220", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Weapons", + }, + { + id: "499953", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Weapons > Collectible Guns", + }, + { + id: "5311", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Weapons > Collectible Knives", + }, + { + id: "221", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Weapons > Collectible Swords", + }, + { + id: "1340", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Collectible Weapons > Sword Stands & Displays", + }, + { + id: "219", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Postage Stamps", + }, + { + id: "218", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Rocks & Fossils", + }, + { + id: "6000", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Scale Model Accessories", + }, + { + id: "37", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Scale Models", + }, + { + id: "1312", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Seal Stamps", + }, + { + id: "3865", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles", + }, + { + id: "4333", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia", + }, + { + id: "4124", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > American Football Autographed Paraphernalia", + }, + { + id: "4180", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Auto Racing Autographed Paraphernalia", + }, + { + id: "4149", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Baseball & Softball Autographed Paraphernalia", + }, + { + id: "4279", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Basketball Autographed Paraphernalia", + }, + { + id: "8210", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Boxing Autographed Paraphernalia", + }, + { + id: "4144", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Hockey Autographed Paraphernalia", + }, + { + id: "4093", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Soccer Autographed Paraphernalia", + }, + { + id: "6186", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Autographed Sports Paraphernalia > Tennis Autographed Sports Paraphernalia", + }, + { + id: "3515", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories", + }, + { + id: "1095", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > American Football Fan Accessories", + }, + { + id: "1051", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Auto Racing Fan Accessories", + }, + { + id: "1074", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Baseball & Softball Fan Accessories", + }, + { + id: "1084", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Basketball Fan Accessories", + }, + { + id: "4006", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Hockey Fan Accessories", + }, + { + id: "3576", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Soccer Fan Accessories", + }, + { + id: "6187", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Sports Collectibles > Sports Fan Accessories > Tennis Fan Accessories", + }, + { + id: "3893", + name: "Arts & Entertainment > Hobbies & Creative Arts > Collectibles > Vintage Advertisements", + }, + { + id: "3577", + name: "Arts & Entertainment > Hobbies & Creative Arts > Homebrewing & Winemaking Supplies", + }, + { + id: "3014", + name: "Arts & Entertainment > Hobbies & Creative Arts > Homebrewing & Winemaking Supplies > Beer Brewing Grains & Malts", + }, + { + id: "502980", + name: "Arts & Entertainment > Hobbies & Creative Arts > Homebrewing & Winemaking Supplies > Bottling Bottles", + }, + { + id: "499891", + name: "Arts & Entertainment > Hobbies & Creative Arts > Homebrewing & Winemaking Supplies > Homebrewing & Winemaking Kits", + }, + { + id: "2579", + name: "Arts & Entertainment > Hobbies & Creative Arts > Homebrewing & Winemaking Supplies > Wine Making", + }, + { id: "33", name: "Arts & Entertainment > Hobbies & Creative Arts > Juggling" }, + { id: "35", name: "Arts & Entertainment > Hobbies & Creative Arts > Magic & Novelties" }, + { id: "5999", name: "Arts & Entertainment > Hobbies & Creative Arts > Model Making" }, + { + id: "3885", + name: "Arts & Entertainment > Hobbies & Creative Arts > Model Making > Model Rocketry", + }, + { + id: "5151", + name: "Arts & Entertainment > Hobbies & Creative Arts > Model Making > Model Train Accessories", + }, + { + id: "5150", + name: "Arts & Entertainment > Hobbies & Creative Arts > Model Making > Model Trains & Train Sets", + }, + { + id: "4175", + name: "Arts & Entertainment > Hobbies & Creative Arts > Model Making > Scale Model Kits", + }, + { + id: "55", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories", + }, + { + id: "57", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories", + }, + { + id: "4797", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning", + }, + { + id: "4891", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Care Kits", + }, + { + id: "4892", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Cleaners & Sanitizers", + }, + { + id: "4890", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Cleaning Tools", + }, + { + id: "4893", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Guards", + }, + { + id: "4894", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Lubricants", + }, + { + id: "4895", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Care & Cleaning > Brass Instrument Polishing Cloths", + }, + { + id: "505310", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Cases & Gigbags", + }, + { + id: "505308", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Mouthpieces", + }, + { + id: "505768", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Mutes", + }, + { + id: "4798", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Replacement Parts", + }, + { + id: "505309", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Brass Instrument Accessories > Brass Instrument Straps & Stands", + }, + { + id: "505288", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Conductor Batons", + }, + { + id: "3270", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Electronic Tuners", + }, + { + id: "505365", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Metronomes", + }, + { + id: "505328", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Benches & Stools", + }, + { + id: "500001", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Lyres & Flip Folders", + }, + { + id: "7277", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Stand Accessories", + }, + { + id: "7279", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Stand Accessories > Music Stand Bags", + }, + { + id: "7280", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Stand Accessories > Music Stand Lights", + }, + { + id: "7278", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Stand Accessories > Sheet Music Clips", + }, + { + id: "4142", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Music Stands", + }, + { + id: "8072", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories", + }, + { + id: "6970", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Cabinets", + }, + { + id: "8461", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Covers & Cases", + }, + { + id: "8073", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Footswitches", + }, + { + id: "8462", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Knobs", + }, + { + id: "7364", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Stands", + }, + { + id: "8480", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifier Accessories > Musical Instrument Amplifier Tubes", + }, + { + id: "56", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Instrument Amplifiers", + }, + { + id: "60", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Keyboard Accessories", + }, + { + id: "7357", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Keyboard Accessories > Musical Keyboard Bags & Cases", + }, + { + id: "3588", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Keyboard Accessories > Musical Keyboard Stands", + }, + { + id: "3324", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Musical Keyboard Accessories > Sustain Pedals", + }, + { + id: "3465", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories", + }, + { + id: "7100", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Cymbal & Drum Cases", + }, + { + id: "7231", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Cymbal & Drum Mutes", + }, + { + id: "7153", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Heads", + }, + { + id: "7152", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Keys", + }, + { + id: "7099", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Kit Hardware", + }, + { + id: "7103", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Kit Hardware > Bass Drum Beaters", + }, + { + id: "7102", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Kit Hardware > Drum Kit Mounting Hardware", + }, + { + id: "7101", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Kit Hardware > Drum Pedals", + }, + { + id: "7150", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Stick & Brush Accessories", + }, + { + id: "7151", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Stick & Brush Accessories > Drum Stick & Brush Bags & Holders", + }, + { + id: "59", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Drum Sticks & Brushes", + }, + { + id: "7455", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Electronic Drum Modules", + }, + { + id: "7282", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Hand Percussion Accessories", + }, + { + id: "7283", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Hand Percussion Accessories > Hand Percussion Bags & Cases", + }, + { + id: "7284", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Hand Percussion Accessories > Hand Percussion Stands & Mounts", + }, + { + id: "4631", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Percussion Mallets", + }, + { + id: "7308", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Percussion Accessories > Percussion Stands", + }, + { + id: "61", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories", + }, + { + id: "3502", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories", + }, + { + id: "3775", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Acoustic Guitar Pickups", + }, + { + id: "5367", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Capos", + }, + { + id: "3412", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Electric Guitar Pickups", + }, + { + id: "3882", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Cases & Gig Bags", + }, + { + id: "503032", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Fittings & Parts", + }, + { + id: "3392", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Humidifiers", + }, + { + id: "4111", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Picks", + }, + { + id: "5368", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Slides", + }, + { + id: "3646", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Stands", + }, + { + id: "499688", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Straps", + }, + { + id: "503721", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar String Winders", + }, + { + id: "3178", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Strings", + }, + { + id: "3176", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Guitar Accessories > Guitar Tuning Pegs", + }, + { + id: "503033", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories", + }, + { + id: "8209", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Bow Cases", + }, + { + id: "503040", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Bows", + }, + { + id: "503039", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Cases", + }, + { + id: "503038", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Fittings & Parts", + }, + { + id: "503037", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Mutes", + }, + { + id: "503036", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Pickups", + }, + { + id: "503035", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Stands", + }, + { + id: "503034", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > Orchestral String Instrument Accessories > Orchestral String Instrument Strings", + }, + { + id: "4806", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > String Instrument Care & Cleaning", + }, + { + id: "3374", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > String Instrument Care & Cleaning > Bow Rosin", + }, + { + id: "4911", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > String Instrument Care & Cleaning > String Instrument Cleaning Cloths", + }, + { + id: "4912", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > String Instrument Accessories > String Instrument Care & Cleaning > String Instrument Polish", + }, + { + id: "62", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories", + }, + { + id: "4790", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories", + }, + { + id: "4809", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Care & Cleaning", + }, + { + id: "4815", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Care & Cleaning > Bassoon Swabs", + }, + { + id: "4810", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Cases & Gigbags", + }, + { + id: "4811", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Parts", + }, + { + id: "4816", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Parts > Bassoon Bocals", + }, + { + id: "4817", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Parts > Bassoon Small Parts", + }, + { + id: "4812", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Reeds", + }, + { + id: "4813", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Stands", + }, + { + id: "4814", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Bassoon Accessories > Bassoon Straps & Supports", + }, + { + id: "4791", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories", + }, + { + id: "4818", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Care & Cleaning", + }, + { + id: "4826", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Care & Cleaning > Clarinet Care Kits", + }, + { + id: "4827", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Care & Cleaning > Clarinet Pad Savers", + }, + { + id: "4828", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Care & Cleaning > Clarinet Swabs", + }, + { + id: "4819", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Cases & Gigbags", + }, + { + id: "4820", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Ligatures & Caps", + }, + { + id: "4822", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Parts", + }, + { + id: "4829", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Parts > Clarinet Barrels", + }, + { + id: "4830", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Parts > Clarinet Bells", + }, + { + id: "4831", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Parts > Clarinet Mouthpieces", + }, + { + id: "4832", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Parts > Clarinet Small Parts", + }, + { + id: "4823", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Pegs & Stands", + }, + { + id: "4824", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Reeds", + }, + { + id: "4825", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Clarinet Accessories > Clarinet Straps & Supports", + }, + { + id: "4792", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories", + }, + { + id: "4833", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Care & Cleaning", + }, + { + id: "4838", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Care & Cleaning > Flute Care Kits", + }, + { + id: "4839", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Care & Cleaning > Flute Cleaning Rods", + }, + { + id: "4840", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Care & Cleaning > Flute Swabs", + }, + { + id: "4834", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Cases & Gigbags", + }, + { + id: "4836", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Parts", + }, + { + id: "4841", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Parts > Flute Headjoints", + }, + { + id: "4842", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Parts > Flute Small Parts", + }, + { + id: "4837", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Flute Accessories > Flute Pegs & Stands", + }, + { + id: "4955", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Harmonica Accessories", + }, + { + id: "4956", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Harmonica Accessories > Harmonica Cases", + }, + { + id: "5046", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Harmonica Accessories > Harmonica Holders", + }, + { + id: "4793", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories", + }, + { + id: "4843", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Care & Cleaning", + }, + { + id: "4849", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Care & Cleaning > Oboe Care Kits", + }, + { + id: "4850", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Care & Cleaning > Oboe Swabs", + }, + { + id: "4844", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Cases & Gigbags", + }, + { + id: "4845", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Parts", + }, + { + id: "4851", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Parts > Oboe Small Parts", + }, + { + id: "4846", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Pegs & Stands", + }, + { + id: "4847", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Reeds", + }, + { + id: "4848", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Oboe & English Horn Accessories > Oboe Straps & Supports", + }, + { + id: "503747", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Recorder Accessories", + }, + { + id: "503749", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Recorder Accessories > Recorder Care & Cleaning", + }, + { + id: "503748", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Recorder Accessories > Recorder Cases", + }, + { + id: "503750", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Recorder Accessories > Recorder Parts", + }, + { + id: "4794", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories", + }, + { + id: "4852", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Care & Cleaning", + }, + { + id: "4860", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Care & Cleaning > Saxophone Care Kits", + }, + { + id: "4861", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Care & Cleaning > Saxophone Pad Savers", + }, + { + id: "4862", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Care & Cleaning > Saxophone Swabs", + }, + { + id: "4853", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Cases & Gigbags", + }, + { + id: "4854", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Ligatures & Caps", + }, + { + id: "4856", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Parts", + }, + { + id: "4863", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Parts > Saxophone Mouthpieces", + }, + { + id: "4864", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Parts > Saxophone Necks", + }, + { + id: "4865", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Parts > Saxophone Small Parts", + }, + { + id: "4857", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Pegs & Stands", + }, + { + id: "4858", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Reeds", + }, + { + id: "4859", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Saxophone Accessories > Saxophone Straps & Supports", + }, + { + id: "4866", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Woodwind Cork Grease", + }, + { + id: "4867", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Woodwind Polishing Cloths", + }, + { + id: "4957", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Woodwind Reed Cases", + }, + { + id: "4939", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instrument & Orchestra Accessories > Woodwind Instrument Accessories > Woodwind Reed Knives", + }, + { id: "54", name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments" }, + { + id: "4983", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Accordions & Concertinas", + }, + { + id: "4984", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Bagpipes", + }, + { + id: "63", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments", + }, + { + id: "505769", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > Alto & Baritone Horns", + }, + { + id: "65", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > Euphoniums", + }, + { + id: "67", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > French Horns", + }, + { + id: "70", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > Trombones", + }, + { + id: "505770", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > Trumpets & Cornets", + }, + { + id: "72", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Brass Instruments > Tubas", + }, + { + id: "6001", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Electronic Musical Instruments", + }, + { + id: "245", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Electronic Musical Instruments > Audio Samplers", + }, + { + id: "6002", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Electronic Musical Instruments > MIDI Controllers", + }, + { + id: "74", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Electronic Musical Instruments > Musical Keyboards", + }, + { + id: "6003", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Electronic Musical Instruments > Sound Synthesizers", + }, + { + id: "75", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion", + }, + { + id: "2917", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Bass Drums", + }, + { + id: "3043", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Cymbals", + }, + { + id: "2518", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Drum Kits", + }, + { + id: "2856", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Electronic Drums", + }, + { + id: "7431", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Glockenspiels & Xylophones", + }, + { + id: "6098", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Gongs", + }, + { + id: "7285", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion", + }, + { + id: "7289", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Claves & Castanets", + }, + { + id: "7288", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Finger & Hand Cymbals", + }, + { + id: "7555", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Bells & Chimes", + }, + { + id: "7295", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums", + }, + { + id: "7298", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Bongos", + }, + { + id: "7297", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Cajons", + }, + { + id: "7296", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Congas", + }, + { + id: "7300", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Frame Drums", + }, + { + id: "7299", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Goblet Drums", + }, + { + id: "7302", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Tablas", + }, + { + id: "7301", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Hand Drums > Talking Drums", + }, + { + id: "7291", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Musical Blocks", + }, + { + id: "7293", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Musical Cowbells", + }, + { + id: "7286", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Musical Scrapers & Ratchets", + }, + { + id: "7287", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Musical Shakers", + }, + { + id: "7290", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Musical Triangles", + }, + { + id: "2515", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Tambourines", + }, + { + id: "7294", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hand Percussion > Vibraslaps", + }, + { + id: "3015", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Hi-Hats", + }, + { + id: "7232", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Practice Pads", + }, + { + id: "2797", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Snare Drums", + }, + { + id: "3005", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Percussion > Tom-Toms", + }, + { + id: "76", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Pianos", + }, + { + id: "77", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments", + }, + { + id: "79", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Cellos", + }, + { + id: "80", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Guitars", + }, + { + id: "84", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Harps", + }, + { + id: "78", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Upright Basses", + }, + { + id: "85", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Violas", + }, + { + id: "86", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > String Instruments > Violins", + }, + { + id: "87", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds", + }, + { + id: "4540", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Bassoons", + }, + { + id: "88", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Clarinets", + }, + { + id: "89", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Flutes", + }, + { + id: "7188", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Flutophones", + }, + { + id: "4743", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Harmonicas", + }, + { + id: "4744", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Jew's Harps", + }, + { + id: "5481", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Melodicas", + }, + { + id: "7250", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Musical Pipes", + }, + { + id: "4541", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Oboes & English Horns", + }, + { + id: "7249", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Ocarinas", + }, + { + id: "90", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Recorders", + }, + { + id: "91", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Saxophones", + }, + { + id: "6721", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Tin Whistles", + }, + { + id: "6728", + name: "Arts & Entertainment > Hobbies & Creative Arts > Musical Instruments > Woodwinds > Train Whistles", + }, + { id: "5709", name: "Arts & Entertainment > Party & Celebration" }, + { id: "2559", name: "Arts & Entertainment > Party & Celebration > Gift Giving" }, + { + id: "6100", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Corsage & Boutonnière Pins", + }, + { + id: "5916", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Corsages & Boutonnières", + }, + { + id: "2899", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Fresh Cut Flowers", + }, + { + id: "53", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Cards & Certificates", + }, + { id: "94", name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping" }, + { + id: "5838", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping > Gift Bags", + }, + { + id: "5091", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping > Gift Boxes & Tins", + }, + { + id: "8213", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping > Gift Tags & Labels", + }, + { + id: "6712", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping > Tissue Paper", + }, + { + id: "2816", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Gift Wrapping > Wrapping Paper", + }, + { + id: "95", + name: "Arts & Entertainment > Party & Celebration > Gift Giving > Greeting & Note Cards", + }, + { id: "96", name: "Arts & Entertainment > Party & Celebration > Party Supplies" }, + { + id: "328061", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Advice Cards", + }, + { + id: "6311", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Balloon Kits", + }, + { id: "2587", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Balloons" }, + { id: "2531", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Banners" }, + { + id: "4730", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Birthday Candles", + }, + { + id: "505763", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Chair Sashes", + }, + { + id: "7007", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Cocktail Decorations", + }, + { id: "2781", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Confetti" }, + { + id: "8216", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Decorative Pom-Poms", + }, + { + id: "3735", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Drinking Games", + }, + { + id: "3361", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Drinking Games > Beer Pong", + }, + { + id: "3440", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Drinking Games > Beer Pong > Beer Pong Tables", + }, + { + id: "5043", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Drinking Straws & Stirrers", + }, + { + id: "1484", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Envelope Seals", + }, + { + id: "8038", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Event Programs", + }, + { + id: "4914", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Fireworks & Firecrackers", + }, + { + id: "8110", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Inflatable Party Decorations", + }, + { id: "1371", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Invitations" }, + { + id: "2783", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Noisemakers & Party Blowers", + }, + { + id: "5452", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Favors", + }, + { + id: "5453", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Favors > Wedding Favors", + }, + { id: "7160", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Games" }, + { id: "6906", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Hats" }, + { + id: "502981", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Streamers & Curtains", + }, + { + id: "502972", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Party Supply Kits", + }, + { id: "3994", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Piñatas" }, + { + id: "5472", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Place Card Holders", + }, + { id: "2104", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Place Cards" }, + { + id: "1887", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Response Cards", + }, + { id: "4915", name: "Arts & Entertainment > Party & Celebration > Party Supplies > Sparklers" }, + { + id: "7097", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Special Occasion Card Boxes & Holders", + }, + { + id: "4351", + name: "Arts & Entertainment > Party & Celebration > Party Supplies > Spray String", + }, + { id: "408", name: "Arts & Entertainment > Party & Celebration > Special Effects" }, + { + id: "5711", + name: "Arts & Entertainment > Party & Celebration > Special Effects > Disco Balls", + }, + { + id: "409", + name: "Arts & Entertainment > Party & Celebration > Special Effects > Fog Machines", + }, + { + id: "5967", + name: "Arts & Entertainment > Party & Celebration > Special Effects > Special Effects Controllers", + }, + { + id: "503028", + name: "Arts & Entertainment > Party & Celebration > Special Effects > Special Effects Light Stands", + }, + { + id: "410", + name: "Arts & Entertainment > Party & Celebration > Special Effects > Special Effects Lighting", + }, + { id: "5868", name: "Arts & Entertainment > Party & Celebration > Trophies & Awards" }, + { + id: "543656", + name: "Arts & Entertainment > Party & Celebration > Trophies & Awards > Award Certificates", + }, + { + id: "543655", + name: "Arts & Entertainment > Party & Celebration > Trophies & Awards > Award Pins & Medals", + }, + { + id: "543657", + name: "Arts & Entertainment > Party & Celebration > Trophies & Awards > Award Plaques", + }, + { + id: "543654", + name: "Arts & Entertainment > Party & Celebration > Trophies & Awards > Award Ribbons", + }, + { + id: "543653", + name: "Arts & Entertainment > Party & Celebration > Trophies & Awards > Trophies", + }, + { id: "537", name: "Baby & Toddler" }, + { id: "4678", name: "Baby & Toddler > Baby Bathing" }, + { id: "4679", name: "Baby & Toddler > Baby Bathing > Baby Bathtubs & Bath Seats" }, + { id: "7082", name: "Baby & Toddler > Baby Bathing > Shower Visors" }, + { id: "5859", name: "Baby & Toddler > Baby Gift Sets" }, + { id: "5252", name: "Baby & Toddler > Baby Health" }, + { id: "6290", name: "Baby & Toddler > Baby Health > Baby Health & Grooming Kits" }, + { id: "5253", name: "Baby & Toddler > Baby Health > Nasal Aspirators" }, + { id: "7016", name: "Baby & Toddler > Baby Health > Pacifier Clips & Holders" }, + { id: "7309", name: "Baby & Toddler > Baby Health > Pacifier Wipes" }, + { id: "566", name: "Baby & Toddler > Baby Health > Pacifiers & Teethers" }, + { id: "540", name: "Baby & Toddler > Baby Safety" }, + { id: "6869", name: "Baby & Toddler > Baby Safety > Baby & Pet Gate Accessories" }, + { id: "542", name: "Baby & Toddler > Baby Safety > Baby & Pet Gates" }, + { id: "541", name: "Baby & Toddler > Baby Safety > Baby Monitors" }, + { id: "5049", name: "Baby & Toddler > Baby Safety > Baby Safety Harnesses & Leashes" }, + { id: "543", name: "Baby & Toddler > Baby Safety > Baby Safety Locks & Guards" }, + { id: "544", name: "Baby & Toddler > Baby Safety > Baby Safety Rails" }, + { id: "2847", name: "Baby & Toddler > Baby Toys & Activity Equipment" }, + { id: "3661", name: "Baby & Toddler > Baby Toys & Activity Equipment > Alphabet Toys" }, + { id: "7198", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Activity Toys" }, + { id: "555", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Bouncers & Rockers" }, + { id: "560", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Jumpers & Swings" }, + { id: "7191", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Mobile Accessories" }, + { id: "1242", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Mobiles" }, + { id: "7360", name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Soothers" }, + { + id: "1241", + name: "Baby & Toddler > Baby Toys & Activity Equipment > Baby Walkers & Entertainers", + }, + { id: "1243", name: "Baby & Toddler > Baby Toys & Activity Equipment > Play Mats & Gyms" }, + { + id: "543613", + name: "Baby & Toddler > Baby Toys & Activity Equipment > Play Mats & Gyms > Play Gyms", + }, + { + id: "543612", + name: "Baby & Toddler > Baby Toys & Activity Equipment > Play Mats & Gyms > Play Mats", + }, + { id: "539", name: "Baby & Toddler > Baby Toys & Activity Equipment > Play Yards" }, + { id: "3459", name: "Baby & Toddler > Baby Toys & Activity Equipment > Push & Pull Toys" }, + { id: "1244", name: "Baby & Toddler > Baby Toys & Activity Equipment > Rattles" }, + { id: "3860", name: "Baby & Toddler > Baby Toys & Activity Equipment > Sorting & Stacking Toys" }, + { id: "2764", name: "Baby & Toddler > Baby Transport" }, + { id: "547", name: "Baby & Toddler > Baby Transport > Baby & Toddler Car Seats" }, + { id: "538", name: "Baby & Toddler > Baby Transport > Baby Carriers" }, + { id: "568", name: "Baby & Toddler > Baby Transport > Baby Strollers" }, + { id: "4386", name: "Baby & Toddler > Baby Transport Accessories" }, + { + id: "4486", + name: "Baby & Toddler > Baby Transport Accessories > Baby & Toddler Car Seat Accessories", + }, + { id: "4916", name: "Baby & Toddler > Baby Transport Accessories > Baby Carrier Accessories" }, + { id: "4387", name: "Baby & Toddler > Baby Transport Accessories > Baby Stroller Accessories" }, + { + id: "8537", + name: "Baby & Toddler > Baby Transport Accessories > Baby Transport Liners & Sacks", + }, + { + id: "5845", + name: "Baby & Toddler > Baby Transport Accessories > Shopping Cart & High Chair Covers", + }, + { id: "548", name: "Baby & Toddler > Diapering" }, + { id: "7200", name: "Baby & Toddler > Diapering > Baby Wipe Dispensers & Warmers" }, + { id: "553", name: "Baby & Toddler > Diapering > Baby Wipes" }, + { id: "502999", name: "Baby & Toddler > Diapering > Changing Mat & Tray Covers" }, + { id: "5628", name: "Baby & Toddler > Diapering > Changing Mats & Trays" }, + { id: "7014", name: "Baby & Toddler > Diapering > Diaper Kits" }, + { id: "6949", name: "Baby & Toddler > Diapering > Diaper Liners" }, + { id: "6883", name: "Baby & Toddler > Diapering > Diaper Organizers" }, + { id: "7001", name: "Baby & Toddler > Diapering > Diaper Pail Accessories" }, + { id: "550", name: "Baby & Toddler > Diapering > Diaper Pails" }, + { id: "2949", name: "Baby & Toddler > Diapering > Diaper Rash Treatments" }, + { id: "6971", name: "Baby & Toddler > Diapering > Diaper Wet Bags" }, + { id: "551", name: "Baby & Toddler > Diapering > Diapers" }, + { id: "561", name: "Baby & Toddler > Nursing & Feeding" }, + { id: "562", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food" }, + { id: "5721", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Baby Cereal" }, + { id: "5718", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Baby Drinks" }, + { id: "5719", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Baby Food" }, + { id: "563", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Baby Formula" }, + { id: "5720", name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Baby Snacks" }, + { + id: "8436", + name: "Baby & Toddler > Nursing & Feeding > Baby & Toddler Food > Toddler Nutrition Drinks & Shakes", + }, + { id: "5630", name: "Baby & Toddler > Nursing & Feeding > Baby Bottle Nipples & Liners" }, + { + id: "543637", + name: "Baby & Toddler > Nursing & Feeding > Baby Bottle Nipples & Liners > Baby Bottle Liners", + }, + { + id: "543636", + name: "Baby & Toddler > Nursing & Feeding > Baby Bottle Nipples & Liners > Baby Bottle Nipples", + }, + { id: "564", name: "Baby & Toddler > Nursing & Feeding > Baby Bottles" }, + { id: "4768", name: "Baby & Toddler > Nursing & Feeding > Baby Care Timers" }, + { id: "2125", name: "Baby & Toddler > Nursing & Feeding > Bibs" }, + { id: "5296", name: "Baby & Toddler > Nursing & Feeding > Bottle Warmers & Sterilizers" }, + { id: "7234", name: "Baby & Toddler > Nursing & Feeding > Breast Milk Storage Containers" }, + { id: "505366", name: "Baby & Toddler > Nursing & Feeding > Breast Pump Accessories" }, + { id: "565", name: "Baby & Toddler > Nursing & Feeding > Breast Pumps" }, + { id: "5629", name: "Baby & Toddler > Nursing & Feeding > Burp Cloths" }, + { id: "5843", name: "Baby & Toddler > Nursing & Feeding > Nursing Covers" }, + { id: "503762", name: "Baby & Toddler > Nursing & Feeding > Nursing Pads & Shields" }, + { id: "8075", name: "Baby & Toddler > Nursing & Feeding > Nursing Pillow Covers" }, + { id: "5298", name: "Baby & Toddler > Nursing & Feeding > Nursing Pillows" }, + { id: "6950", name: "Baby & Toddler > Nursing & Feeding > Sippy Cups" }, + { id: "6952", name: "Baby & Toddler > Potty Training" }, + { id: "552", name: "Baby & Toddler > Potty Training > Potty Seats" }, + { id: "6953", name: "Baby & Toddler > Potty Training > Potty Training Kits" }, + { id: "6899", name: "Baby & Toddler > Swaddling & Receiving Blankets" }, + { id: "543664", name: "Baby & Toddler > Swaddling & Receiving Blankets > Receiving Blankets" }, + { id: "543665", name: "Baby & Toddler > Swaddling & Receiving Blankets > Swaddling Blankets" }, + { id: "111", name: "Business & Industrial" }, + { id: "5863", name: "Business & Industrial > Advertising & Marketing" }, + { id: "5884", name: "Business & Industrial > Advertising & Marketing > Brochures" }, + { id: "5864", name: "Business & Industrial > Advertising & Marketing > Trade Show Counters" }, + { id: "5865", name: "Business & Industrial > Advertising & Marketing > Trade Show Displays" }, + { id: "112", name: "Business & Industrial > Agriculture" }, + { id: "6991", name: "Business & Industrial > Agriculture > Animal Husbandry" }, + { id: "499997", name: "Business & Industrial > Agriculture > Animal Husbandry > Egg Incubators" }, + { id: "505821", name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed" }, + { + id: "543545", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed > Cattle Feed", + }, + { + id: "543544", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed > Chicken Feed", + }, + { + id: "543547", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed > Goat & Sheep Feed", + }, + { + id: "543548", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed > Mixed Herd Feed", + }, + { + id: "543546", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feed > Pig Feed", + }, + { + id: "6990", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Feeders & Waterers", + }, + { + id: "499946", + name: "Business & Industrial > Agriculture > Animal Husbandry > Livestock Halters", + }, + { id: "7261", name: "Business & Industrial > Automation Control Components" }, + { + id: "7263", + name: "Business & Industrial > Automation Control Components > Programmable Logic Controllers", + }, + { + id: "7262", + name: "Business & Industrial > Automation Control Components > Variable Frequency & Adjustable Speed Drives", + }, + { id: "114", name: "Business & Industrial > Construction" }, + { id: "134", name: "Business & Industrial > Construction > Surveying" }, + { id: "8278", name: "Business & Industrial > Construction > Traffic Cones & Barrels" }, + { id: "7497", name: "Business & Industrial > Dentistry" }, + { id: "7500", name: "Business & Industrial > Dentistry > Dental Cement" }, + { id: "7499", name: "Business & Industrial > Dentistry > Dental Tools" }, + { id: "8490", name: "Business & Industrial > Dentistry > Dental Tools > Dappen Dishes" }, + { id: "7498", name: "Business & Industrial > Dentistry > Dental Tools > Dental Mirrors" }, + { id: "7531", name: "Business & Industrial > Dentistry > Dental Tools > Dental Tool Sets" }, + { id: "8121", name: "Business & Industrial > Dentistry > Dental Tools > Prophy Cups" }, + { id: "8120", name: "Business & Industrial > Dentistry > Dental Tools > Prophy Heads" }, + { id: "8130", name: "Business & Industrial > Dentistry > Prophy Paste" }, + { id: "2155", name: "Business & Industrial > Film & Television" }, + { id: "1813", name: "Business & Industrial > Finance & Insurance" }, + { id: "7565", name: "Business & Industrial > Finance & Insurance > Bullion" }, + { id: "135", name: "Business & Industrial > Food Service" }, + { id: "7303", name: "Business & Industrial > Food Service > Bakery Boxes" }, + { id: "4217", name: "Business & Industrial > Food Service > Bus Tubs" }, + { id: "8532", name: "Business & Industrial > Food Service > Check Presenters" }, + { id: "5102", name: "Business & Industrial > Food Service > Concession Food Containers" }, + { id: "8059", name: "Business & Industrial > Food Service > Disposable Lids" }, + { id: "7088", name: "Business & Industrial > Food Service > Disposable Serveware" }, + { + id: "7089", + name: "Business & Industrial > Food Service > Disposable Serveware > Disposable Serving Trays", + }, + { id: "4632", name: "Business & Industrial > Food Service > Disposable Tableware" }, + { + id: "5098", + name: "Business & Industrial > Food Service > Disposable Tableware > Disposable Bowls", + }, + { + id: "5099", + name: "Business & Industrial > Food Service > Disposable Tableware > Disposable Cups", + }, + { + id: "5100", + name: "Business & Industrial > Food Service > Disposable Tableware > Disposable Cutlery", + }, + { + id: "5101", + name: "Business & Industrial > Food Service > Disposable Tableware > Disposable Plates", + }, + { id: "4096", name: "Business & Industrial > Food Service > Food Service Baskets" }, + { id: "4742", name: "Business & Industrial > Food Service > Food Service Carts" }, + { id: "6786", name: "Business & Industrial > Food Service > Food Washers & Dryers" }, + { id: "6517", name: "Business & Industrial > Food Service > Hot Dog Rollers" }, + { id: "7353", name: "Business & Industrial > Food Service > Ice Bins" }, + { id: "5104", name: "Business & Industrial > Food Service > Plate & Dish Warmers" }, + { id: "8533", name: "Business & Industrial > Food Service > Sneeze Guards" }, + { id: "5097", name: "Business & Industrial > Food Service > Take-Out Containers" }, + { id: "7553", name: "Business & Industrial > Food Service > Tilt Skillets" }, + { id: "137", name: "Business & Industrial > Food Service > Vending Machines" }, + { id: "1827", name: "Business & Industrial > Forestry & Logging" }, + { id: "7240", name: "Business & Industrial > Hairdressing & Cosmetology" }, + { + id: "505670", + name: "Business & Industrial > Hairdressing & Cosmetology > Hairdressing Capes & Neck Covers", + }, + { id: "7242", name: "Business & Industrial > Hairdressing & Cosmetology > Pedicure Chairs" }, + { id: "7241", name: "Business & Industrial > Hairdressing & Cosmetology > Salon Chairs" }, + { id: "1795", name: "Business & Industrial > Heavy Machinery" }, + { id: "2072", name: "Business & Industrial > Heavy Machinery > Chippers" }, + { id: "1475", name: "Business & Industrial > Hotel & Hospitality" }, + { id: "5830", name: "Business & Industrial > Industrial Storage" }, + { id: "5832", name: "Business & Industrial > Industrial Storage > Industrial Cabinets" }, + { id: "5833", name: "Business & Industrial > Industrial Storage > Industrial Shelving" }, + { id: "5831", name: "Business & Industrial > Industrial Storage > Shipping Containers" }, + { + id: "8274", + name: "Business & Industrial > Industrial Storage > Wire Partitions, Enclosures & Doors", + }, + { id: "8025", name: "Business & Industrial > Industrial Storage Accessories" }, + { id: "500086", name: "Business & Industrial > Janitorial Carts & Caddies" }, + { id: "1556", name: "Business & Industrial > Law Enforcement" }, + { id: "1906", name: "Business & Industrial > Law Enforcement > Cuffs" }, + { id: "361", name: "Business & Industrial > Law Enforcement > Metal Detectors" }, + { id: "1470", name: "Business & Industrial > Manufacturing" }, + { id: "6987", name: "Business & Industrial > Material Handling" }, + { id: "6988", name: "Business & Industrial > Material Handling > Conveyors" }, + { id: "131", name: "Business & Industrial > Material Handling > Lifts & Hoists" }, + { + id: "503768", + name: "Business & Industrial > Material Handling > Lifts & Hoists > Hoists, Cranes & Trolleys", + }, + { + id: "503771", + name: "Business & Industrial > Material Handling > Lifts & Hoists > Jacks & Lift Trucks", + }, + { + id: "503767", + name: "Business & Industrial > Material Handling > Lifts & Hoists > Personnel Lifts", + }, + { + id: "503769", + name: "Business & Industrial > Material Handling > Lifts & Hoists > Pulleys, Blocks & Sheaves", + }, + { id: "503772", name: "Business & Industrial > Material Handling > Lifts & Hoists > Winches" }, + { id: "503011", name: "Business & Industrial > Material Handling > Pallets & Loading Platforms" }, + { id: "2496", name: "Business & Industrial > Medical" }, + { id: "6275", name: "Business & Industrial > Medical > Hospital Curtains" }, + { id: "1898", name: "Business & Industrial > Medical > Hospital Gowns" }, + { id: "6303", name: "Business & Industrial > Medical > Medical Bedding" }, + { id: "3477", name: "Business & Industrial > Medical > Medical Equipment" }, + { + id: "3230", + name: "Business & Industrial > Medical > Medical Equipment > Automated External Defibrillators", + }, + { id: "503006", name: "Business & Industrial > Medical > Medical Equipment > Gait Belts" }, + { + id: "6972", + name: "Business & Industrial > Medical > Medical Equipment > Medical Reflex Hammers & Tuning Forks", + }, + { + id: "499858", + name: "Business & Industrial > Medical > Medical Equipment > Medical Stretchers & Gurneys", + }, + { + id: "4245", + name: "Business & Industrial > Medical > Medical Equipment > Otoscopes & Ophthalmoscopes", + }, + { id: "7522", name: "Business & Industrial > Medical > Medical Equipment > Patient Lifts" }, + { id: "4364", name: "Business & Industrial > Medical > Medical Equipment > Stethoscopes" }, + { + id: "6714", + name: "Business & Industrial > Medical > Medical Equipment > Vital Signs Monitor Accessories", + }, + { + id: "6280", + name: "Business & Industrial > Medical > Medical Equipment > Vital Signs Monitors", + }, + { id: "5167", name: "Business & Industrial > Medical > Medical Furniture" }, + { id: "5168", name: "Business & Industrial > Medical > Medical Furniture > Chiropractic Tables" }, + { + id: "5169", + name: "Business & Industrial > Medical > Medical Furniture > Examination Chairs & Tables", + }, + { + id: "4435", + name: "Business & Industrial > Medical > Medical Furniture > Homecare & Hospital Beds", + }, + { id: "5170", name: "Business & Industrial > Medical > Medical Furniture > Medical Cabinets" }, + { id: "5171", name: "Business & Industrial > Medical > Medical Furniture > Medical Carts" }, + { + id: "5173", + name: "Business & Industrial > Medical > Medical Furniture > Medical Carts > Crash Carts", + }, + { + id: "5174", + name: "Business & Industrial > Medical > Medical Furniture > Medical Carts > IV Poles & Carts", + }, + { id: "5172", name: "Business & Industrial > Medical > Medical Furniture > Surgical Tables" }, + { id: "230913", name: "Business & Industrial > Medical > Medical Instruments" }, + { id: "6281", name: "Business & Industrial > Medical > Medical Instruments > Medical Forceps" }, + { id: "232166", name: "Business & Industrial > Medical > Medical Instruments > Scalpel Blades" }, + { id: "8026", name: "Business & Industrial > Medical > Medical Instruments > Scalpels" }, + { + id: "499935", + name: "Business & Industrial > Medical > Medical Instruments > Surgical Needles & Sutures", + }, + { id: "2907", name: "Business & Industrial > Medical > Medical Supplies" }, + { id: "511", name: "Business & Industrial > Medical > Medical Supplies > Disposable Gloves" }, + { id: "7063", name: "Business & Industrial > Medical > Medical Supplies > Finger Cots" }, + { + id: "499696", + name: "Business & Industrial > Medical > Medical Supplies > Medical Needles & Syringes", + }, + { + id: "543672", + name: "Business & Industrial > Medical > Medical Supplies > Medical Needles & Syringes > Medical Needle & Syringe Sets", + }, + { + id: "543670", + name: "Business & Industrial > Medical > Medical Supplies > Medical Needles & Syringes > Medical Needles", + }, + { + id: "543671", + name: "Business & Industrial > Medical > Medical Supplies > Medical Needles & Syringes > Medical Syringes", + }, + { id: "505828", name: "Business & Industrial > Medical > Medical Supplies > Ostomy Supplies" }, + { id: "7324", name: "Business & Industrial > Medical > Medical Supplies > Tongue Depressors" }, + { id: "6490", name: "Business & Industrial > Medical > Medical Teaching Equipment" }, + { + id: "6491", + name: "Business & Industrial > Medical > Medical Teaching Equipment > Medical & Emergency Response Training Mannequins", + }, + { id: "5602", name: "Business & Industrial > Medical > Scrub Caps" }, + { id: "2928", name: "Business & Industrial > Medical > Scrubs" }, + { id: "1645", name: "Business & Industrial > Medical > Surgical Gowns" }, + { id: "2187", name: "Business & Industrial > Mining & Quarrying" }, + { id: "4285", name: "Business & Industrial > Piercing & Tattooing" }, + { id: "4350", name: "Business & Industrial > Piercing & Tattooing > Piercing Supplies" }, + { + id: "4122", + name: "Business & Industrial > Piercing & Tattooing > Piercing Supplies > Piercing Needles", + }, + { id: "4326", name: "Business & Industrial > Piercing & Tattooing > Tattooing Supplies" }, + { + id: "5853", + name: "Business & Industrial > Piercing & Tattooing > Tattooing Supplies > Tattoo Cover-Ups", + }, + { + id: "4215", + name: "Business & Industrial > Piercing & Tattooing > Tattooing Supplies > Tattooing Inks", + }, + { + id: "4379", + name: "Business & Industrial > Piercing & Tattooing > Tattooing Supplies > Tattooing Machines", + }, + { + id: "4072", + name: "Business & Industrial > Piercing & Tattooing > Tattooing Supplies > Tattooing Needles", + }, + { id: "138", name: "Business & Industrial > Retail" }, + { id: "4244", name: "Business & Industrial > Retail > Clothing Display Racks" }, + { id: "3803", name: "Business & Industrial > Retail > Display Mannequins" }, + { id: "7128", name: "Business & Industrial > Retail > Mannequin Parts" }, + { id: "4181", name: "Business & Industrial > Retail > Money Handling" }, + { id: "4290", name: "Business & Industrial > Retail > Money Handling > Banknote Verifiers" }, + { + id: "505825", + name: "Business & Industrial > Retail > Money Handling > Cash Register & POS Terminal Accessories", + }, + { + id: "4283", + name: "Business & Industrial > Retail > Money Handling > Cash Register & POS Terminal Accessories > Cash Drawers & Trays", + }, + { + id: "505808", + name: "Business & Industrial > Retail > Money Handling > Cash Register & POS Terminal Accessories > Credit Card Terminals", + }, + { + id: "5310", + name: "Business & Industrial > Retail > Money Handling > Cash Register & POS Terminal Accessories > Signature Capture Pads", + }, + { + id: "505824", + name: "Business & Industrial > Retail > Money Handling > Cash Registers & POS Terminals", + }, + { + id: "543647", + name: "Business & Industrial > Retail > Money Handling > Cash Registers & POS Terminals > Cash Registers", + }, + { + id: "543648", + name: "Business & Industrial > Retail > Money Handling > Cash Registers & POS Terminals > POS Terminals", + }, + { id: "4151", name: "Business & Industrial > Retail > Money Handling > Coin & Bill Counters" }, + { id: "3273", name: "Business & Industrial > Retail > Money Handling > Money Changers" }, + { id: "4329", name: "Business & Industrial > Retail > Money Handling > Money Deposit Bags" }, + { + id: "4055", + name: "Business & Industrial > Retail > Money Handling > Paper Coin Wrappers & Bill Straps", + }, + { id: "1837", name: "Business & Industrial > Retail > Paper & Plastic Shopping Bags" }, + { id: "4127", name: "Business & Industrial > Retail > Pricing Guns" }, + { id: "4160", name: "Business & Industrial > Retail > Retail Display Cases" }, + { id: "499897", name: "Business & Industrial > Retail > Retail Display Props & Models" }, + { id: "1624", name: "Business & Industrial > Science & Laboratory" }, + { id: "6975", name: "Business & Industrial > Science & Laboratory > Biochemicals" }, + { id: "7325", name: "Business & Industrial > Science & Laboratory > Dissection Kits" }, + { id: "3002", name: "Business & Industrial > Science & Laboratory > Laboratory Chemicals" }, + { id: "4335", name: "Business & Industrial > Science & Laboratory > Laboratory Equipment" }, + { + id: "4116", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Autoclaves", + }, + { + id: "4336", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Centrifuges", + }, + { + id: "7218", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Dry Ice Makers", + }, + { + id: "500057", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Freeze-Drying Machines", + }, + { + id: "4474", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Laboratory Blenders", + }, + { + id: "500114", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Laboratory Freezers", + }, + { + id: "503722", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Laboratory Funnels", + }, + { + id: "4133", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Laboratory Hot Plates", + }, + { + id: "4231", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Laboratory Ovens", + }, + { + id: "4555", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories", + }, + { + id: "4557", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories > Microscope Cameras", + }, + { + id: "4556", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories > Microscope Eyepieces & Adapters", + }, + { + id: "4665", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories > Microscope Objective Lenses", + }, + { + id: "4664", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories > Microscope Replacement Bulbs", + }, + { + id: "4558", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscope Accessories > Microscope Slides", + }, + { + id: "158", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microscopes", + }, + { + id: "7437", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Microtomes", + }, + { + id: "7468", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Spectrometer Accessories", + }, + { + id: "7393", + name: "Business & Industrial > Science & Laboratory > Laboratory Equipment > Spectrometers", + }, + { id: "8119", name: "Business & Industrial > Science & Laboratory > Laboratory Specimens" }, + { id: "4255", name: "Business & Industrial > Science & Laboratory > Laboratory Supplies" }, + { + id: "4310", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Beakers", + }, + { + id: "4061", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Graduated Cylinders", + }, + { + id: "4036", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Laboratory Flasks", + }, + { + id: "4276", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Petri Dishes", + }, + { + id: "4075", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Pipettes", + }, + { + id: "4155", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Test Tube Racks", + }, + { + id: "4306", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Test Tubes", + }, + { + id: "4140", + name: "Business & Industrial > Science & Laboratory > Laboratory Supplies > Wash Bottles", + }, + { id: "976", name: "Business & Industrial > Signage" }, + { id: "7322", name: "Business & Industrial > Signage > Business Hour Signs" }, + { id: "8155", name: "Business & Industrial > Signage > Digital Signs" }, + { id: "4297", name: "Business & Industrial > Signage > Electric Signs" }, + { id: "4131", name: "Business & Industrial > Signage > Electric Signs > LED Signs" }, + { id: "4070", name: "Business & Industrial > Signage > Electric Signs > Neon Signs" }, + { id: "5894", name: "Business & Industrial > Signage > Emergency & Exit Signs" }, + { id: "5897", name: "Business & Industrial > Signage > Facility Identification Signs" }, + { id: "7323", name: "Business & Industrial > Signage > Open & Closed Signs" }, + { id: "5896", name: "Business & Industrial > Signage > Parking Signs & Permits" }, + { id: "5900", name: "Business & Industrial > Signage > Policy Signs" }, + { id: "5898", name: "Business & Industrial > Signage > Retail & Sale Signs" }, + { id: "5895", name: "Business & Industrial > Signage > Road & Traffic Signs" }, + { id: "5892", name: "Business & Industrial > Signage > Safety & Warning Signs" }, + { id: "5893", name: "Business & Industrial > Signage > Security Signs" }, + { id: "5899", name: "Business & Industrial > Signage > Sidewalk & Yard Signs" }, + { id: "2047", name: "Business & Industrial > Work Safety Protective Gear" }, + { id: "2389", name: "Business & Industrial > Work Safety Protective Gear > Bullet Proof Vests" }, + { + id: "8269", + name: "Business & Industrial > Work Safety Protective Gear > Gas Mask & Respirator Accessories", + }, + { id: "2723", name: "Business & Industrial > Work Safety Protective Gear > Hardhats" }, + { + id: "2808", + name: "Business & Industrial > Work Safety Protective Gear > Hazardous Material Suits", + }, + { id: "6764", name: "Business & Industrial > Work Safety Protective Gear > Protective Aprons" }, + { id: "2227", name: "Business & Industrial > Work Safety Protective Gear > Protective Eyewear" }, + { id: "503724", name: "Business & Industrial > Work Safety Protective Gear > Protective Masks" }, + { + id: "7407", + name: "Business & Industrial > Work Safety Protective Gear > Protective Masks > Dust Masks", + }, + { + id: "2349", + name: "Business & Industrial > Work Safety Protective Gear > Protective Masks > Fireman's Masks", + }, + { + id: "2473", + name: "Business & Industrial > Work Safety Protective Gear > Protective Masks > Gas Masks & Respirators", + }, + { + id: "513", + name: "Business & Industrial > Work Safety Protective Gear > Protective Masks > Medical Masks", + }, + { id: "5591", name: "Business & Industrial > Work Safety Protective Gear > Safety Gloves" }, + { id: "499961", name: "Business & Industrial > Work Safety Protective Gear > Safety Knee Pads" }, + { id: "499927", name: "Business & Industrial > Work Safety Protective Gear > Welding Helmets" }, + { + id: "499708", + name: "Business & Industrial > Work Safety Protective Gear > Work Safety Harnesses", + }, + { id: "7085", name: "Business & Industrial > Work Safety Protective Gear > Work Safety Tethers" }, + { id: "141", name: "Cameras & Optics" }, + { id: "2096", name: "Cameras & Optics > Camera & Optic Accessories" }, + { + id: "463625", + name: "Cameras & Optics > Camera & Optic Accessories > Camera & Optic Replacement Cables", + }, + { + id: "149", + name: "Cameras & Optics > Camera & Optic Accessories > Camera & Video Camera Lenses", + }, + { + id: "4432", + name: "Cameras & Optics > Camera & Optic Accessories > Camera & Video Camera Lenses > Camera Lenses", + }, + { + id: "5346", + name: "Cameras & Optics > Camera & Optic Accessories > Camera & Video Camera Lenses > Surveillance Camera Lenses", + }, + { + id: "5280", + name: "Cameras & Optics > Camera & Optic Accessories > Camera & Video Camera Lenses > Video Camera Lenses", + }, + { id: "2911", name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories" }, + { + id: "5588", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens & Filter Adapter Rings", + }, + { + id: "4441", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens Bags", + }, + { + id: "2829", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens Caps", + }, + { + id: "4416", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens Converters", + }, + { + id: "147", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens Filters", + }, + { + id: "2627", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Lens Accessories > Lens Hoods", + }, + { id: "143", name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories" }, + { + id: "8174", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Accessory Sets", + }, + { + id: "6308", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Bags & Cases", + }, + { + id: "296246", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Body Replacement Panels & Doors", + }, + { + id: "298420", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Digital Backs", + }, + { + id: "153", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Film", + }, + { + id: "5479", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Flash Accessories", + }, + { + id: "148", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Flashes", + }, + { + id: "500104", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Focus Devices", + }, + { + id: "461567", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Gears", + }, + { + id: "500037", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Grips", + }, + { + id: "296248", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Image Sensors", + }, + { + id: "461568", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Lens Zoom Units", + }, + { + id: "5532", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Remote Controls", + }, + { + id: "296247", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Replacement Buttons & Knobs", + }, + { + id: "296249", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Replacement Screens & Displays", + }, + { + id: "503020", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Silencers & Sound Blimps", + }, + { + id: "499998", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Stabilizers & Supports", + }, + { + id: "5429", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Straps", + }, + { + id: "503019", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Camera Sun Hoods & Viewfinder Attachments", + }, + { + id: "2987", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Flash Brackets", + }, + { + id: "500107", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > On-Camera Monitors", + }, + { + id: "5937", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Surveillance Camera Accessories", + }, + { + id: "8535", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Underwater Camera Housing Accessories", + }, + { + id: "6307", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Underwater Camera Housings", + }, + { + id: "2394", + name: "Cameras & Optics > Camera & Optic Accessories > Camera Parts & Accessories > Video Camera Lights", + }, + { id: "160", name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories" }, + { + id: "5282", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Binocular & Monocular Accessories", + }, + { + id: "5545", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Optics Bags & Cases", + }, + { + id: "5283", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Rangefinder Accessories", + }, + { + id: "5542", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Spotting Scope Accessories", + }, + { + id: "5284", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Telescope Accessories", + }, + { + id: "4274", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Thermal Optic Accessories", + }, + { + id: "5543", + name: "Cameras & Optics > Camera & Optic Accessories > Optic Accessories > Weapon Scope & Sight Accessories", + }, + { + id: "4638", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories", + }, + { + id: "4640", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories > Tripod & Monopod Cases", + }, + { + id: "4639", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories > Tripod & Monopod Heads", + }, + { + id: "3035", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories > Tripod Collars & Mounts", + }, + { + id: "503726", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories > Tripod Handles", + }, + { + id: "503016", + name: "Cameras & Optics > Camera & Optic Accessories > Tripod & Monopod Accessories > Tripod Spreaders", + }, + { id: "150", name: "Cameras & Optics > Camera & Optic Accessories > Tripods & Monopods" }, + { id: "142", name: "Cameras & Optics > Cameras" }, + { id: "499976", name: "Cameras & Optics > Cameras > Borescopes" }, + { id: "152", name: "Cameras & Optics > Cameras > Digital Cameras" }, + { id: "4024", name: "Cameras & Optics > Cameras > Disposable Cameras" }, + { id: "154", name: "Cameras & Optics > Cameras > Film Cameras" }, + { id: "362", name: "Cameras & Optics > Cameras > Surveillance Cameras" }, + { id: "5402", name: "Cameras & Optics > Cameras > Trail Cameras" }, + { id: "155", name: "Cameras & Optics > Cameras > Video Cameras" }, + { id: "312", name: "Cameras & Optics > Cameras > Webcams" }, + { id: "156", name: "Cameras & Optics > Optics" }, + { id: "157", name: "Cameras & Optics > Optics > Binoculars" }, + { id: "4164", name: "Cameras & Optics > Optics > Monoculars" }, + { id: "161", name: "Cameras & Optics > Optics > Rangefinders" }, + { id: "4040", name: "Cameras & Optics > Optics > Scopes" }, + { id: "4136", name: "Cameras & Optics > Optics > Scopes > Spotting Scopes" }, + { id: "165", name: "Cameras & Optics > Optics > Scopes > Telescopes" }, + { id: "1695", name: "Cameras & Optics > Optics > Scopes > Weapon Scopes & Sights" }, + { id: "39", name: "Cameras & Optics > Photography" }, + { id: "41", name: "Cameras & Optics > Photography > Darkroom" }, + { + id: "2234", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment", + }, + { + id: "2625", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment > Copystands", + }, + { + id: "2999", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment > Darkroom Sinks", + }, + { + id: "2650", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment > Developing Tanks & Reels", + }, + { + id: "2728", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment > Print Trays, Washers & Dryers", + }, + { + id: "2516", + name: "Cameras & Optics > Photography > Darkroom > Developing & Processing Equipment > Retouching Equipment & Supplies", + }, + { id: "2520", name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment" }, + { + id: "2969", + name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment > Darkroom Easels", + }, + { + id: "2543", + name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment > Darkroom Timers", + }, + { + id: "3029", + name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment > Focusing Aids", + }, + { + id: "2815", + name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment > Photographic Analyzers", + }, + { + id: "2698", + name: "Cameras & Optics > Photography > Darkroom > Enlarging Equipment > Photographic Enlargers", + }, + { id: "1622", name: "Cameras & Optics > Photography > Darkroom > Photographic Chemicals" }, + { id: "2804", name: "Cameras & Optics > Photography > Darkroom > Photographic Paper" }, + { id: "2600", name: "Cameras & Optics > Photography > Darkroom > Safelights" }, + { id: "42", name: "Cameras & Optics > Photography > Lighting & Studio" }, + { + id: "5499", + name: "Cameras & Optics > Photography > Lighting & Studio > Light Meter Accessories", + }, + { id: "1548", name: "Cameras & Optics > Photography > Lighting & Studio > Light Meters" }, + { id: "1611", name: "Cameras & Optics > Photography > Lighting & Studio > Studio Backgrounds" }, + { + id: "503018", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Light & Flash Accessories", + }, + { + id: "2475", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lighting Controls", + }, + { + id: "3056", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lighting Controls > Flash Diffusers", + }, + { + id: "5431", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lighting Controls > Flash Reflectors", + }, + { + id: "2490", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lighting Controls > Lighting Filters & Gobos", + }, + { + id: "5432", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lighting Controls > Softboxes", + }, + { + id: "2926", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Lights & Flashes", + }, + { + id: "503017", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Stand & Mount Accessories", + }, + { + id: "2007", + name: "Cameras & Optics > Photography > Lighting & Studio > Studio Stands & Mounts", + }, + { id: "503735", name: "Cameras & Optics > Photography > Photo Mounting Supplies" }, + { id: "4368", name: "Cameras & Optics > Photography > Photo Negative & Slide Storage" }, + { id: "222", name: "Electronics" }, + { id: "3356", name: "Electronics > Arcade Equipment" }, + { id: "8085", name: "Electronics > Arcade Equipment > Basketball Arcade Games" }, + { id: "3946", name: "Electronics > Arcade Equipment > Pinball Machine Accessories" }, + { id: "3140", name: "Electronics > Arcade Equipment > Pinball Machines" }, + { id: "3681", name: "Electronics > Arcade Equipment > Skee-Ball Machines" }, + { id: "3676", name: "Electronics > Arcade Equipment > Video Game Arcade Cabinet Accessories" }, + { id: "3117", name: "Electronics > Arcade Equipment > Video Game Arcade Cabinets" }, + { id: "223", name: "Electronics > Audio" }, + { id: "1420", name: "Electronics > Audio > Audio Accessories" }, + { + id: "503008", + name: "Electronics > Audio > Audio Accessories > Audio & Video Receiver Accessories", + }, + { + id: "505797", + name: "Electronics > Audio > Audio Accessories > Headphone & Headset Accessories", + }, + { + id: "503004", + name: "Electronics > Audio > Audio Accessories > Headphone & Headset Accessories > Headphone Cushions & Tips", + }, + { id: "5395", name: "Electronics > Audio > Audio Accessories > Karaoke System Accessories" }, + { + id: "5396", + name: "Electronics > Audio > Audio Accessories > Karaoke System Accessories > Karaoke Chips", + }, + { id: "232", name: "Electronics > Audio > Audio Accessories > MP3 Player Accessories" }, + { + id: "7566", + name: "Electronics > Audio > Audio Accessories > MP3 Player Accessories > MP3 Player & Mobile Phone Accessory Sets", + }, + { + id: "3055", + name: "Electronics > Audio > Audio Accessories > MP3 Player Accessories > MP3 Player Cases", + }, + { id: "3306", name: "Electronics > Audio > Audio Accessories > Microphone Accessories" }, + { id: "3912", name: "Electronics > Audio > Audio Accessories > Microphone Stands" }, + { id: "239", name: "Electronics > Audio > Audio Accessories > Satellite Radio Accessories" }, + { id: "7163", name: "Electronics > Audio > Audio Accessories > Speaker Accessories" }, + { + id: "500112", + name: "Electronics > Audio > Audio Accessories > Speaker Accessories > Speaker Bags, Covers & Cases", + }, + { + id: "500120", + name: "Electronics > Audio > Audio Accessories > Speaker Accessories > Speaker Components & Kits", + }, + { + id: "8047", + name: "Electronics > Audio > Audio Accessories > Speaker Accessories > Speaker Stand Bags", + }, + { + id: "8049", + name: "Electronics > Audio > Audio Accessories > Speaker Accessories > Speaker Stands & Mounts", + }, + { + id: "500119", + name: "Electronics > Audio > Audio Accessories > Speaker Accessories > Tactile Transducers", + }, + { id: "2372", name: "Electronics > Audio > Audio Accessories > Turntable Accessories" }, + { id: "2165", name: "Electronics > Audio > Audio Components" }, + { id: "241", name: "Electronics > Audio > Audio Components > Audio & Video Receivers" }, + { id: "224", name: "Electronics > Audio > Audio Components > Audio Amplifiers" }, + { + id: "4493", + name: "Electronics > Audio > Audio Components > Audio Amplifiers > Headphone Amplifiers", + }, + { + id: "5381", + name: "Electronics > Audio > Audio Components > Audio Amplifiers > Power Amplifiers", + }, + { id: "236", name: "Electronics > Audio > Audio Components > Audio Mixers" }, + { id: "5129", name: "Electronics > Audio > Audio Components > Audio Transmitters" }, + { + id: "5130", + name: "Electronics > Audio > Audio Components > Audio Transmitters > Bluetooth Transmitters", + }, + { + id: "4035", + name: "Electronics > Audio > Audio Components > Audio Transmitters > FM Transmitters", + }, + { id: "6545", name: "Electronics > Audio > Audio Components > Channel Strips" }, + { id: "6546", name: "Electronics > Audio > Audio Components > Direct Boxes" }, + { id: "505771", name: "Electronics > Audio > Audio Components > Headphones & Headsets" }, + { + id: "543626", + name: "Electronics > Audio > Audio Components > Headphones & Headsets > Headphones", + }, + { + id: "543627", + name: "Electronics > Audio > Audio Components > Headphones & Headsets > Headsets", + }, + { id: "234", name: "Electronics > Audio > Audio Components > Microphones" }, + { id: "246", name: "Electronics > Audio > Audio Components > Signal Processors" }, + { id: "5435", name: "Electronics > Audio > Audio Components > Signal Processors > Crossovers" }, + { + id: "247", + name: "Electronics > Audio > Audio Components > Signal Processors > Effects Processors", + }, + { id: "248", name: "Electronics > Audio > Audio Components > Signal Processors > Equalizers" }, + { + id: "5597", + name: "Electronics > Audio > Audio Components > Signal Processors > Loudspeaker Management Systems", + }, + { + id: "3945", + name: "Electronics > Audio > Audio Components > Signal Processors > Microphone Preamps", + }, + { + id: "5596", + name: "Electronics > Audio > Audio Components > Signal Processors > Noise Gates & Compressors", + }, + { + id: "5369", + name: "Electronics > Audio > Audio Components > Signal Processors > Phono Preamps", + }, + { id: "249", name: "Electronics > Audio > Audio Components > Speakers" }, + { id: "505298", name: "Electronics > Audio > Audio Components > Studio Recording Bundles" }, + { id: "242", name: "Electronics > Audio > Audio Players & Recorders" }, + { id: "225", name: "Electronics > Audio > Audio Players & Recorders > Boomboxes" }, + { id: "226", name: "Electronics > Audio > Audio Players & Recorders > CD Players & Recorders" }, + { + id: "243", + name: "Electronics > Audio > Audio Players & Recorders > Cassette Players & Recorders", + }, + { id: "252", name: "Electronics > Audio > Audio Players & Recorders > Home Theater Systems" }, + { id: "4652", name: "Electronics > Audio > Audio Players & Recorders > Jukeboxes" }, + { id: "230", name: "Electronics > Audio > Audio Players & Recorders > Karaoke Systems" }, + { id: "233", name: "Electronics > Audio > Audio Players & Recorders > MP3 Players" }, + { + id: "235", + name: "Electronics > Audio > Audio Players & Recorders > MiniDisc Players & Recorders", + }, + { id: "5434", name: "Electronics > Audio > Audio Players & Recorders > Multitrack Recorders" }, + { id: "6886", name: "Electronics > Audio > Audio Players & Recorders > Radios" }, + { + id: "8271", + name: "Electronics > Audio > Audio Players & Recorders > Reel-to-Reel Tape Players & Recorders", + }, + { id: "251", name: "Electronics > Audio > Audio Players & Recorders > Stereo Systems" }, + { + id: "256", + name: "Electronics > Audio > Audio Players & Recorders > Turntables & Record Players", + }, + { id: "244", name: "Electronics > Audio > Audio Players & Recorders > Voice Recorders" }, + { id: "8159", name: "Electronics > Audio > Bullhorns" }, + { id: "4921", name: "Electronics > Audio > DJ & Specialty Audio" }, + { id: "4922", name: "Electronics > Audio > DJ & Specialty Audio > DJ CD Players" }, + { id: "4923", name: "Electronics > Audio > DJ & Specialty Audio > DJ Systems" }, + { id: "2154", name: "Electronics > Audio > Public Address Systems" }, + { id: "3727", name: "Electronics > Audio > Stage Equipment" }, + { id: "3242", name: "Electronics > Audio > Stage Equipment > Wireless Transmitters" }, + { id: "3702", name: "Electronics > Circuit Boards & Components" }, + { id: "500027", name: "Electronics > Circuit Boards & Components > Circuit Board Accessories" }, + { id: "7259", name: "Electronics > Circuit Boards & Components > Circuit Decoders & Encoders" }, + { id: "3889", name: "Electronics > Circuit Boards & Components > Circuit Prototyping" }, + { + id: "4010", + name: "Electronics > Circuit Boards & Components > Circuit Prototyping > Breadboards", + }, + { id: "7258", name: "Electronics > Circuit Boards & Components > Electronic Filters" }, + { id: "3635", name: "Electronics > Circuit Boards & Components > Passive Circuit Components" }, + { + id: "3220", + name: "Electronics > Circuit Boards & Components > Passive Circuit Components > Capacitors", + }, + { + id: "7260", + name: "Electronics > Circuit Boards & Components > Passive Circuit Components > Electronic Oscillators", + }, + { + id: "3121", + name: "Electronics > Circuit Boards & Components > Passive Circuit Components > Inductors", + }, + { + id: "3424", + name: "Electronics > Circuit Boards & Components > Passive Circuit Components > Resistors", + }, + { id: "7264", name: "Electronics > Circuit Boards & Components > Printed Circuit Boards" }, + { + id: "298419", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Camera Circuit Boards", + }, + { + id: "499898", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Computer Circuit Boards", + }, + { + id: "499899", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Computer Circuit Boards > Computer Inverter Boards", + }, + { + id: "8546", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Computer Circuit Boards > Hard Drive Circuit Boards", + }, + { + id: "289", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Computer Circuit Boards > Motherboards", + }, + { + id: "3416", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Development Boards", + }, + { + id: "499889", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Exercise Machine Circuit Boards", + }, + { + id: "8545", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Household Appliance Circuit Boards", + }, + { + id: "8549", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Pool & Spa Circuit Boards", + }, + { + id: "8544", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Printer, Copier, & Fax Machine Circuit Boards", + }, + { + id: "499675", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Scanner Circuit Boards", + }, + { + id: "8516", + name: "Electronics > Circuit Boards & Components > Printed Circuit Boards > Television Circuit Boards", + }, + { id: "3991", name: "Electronics > Circuit Boards & Components > Semiconductors" }, + { id: "3632", name: "Electronics > Circuit Boards & Components > Semiconductors > Diodes" }, + { + id: "7257", + name: "Electronics > Circuit Boards & Components > Semiconductors > Integrated Circuits & Chips", + }, + { + id: "3949", + name: "Electronics > Circuit Boards & Components > Semiconductors > Microcontrollers", + }, + { id: "3094", name: "Electronics > Circuit Boards & Components > Semiconductors > Transistors" }, + { id: "262", name: "Electronics > Communications" }, + { id: "266", name: "Electronics > Communications > Answering Machines" }, + { id: "5275", name: "Electronics > Communications > Caller IDs" }, + { id: "263", name: "Electronics > Communications > Communication Radio Accessories" }, + { id: "2471", name: "Electronics > Communications > Communication Radios" }, + { id: "2106", name: "Electronics > Communications > Communication Radios > CB Radios" }, + { id: "4415", name: "Electronics > Communications > Communication Radios > Radio Scanners" }, + { id: "273", name: "Electronics > Communications > Communication Radios > Two-Way Radios" }, + { id: "5404", name: "Electronics > Communications > Intercom Accessories" }, + { id: "360", name: "Electronics > Communications > Intercoms" }, + { id: "268", name: "Electronics > Communications > Pagers" }, + { id: "270", name: "Electronics > Communications > Telephony" }, + { id: "4666", name: "Electronics > Communications > Telephony > Conference Phones" }, + { id: "271", name: "Electronics > Communications > Telephony > Corded Phones" }, + { id: "272", name: "Electronics > Communications > Telephony > Cordless Phones" }, + { id: "264", name: "Electronics > Communications > Telephony > Mobile Phone Accessories" }, + { + id: "8111", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Camera Accessories", + }, + { + id: "2353", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Cases", + }, + { + id: "4550", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Charms & Straps", + }, + { + id: "6030", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Pre-Paid Cards & SIM Cards", + }, + { + id: "543515", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Pre-Paid Cards & SIM Cards > Mobile Phone Pre-Paid Cards", + }, + { + id: "543516", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Pre-Paid Cards & SIM Cards > SIM Cards", + }, + { + id: "7347", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Replacement Parts", + }, + { + id: "5566", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > Mobile Phone Stands", + }, + { + id: "499916", + name: "Electronics > Communications > Telephony > Mobile Phone Accessories > SIM Card Ejection Tools", + }, + { id: "267", name: "Electronics > Communications > Telephony > Mobile Phones" }, + { + id: "543513", + name: "Electronics > Communications > Telephony > Mobile Phones > Contract Mobile Phones", + }, + { + id: "543512", + name: "Electronics > Communications > Telephony > Mobile Phones > Pre-paid Mobile Phones", + }, + { + id: "543514", + name: "Electronics > Communications > Telephony > Mobile Phones > Unlocked Mobile Phones", + }, + { id: "1924", name: "Electronics > Communications > Telephony > Satellite Phones" }, + { id: "265", name: "Electronics > Communications > Telephony > Telephone Accessories" }, + { + id: "269", + name: "Electronics > Communications > Telephony > Telephone Accessories > Phone Cards", + }, + { id: "274", name: "Electronics > Communications > Video Conferencing" }, + { id: "1801", name: "Electronics > Components" }, + { id: "7395", name: "Electronics > Components > Accelerometers" }, + { id: "2182", name: "Electronics > Components > Converters" }, + { id: "503001", name: "Electronics > Components > Converters > Audio Converters" }, + { id: "2205", name: "Electronics > Components > Converters > Scan Converters" }, + { id: "1977", name: "Electronics > Components > Electronics Component Connectors" }, + { id: "1337", name: "Electronics > Components > Modulators" }, + { id: "1544", name: "Electronics > Components > Splitters" }, + { id: "278", name: "Electronics > Computers" }, + { id: "5254", name: "Electronics > Computers > Barebone Computers" }, + { id: "331", name: "Electronics > Computers > Computer Servers" }, + { id: "325", name: "Electronics > Computers > Desktop Computers" }, + { id: "298", name: "Electronics > Computers > Handheld Devices" }, + { id: "5256", name: "Electronics > Computers > Handheld Devices > Data Collectors" }, + { id: "3539", name: "Electronics > Computers > Handheld Devices > E-Book Readers" }, + { id: "3769", name: "Electronics > Computers > Handheld Devices > PDAs" }, + { id: "5255", name: "Electronics > Computers > Interactive Kiosks" }, + { id: "328", name: "Electronics > Computers > Laptops" }, + { id: "500002", name: "Electronics > Computers > Smart Glasses" }, + { id: "4745", name: "Electronics > Computers > Tablet Computers" }, + { id: "8539", name: "Electronics > Computers > Thin & Zero Clients" }, + { id: "543668", name: "Electronics > Computers > Thin & Zero Clients > Thin Client Computers" }, + { id: "543669", name: "Electronics > Computers > Thin & Zero Clients > Zero Client Computers" }, + { id: "502995", name: "Electronics > Computers > Touch Table Computers" }, + { id: "2082", name: "Electronics > Electronics Accessories" }, + { id: "258", name: "Electronics > Electronics Accessories > Adapters" }, + { + id: "4463", + name: "Electronics > Electronics Accessories > Adapters > Audio & Video Cable Adapters & Couplers", + }, + { id: "146", name: "Electronics > Electronics Accessories > Adapters > Memory Card Adapters" }, + { id: "7182", name: "Electronics > Electronics Accessories > Adapters > USB Adapters" }, + { id: "5476", name: "Electronics > Electronics Accessories > Antenna Accessories" }, + { + id: "5477", + name: "Electronics > Electronics Accessories > Antenna Accessories > Antenna Mounts & Brackets", + }, + { + id: "5478", + name: "Electronics > Electronics Accessories > Antenna Accessories > Antenna Rotators", + }, + { + id: "6016", + name: "Electronics > Electronics Accessories > Antenna Accessories > Satellite LNBs", + }, + { id: "1718", name: "Electronics > Electronics Accessories > Antennas" }, + { + id: "8156", + name: "Electronics > Electronics Accessories > Audio & Video Splitters & Switches", + }, + { + id: "499944", + name: "Electronics > Electronics Accessories > Audio & Video Splitters & Switches > DVI Splitters & Switches", + }, + { + id: "8164", + name: "Electronics > Electronics Accessories > Audio & Video Splitters & Switches > HDMI Splitters & Switches", + }, + { + id: "499945", + name: "Electronics > Electronics Accessories > Audio & Video Splitters & Switches > VGA Splitters & Switches", + }, + { id: "367", name: "Electronics > Electronics Accessories > Blank Media" }, + { id: "3328", name: "Electronics > Electronics Accessories > Cable Management" }, + { id: "3764", name: "Electronics > Electronics Accessories > Cable Management > Cable Clips" }, + { + id: "500036", + name: "Electronics > Electronics Accessories > Cable Management > Cable Tie Guns", + }, + { id: "6402", name: "Electronics > Electronics Accessories > Cable Management > Cable Trays" }, + { id: "5273", name: "Electronics > Electronics Accessories > Cable Management > Patch Panels" }, + { + id: "499686", + name: "Electronics > Electronics Accessories > Cable Management > Wire & Cable Identification Markers", + }, + { + id: "6780", + name: "Electronics > Electronics Accessories > Cable Management > Wire & Cable Sleeves", + }, + { + id: "4016", + name: "Electronics > Electronics Accessories > Cable Management > Wire & Cable Ties", + }, + { id: "259", name: "Electronics > Electronics Accessories > Cables" }, + { id: "1867", name: "Electronics > Electronics Accessories > Cables > Audio & Video Cables" }, + { id: "3461", name: "Electronics > Electronics Accessories > Cables > KVM Cables" }, + { id: "1480", name: "Electronics > Electronics Accessories > Cables > Network Cables" }, + { + id: "500035", + name: "Electronics > Electronics Accessories > Cables > Storage & Data Transfer Cables", + }, + { id: "1763", name: "Electronics > Electronics Accessories > Cables > System & Power Cables" }, + { id: "3541", name: "Electronics > Electronics Accessories > Cables > Telephone Cables" }, + { id: "279", name: "Electronics > Electronics Accessories > Computer Accessories" }, + { + id: "500040", + name: "Electronics > Electronics Accessories > Computer Accessories > Computer Accessory Sets", + }, + { + id: "7530", + name: "Electronics > Electronics Accessories > Computer Accessories > Computer Covers & Skins", + }, + { + id: "5489", + name: "Electronics > Electronics Accessories > Computer Accessories > Computer Risers & Stands", + }, + { + id: "280", + name: "Electronics > Electronics Accessories > Computer Accessories > Handheld Device Accessories", + }, + { + id: "4736", + name: "Electronics > Electronics Accessories > Computer Accessories > Handheld Device Accessories > E-Book Reader Accessories", + }, + { + id: "4738", + name: "Electronics > Electronics Accessories > Computer Accessories > Handheld Device Accessories > E-Book Reader Accessories > E-Book Reader Cases", + }, + { + id: "4737", + name: "Electronics > Electronics Accessories > Computer Accessories > Handheld Device Accessories > PDA Accessories", + }, + { + id: "4739", + name: "Electronics > Electronics Accessories > Computer Accessories > Handheld Device Accessories > PDA Accessories > PDA Cases", + }, + { + id: "6291", + name: "Electronics > Electronics Accessories > Computer Accessories > Keyboard & Mouse Wrist Rests", + }, + { + id: "6979", + name: "Electronics > Electronics Accessories > Computer Accessories > Keyboard Trays & Platforms", + }, + { + id: "300", + name: "Electronics > Electronics Accessories > Computer Accessories > Laptop Docking Stations", + }, + { id: "1993", name: "Electronics > Electronics Accessories > Computer Accessories > Mouse Pads" }, + { + id: "5669", + name: "Electronics > Electronics Accessories > Computer Accessories > Stylus Pen Nibs & Refills", + }, + { + id: "5308", + name: "Electronics > Electronics Accessories > Computer Accessories > Stylus Pens", + }, + { + id: "499956", + name: "Electronics > Electronics Accessories > Computer Accessories > Tablet Computer Docks & Stands", + }, + { id: "285", name: "Electronics > Electronics Accessories > Computer Components" }, + { + id: "6932", + name: "Electronics > Electronics Accessories > Computer Components > Blade Server Enclosures", + }, + { + id: "8158", + name: "Electronics > Electronics Accessories > Computer Components > Computer Backplates & I/O Shields", + }, + { + id: "291", + name: "Electronics > Electronics Accessories > Computer Components > Computer Power Supplies", + }, + { + id: "292", + name: "Electronics > Electronics Accessories > Computer Components > Computer Processors", + }, + { + id: "293", + name: "Electronics > Electronics Accessories > Computer Components > Computer Racks & Mounts", + }, + { + id: "294", + name: "Electronics > Electronics Accessories > Computer Components > Computer Starter Kits", + }, + { + id: "295", + name: "Electronics > Electronics Accessories > Computer Components > Computer System Cooling Parts", + }, + { + id: "296", + name: "Electronics > Electronics Accessories > Computer Components > Desktop Computer & Server Cases", + }, + { + id: "8162", + name: "Electronics > Electronics Accessories > Computer Components > E-Book Reader Parts", + }, + { + id: "8163", + name: "Electronics > Electronics Accessories > Computer Components > E-Book Reader Parts > E-Book Reader Screens & Screen Digitizers", + }, + { + id: "287", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters", + }, + { + id: "286", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters > Audio Cards & Adapters", + }, + { + id: "505299", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters > Computer Interface Cards & Adapters", + }, + { + id: "503755", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters > Riser Cards", + }, + { + id: "1487", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters > TV Tuner Cards & Adapters", + }, + { + id: "297", + name: "Electronics > Electronics Accessories > Computer Components > I/O Cards & Adapters > Video Cards & Adapters", + }, + { + id: "6475", + name: "Electronics > Electronics Accessories > Computer Components > Input Device Accessories", + }, + { + id: "6476", + name: "Electronics > Electronics Accessories > Computer Components > Input Device Accessories > Barcode Scanner Stands", + }, + { + id: "8008", + name: "Electronics > Electronics Accessories > Computer Components > Input Device Accessories > Game Controller Accessories", + }, + { + id: "503003", + name: "Electronics > Electronics Accessories > Computer Components > Input Device Accessories > Keyboard Keys & Caps", + }, + { + id: "500052", + name: "Electronics > Electronics Accessories > Computer Components > Input Device Accessories > Mice & Trackball Accessories", + }, + { + id: "1928", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices", + }, + { + id: "139", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Barcode Scanners", + }, + { + id: "5309", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Digital Note Taking Pens", + }, + { + id: "505801", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Electronic Card Readers", + }, + { + id: "5366", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Fingerprint Readers", + }, + { + id: "301", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers", + }, + { + id: "543591", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers > Game Racing Wheels", + }, + { + id: "543590", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers > Game Remotes", + }, + { + id: "543589", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers > Gaming Pads", + }, + { + id: "543588", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers > Joystick Controllers", + }, + { + id: "543593", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Game Controllers > Musical Instrument Game Controllers", + }, + { + id: "499950", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Gesture Control Input Devices", + }, + { + id: "302", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Graphics Tablets", + }, + { + id: "1562", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > KVM Switches", + }, + { + id: "303", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Keyboards", + }, + { + id: "3580", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Memory Card Readers", + }, + { + id: "304", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Mice & Trackballs", + }, + { + id: "4512", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Numeric Keypads", + }, + { + id: "308", + name: "Electronics > Electronics Accessories > Computer Components > Input Devices > Touchpads", + }, + { + id: "4224", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts", + }, + { + id: "6416", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Hinges", + }, + { + id: "4270", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Housings & Trim", + }, + { + id: "7501", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Replacement Cables", + }, + { + id: "4301", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Replacement Keyboards", + }, + { + id: "4102", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Replacement Screens", + }, + { + id: "43617", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Replacement Speakers", + }, + { + id: "8160", + name: "Electronics > Electronics Accessories > Computer Components > Laptop Parts > Laptop Screen Digitizers", + }, + { + id: "2414", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices", + }, + { + id: "5268", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Disk Duplicators", + }, + { + id: "376", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Disk Duplicators > CD/DVD Duplicators", + }, + { + id: "5271", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Disk Duplicators > Hard Drive Duplicators", + }, + { + id: "5112", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Disk Duplicators > USB Drive Duplicators", + }, + { + id: "1301", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Floppy Drives", + }, + { + id: "1623", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drive Accessories", + }, + { + id: "381", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drive Accessories > Hard Drive Carrying Cases", + }, + { + id: "4417", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drive Accessories > Hard Drive Docks", + }, + { + id: "505767", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drive Accessories > Hard Drive Enclosures & Mounts", + }, + { + id: "5272", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drive Arrays", + }, + { + id: "380", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Hard Drives", + }, + { + id: "5269", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Network Storage Systems", + }, + { + id: "377", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Optical Drives", + }, + { + id: "385", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > Tape Drives", + }, + { + id: "3712", + name: "Electronics > Electronics Accessories > Computer Components > Storage Devices > USB Flash Drives", + }, + { + id: "7349", + name: "Electronics > Electronics Accessories > Computer Components > Tablet Computer Parts", + }, + { + id: "503002", + name: "Electronics > Electronics Accessories > Computer Components > Tablet Computer Parts > Tablet Computer Housings & Trim", + }, + { + id: "45262", + name: "Electronics > Electronics Accessories > Computer Components > Tablet Computer Parts > Tablet Computer Replacement Speakers", + }, + { + id: "500013", + name: "Electronics > Electronics Accessories > Computer Components > Tablet Computer Parts > Tablet Computer Screens & Screen Digitizers", + }, + { + id: "311", + name: "Electronics > Electronics Accessories > Computer Components > USB & FireWire Hubs", + }, + { id: "4617", name: "Electronics > Electronics Accessories > Electronics Cleaners" }, + { id: "5466", name: "Electronics > Electronics Accessories > Electronics Films & Shields" }, + { + id: "5523", + name: "Electronics > Electronics Accessories > Electronics Films & Shields > Electronics Stickers & Decals", + }, + { + id: "5469", + name: "Electronics > Electronics Accessories > Electronics Films & Shields > Keyboard Protectors", + }, + { + id: "5467", + name: "Electronics > Electronics Accessories > Electronics Films & Shields > Privacy Filters", + }, + { + id: "5468", + name: "Electronics > Electronics Accessories > Electronics Films & Shields > Screen Protectors", + }, + { id: "288", name: "Electronics > Electronics Accessories > Memory" }, + { id: "1665", name: "Electronics > Electronics Accessories > Memory > Cache Memory" }, + { id: "384", name: "Electronics > Electronics Accessories > Memory > Flash Memory" }, + { + id: "3387", + name: "Electronics > Electronics Accessories > Memory > Flash Memory > Flash Memory Cards", + }, + { id: "1733", name: "Electronics > Electronics Accessories > Memory > RAM" }, + { id: "2130", name: "Electronics > Electronics Accessories > Memory > ROM" }, + { id: "1767", name: "Electronics > Electronics Accessories > Memory > Video Memory" }, + { id: "3422", name: "Electronics > Electronics Accessories > Memory Accessories" }, + { id: "3672", name: "Electronics > Electronics Accessories > Memory Accessories > Memory Cases" }, + { + id: "499878", + name: "Electronics > Electronics Accessories > Mobile Phone & Tablet Tripods & Monopods", + }, + { id: "275", name: "Electronics > Electronics Accessories > Power" }, + { id: "276", name: "Electronics > Electronics Accessories > Power > Batteries" }, + { + id: "1722", + name: "Electronics > Electronics Accessories > Power > Batteries > Camera Batteries", + }, + { + id: "1880", + name: "Electronics > Electronics Accessories > Power > Batteries > Cordless Phone Batteries", + }, + { + id: "7551", + name: "Electronics > Electronics Accessories > Power > Batteries > E-Book Reader Batteries", + }, + { + id: "4928", + name: "Electronics > Electronics Accessories > Power > Batteries > General Purpose Batteries", + }, + { + id: "1564", + name: "Electronics > Electronics Accessories > Power > Batteries > Laptop Batteries", + }, + { + id: "499810", + name: "Electronics > Electronics Accessories > Power > Batteries > MP3 Player Batteries", + }, + { + id: "1745", + name: "Electronics > Electronics Accessories > Power > Batteries > Mobile Phone Batteries", + }, + { id: "5133", name: "Electronics > Electronics Accessories > Power > Batteries > PDA Batteries" }, + { + id: "7438", + name: "Electronics > Electronics Accessories > Power > Batteries > Tablet Computer Batteries", + }, + { id: "6289", name: "Electronics > Electronics Accessories > Power > Batteries > UPS Batteries" }, + { + id: "2222", + name: "Electronics > Electronics Accessories > Power > Batteries > Video Camera Batteries", + }, + { + id: "500117", + name: "Electronics > Electronics Accessories > Power > Batteries > Video Game Console & Controller Batteries", + }, + { id: "7166", name: "Electronics > Electronics Accessories > Power > Battery Accessories" }, + { + id: "6817", + name: "Electronics > Electronics Accessories > Power > Battery Accessories > Battery Charge Controllers", + }, + { + id: "8243", + name: "Electronics > Electronics Accessories > Power > Battery Accessories > Battery Holders", + }, + { + id: "3130", + name: "Electronics > Electronics Accessories > Power > Battery Accessories > Camera Battery Chargers", + }, + { + id: "7167", + name: "Electronics > Electronics Accessories > Power > Battery Accessories > General Purpose Battery Chargers", + }, + { + id: "499928", + name: "Electronics > Electronics Accessories > Power > Battery Accessories > General Purpose Battery Testers", + }, + { id: "2978", name: "Electronics > Electronics Accessories > Power > Fuel Cells" }, + { + id: "6933", + name: "Electronics > Electronics Accessories > Power > Power Adapter & Charger Accessories", + }, + { + id: "505295", + name: "Electronics > Electronics Accessories > Power > Power Adapters & Chargers", + }, + { id: "6790", name: "Electronics > Electronics Accessories > Power > Power Control Units" }, + { + id: "3160", + name: "Electronics > Electronics Accessories > Power > Power Strips & Surge Suppressors", + }, + { id: "5274", name: "Electronics > Electronics Accessories > Power > Power Supply Enclosures" }, + { id: "5380", name: "Electronics > Electronics Accessories > Power > Surge Protection Devices" }, + { + id: "7135", + name: "Electronics > Electronics Accessories > Power > Travel Converters & Adapters", + }, + { id: "1348", name: "Electronics > Electronics Accessories > Power > UPS" }, + { id: "1375", name: "Electronics > Electronics Accessories > Power > UPS Accessories" }, + { id: "341", name: "Electronics > Electronics Accessories > Remote Controls" }, + { id: "5473", name: "Electronics > Electronics Accessories > Signal Boosters" }, + { id: "5695", name: "Electronics > Electronics Accessories > Signal Jammers" }, + { id: "5612", name: "Electronics > Electronics Accessories > Signal Jammers > GPS Jammers" }, + { + id: "5696", + name: "Electronics > Electronics Accessories > Signal Jammers > Mobile Phone Jammers", + }, + { id: "5589", name: "Electronics > Electronics Accessories > Signal Jammers > Radar Jammers" }, + { id: "3895", name: "Electronics > GPS Accessories" }, + { id: "3781", name: "Electronics > GPS Accessories > GPS Cases" }, + { id: "3213", name: "Electronics > GPS Accessories > GPS Mounts" }, + { id: "339", name: "Electronics > GPS Navigation Systems" }, + { id: "6544", name: "Electronics > GPS Tracking Devices" }, + { id: "340", name: "Electronics > Marine Electronics" }, + { id: "1550", name: "Electronics > Marine Electronics > Fish Finders" }, + { id: "8134", name: "Electronics > Marine Electronics > Marine Audio & Video Receivers" }, + { id: "2178", name: "Electronics > Marine Electronics > Marine Chartplotters & GPS" }, + { id: "1552", name: "Electronics > Marine Electronics > Marine Radar" }, + { id: "4450", name: "Electronics > Marine Electronics > Marine Radios" }, + { id: "8473", name: "Electronics > Marine Electronics > Marine Speakers" }, + { id: "342", name: "Electronics > Networking" }, + { id: "1350", name: "Electronics > Networking > Bridges & Routers" }, + { id: "5659", name: "Electronics > Networking > Bridges & Routers > Network Bridges" }, + { id: "2358", name: "Electronics > Networking > Bridges & Routers > VoIP Gateways & Routers" }, + { id: "5496", name: "Electronics > Networking > Bridges & Routers > Wireless Access Points" }, + { id: "5497", name: "Electronics > Networking > Bridges & Routers > Wireless Routers" }, + { id: "2479", name: "Electronics > Networking > Concentrators & Multiplexers" }, + { id: "2455", name: "Electronics > Networking > Hubs & Switches" }, + { id: "5576", name: "Electronics > Networking > Modem Accessories" }, + { id: "343", name: "Electronics > Networking > Modems" }, + { id: "290", name: "Electronics > Networking > Network Cards & Adapters" }, + { id: "3742", name: "Electronics > Networking > Network Security & Firewall Devices" }, + { id: "6508", name: "Electronics > Networking > Power Over Ethernet Adapters" }, + { id: "3425", name: "Electronics > Networking > Print Servers" }, + { id: "2121", name: "Electronics > Networking > Repeaters & Transceivers" }, + { id: "345", name: "Electronics > Print, Copy, Scan & Fax" }, + { id: "499682", name: "Electronics > Print, Copy, Scan & Fax > 3D Printer Accessories" }, + { id: "6865", name: "Electronics > Print, Copy, Scan & Fax > 3D Printers" }, + { + id: "502990", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories", + }, + { + id: "5258", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables", + }, + { + id: "5259", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Printer Drums & Drum Kits", + }, + { + id: "5266", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Printer Filters", + }, + { + id: "5262", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Printer Maintenance Kits", + }, + { + id: "5260", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Printer Ribbons", + }, + { + id: "5261", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Printheads", + }, + { + id: "7362", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Toner & Inkjet Cartridge Refills", + }, + { + id: "356", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Consumables > Toner & Inkjet Cartridges", + }, + { + id: "5265", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Duplexers", + }, + { + id: "1683", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Memory", + }, + { + id: "5459", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer Stands", + }, + { + id: "502991", + name: "Electronics > Print, Copy, Scan & Fax > Printer, Copier & Fax Machine Accessories > Printer, Copier & Fax Machine Replacement Parts", + }, + { + id: "500106", + name: "Electronics > Print, Copy, Scan & Fax > Printers, Copiers & Fax Machines", + }, + { id: "284", name: "Electronics > Print, Copy, Scan & Fax > Scanner Accessories" }, + { id: "306", name: "Electronics > Print, Copy, Scan & Fax > Scanners" }, + { id: "912", name: "Electronics > Radar Detectors" }, + { id: "500091", name: "Electronics > Speed Radars" }, + { id: "4488", name: "Electronics > Toll Collection Devices" }, + { id: "386", name: "Electronics > Video" }, + { id: "305", name: "Electronics > Video > Computer Monitors" }, + { id: "396", name: "Electronics > Video > Projectors" }, + { id: "397", name: "Electronics > Video > Projectors > Multimedia Projectors" }, + { id: "398", name: "Electronics > Video > Projectors > Overhead Projectors" }, + { id: "399", name: "Electronics > Video > Projectors > Slide Projectors" }, + { id: "5561", name: "Electronics > Video > Satellite & Cable TV" }, + { id: "5562", name: "Electronics > Video > Satellite & Cable TV > Cable TV Receivers" }, + { id: "401", name: "Electronics > Video > Satellite & Cable TV > Satellite Receivers" }, + { id: "404", name: "Electronics > Video > Televisions" }, + { id: "2027", name: "Electronics > Video > Video Accessories" }, + { id: "4760", name: "Electronics > Video > Video Accessories > 3D Glasses" }, + { id: "283", name: "Electronics > Video > Video Accessories > Computer Monitor Accessories" }, + { + id: "5516", + name: "Electronics > Video > Video Accessories > Computer Monitor Accessories > Color Calibrators", + }, + { id: "393", name: "Electronics > Video > Video Accessories > Projector Accessories" }, + { + id: "5599", + name: "Electronics > Video > Video Accessories > Projector Accessories > Projection & Tripod Skirts", + }, + { + id: "4570", + name: "Electronics > Video > Video Accessories > Projector Accessories > Projection Screen Stands", + }, + { + id: "395", + name: "Electronics > Video > Video Accessories > Projector Accessories > Projection Screens", + }, + { + id: "5257", + name: "Electronics > Video > Video Accessories > Projector Accessories > Projector Mounts", + }, + { + id: "394", + name: "Electronics > Video > Video Accessories > Projector Accessories > Projector Replacement Lamps", + }, + { id: "2145", name: "Electronics > Video > Video Accessories > Rewinders" }, + { id: "403", name: "Electronics > Video > Video Accessories > Television Parts & Accessories" }, + { + id: "4458", + name: "Electronics > Video > Video Accessories > Television Parts & Accessories > TV & Monitor Mounts", + }, + { + id: "5503", + name: "Electronics > Video > Video Accessories > Television Parts & Accessories > TV Converter Boxes", + }, + { + id: "5471", + name: "Electronics > Video > Video Accessories > Television Parts & Accessories > TV Replacement Lamps", + }, + { + id: "43616", + name: "Electronics > Video > Video Accessories > Television Parts & Accessories > TV Replacement Speakers", + }, + { id: "1368", name: "Electronics > Video > Video Editing Hardware & Production Equipment" }, + { id: "1634", name: "Electronics > Video > Video Multiplexers" }, + { id: "387", name: "Electronics > Video > Video Players & Recorders" }, + { id: "388", name: "Electronics > Video > Video Players & Recorders > DVD & Blu-ray Players" }, + { id: "389", name: "Electronics > Video > Video Players & Recorders > DVD Recorders" }, + { id: "390", name: "Electronics > Video > Video Players & Recorders > Digital Video Recorders" }, + { + id: "5276", + name: "Electronics > Video > Video Players & Recorders > Streaming & Home Media Players", + }, + { id: "391", name: "Electronics > Video > Video Players & Recorders > VCRs" }, + { id: "5278", name: "Electronics > Video > Video Servers" }, + { id: "5450", name: "Electronics > Video > Video Transmitters" }, + { id: "1270", name: "Electronics > Video Game Console Accessories" }, + { + id: "1505", + name: "Electronics > Video Game Console Accessories > Home Game Console Accessories", + }, + { + id: "2070", + name: "Electronics > Video Game Console Accessories > Portable Game Console Accessories", + }, + { id: "1294", name: "Electronics > Video Game Consoles" }, + { id: "412", name: "Food, Beverages & Tobacco" }, + { id: "413", name: "Food, Beverages & Tobacco > Beverages" }, + { id: "499676", name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages" }, + { id: "414", name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Beer" }, + { id: "7486", name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Bitters" }, + { + id: "5725", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Cocktail Mixes", + }, + { + id: "543537", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Cocktail Mixes > Frozen Cocktail Mixes", + }, + { + id: "543536", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Cocktail Mixes > Shelf-stable Cocktail Mixes", + }, + { + id: "5887", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Flavored Alcoholic Beverages", + }, + { id: "6761", name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Hard Cider" }, + { + id: "417", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits", + }, + { + id: "505761", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Absinthe", + }, + { + id: "2364", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Brandy", + }, + { + id: "1671", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Gin", + }, + { + id: "2933", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Liqueurs", + }, + { + id: "2605", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Rum", + }, + { + id: "502976", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Shochu & Soju", + }, + { + id: "543642", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Shochu & Soju > Shochu", + }, + { + id: "543643", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Shochu & Soju > Soju", + }, + { + id: "2220", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Tequila", + }, + { + id: "2107", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Vodka", + }, + { + id: "1926", + name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Liquor & Spirits > Whiskey", + }, + { id: "421", name: "Food, Beverages & Tobacco > Beverages > Alcoholic Beverages > Wine" }, + { id: "6797", name: "Food, Beverages & Tobacco > Beverages > Buttermilk" }, + { id: "1868", name: "Food, Beverages & Tobacco > Beverages > Coffee" }, + { id: "8030", name: "Food, Beverages & Tobacco > Beverages > Eggnog" }, + { id: "8036", name: "Food, Beverages & Tobacco > Beverages > Fruit Flavored Drinks" }, + { id: "415", name: "Food, Beverages & Tobacco > Beverages > Hot Chocolate" }, + { id: "2887", name: "Food, Beverages & Tobacco > Beverages > Juice" }, + { id: "418", name: "Food, Beverages & Tobacco > Beverages > Milk" }, + { id: "5724", name: "Food, Beverages & Tobacco > Beverages > Non-Dairy Milk" }, + { id: "6848", name: "Food, Beverages & Tobacco > Beverages > Powdered Beverage Mixes" }, + { id: "2628", name: "Food, Beverages & Tobacco > Beverages > Soda" }, + { id: "5723", name: "Food, Beverages & Tobacco > Beverages > Sports & Energy Drinks" }, + { id: "2073", name: "Food, Beverages & Tobacco > Beverages > Tea & Infusions" }, + { id: "7528", name: "Food, Beverages & Tobacco > Beverages > Vinegar Drinks" }, + { id: "420", name: "Food, Beverages & Tobacco > Beverages > Water" }, + { id: "543531", name: "Food, Beverages & Tobacco > Beverages > Water > Carbonated Water" }, + { + id: "543534", + name: "Food, Beverages & Tobacco > Beverages > Water > Carbonated Water > Flavored Carbonated Water", + }, + { + id: "543535", + name: "Food, Beverages & Tobacco > Beverages > Water > Carbonated Water > Unflavored Carbonated Water", + }, + { id: "543530", name: "Food, Beverages & Tobacco > Beverages > Water > Distilled Water" }, + { id: "543533", name: "Food, Beverages & Tobacco > Beverages > Water > Flat Mineral Water" }, + { id: "543532", name: "Food, Beverages & Tobacco > Beverages > Water > Spring Water" }, + { id: "422", name: "Food, Beverages & Tobacco > Food Items" }, + { id: "1876", name: "Food, Beverages & Tobacco > Food Items > Bakery" }, + { id: "1573", name: "Food, Beverages & Tobacco > Food Items > Bakery > Bagels" }, + { id: "5904", name: "Food, Beverages & Tobacco > Food Items > Bakery > Bakery Assortments" }, + { id: "424", name: "Food, Beverages & Tobacco > Food Items > Bakery > Breads & Buns" }, + { id: "2194", name: "Food, Beverages & Tobacco > Food Items > Bakery > Cakes & Dessert Bars" }, + { id: "6196", name: "Food, Beverages & Tobacco > Food Items > Bakery > Coffee Cakes" }, + { id: "2229", name: "Food, Beverages & Tobacco > Food Items > Bakery > Cookies" }, + { id: "6195", name: "Food, Beverages & Tobacco > Food Items > Bakery > Cupcakes" }, + { id: "5751", name: "Food, Beverages & Tobacco > Food Items > Bakery > Donuts" }, + { id: "5054", name: "Food, Beverages & Tobacco > Food Items > Bakery > Fudge" }, + { id: "5790", name: "Food, Beverages & Tobacco > Food Items > Bakery > Ice Cream Cones" }, + { id: "1895", name: "Food, Beverages & Tobacco > Food Items > Bakery > Muffins" }, + { id: "5750", name: "Food, Beverages & Tobacco > Food Items > Bakery > Pastries & Scones" }, + { id: "5749", name: "Food, Beverages & Tobacco > Food Items > Bakery > Pies & Tarts" }, + { id: "6891", name: "Food, Beverages & Tobacco > Food Items > Bakery > Taco Shells & Tostadas" }, + { id: "5748", name: "Food, Beverages & Tobacco > Food Items > Bakery > Tortillas & Wraps" }, + { + id: "6219", + name: "Food, Beverages & Tobacco > Food Items > Candied & Chocolate Covered Fruit", + }, + { id: "4748", name: "Food, Beverages & Tobacco > Food Items > Candy & Chocolate" }, + { id: "427", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces" }, + { + id: "6772", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Cocktail Sauce", + }, + { + id: "6905", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Curry Sauce", + }, + { + id: "6845", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Dessert Toppings", + }, + { + id: "6854", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Dessert Toppings > Fruit Toppings", + }, + { + id: "6844", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Dessert Toppings > Ice Cream Syrup", + }, + { id: "5763", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Fish Sauce" }, + { id: "5762", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Gravy" }, + { id: "4947", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Honey" }, + { + id: "6782", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Horseradish Sauce", + }, + { id: "4614", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Hot Sauce" }, + { id: "2018", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Ketchup" }, + { + id: "500074", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Marinades & Grilling Sauces", + }, + { id: "1568", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Mayonnaise" }, + { id: "1387", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Mustard" }, + { + id: "5760", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Olives & Capers", + }, + { + id: "5759", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Pasta Sauce", + }, + { + id: "500076", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Pickled Fruits & Vegetables", + }, + { + id: "6203", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Pizza Sauce", + }, + { + id: "500075", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Relish & Chutney", + }, + { + id: "1969", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Salad Dressing", + }, + { + id: "4615", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Satay Sauce", + }, + { id: "4616", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Soy Sauce" }, + { + id: "500089", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Sweet and Sour Sauces", + }, + { id: "4943", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Syrup" }, + { id: "4692", name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Tahini" }, + { + id: "6783", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Tartar Sauce", + }, + { + id: "500105", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > White & Cream Sauces", + }, + { + id: "6246", + name: "Food, Beverages & Tobacco > Food Items > Condiments & Sauces > Worcestershire Sauce", + }, + { id: "2660", name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients" }, + { + id: "6754", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Chips", + }, + { + id: "5776", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Chocolate", + }, + { + id: "5775", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Flavors & Extracts", + }, + { + id: "2572", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Mixes", + }, + { + id: "2803", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Powder", + }, + { + id: "5774", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Baking Soda", + }, + { + id: "6774", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Batter & Coating Mixes", + }, + { + id: "4613", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Bean Paste", + }, + { + id: "5773", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Bread Crumbs", + }, + { + id: "500093", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Canned & Dry Milk", + }, + { + id: "7506", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Cookie Decorating Kits", + }, + { + id: "2126", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Cooking Oils", + }, + { + id: "5771", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Cooking Starch", + }, + { + id: "5777", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Cooking Wine", + }, + { + id: "5770", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Corn Syrup", + }, + { + id: "5752", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Dough", + }, + { + id: "5755", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Dough > Bread & Pastry Dough", + }, + { + id: "5756", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Dough > Cookie & Brownie Dough", + }, + { + id: "5753", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Dough > Pie Crusts", + }, + { + id: "6775", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Edible Baking Decorations", + }, + { + id: "543549", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Egg Replacers", + }, + { + id: "5105", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Floss Sugar", + }, + { + id: "2775", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Flour", + }, + { + id: "7127", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Food Coloring", + }, + { + id: "5769", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Frosting & Icing", + }, + { + id: "499986", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Lemon & Lime Juice", + }, + { + id: "5767", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Marshmallows", + }, + { + id: "8076", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Meal", + }, + { + id: "5766", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Molasses", + }, + { + id: "5800", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Pie & Pastry Fillings", + }, + { + id: "5765", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Shortening & Lard", + }, + { + id: "7354", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Starter Cultures", + }, + { + id: "503734", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Sugar & Sweeteners", + }, + { + id: "499707", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Tapioca Pearls", + }, + { + id: "6922", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Tomato Paste", + }, + { + id: "5768", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Unflavored Gelatin", + }, + { + id: "2140", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Vinegar", + }, + { + id: "5778", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Waffle & Pancake Mixes", + }, + { + id: "2905", + name: "Food, Beverages & Tobacco > Food Items > Cooking & Baking Ingredients > Yeast", + }, + { id: "428", name: "Food, Beverages & Tobacco > Food Items > Dairy Products" }, + { + id: "5827", + name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Butter & Margarine", + }, + { id: "429", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Cheese" }, + { id: "4418", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Coffee Creamer" }, + { id: "1855", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Cottage Cheese" }, + { id: "5786", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Cream" }, + { id: "5787", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Sour Cream" }, + { id: "6821", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Whipped Cream" }, + { id: "1954", name: "Food, Beverages & Tobacco > Food Items > Dairy Products > Yogurt" }, + { id: "5740", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads" }, + { id: "6204", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Apple Butter" }, + { + id: "6831", + name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Cheese Dips & Spreads", + }, + { id: "5785", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Cream Cheese" }, + { id: "5742", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Guacamole" }, + { id: "5741", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Hummus" }, + { id: "2188", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Jams & Jellies" }, + { id: "3965", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Nut Butters" }, + { id: "1702", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Salsa" }, + { id: "6784", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Tapenade" }, + { id: "6830", name: "Food, Beverages & Tobacco > Food Items > Dips & Spreads > Vegetable Dip" }, + { id: "136", name: "Food, Beverages & Tobacco > Food Items > Food Gift Baskets" }, + { id: "5788", name: "Food, Beverages & Tobacco > Food Items > Frozen Desserts & Novelties" }, + { + id: "499991", + name: "Food, Beverages & Tobacco > Food Items > Frozen Desserts & Novelties > Ice Cream & Frozen Yogurt", + }, + { + id: "6873", + name: "Food, Beverages & Tobacco > Food Items > Frozen Desserts & Novelties > Ice Cream Novelties", + }, + { + id: "5789", + name: "Food, Beverages & Tobacco > Food Items > Frozen Desserts & Novelties > Ice Pops", + }, + { id: "430", name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables" }, + { + id: "5799", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Canned & Jarred Fruits", + }, + { + id: "5798", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Canned & Jarred Vegetables", + }, + { + id: "5797", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Canned & Prepared Beans", + }, + { + id: "1755", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Dried Fruits", + }, + { + id: "7387", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Dried Vegetables", + }, + { id: "5796", name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Dry Beans" }, + { + id: "5795", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits", + }, + { + id: "6566", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Apples", + }, + { + id: "6571", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Atemoyas", + }, + { + id: "6572", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Avocados", + }, + { + id: "6573", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Babacos", + }, + { + id: "6574", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Bananas", + }, + { + id: "6582", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Berries", + }, + { + id: "6589", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Breadfruit", + }, + { + id: "6593", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Cactus Pears", + }, + { + id: "6602", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Cherimoyas", + }, + { + id: "503759", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits", + }, + { + id: "6621", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Grapefruits", + }, + { + id: "6632", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Kumquats", + }, + { + id: "6636", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Lemons", + }, + { + id: "6641", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Limequats", + }, + { + id: "6642", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Limes", + }, + { + id: "6658", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Oranges", + }, + { + id: "6697", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Citrus Fruits > Tangelos", + }, + { + id: "6809", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Coconuts", + }, + { + id: "6812", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Dates", + }, + { + id: "6614", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Feijoas", + }, + { + id: "6810", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Figs", + }, + { + id: "499906", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Fruit Mixes", + }, + { + id: "6626", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Grapes", + }, + { + id: "6625", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Guavas", + }, + { + id: "6624", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Homely Fruits", + }, + { + id: "6633", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Kiwis", + }, + { + id: "6640", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Longan", + }, + { + id: "6639", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Loquats", + }, + { + id: "6638", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Lychees", + }, + { + id: "6813", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Madroño", + }, + { + id: "6647", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Mamey", + }, + { + id: "6645", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Mangosteens", + }, + { + id: "6649", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Melons", + }, + { + id: "6661", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Papayas", + }, + { + id: "6667", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Passion Fruit", + }, + { + id: "6665", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Pears", + }, + { + id: "6672", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Persimmons", + }, + { + id: "6671", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Physalis", + }, + { + id: "6670", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Pineapples", + }, + { + id: "6676", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Pitahayas", + }, + { + id: "6673", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Pomegranates", + }, + { + id: "6679", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Quince", + }, + { + id: "6678", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Rambutans", + }, + { + id: "6688", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Sapodillo", + }, + { + id: "6687", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Sapote", + }, + { + id: "6691", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Soursops", + }, + { + id: "6594", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Starfruits", + }, + { + id: "503760", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits", + }, + { + id: "6567", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Apricots", + }, + { + id: "6601", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Cherries", + }, + { + id: "6646", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Mangoes", + }, + { + id: "505301", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Peaches & Nectarines", + }, + { + id: "6675", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Plumcots", + }, + { + id: "6674", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Stone Fruits > Plums", + }, + { + id: "6814", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Sugar Apples", + }, + { + id: "6698", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Fruits > Tamarindo", + }, + { + id: "5793", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables", + }, + { + id: "6716", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Arracachas", + }, + { + id: "6570", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Artichokes", + }, + { + id: "6568", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Asparagus", + }, + { + id: "6577", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Beans", + }, + { + id: "6580", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Beets", + }, + { + id: "6587", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Borage", + }, + { + id: "6591", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Broccoli", + }, + { + id: "6590", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Brussel Sprouts", + }, + { + id: "6592", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Cabbage", + }, + { + id: "6808", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Cactus Leaves", + }, + { + id: "6596", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Cardoon", + }, + { + id: "6595", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Carrots", + }, + { + id: "6600", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Cauliflower", + }, + { + id: "6599", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Celery", + }, + { + id: "6598", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Celery Roots", + }, + { + id: "6609", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Corn", + }, + { + id: "6608", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Cucumbers", + }, + { + id: "6613", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Eggplants", + }, + { + id: "6816", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Fennel Bulbs", + }, + { + id: "6615", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Fiddlehead Ferns", + }, + { + id: "6616", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Gai Choy", + }, + { + id: "6617", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Gai Lan", + }, + { + id: "6620", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Garlic", + }, + { + id: "6619", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Ginger Root", + }, + { + id: "6618", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Gobo Root", + }, + { + id: "6622", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens", + }, + { + id: "6569", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Arugula", + }, + { + id: "6581", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Beet Greens", + }, + { + id: "6584", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Bok Choy", + }, + { + id: "6597", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Chard", + }, + { + id: "6717", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Chicory", + }, + { + id: "6610", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Choy Sum", + }, + { + id: "6629", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Kale", + }, + { + id: "6637", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Lettuce", + }, + { + id: "6656", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > On Choy", + }, + { + id: "5792", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Salad Mixes", + }, + { + id: "6695", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Spinach", + }, + { + id: "6706", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Greens > Yu Choy", + }, + { + id: "6631", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Horseradish Root", + }, + { + id: "6630", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Jicama", + }, + { + id: "6628", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Kohlrabi", + }, + { + id: "6627", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Leeks", + }, + { + id: "6644", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Lotus Roots", + }, + { + id: "6643", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Malangas", + }, + { + id: "6653", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Mushrooms", + }, + { + id: "6657", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Okra", + }, + { + id: "6655", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Onions", + }, + { + id: "6664", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Parsley Roots", + }, + { + id: "6663", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Parsnips", + }, + { + id: "6669", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Peas", + }, + { + id: "6668", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Peppers", + }, + { + id: "6586", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Potatoes", + }, + { + id: "6682", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Radishes", + }, + { + id: "6681", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Rhubarb", + }, + { + id: "6818", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Shallots", + }, + { + id: "503761", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Sprouts", + }, + { + id: "505354", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Squashes & Gourds", + }, + { + id: "6694", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Sugar Cane", + }, + { + id: "6693", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Sunchokes", + }, + { + id: "6585", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Sweet Potatoes", + }, + { + id: "6692", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Tamarillos", + }, + { + id: "6704", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Taro Root", + }, + { + id: "6703", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Tomatoes", + }, + { + id: "505329", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Turnips & Rutabagas", + }, + { + id: "499905", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Vegetable Mixes", + }, + { + id: "6701", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Water Chestnuts", + }, + { + id: "6700", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Watercress", + }, + { + id: "7193", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Wheatgrass", + }, + { + id: "8515", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Yams", + }, + { + id: "6705", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fresh & Frozen Vegetables > Yuca Root", + }, + { + id: "5794", + name: "Food, Beverages & Tobacco > Food Items > Fruits & Vegetables > Fruit Sauces", + }, + { id: "431", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal" }, + { id: "4683", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Amaranth" }, + { id: "4687", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Barley" }, + { + id: "4684", + name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Buckwheat", + }, + { + id: "4689", + name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Cereal & Granola", + }, + { id: "7196", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Couscous" }, + { id: "4686", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Millet" }, + { + id: "4690", + name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Oats, Grits & Hot Cereal", + }, + { id: "6259", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Quinoa" }, + { id: "4682", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Rice" }, + { id: "7374", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Rye" }, + { id: "4688", name: "Food, Beverages & Tobacco > Food Items > Grains, Rice & Cereal > Wheat" }, + { id: "432", name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs" }, + { id: "4627", name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Eggs" }, + { + id: "543554", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Eggs > Egg Whites", + }, + { + id: "543555", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Eggs > Liquid & Frozen Eggs", + }, + { + id: "543556", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Eggs > Prepared Eggs", + }, + { + id: "543557", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Eggs > Whole Eggs", + }, + { id: "4628", name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Meat" }, + { + id: "5811", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Meat > Canned Meats", + }, + { + id: "5805", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Meat > Fresh & Frozen Meats", + }, + { + id: "5804", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Meat > Lunch & Deli Meats", + }, + { id: "4629", name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Seafood" }, + { + id: "5813", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Seafood > Canned Seafood", + }, + { + id: "5812", + name: "Food, Beverages & Tobacco > Food Items > Meat, Seafood & Eggs > Seafood > Fresh & Frozen Seafood", + }, + { id: "433", name: "Food, Beverages & Tobacco > Food Items > Nuts & Seeds" }, + { id: "434", name: "Food, Beverages & Tobacco > Food Items > Pasta & Noodles" }, + { id: "5814", name: "Food, Beverages & Tobacco > Food Items > Prepared Foods" }, + { + id: "499989", + name: "Food, Beverages & Tobacco > Food Items > Prepared Foods > Prepared Appetizers & Side Dishes", + }, + { + id: "499988", + name: "Food, Beverages & Tobacco > Food Items > Prepared Foods > Prepared Meals & Entrées", + }, + { id: "4608", name: "Food, Beverages & Tobacco > Food Items > Seasonings & Spices" }, + { + id: "1529", + name: "Food, Beverages & Tobacco > Food Items > Seasonings & Spices > Herbs & Spices", + }, + { id: "4610", name: "Food, Beverages & Tobacco > Food Items > Seasonings & Spices > MSG" }, + { id: "6199", name: "Food, Beverages & Tobacco > Food Items > Seasonings & Spices > Pepper" }, + { id: "4611", name: "Food, Beverages & Tobacco > Food Items > Seasonings & Spices > Salt" }, + { id: "423", name: "Food, Beverages & Tobacco > Food Items > Snack Foods" }, + { id: "7159", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Breadsticks" }, + { + id: "5747", + name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Cereal & Granola Bars", + }, + { + id: "543651", + name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Cereal & Granola Bars > Cereal Bars", + }, + { + id: "543652", + name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Cereal & Granola Bars > Granola Bars", + }, + { id: "6192", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Cheese Puffs" }, + { id: "2392", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Chips" }, + { id: "1445", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Crackers" }, + { id: "5746", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Croutons" }, + { id: "5744", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Fruit Snacks" }, + { id: "3284", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Jerky" }, + { id: "1534", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Popcorn" }, + { id: "6194", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Pork Rinds" }, + { id: "3446", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Pretzels" }, + { + id: "5743", + name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Pudding & Gelatin Snacks", + }, + { id: "2432", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Puffed Rice Cakes" }, + { id: "6847", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Salad Toppings" }, + { id: "7427", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Sesame Sticks" }, + { id: "6785", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Snack Cakes" }, + { id: "7327", name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Sticky Rice Cakes" }, + { + id: "5745", + name: "Food, Beverages & Tobacco > Food Items > Snack Foods > Trail & Snack Mixes", + }, + { id: "2423", name: "Food, Beverages & Tobacco > Food Items > Soups & Broths" }, + { id: "5807", name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products" }, + { + id: "6839", + name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products > Cheese Alternatives", + }, + { + id: "6843", + name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products > Meat Alternatives", + }, + { + id: "5808", + name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products > Seitan", + }, + { + id: "5810", + name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products > Tempeh", + }, + { + id: "5809", + name: "Food, Beverages & Tobacco > Food Items > Tofu, Soy & Vegetarian Products > Tofu", + }, + { id: "435", name: "Food, Beverages & Tobacco > Tobacco Products" }, + { id: "3916", name: "Food, Beverages & Tobacco > Tobacco Products > Chewing Tobacco" }, + { id: "3151", name: "Food, Beverages & Tobacco > Tobacco Products > Cigarettes" }, + { id: "3682", name: "Food, Beverages & Tobacco > Tobacco Products > Cigars" }, + { id: "3741", name: "Food, Beverages & Tobacco > Tobacco Products > Loose Tobacco" }, + { id: "499963", name: "Food, Beverages & Tobacco > Tobacco Products > Smoking Pipes" }, + { + id: "4091", + name: "Food, Beverages & Tobacco > Tobacco Products > Vaporizers & Electronic Cigarettes", + }, + { + id: "543635", + name: "Food, Beverages & Tobacco > Tobacco Products > Vaporizers & Electronic Cigarettes > Electronic Cigarettes", + }, + { + id: "543634", + name: "Food, Beverages & Tobacco > Tobacco Products > Vaporizers & Electronic Cigarettes > Vaporizers", + }, + { id: "436", name: "Furniture" }, + { id: "554", name: "Furniture > Baby & Toddler Furniture" }, + { id: "6349", name: "Furniture > Baby & Toddler Furniture > Baby & Toddler Furniture Sets" }, + { id: "7068", name: "Furniture > Baby & Toddler Furniture > Bassinet & Cradle Accessories" }, + { id: "6393", name: "Furniture > Baby & Toddler Furniture > Bassinets & Cradles" }, + { id: "558", name: "Furniture > Baby & Toddler Furniture > Changing Tables" }, + { id: "7070", name: "Furniture > Baby & Toddler Furniture > Crib & Toddler Bed Accessories" }, + { + id: "7072", + name: "Furniture > Baby & Toddler Furniture > Crib & Toddler Bed Accessories > Crib Bumpers & Liners", + }, + { + id: "7071", + name: "Furniture > Baby & Toddler Furniture > Crib & Toddler Bed Accessories > Crib Conversion Kits", + }, + { id: "6394", name: "Furniture > Baby & Toddler Furniture > Cribs & Toddler Beds" }, + { + id: "6969", + name: "Furniture > Baby & Toddler Furniture > High Chair & Booster Seat Accessories", + }, + { id: "559", name: "Furniture > Baby & Toddler Furniture > High Chairs & Booster Seats" }, + { id: "6433", name: "Furniture > Beds & Accessories" }, + { id: "4437", name: "Furniture > Beds & Accessories > Bed & Bed Frame Accessories" }, + { id: "505764", name: "Furniture > Beds & Accessories > Beds & Bed Frames" }, + { id: "451", name: "Furniture > Beds & Accessories > Headboards & Footboards" }, + { id: "2720", name: "Furniture > Beds & Accessories > Mattress Foundations" }, + { id: "2696", name: "Furniture > Beds & Accessories > Mattresses" }, + { id: "441", name: "Furniture > Benches" }, + { id: "6850", name: "Furniture > Benches > Kitchen & Dining Benches" }, + { id: "6851", name: "Furniture > Benches > Storage & Entryway Benches" }, + { id: "4241", name: "Furniture > Benches > Vanity Benches" }, + { id: "6356", name: "Furniture > Cabinets & Storage" }, + { id: "4063", name: "Furniture > Cabinets & Storage > Armoires & Wardrobes" }, + { id: "447", name: "Furniture > Cabinets & Storage > Buffets & Sideboards" }, + { id: "448", name: "Furniture > Cabinets & Storage > China Cabinets & Hutches" }, + { id: "4195", name: "Furniture > Cabinets & Storage > Dressers" }, + { id: "463", name: "Furniture > Cabinets & Storage > File Cabinets" }, + { id: "465846", name: "Furniture > Cabinets & Storage > Ironing Centers" }, + { id: "6934", name: "Furniture > Cabinets & Storage > Kitchen Cabinets" }, + { id: "6539", name: "Furniture > Cabinets & Storage > Magazine Racks" }, + { id: "6358", name: "Furniture > Cabinets & Storage > Media Storage Cabinets & Racks" }, + { id: "5938", name: "Furniture > Cabinets & Storage > Storage Cabinets & Lockers" }, + { id: "4205", name: "Furniture > Cabinets & Storage > Storage Chests" }, + { id: "6947", name: "Furniture > Cabinets & Storage > Storage Chests > Hope Chests" }, + { id: "4268", name: "Furniture > Cabinets & Storage > Storage Chests > Toy Chests" }, + { id: "4148", name: "Furniture > Cabinets & Storage > Vanities" }, + { id: "2081", name: "Furniture > Cabinets & Storage > Vanities > Bathroom Vanities" }, + { id: "6360", name: "Furniture > Cabinets & Storage > Vanities > Bedroom Vanities" }, + { id: "6357", name: "Furniture > Cabinets & Storage > Wine & Liquor Cabinets" }, + { id: "5578", name: "Furniture > Cabinets & Storage > Wine Racks" }, + { id: "442", name: "Furniture > Carts & Islands" }, + { id: "453", name: "Furniture > Carts & Islands > Kitchen & Dining Carts" }, + { id: "6374", name: "Furniture > Carts & Islands > Kitchen Islands" }, + { id: "7248", name: "Furniture > Chair Accessories" }, + { id: "8206", name: "Furniture > Chair Accessories > Hanging Chair Replacement Parts" }, + { id: "443", name: "Furniture > Chairs" }, + { id: "6499", name: "Furniture > Chairs > Arm Chairs, Recliners & Sleeper Chairs" }, + { id: "438", name: "Furniture > Chairs > Bean Bag Chairs" }, + { id: "456", name: "Furniture > Chairs > Chaises" }, + { id: "2919", name: "Furniture > Chairs > Electric Massaging Chairs" }, + { id: "500051", name: "Furniture > Chairs > Floor Chairs" }, + { id: "3358", name: "Furniture > Chairs > Folding Chairs & Stools" }, + { id: "6800", name: "Furniture > Chairs > Gaming Chairs" }, + { id: "7197", name: "Furniture > Chairs > Hanging Chairs" }, + { id: "5886", name: "Furniture > Chairs > Kitchen & Dining Room Chairs" }, + { id: "2002", name: "Furniture > Chairs > Rocking Chairs" }, + { id: "6859", name: "Furniture > Chairs > Slipper Chairs" }, + { id: "1463", name: "Furniture > Chairs > Table & Bar Stools" }, + { id: "457", name: "Furniture > Entertainment Centers & TV Stands" }, + { id: "6345", name: "Furniture > Furniture Sets" }, + { id: "500000", name: "Furniture > Furniture Sets > Bathroom Furniture Sets" }, + { id: "6346", name: "Furniture > Furniture Sets > Bedroom Furniture Sets" }, + { id: "6347", name: "Furniture > Furniture Sets > Kitchen & Dining Furniture Sets" }, + { id: "6348", name: "Furniture > Furniture Sets > Living Room Furniture Sets" }, + { id: "6860", name: "Furniture > Futon Frames" }, + { id: "2786", name: "Furniture > Futon Pads" }, + { id: "450", name: "Furniture > Futons" }, + { id: "6362", name: "Furniture > Office Furniture" }, + { id: "4191", name: "Furniture > Office Furniture > Desks" }, + { id: "2045", name: "Furniture > Office Furniture > Office Chairs" }, + { id: "500061", name: "Furniture > Office Furniture > Office Furniture Sets" }, + { id: "6363", name: "Furniture > Office Furniture > Workspace Tables" }, + { id: "2242", name: "Furniture > Office Furniture > Workspace Tables > Art & Drafting Tables" }, + { id: "4317", name: "Furniture > Office Furniture > Workspace Tables > Conference Room Tables" }, + { id: "6908", name: "Furniture > Office Furniture > Workstations & Cubicles" }, + { id: "503765", name: "Furniture > Office Furniture Accessories" }, + { id: "503766", name: "Furniture > Office Furniture Accessories > Desk Parts & Accessories" }, + { id: "7559", name: "Furniture > Office Furniture Accessories > Office Chair Accessories" }, + { + id: "6909", + name: "Furniture > Office Furniture Accessories > Workstation & Cubicle Accessories", + }, + { id: "458", name: "Furniture > Ottomans" }, + { id: "4299", name: "Furniture > Outdoor Furniture" }, + { id: "6892", name: "Furniture > Outdoor Furniture > Outdoor Beds" }, + { id: "6367", name: "Furniture > Outdoor Furniture > Outdoor Furniture Sets" }, + { id: "6822", name: "Furniture > Outdoor Furniture > Outdoor Ottomans" }, + { id: "6368", name: "Furniture > Outdoor Furniture > Outdoor Seating" }, + { id: "5044", name: "Furniture > Outdoor Furniture > Outdoor Seating > Outdoor Benches" }, + { id: "6828", name: "Furniture > Outdoor Furniture > Outdoor Seating > Outdoor Chairs" }, + { + id: "500111", + name: "Furniture > Outdoor Furniture > Outdoor Seating > Outdoor Sectional Sofa Units", + }, + { id: "4513", name: "Furniture > Outdoor Furniture > Outdoor Seating > Outdoor Sofas" }, + { id: "4105", name: "Furniture > Outdoor Furniture > Outdoor Seating > Sunloungers" }, + { id: "7310", name: "Furniture > Outdoor Furniture > Outdoor Storage Boxes" }, + { id: "2684", name: "Furniture > Outdoor Furniture > Outdoor Tables" }, + { id: "6963", name: "Furniture > Outdoor Furniture Accessories" }, + { id: "6964", name: "Furniture > Outdoor Furniture Accessories > Outdoor Furniture Covers" }, + { id: "6915", name: "Furniture > Room Divider Accessories" }, + { id: "4163", name: "Furniture > Room Dividers" }, + { id: "464", name: "Furniture > Shelving" }, + { id: "465", name: "Furniture > Shelving > Bookcases & Standing Shelves" }, + { id: "6372", name: "Furniture > Shelving > Wall Shelves & Ledges" }, + { id: "8023", name: "Furniture > Shelving Accessories" }, + { id: "8024", name: "Furniture > Shelving Accessories > Replacement Shelves" }, + { id: "7212", name: "Furniture > Sofa Accessories" }, + { id: "7213", name: "Furniture > Sofa Accessories > Chair & Sofa Supports" }, + { id: "500064", name: "Furniture > Sofa Accessories > Sectional Sofa Units" }, + { id: "460", name: "Furniture > Sofas" }, + { id: "6913", name: "Furniture > Table Accessories" }, + { id: "6911", name: "Furniture > Table Accessories > Table Legs" }, + { id: "6910", name: "Furniture > Table Accessories > Table Tops" }, + { id: "6392", name: "Furniture > Tables" }, + { id: "6369", name: "Furniture > Tables > Accent Tables" }, + { id: "1395", name: "Furniture > Tables > Accent Tables > Coffee Tables" }, + { id: "1549", name: "Furniture > Tables > Accent Tables > End Tables" }, + { id: "1602", name: "Furniture > Tables > Accent Tables > Sofa Tables" }, + { id: "6351", name: "Furniture > Tables > Activity Tables" }, + { id: "4080", name: "Furniture > Tables > Folding Tables" }, + { id: "4355", name: "Furniture > Tables > Kitchen & Dining Room Tables" }, + { id: "4484", name: "Furniture > Tables > Kotatsu" }, + { id: "462", name: "Furniture > Tables > Nightstands" }, + { id: "2693", name: "Furniture > Tables > Poker & Game Tables" }, + { id: "5121", name: "Furniture > Tables > Sewing Machine Tables" }, + { id: "632", name: "Hardware" }, + { id: "503739", name: "Hardware > Building Consumables" }, + { id: "2277", name: "Hardware > Building Consumables > Chemicals" }, + { id: "1735", name: "Hardware > Building Consumables > Chemicals > Acid Neutralizers" }, + { id: "6795", name: "Hardware > Building Consumables > Chemicals > Ammonia" }, + { id: "1479", name: "Hardware > Building Consumables > Chemicals > Chimney Cleaners" }, + { id: "7504", name: "Hardware > Building Consumables > Chemicals > Concrete & Masonry Cleaners" }, + { id: "6191", name: "Hardware > Building Consumables > Chemicals > De-icers" }, + { id: "7503", name: "Hardware > Building Consumables > Chemicals > Deck & Fence Cleaners" }, + { id: "1749", name: "Hardware > Building Consumables > Chemicals > Drain Cleaners" }, + { id: "505319", name: "Hardware > Building Consumables > Chemicals > Electrical Freeze Sprays" }, + { id: "500088", name: "Hardware > Building Consumables > Chemicals > Lighter Fluid" }, + { + id: "7470", + name: "Hardware > Building Consumables > Chemicals > Septic Tank & Cesspool Treatments", + }, + { id: "503742", name: "Hardware > Building Consumables > Hardware Glue & Adhesives" }, + { id: "2212", name: "Hardware > Building Consumables > Hardware Tape" }, + { id: "1753", name: "Hardware > Building Consumables > Lubricants" }, + { id: "503743", name: "Hardware > Building Consumables > Masonry Consumables" }, + { + id: "3031", + name: "Hardware > Building Consumables > Masonry Consumables > Bricks & Concrete Blocks", + }, + { + id: "2282", + name: "Hardware > Building Consumables > Masonry Consumables > Cement, Mortar & Concrete Mixes", + }, + { id: "499876", name: "Hardware > Building Consumables > Masonry Consumables > Grout" }, + { id: "503740", name: "Hardware > Building Consumables > Painting Consumables" }, + { id: "1361", name: "Hardware > Building Consumables > Painting Consumables > Paint" }, + { id: "2474", name: "Hardware > Building Consumables > Painting Consumables > Paint Binders" }, + { id: "2058", name: "Hardware > Building Consumables > Painting Consumables > Primers" }, + { id: "1648", name: "Hardware > Building Consumables > Painting Consumables > Stains" }, + { + id: "503738", + name: "Hardware > Building Consumables > Painting Consumables > Varnishes & Finishes", + }, + { id: "505305", name: "Hardware > Building Consumables > Plumbing Primer" }, + { id: "503744", name: "Hardware > Building Consumables > Protective Coatings & Sealants" }, + { id: "1995", name: "Hardware > Building Consumables > Solder & Flux" }, + { id: "503741", name: "Hardware > Building Consumables > Solvents, Strippers & Thinners" }, + { id: "505802", name: "Hardware > Building Consumables > Wall Patching Compounds & Plaster" }, + { id: "115", name: "Hardware > Building Materials" }, + { id: "2729", name: "Hardware > Building Materials > Countertops" }, + { id: "6343", name: "Hardware > Building Materials > Door Hardware" }, + { id: "2972", name: "Hardware > Building Materials > Door Hardware > Door Bells & Chimes" }, + { id: "6446", name: "Hardware > Building Materials > Door Hardware > Door Closers" }, + { id: "503727", name: "Hardware > Building Materials > Door Hardware > Door Frames" }, + { id: "99338", name: "Hardware > Building Materials > Door Hardware > Door Keyhole Escutcheons" }, + { id: "1356", name: "Hardware > Building Materials > Door Hardware > Door Knobs & Handles" }, + { id: "2795", name: "Hardware > Building Materials > Door Hardware > Door Knockers" }, + { id: "499970", name: "Hardware > Building Materials > Door Hardware > Door Push Plates" }, + { id: "2665", name: "Hardware > Building Materials > Door Hardware > Door Stops" }, + { id: "6458", name: "Hardware > Building Materials > Door Hardware > Door Strikes" }, + { id: "119", name: "Hardware > Building Materials > Doors" }, + { id: "4468", name: "Hardware > Building Materials > Doors > Garage Doors" }, + { id: "4634", name: "Hardware > Building Materials > Doors > Home Doors" }, + { id: "503776", name: "Hardware > Building Materials > Drywall" }, + { id: "2826", name: "Hardware > Building Materials > Flooring & Carpet" }, + { id: "120", name: "Hardware > Building Materials > Glass" }, + { id: "499949", name: "Hardware > Building Materials > Handrails & Railing Systems" }, + { id: "2030", name: "Hardware > Building Materials > Hatches" }, + { id: "122", name: "Hardware > Building Materials > Insulation" }, + { id: "125", name: "Hardware > Building Materials > Lumber & Sheet Stock" }, + { id: "7112", name: "Hardware > Building Materials > Molding" }, + { id: "503777", name: "Hardware > Building Materials > Rebar & Remesh" }, + { id: "123", name: "Hardware > Building Materials > Roofing" }, + { id: "4544", name: "Hardware > Building Materials > Roofing > Gutter Accessories" }, + { id: "121", name: "Hardware > Building Materials > Roofing > Gutters" }, + { id: "2008", name: "Hardware > Building Materials > Roofing > Roof Flashings" }, + { id: "8270", name: "Hardware > Building Materials > Roofing > Roofing Shingles & Tiles" }, + { id: "6943", name: "Hardware > Building Materials > Shutters" }, + { id: "503775", name: "Hardware > Building Materials > Siding" }, + { id: "7439", name: "Hardware > Building Materials > Sound Dampening Panels & Foam" }, + { id: "7004", name: "Hardware > Building Materials > Staircases" }, + { id: "7136", name: "Hardware > Building Materials > Wall & Ceiling Tile" }, + { id: "7053", name: "Hardware > Building Materials > Wall Paneling" }, + { + id: "505300", + name: "Hardware > Building Materials > Weather Stripping & Weatherization Supplies", + }, + { id: "499772", name: "Hardware > Building Materials > Window Hardware" }, + { id: "499773", name: "Hardware > Building Materials > Window Hardware > Window Cranks" }, + { id: "503728", name: "Hardware > Building Materials > Window Hardware > Window Frames" }, + { id: "124", name: "Hardware > Building Materials > Windows" }, + { id: "128", name: "Hardware > Fencing & Barriers" }, + { id: "502983", name: "Hardware > Fencing & Barriers > Fence & Gate Accessories" }, + { id: "502973", name: "Hardware > Fencing & Barriers > Fence Panels" }, + { id: "1352", name: "Hardware > Fencing & Barriers > Fence Pickets" }, + { id: "1919", name: "Hardware > Fencing & Barriers > Fence Posts & Rails" }, + { id: "502986", name: "Hardware > Fencing & Barriers > Garden Borders & Edging" }, + { id: "1788", name: "Hardware > Fencing & Barriers > Gates" }, + { id: "502984", name: "Hardware > Fencing & Barriers > Lattice" }, + { id: "499958", name: "Hardware > Fencing & Barriers > Safety & Crowd Control Barriers" }, + { id: "543575", name: "Hardware > Fuel" }, + { id: "543703", name: "Hardware > Fuel > Home Heating Oil" }, + { id: "543576", name: "Hardware > Fuel > Kerosene" }, + { id: "543579", name: "Hardware > Fuel > Kerosene > Clear Kerosene" }, + { id: "543578", name: "Hardware > Fuel > Kerosene > Dyed Kerosene" }, + { id: "543577", name: "Hardware > Fuel > Propane" }, + { id: "502975", name: "Hardware > Fuel Containers & Tanks" }, + { id: "2878", name: "Hardware > Hardware Accessories" }, + { id: "7092", name: "Hardware > Hardware Accessories > Brackets & Reinforcement Braces" }, + { id: "4696", name: "Hardware > Hardware Accessories > Cabinet Hardware" }, + { + id: "232167", + name: "Hardware > Hardware Accessories > Cabinet Hardware > Cabinet & Furniture Keyhole Escutcheons", + }, + { id: "4697", name: "Hardware > Hardware Accessories > Cabinet Hardware > Cabinet Backplates" }, + { id: "4698", name: "Hardware > Hardware Accessories > Cabinet Hardware > Cabinet Catches" }, + { id: "4699", name: "Hardware > Hardware Accessories > Cabinet Hardware > Cabinet Doors" }, + { + id: "4700", + name: "Hardware > Hardware Accessories > Cabinet Hardware > Cabinet Knobs & Handles", + }, + { id: "499981", name: "Hardware > Hardware Accessories > Casters" }, + { id: "502977", name: "Hardware > Hardware Accessories > Chain, Wire & Rope" }, + { id: "6298", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Bungee Cords" }, + { id: "1492", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Chains" }, + { id: "4469", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Pull Chains" }, + { + id: "3053", + name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Ropes & Hardware Cable", + }, + { id: "6297", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Tie Down Straps" }, + { id: "5119", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Twine" }, + { id: "6904", name: "Hardware > Hardware Accessories > Chain, Wire & Rope > Utility Wire" }, + { id: "1318", name: "Hardware > Hardware Accessories > Coils" }, + { id: "7086", name: "Hardware > Hardware Accessories > Concrete Molds" }, + { id: "7270", name: "Hardware > Hardware Accessories > Dowel Pins & Rods" }, + { id: "8470", name: "Hardware > Hardware Accessories > Drawer Slides" }, + { id: "1979", name: "Hardware > Hardware Accessories > Drop Cloths" }, + { id: "1816", name: "Hardware > Hardware Accessories > Filters & Screens" }, + { id: "7557", name: "Hardware > Hardware Accessories > Flagging & Caution Tape" }, + { id: "6841", name: "Hardware > Hardware Accessories > Gas Hoses" }, + { id: "8112", name: "Hardware > Hardware Accessories > Ground Spikes" }, + { id: "500054", name: "Hardware > Hardware Accessories > Hardware Fasteners" }, + { id: "1508", name: "Hardware > Hardware Accessories > Hardware Fasteners > Drywall Anchors" }, + { id: "2408", name: "Hardware > Hardware Accessories > Hardware Fasteners > Nails" }, + { id: "1739", name: "Hardware > Hardware Accessories > Hardware Fasteners > Nuts & Bolts" }, + { id: "7062", name: "Hardware > Hardware Accessories > Hardware Fasteners > Rivets" }, + { id: "2230", name: "Hardware > Hardware Accessories > Hardware Fasteners > Screw Posts" }, + { id: "2251", name: "Hardware > Hardware Accessories > Hardware Fasteners > Screws" }, + { id: "500055", name: "Hardware > Hardware Accessories > Hardware Fasteners > Threaded Rods" }, + { id: "2195", name: "Hardware > Hardware Accessories > Hardware Fasteners > Washers" }, + { id: "1771", name: "Hardware > Hardware Accessories > Hinges" }, + { id: "503773", name: "Hardware > Hardware Accessories > Hooks, Buckles & Fasteners" }, + { + id: "503764", + name: "Hardware > Hardware Accessories > Hooks, Buckles & Fasteners > Chain Connectors & Links", + }, + { + id: "502978", + name: "Hardware > Hardware Accessories > Hooks, Buckles & Fasteners > Gear Ties", + }, + { + id: "503770", + name: "Hardware > Hardware Accessories > Hooks, Buckles & Fasteners > Lifting Hooks, Clamps & Shackles", + }, + { + id: "502992", + name: "Hardware > Hardware Accessories > Hooks, Buckles & Fasteners > Utility Buckles", + }, + { id: "6770", name: "Hardware > Hardware Accessories > Lubrication Hoses" }, + { id: "503731", name: "Hardware > Hardware Accessories > Metal Casting Molds" }, + { + id: "500030", + name: "Hardware > Hardware Accessories > Moving & Soundproofing Blankets & Covers", + }, + { id: "6769", name: "Hardware > Hardware Accessories > Pneumatic Hoses" }, + { id: "8113", name: "Hardware > Hardware Accessories > Post Base Plates" }, + { id: "499933", name: "Hardware > Hardware Accessories > Springs" }, + { id: "4988", name: "Hardware > Hardware Accessories > Tarps" }, + { id: "3974", name: "Hardware > Hardware Accessories > Tool Storage & Organization" }, + { + id: "4199", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Garden Hose Storage", + }, + { + id: "2485", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool & Equipment Belts", + }, + { id: "6876", name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool Bags" }, + { + id: "3980", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool Boxes", + }, + { + id: "3280", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool Cabinets & Chests", + }, + { + id: "500103", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool Organizer Liners & Inserts", + }, + { + id: "4031", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Tool Sheaths", + }, + { + id: "3919", + name: "Hardware > Hardware Accessories > Tool Storage & Organization > Work Benches", + }, + { id: "505320", name: "Hardware > Hardware Accessories > Wall Jacks & Braces" }, + { id: "500096", name: "Hardware > Hardware Pumps" }, + { id: "500099", name: "Hardware > Hardware Pumps > Home Appliance Pumps" }, + { id: "500098", name: "Hardware > Hardware Pumps > Pool, Fountain & Pond Pumps" }, + { + id: "500097", + name: "Hardware > Hardware Pumps > Sprinkler, Booster & Irrigation System Pumps", + }, + { id: "500102", name: "Hardware > Hardware Pumps > Sump, Sewage & Effluent Pumps" }, + { id: "500101", name: "Hardware > Hardware Pumps > Utility Pumps" }, + { id: "500100", name: "Hardware > Hardware Pumps > Well Pumps & Systems" }, + { id: "499873", name: "Hardware > Heating, Ventilation & Air Conditioning" }, + { + id: "500090", + name: "Hardware > Heating, Ventilation & Air Conditioning > Air & Filter Dryers", + }, + { id: "499874", name: "Hardware > Heating, Ventilation & Air Conditioning > Air Ducts" }, + { id: "1519", name: "Hardware > Heating, Ventilation & Air Conditioning > HVAC Controls" }, + { + id: "2238", + name: "Hardware > Heating, Ventilation & Air Conditioning > HVAC Controls > Control Panels", + }, + { + id: "500043", + name: "Hardware > Heating, Ventilation & Air Conditioning > HVAC Controls > Humidistats", + }, + { + id: "1897", + name: "Hardware > Heating, Ventilation & Air Conditioning > HVAC Controls > Thermostats", + }, + { id: "2766", name: "Hardware > Heating, Ventilation & Air Conditioning > Vents & Flues" }, + { id: "1974", name: "Hardware > Locks & Keys" }, + { id: "6488", name: "Hardware > Locks & Keys > Key Blanks" }, + { id: "8067", name: "Hardware > Locks & Keys > Key Caps" }, + { id: "1870", name: "Hardware > Locks & Keys > Key Card Entry Systems" }, + { id: "503730", name: "Hardware > Locks & Keys > Locks & Latches" }, + { id: "133", name: "Hardware > Plumbing" }, + { id: "1810", name: "Hardware > Plumbing > Plumbing Fittings & Supports" }, + { id: "6732", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Gaskets & O-Rings" }, + { + id: "499697", + name: "Hardware > Plumbing > Plumbing Fittings & Supports > In-Wall Carriers & Mounting Frames", + }, + { id: "2068", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Nozzles" }, + { + id: "2710", + name: "Hardware > Plumbing > Plumbing Fittings & Supports > Pipe Adapters & Bushings", + }, + { id: "2909", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Pipe Caps & Plugs" }, + { id: "2359", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Pipe Connectors" }, + { id: "1694", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Plumbing Flanges" }, + { id: "2634", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Plumbing Pipe Clamps" }, + { id: "2611", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Plumbing Regulators" }, + { id: "2466", name: "Hardware > Plumbing > Plumbing Fittings & Supports > Plumbing Valves" }, + { id: "504635", name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts" }, + { + id: "2996", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Bathtub Accessories", + }, + { + id: "505368", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Bathtub Accessories > Bathtub Bases & Feet", + }, + { + id: "5508", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Bathtub Accessories > Bathtub Skirts", + }, + { + id: "2463", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Bathtub Accessories > Bathtub Spouts", + }, + { + id: "504637", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components", + }, + { + id: "2851", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Drain Covers & Strainers", + }, + { + id: "1514", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Drain Frames", + }, + { + id: "2257", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Drain Liners", + }, + { + id: "1932", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Drain Openers", + }, + { + id: "1407", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Drain Rods", + }, + { + id: "1319", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Plumbing Traps", + }, + { + id: "2170", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drain Components > Plumbing Wastes", + }, + { id: "504636", name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Drains" }, + { + id: "1489", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Faucet Accessories", + }, + { + id: "8115", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Faucet Accessories > Faucet Aerators", + }, + { + id: "8116", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Faucet Accessories > Faucet Handles & Controls", + }, + { id: "1458", name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Fixture Plates" }, + { id: "2206", name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts" }, + { + id: "8320", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Bathtub & Shower Jets", + }, + { + id: "8277", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Electric & Power Showers", + }, + { + id: "504638", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Arms & Connectors", + }, + { + id: "4728", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Bases", + }, + { + id: "2088", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Columns", + }, + { + id: "1779", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Doors & Enclosures", + }, + { + id: "581", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Heads", + }, + { + id: "7130", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Walls & Surrounds", + }, + { + id: "5048", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Shower Parts > Shower Water Filters", + }, + { + id: "1963", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Sink Accessories", + }, + { + id: "2410", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Sink Accessories > Sink Legs", + }, + { + id: "2691", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories", + }, + { + id: "1425", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Ballcocks & Flappers", + }, + { + id: "504634", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Bidet Faucets & Sprayers", + }, + { + id: "1865", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet & Bidet Seats", + }, + { + id: "7358", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Seat Covers", + }, + { + id: "7446", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Seat Lid Covers", + }, + { + id: "5666", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Tank Covers", + }, + { + id: "2817", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Tank Levers", + }, + { + id: "5665", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Tanks", + }, + { + id: "2478", + name: "Hardware > Plumbing > Plumbing Fixture Hardware & Parts > Toilet & Bidet Accessories > Toilet Trim", + }, + { id: "1673", name: "Hardware > Plumbing > Plumbing Fixtures" }, + { id: "499999", name: "Hardware > Plumbing > Plumbing Fixtures > Bathroom Suites" }, + { id: "1636", name: "Hardware > Plumbing > Plumbing Fixtures > Bathtubs" }, + { id: "2032", name: "Hardware > Plumbing > Plumbing Fixtures > Faucets" }, + { id: "7244", name: "Hardware > Plumbing > Plumbing Fixtures > Shower Stalls & Kits" }, + { id: "1687", name: "Hardware > Plumbing > Plumbing Fixtures > Sinks" }, + { id: "2886", name: "Hardware > Plumbing > Plumbing Fixtures > Sinks > Bathroom Sinks" }, + { id: "2757", name: "Hardware > Plumbing > Plumbing Fixtures > Sinks > Kitchen & Utility Sinks" }, + { id: "2062", name: "Hardware > Plumbing > Plumbing Fixtures > Toilets & Bidets" }, + { id: "2376", name: "Hardware > Plumbing > Plumbing Fixtures > Toilets & Bidets > Bidets" }, + { id: "1921", name: "Hardware > Plumbing > Plumbing Fixtures > Toilets & Bidets > Toilets" }, + { id: "1746", name: "Hardware > Plumbing > Plumbing Fixtures > Toilets & Bidets > Urinals" }, + { id: "2570", name: "Hardware > Plumbing > Plumbing Hoses & Supply Lines" }, + { id: "2216", name: "Hardware > Plumbing > Plumbing Pipes" }, + { id: "2203", name: "Hardware > Plumbing > Plumbing Repair Kits" }, + { id: "2273", name: "Hardware > Plumbing > Water Dispensing & Filtration" }, + { + id: "2055", + name: "Hardware > Plumbing > Water Dispensing & Filtration > In-Line Water Filters", + }, + { id: "2343", name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Dispensers" }, + { + id: "1821", + name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Dispensers > Drinking Fountains", + }, + { + id: "1354", + name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Dispensers > Water Chillers", + }, + { id: "1390", name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Distillers" }, + { + id: "2171", + name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Filtration Accessories", + }, + { + id: "2063", + name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Filtration Accessories > Water Filter Cartridges", + }, + { + id: "2406", + name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Filtration Accessories > Water Filter Housings", + }, + { id: "5646", name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Softener Salt" }, + { id: "1952", name: "Hardware > Plumbing > Water Dispensing & Filtration > Water Softeners" }, + { id: "2243", name: "Hardware > Plumbing > Water Levelers" }, + { id: "6832", name: "Hardware > Plumbing > Water Timers" }, + { id: "1723", name: "Hardware > Plumbing > Well Supplies" }, + { id: "127", name: "Hardware > Power & Electrical Supplies" }, + { id: "500049", name: "Hardware > Power & Electrical Supplies > Armatures, Rotors & Stators" }, + { id: "7183", name: "Hardware > Power & Electrical Supplies > Ballasts & Starters" }, + { id: "499893", name: "Hardware > Power & Electrical Supplies > Carbon Brushes" }, + { id: "6807", name: "Hardware > Power & Electrical Supplies > Circuit Breaker Panels" }, + { id: "499768", name: "Hardware > Power & Electrical Supplies > Conduit & Housings" }, + { + id: "499770", + name: "Hardware > Power & Electrical Supplies > Conduit & Housings > Electrical Conduit", + }, + { + id: "3797", + name: "Hardware > Power & Electrical Supplies > Conduit & Housings > Heat-Shrink Tubing", + }, + { id: "7275", name: "Hardware > Power & Electrical Supplies > Electrical Motors" }, + { + id: "2006", + name: "Hardware > Power & Electrical Supplies > Electrical Mount Boxes & Brackets", + }, + { id: "5627", name: "Hardware > Power & Electrical Supplies > Electrical Plug Caps" }, + { id: "6459", name: "Hardware > Power & Electrical Supplies > Electrical Switches" }, + { + id: "1935", + name: "Hardware > Power & Electrical Supplies > Electrical Switches > Light Switches", + }, + { + id: "499932", + name: "Hardware > Power & Electrical Supplies > Electrical Switches > Specialty Electrical Switches & Relays", + }, + { id: "2345", name: "Hardware > Power & Electrical Supplies > Electrical Wires & Cable" }, + { id: "6375", name: "Hardware > Power & Electrical Supplies > Extension Cord Accessories" }, + { id: "4789", name: "Hardware > Power & Electrical Supplies > Extension Cords" }, + { id: "4709", name: "Hardware > Power & Electrical Supplies > Generator Accessories" }, + { id: "1218", name: "Hardware > Power & Electrical Supplies > Generators" }, + { id: "2413", name: "Hardware > Power & Electrical Supplies > Home Automation Kits" }, + { id: "2028", name: "Hardware > Power & Electrical Supplies > Phone & Data Jacks" }, + { id: "5533", name: "Hardware > Power & Electrical Supplies > Power Converters" }, + { id: "499966", name: "Hardware > Power & Electrical Supplies > Power Inlets" }, + { id: "5142", name: "Hardware > Power & Electrical Supplies > Power Inverters" }, + { id: "1869", name: "Hardware > Power & Electrical Supplies > Power Outlets & Sockets" }, + { id: "4715", name: "Hardware > Power & Electrical Supplies > Solar Energy Kits" }, + { id: "4714", name: "Hardware > Power & Electrical Supplies > Solar Panels" }, + { + id: "505318", + name: "Hardware > Power & Electrical Supplies > Voltage Transformers & Regulators", + }, + { id: "2377", name: "Hardware > Power & Electrical Supplies > Wall Plates & Covers" }, + { id: "6833", name: "Hardware > Power & Electrical Supplies > Wall Socket Controls & Sensors" }, + { id: "2274", name: "Hardware > Power & Electrical Supplies > Wire Caps & Nuts" }, + { id: "503729", name: "Hardware > Power & Electrical Supplies > Wire Terminals & Connectors" }, + { id: "499982", name: "Hardware > Small Engines" }, + { id: "1910", name: "Hardware > Storage Tanks" }, + { id: "3650", name: "Hardware > Tool Accessories" }, + { id: "6939", name: "Hardware > Tool Accessories > Abrasive Blaster Accessories" }, + { + id: "6940", + name: "Hardware > Tool Accessories > Abrasive Blaster Accessories > Sandblasting Cabinets", + }, + { id: "7326", name: "Hardware > Tool Accessories > Axe Accessories" }, + { id: "7370", name: "Hardware > Tool Accessories > Axe Accessories > Axe Handles" }, + { id: "7369", name: "Hardware > Tool Accessories > Axe Accessories > Axe Heads" }, + { id: "8117", name: "Hardware > Tool Accessories > Cutter Accessories" }, + { id: "8118", name: "Hardware > Tool Accessories > Cutter Accessories > Nibbler Dies" }, + { id: "3944", name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories" }, + { + id: "1540", + name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Drill & Screwdriver Bits", + }, + { + id: "7140", + name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Drill Bit Extensions", + }, + { + id: "6378", + name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Drill Bit Sharpeners", + }, + { + id: "8276", + name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Drill Chucks", + }, + { + id: "8275", + name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Drill Stands & Guides", + }, + { id: "6806", name: "Hardware > Tool Accessories > Drill & Screwdriver Accessories > Hole Saws" }, + { id: "6471", name: "Hardware > Tool Accessories > Driver Accessories" }, + { id: "2447", name: "Hardware > Tool Accessories > Flashlight Accessories" }, + { id: "499859", name: "Hardware > Tool Accessories > Grinder Accessories" }, + { + id: "499860", + name: "Hardware > Tool Accessories > Grinder Accessories > Grinding Wheels & Points", + }, + { id: "7056", name: "Hardware > Tool Accessories > Hammer Accessories" }, + { id: "7087", name: "Hardware > Tool Accessories > Hammer Accessories > Air Hammer Accessories" }, + { id: "7055", name: "Hardware > Tool Accessories > Hammer Accessories > Hammer Handles" }, + { id: "7057", name: "Hardware > Tool Accessories > Hammer Accessories > Hammer Heads" }, + { id: "2380", name: "Hardware > Tool Accessories > Industrial Staples" }, + { id: "6907", name: "Hardware > Tool Accessories > Jigs" }, + { id: "7472", name: "Hardware > Tool Accessories > Magnetizers & Demagnetizers" }, + { id: "505323", name: "Hardware > Tool Accessories > Mattock & Pickaxe Accessories" }, + { + id: "505324", + name: "Hardware > Tool Accessories > Mattock & Pickaxe Accessories > Mattock & Pickaxe Handles", + }, + { id: "5526", name: "Hardware > Tool Accessories > Measuring Tool & Sensor Accessories" }, + { + id: "5557", + name: "Hardware > Tool Accessories > Measuring Tool & Sensor Accessories > Electrical Testing Tool Accessories", + }, + { + id: "5556", + name: "Hardware > Tool Accessories > Measuring Tool & Sensor Accessories > Gas Detector Accessories", + }, + { + id: "503007", + name: "Hardware > Tool Accessories > Measuring Tool & Sensor Accessories > Measuring Scale Accessories", + }, + { + id: "7415", + name: "Hardware > Tool Accessories > Measuring Tool & Sensor Accessories > Multimeter Accessories", + }, + { id: "499886", name: "Hardware > Tool Accessories > Mixing Tool Paddles" }, + { id: "7019", name: "Hardware > Tool Accessories > Paint Tool Accessories" }, + { + id: "6887", + name: "Hardware > Tool Accessories > Paint Tool Accessories > Airbrush Accessories", + }, + { + id: "328062", + name: "Hardware > Tool Accessories > Paint Tool Accessories > Paint Brush Cleaning Solutions", + }, + { + id: "7020", + name: "Hardware > Tool Accessories > Paint Tool Accessories > Paint Roller Accessories", + }, + { id: "6295", name: "Hardware > Tool Accessories > Power Tool Batteries" }, + { id: "6292", name: "Hardware > Tool Accessories > Power Tool Chargers" }, + { id: "3744", name: "Hardware > Tool Accessories > Router Accessories" }, + { id: "3673", name: "Hardware > Tool Accessories > Router Accessories > Router Bits" }, + { id: "3300", name: "Hardware > Tool Accessories > Router Accessories > Router Tables" }, + { id: "4487", name: "Hardware > Tool Accessories > Sanding Accessories" }, + { + id: "3240", + name: "Hardware > Tool Accessories > Sanding Accessories > Sandpaper & Sanding Sponges", + }, + { id: "6549", name: "Hardware > Tool Accessories > Saw Accessories" }, + { id: "7515", name: "Hardware > Tool Accessories > Saw Accessories > Band Saw Accessories" }, + { + id: "7345", + name: "Hardware > Tool Accessories > Saw Accessories > Handheld Circular Saw Accessories", + }, + { id: "7346", name: "Hardware > Tool Accessories > Saw Accessories > Jigsaw Accessories" }, + { id: "6503", name: "Hardware > Tool Accessories > Saw Accessories > Miter Saw Accessories" }, + { id: "6501", name: "Hardware > Tool Accessories > Saw Accessories > Table Saw Accessories" }, + { id: "3470", name: "Hardware > Tool Accessories > Shaper Accessories" }, + { id: "3210", name: "Hardware > Tool Accessories > Shaper Accessories > Shaper Cutters" }, + { id: "3281", name: "Hardware > Tool Accessories > Soldering Iron Accessories" }, + { + id: "3629", + name: "Hardware > Tool Accessories > Soldering Iron Accessories > Soldering Iron Stands", + }, + { + id: "3609", + name: "Hardware > Tool Accessories > Soldering Iron Accessories > Soldering Iron Tips", + }, + { id: "2174", name: "Hardware > Tool Accessories > Tool Blades" }, + { id: "505831", name: "Hardware > Tool Accessories > Tool Blades > Cutter & Scraper Blades" }, + { id: "2202", name: "Hardware > Tool Accessories > Tool Blades > Saw Blades" }, + { id: "505810", name: "Hardware > Tool Accessories > Tool Handle Wedges" }, + { id: "8258", name: "Hardware > Tool Accessories > Tool Safety Tethers" }, + { id: "5571", name: "Hardware > Tool Accessories > Tool Sockets" }, + { id: "4658", name: "Hardware > Tool Accessories > Tool Stands" }, + { id: "4659", name: "Hardware > Tool Accessories > Tool Stands > Saw Stands" }, + { id: "505812", name: "Hardware > Tool Accessories > Wedge Tools" }, + { id: "499947", name: "Hardware > Tool Accessories > Welding Accessories" }, + { id: "1167", name: "Hardware > Tools" }, + { id: "6938", name: "Hardware > Tools > Abrasive Blasters" }, + { id: "1169", name: "Hardware > Tools > Anvils" }, + { id: "1171", name: "Hardware > Tools > Axes" }, + { id: "7271", name: "Hardware > Tools > Carpentry Jointers" }, + { id: "1174", name: "Hardware > Tools > Carving Chisels & Gouges" }, + { id: "1215", name: "Hardware > Tools > Caulking Tools" }, + { id: "2792", name: "Hardware > Tools > Chimney Brushes" }, + { id: "4325", name: "Hardware > Tools > Compactors" }, + { id: "2015", name: "Hardware > Tools > Compressors" }, + { id: "4672", name: "Hardware > Tools > Concrete Brooms" }, + { id: "1180", name: "Hardware > Tools > Cutters" }, + { id: "1181", name: "Hardware > Tools > Cutters > Bolt Cutters" }, + { id: "1182", name: "Hardware > Tools > Cutters > Glass Cutters" }, + { id: "1454", name: "Hardware > Tools > Cutters > Handheld Metal Shears & Nibblers" }, + { id: "7562", name: "Hardware > Tools > Cutters > Nippers" }, + { id: "2080", name: "Hardware > Tools > Cutters > Pipe Cutters" }, + { id: "1824", name: "Hardware > Tools > Cutters > Rebar Cutters" }, + { id: "2726", name: "Hardware > Tools > Cutters > Tile & Shingle Cutters" }, + { id: "2411", name: "Hardware > Tools > Cutters > Utility Knives" }, + { id: "1391", name: "Hardware > Tools > Deburrers" }, + { id: "126", name: "Hardware > Tools > Dollies & Hand Trucks" }, + { id: "1217", name: "Hardware > Tools > Drills" }, + { id: "1367", name: "Hardware > Tools > Drills > Augers" }, + { id: "1216", name: "Hardware > Tools > Drills > Drill Presses" }, + { id: "2629", name: "Hardware > Tools > Drills > Handheld Power Drills" }, + { id: "1465", name: "Hardware > Tools > Drills > Mortisers" }, + { id: "1994", name: "Hardware > Tools > Drills > Pneumatic Drills" }, + { id: "6461", name: "Hardware > Tools > Electrician Fish Tape" }, + { id: "338", name: "Hardware > Tools > Flashlights & Headlamps" }, + { id: "543689", name: "Hardware > Tools > Flashlights & Headlamps > Flashlights" }, + { id: "2454", name: "Hardware > Tools > Flashlights & Headlamps > Headlamps" }, + { id: "7556", name: "Hardware > Tools > Grease Guns" }, + { id: "1219", name: "Hardware > Tools > Grinders" }, + { id: "1185", name: "Hardware > Tools > Grips" }, + { id: "1186", name: "Hardware > Tools > Hammers" }, + { id: "2208", name: "Hardware > Tools > Hammers > Manual Hammers" }, + { id: "505364", name: "Hardware > Tools > Hammers > Powered Hammers" }, + { id: "499887", name: "Hardware > Tools > Handheld Power Mixers" }, + { id: "5927", name: "Hardware > Tools > Hardware Torches" }, + { id: "1220", name: "Hardware > Tools > Heat Guns" }, + { id: "1221", name: "Hardware > Tools > Impact Wrenches & Drivers" }, + { id: "2456", name: "Hardware > Tools > Industrial Vibrators" }, + { id: "7416", name: "Hardware > Tools > Inspection Mirrors" }, + { id: "130", name: "Hardware > Tools > Ladders & Scaffolding" }, + { id: "2416", name: "Hardware > Tools > Ladders & Scaffolding > Ladder Carts" }, + { id: "6928", name: "Hardware > Tools > Ladders & Scaffolding > Ladders" }, + { id: "1866", name: "Hardware > Tools > Ladders & Scaffolding > Scaffolding" }, + { id: "635", name: "Hardware > Tools > Ladders & Scaffolding > Step Stools" }, + { id: "1809", name: "Hardware > Tools > Ladders & Scaffolding > Work Platforms" }, + { id: "1663", name: "Hardware > Tools > Lathes" }, + { id: "1603", name: "Hardware > Tools > Light Bulb Changers" }, + { id: "503774", name: "Hardware > Tools > Lighters & Matches" }, + { id: "7030", name: "Hardware > Tools > Log Splitters" }, + { id: "5873", name: "Hardware > Tools > Magnetic Sweepers" }, + { id: "1832", name: "Hardware > Tools > Marking Tools" }, + { id: "1193", name: "Hardware > Tools > Masonry Tools" }, + { id: "1668", name: "Hardware > Tools > Masonry Tools > Brick Tools" }, + { id: "2305", name: "Hardware > Tools > Masonry Tools > Cement Mixers" }, + { id: "1555", name: "Hardware > Tools > Masonry Tools > Construction Lines" }, + { id: "2337", name: "Hardware > Tools > Masonry Tools > Floats" }, + { id: "7484", name: "Hardware > Tools > Masonry Tools > Grout Sponges" }, + { id: "1799", name: "Hardware > Tools > Masonry Tools > Masonry Edgers & Groovers" }, + { id: "1450", name: "Hardware > Tools > Masonry Tools > Masonry Jointers" }, + { id: "2181", name: "Hardware > Tools > Masonry Tools > Masonry Trowels" }, + { id: "4132", name: "Hardware > Tools > Masonry Tools > Power Trowels" }, + { id: "3932", name: "Hardware > Tools > Mattocks & Pickaxes" }, + { id: "1305", name: "Hardware > Tools > Measuring Tools & Sensors" }, + { id: "5515", name: "Hardware > Tools > Measuring Tools & Sensors > Air Quality Meters" }, + { id: "4022", name: "Hardware > Tools > Measuring Tools & Sensors > Altimeters" }, + { id: "500058", name: "Hardware > Tools > Measuring Tools & Sensors > Anemometers" }, + { id: "3602", name: "Hardware > Tools > Measuring Tools & Sensors > Barometers" }, + { id: "2192", name: "Hardware > Tools > Measuring Tools & Sensors > Calipers" }, + { id: "1533", name: "Hardware > Tools > Measuring Tools & Sensors > Cruising Rods" }, + { id: "5487", name: "Hardware > Tools > Measuring Tools & Sensors > Distance Meters" }, + { id: "1850", name: "Hardware > Tools > Measuring Tools & Sensors > Dividers" }, + { id: "503737", name: "Hardware > Tools > Measuring Tools & Sensors > Electrical Testing Tools" }, + { id: "1640", name: "Hardware > Tools > Measuring Tools & Sensors > Flow Meters & Controllers" }, + { id: "1991", name: "Hardware > Tools > Measuring Tools & Sensors > Gas Detectors" }, + { id: "1732", name: "Hardware > Tools > Measuring Tools & Sensors > Gauges" }, + { id: "5371", name: "Hardware > Tools > Measuring Tools & Sensors > Geiger Counters" }, + { id: "4754", name: "Hardware > Tools > Measuring Tools & Sensors > Hygrometers" }, + { id: "4506", name: "Hardware > Tools > Measuring Tools & Sensors > Infrared Thermometers" }, + { id: "2330", name: "Hardware > Tools > Measuring Tools & Sensors > Knife Guides" }, + { id: "1191", name: "Hardware > Tools > Measuring Tools & Sensors > Levels" }, + { id: "4081", name: "Hardware > Tools > Measuring Tools & Sensors > Levels > Bubble Levels" }, + { id: "4931", name: "Hardware > Tools > Measuring Tools & Sensors > Levels > Laser Levels" }, + { id: "4294", name: "Hardware > Tools > Measuring Tools & Sensors > Levels > Sight Levels" }, + { id: "1698", name: "Hardware > Tools > Measuring Tools & Sensors > Measuring Scales" }, + { id: "1459", name: "Hardware > Tools > Measuring Tools & Sensors > Measuring Wheels" }, + { id: "4755", name: "Hardware > Tools > Measuring Tools & Sensors > Moisture Meters" }, + { id: "1785", name: "Hardware > Tools > Measuring Tools & Sensors > Probes & Finders" }, + { id: "1198", name: "Hardware > Tools > Measuring Tools & Sensors > Protractors" }, + { id: "1539", name: "Hardware > Tools > Measuring Tools & Sensors > Rebar Locators" }, + { id: "2021", name: "Hardware > Tools > Measuring Tools & Sensors > Rulers" }, + { id: "4756", name: "Hardware > Tools > Measuring Tools & Sensors > Seismometer" }, + { id: "4757", name: "Hardware > Tools > Measuring Tools & Sensors > Sound Meters" }, + { id: "1205", name: "Hardware > Tools > Measuring Tools & Sensors > Squares" }, + { id: "1413", name: "Hardware > Tools > Measuring Tools & Sensors > Straight Edges" }, + { id: "1207", name: "Hardware > Tools > Measuring Tools & Sensors > Stud Sensors" }, + { id: "2481", name: "Hardware > Tools > Measuring Tools & Sensors > Tape Measures" }, + { id: "4340", name: "Hardware > Tools > Measuring Tools & Sensors > Theodolites" }, + { id: "6799", name: "Hardware > Tools > Measuring Tools & Sensors > Thermal Imaging Cameras" }, + { + id: "2093", + name: "Hardware > Tools > Measuring Tools & Sensors > Thermocouples & Thermopiles", + }, + { id: "7394", name: "Hardware > Tools > Measuring Tools & Sensors > Transducers" }, + { id: "4758", name: "Hardware > Tools > Measuring Tools & Sensors > UV Light Meters" }, + { id: "4759", name: "Hardware > Tools > Measuring Tools & Sensors > Vibration Meters" }, + { + id: "1374", + name: "Hardware > Tools > Measuring Tools & Sensors > Weather Forecasters & Stations", + }, + { id: "4074", name: "Hardware > Tools > Measuring Tools & Sensors > pH Meters" }, + { id: "5077", name: "Hardware > Tools > Milling Machines" }, + { id: "5587", name: "Hardware > Tools > Multifunction Power Tools" }, + { id: "1194", name: "Hardware > Tools > Nail Pullers" }, + { id: "1206", name: "Hardware > Tools > Nailers & Staplers" }, + { id: "5828", name: "Hardware > Tools > Oil Filter Drains" }, + { id: "2077", name: "Hardware > Tools > Paint Tools" }, + { id: "2486", name: "Hardware > Tools > Paint Tools > Airbrushes" }, + { id: "1300", name: "Hardware > Tools > Paint Tools > Paint Brushes" }, + { id: "6556", name: "Hardware > Tools > Paint Tools > Paint Edgers" }, + { id: "1774", name: "Hardware > Tools > Paint Tools > Paint Rollers" }, + { id: "499888", name: "Hardware > Tools > Paint Tools > Paint Shakers" }, + { id: "1699", name: "Hardware > Tools > Paint Tools > Paint Sponges" }, + { id: "2465", name: "Hardware > Tools > Paint Tools > Paint Sprayers" }, + { id: "505325", name: "Hardware > Tools > Paint Tools > Paint Strainers" }, + { id: "6557", name: "Hardware > Tools > Paint Tools > Paint Trays" }, + { id: "1196", name: "Hardware > Tools > Pickup Tools" }, + { id: "1667", name: "Hardware > Tools > Pipe & Bar Benders" }, + { id: "2053", name: "Hardware > Tools > Pipe & Tube Cleaners" }, + { id: "1862", name: "Hardware > Tools > Pipe Brushes" }, + { id: "6868", name: "Hardware > Tools > Planers" }, + { id: "1187", name: "Hardware > Tools > Planes" }, + { id: "1958", name: "Hardware > Tools > Pliers" }, + { id: "1563", name: "Hardware > Tools > Plungers" }, + { id: "1225", name: "Hardware > Tools > Polishers & Buffers" }, + { id: "3501", name: "Hardware > Tools > Post Hole Diggers" }, + { id: "1179", name: "Hardware > Tools > Pry Bars" }, + { id: "505315", name: "Hardware > Tools > Punches & Awls" }, + { id: "1202", name: "Hardware > Tools > Putty Knives & Scrapers" }, + { id: "1819", name: "Hardware > Tools > Reamers" }, + { id: "7064", name: "Hardware > Tools > Riveting Tools" }, + { id: "7065", name: "Hardware > Tools > Riveting Tools > Rivet Guns" }, + { id: "7066", name: "Hardware > Tools > Riveting Tools > Rivet Pliers" }, + { id: "1841", name: "Hardware > Tools > Routing Tools" }, + { id: "1188", name: "Hardware > Tools > Sanders" }, + { id: "4419", name: "Hardware > Tools > Sanding Blocks" }, + { id: "1201", name: "Hardware > Tools > Saw Horses" }, + { id: "1235", name: "Hardware > Tools > Saws" }, + { id: "3582", name: "Hardware > Tools > Saws > Band Saws" }, + { id: "3516", name: "Hardware > Tools > Saws > Cut-Off Saws" }, + { id: "3594", name: "Hardware > Tools > Saws > Hand Saws" }, + { id: "3224", name: "Hardware > Tools > Saws > Handheld Circular Saws" }, + { id: "3725", name: "Hardware > Tools > Saws > Jigsaws" }, + { id: "7077", name: "Hardware > Tools > Saws > Masonry & Tile Saws" }, + { id: "3517", name: "Hardware > Tools > Saws > Miter Saws" }, + { id: "499985", name: "Hardware > Tools > Saws > Panel Saws" }, + { id: "3494", name: "Hardware > Tools > Saws > Reciprocating Saws" }, + { id: "4633", name: "Hardware > Tools > Saws > Scroll Saws" }, + { id: "3706", name: "Hardware > Tools > Saws > Table Saws" }, + { id: "1203", name: "Hardware > Tools > Screwdrivers" }, + { id: "1923", name: "Hardware > Tools > Shapers" }, + { id: "1644", name: "Hardware > Tools > Sharpeners" }, + { id: "1195", name: "Hardware > Tools > Socket Drivers" }, + { id: "1236", name: "Hardware > Tools > Soldering Irons" }, + { id: "1787", name: "Hardware > Tools > Tap Reseaters" }, + { id: "1184", name: "Hardware > Tools > Taps & Dies" }, + { id: "1584", name: "Hardware > Tools > Threading Machines" }, + { id: "2835", name: "Hardware > Tools > Tool Clamps & Vises" }, + { id: "3745", name: "Hardware > Tools > Tool Files" }, + { id: "1439", name: "Hardware > Tools > Tool Keys" }, + { id: "2198", name: "Hardware > Tools > Tool Knives" }, + { id: "4919", name: "Hardware > Tools > Tool Sets" }, + { id: "6965", name: "Hardware > Tools > Tool Sets > Hand Tool Sets" }, + { id: "4716", name: "Hardware > Tools > Tool Sets > Power Tool Combo Sets" }, + { id: "1238", name: "Hardware > Tools > Welding Guns & Plasma Cutters" }, + { id: "1469", name: "Hardware > Tools > Wire & Cable Hand Tools" }, + { id: "5592", name: "Hardware > Tools > Work Lights" }, + { id: "1632", name: "Hardware > Tools > Wrenches" }, + { id: "469", name: "Health & Beauty" }, + { id: "491", name: "Health & Beauty > Health Care" }, + { id: "5849", name: "Health & Beauty > Health Care > Acupuncture" }, + { id: "5850", name: "Health & Beauty > Health Care > Acupuncture > Acupuncture Models" }, + { id: "5851", name: "Health & Beauty > Health Care > Acupuncture > Acupuncture Needles" }, + { id: "7220", name: "Health & Beauty > Health Care > Bed Pans" }, + { id: "5071", name: "Health & Beauty > Health Care > Biometric Monitor Accessories" }, + { + id: "505819", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Activity Monitor Accessories", + }, + { + id: "3688", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Glucose Meter Accessories", + }, + { + id: "6323", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Glucose Meter Accessories > Blood Glucose Control Solution", + }, + { + id: "3905", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Glucose Meter Accessories > Blood Glucose Test Strips", + }, + { + id: "3111", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Glucose Meter Accessories > Lancing Devices", + }, + { + id: "6284", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Pressure Monitor Accessories", + }, + { + id: "6285", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Blood Pressure Monitor Accessories > Blood Pressure Monitor Cuffs", + }, + { + id: "5072", + name: "Health & Beauty > Health Care > Biometric Monitor Accessories > Body Weight Scale Accessories", + }, + { id: "494", name: "Health & Beauty > Health Care > Biometric Monitors" }, + { id: "500009", name: "Health & Beauty > Health Care > Biometric Monitors > Activity Monitors" }, + { id: "2246", name: "Health & Beauty > Health Care > Biometric Monitors > Blood Glucose Meters" }, + { + id: "495", + name: "Health & Beauty > Health Care > Biometric Monitors > Blood Pressure Monitors", + }, + { id: "496", name: "Health & Beauty > Health Care > Biometric Monitors > Body Fat Analyzers" }, + { id: "500", name: "Health & Beauty > Health Care > Biometric Monitors > Body Weight Scales" }, + { id: "2633", name: "Health & Beauty > Health Care > Biometric Monitors > Breathalyzers" }, + { id: "497", name: "Health & Beauty > Health Care > Biometric Monitors > Cholesterol Analyzers" }, + { + id: "505822", + name: "Health & Beauty > Health Care > Biometric Monitors > Fertility Monitors and Ovulation Tests", + }, + { + id: "543679", + name: "Health & Beauty > Health Care > Biometric Monitors > Fertility Monitors and Ovulation Tests > Fertility Tests & Monitors", + }, + { + id: "543680", + name: "Health & Beauty > Health Care > Biometric Monitors > Fertility Monitors and Ovulation Tests > Ovulation Tests", + }, + { id: "501", name: "Health & Beauty > Health Care > Biometric Monitors > Medical Thermometers" }, + { + id: "4767", + name: "Health & Beauty > Health Care > Biometric Monitors > Prenatal Heart Rate Monitors", + }, + { id: "5551", name: "Health & Beauty > Health Care > Biometric Monitors > Pulse Oximeters" }, + { id: "775", name: "Health & Beauty > Health Care > Condoms" }, + { id: "505820", name: "Health & Beauty > Health Care > Conductivity Gels & Lotions" }, + { id: "7002", name: "Health & Beauty > Health Care > Contraceptive Cases" }, + { id: "508", name: "Health & Beauty > Health Care > First Aid" }, + { + id: "2954", + name: "Health & Beauty > Health Care > First Aid > Antiseptics & Cleaning Supplies", + }, + { id: "6206", name: "Health & Beauty > Health Care > First Aid > Cast & Bandage Protectors" }, + { id: "4527", name: "Health & Beauty > Health Care > First Aid > Eye Wash Supplies" }, + { id: "510", name: "Health & Beauty > Health Care > First Aid > First Aid Kits" }, + { id: "516", name: "Health & Beauty > Health Care > First Aid > Hot & Cold Therapies" }, + { + id: "5848", + name: "Health & Beauty > Health Care > First Aid > Hot & Cold Therapies > Heat Rubs", + }, + { + id: "6205", + name: "Health & Beauty > Health Care > First Aid > Hot & Cold Therapies > Heating Pads", + }, + { + id: "4753", + name: "Health & Beauty > Health Care > First Aid > Hot & Cold Therapies > Ice Packs", + }, + { id: "509", name: "Health & Beauty > Health Care > First Aid > Medical Tape & Bandages" }, + { id: "2890", name: "Health & Beauty > Health Care > Fitness & Nutrition" }, + { id: "2984", name: "Health & Beauty > Health Care > Fitness & Nutrition > Nutrition Bars" }, + { + id: "5702", + name: "Health & Beauty > Health Care > Fitness & Nutrition > Nutrition Drinks & Shakes", + }, + { + id: "6242", + name: "Health & Beauty > Health Care > Fitness & Nutrition > Nutrition Gels & Chews", + }, + { + id: "6871", + name: "Health & Beauty > Health Care > Fitness & Nutrition > Nutritional Food Purées", + }, + { + id: "7413", + name: "Health & Beauty > Health Care > Fitness & Nutrition > Tube Feeding Supplements", + }, + { + id: "525", + name: "Health & Beauty > Health Care > Fitness & Nutrition > Vitamins & Supplements", + }, + { id: "5690", name: "Health & Beauty > Health Care > Hearing Aids" }, + { id: "517", name: "Health & Beauty > Health Care > Incontinence Aids" }, + { id: "500087", name: "Health & Beauty > Health Care > Light Therapy Lamps" }, + { id: "5966", name: "Health & Beauty > Health Care > Medical Alarm Systems" }, + { id: "5965", name: "Health & Beauty > Health Care > Medical Identification Tags & Jewelry" }, + { id: "505293", name: "Health & Beauty > Health Care > Medical Tests" }, + { id: "499934", name: "Health & Beauty > Health Care > Medical Tests > Allergy Test Kits" }, + { id: "7337", name: "Health & Beauty > Health Care > Medical Tests > Blood Typing Test Kits" }, + { id: "2552", name: "Health & Beauty > Health Care > Medical Tests > Drug Tests" }, + { id: "7336", name: "Health & Beauty > Health Care > Medical Tests > HIV Tests" }, + { id: "1680", name: "Health & Beauty > Health Care > Medical Tests > Pregnancy Tests" }, + { + id: "505294", + name: "Health & Beauty > Health Care > Medical Tests > Urinary Tract Infection Tests", + }, + { id: "518", name: "Health & Beauty > Health Care > Medicine & Drugs" }, + { id: "519", name: "Health & Beauty > Health Care > Mobility & Accessibility" }, + { + id: "520", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment", + }, + { + id: "3512", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment > Mobility Scooters", + }, + { + id: "7138", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment > Stair Lifts", + }, + { + id: "502969", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment > Transfer Boards & Sheets", + }, + { + id: "3364", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment > Wheelchairs", + }, + { + id: "521", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Equipment Accessories", + }, + { + id: "5488", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Furniture & Fixtures", + }, + { + id: "7243", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Accessibility Furniture & Fixtures > Shower Benches & Seats", + }, + { + id: "6929", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Walking Aid Accessories", + }, + { id: "5164", name: "Health & Beauty > Health Care > Mobility & Accessibility > Walking Aids" }, + { + id: "5165", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Walking Aids > Canes & Walking Sticks", + }, + { + id: "4248", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Walking Aids > Crutches", + }, + { + id: "5166", + name: "Health & Beauty > Health Care > Mobility & Accessibility > Walking Aids > Walkers", + }, + { id: "5870", name: "Health & Beauty > Health Care > Occupational & Physical Therapy Equipment" }, + { + id: "8541", + name: "Health & Beauty > Health Care > Occupational & Physical Therapy Equipment > Electrical Muscle Stimulators", + }, + { + id: "505352", + name: "Health & Beauty > Health Care > Occupational & Physical Therapy Equipment > Therapeutic Swings", + }, + { id: "3777", name: "Health & Beauty > Health Care > Pillboxes" }, + { id: "4551", name: "Health & Beauty > Health Care > Respiratory Care" }, + { id: "4552", name: "Health & Beauty > Health Care > Respiratory Care > Nebulizers" }, + { id: "499692", name: "Health & Beauty > Health Care > Respiratory Care > Oxygen Tanks" }, + { id: "7317", name: "Health & Beauty > Health Care > Respiratory Care > PAP Machines" }, + { id: "7316", name: "Health & Beauty > Health Care > Respiratory Care > PAP Masks" }, + { id: "505669", name: "Health & Beauty > Health Care > Respiratory Care > Steam Inhalers" }, + { id: "8082", name: "Health & Beauty > Health Care > Specimen Cups" }, + { id: "7186", name: "Health & Beauty > Health Care > Spermicides" }, + { id: "8105", name: "Health & Beauty > Health Care > Stump Shrinkers" }, + { id: "523", name: "Health & Beauty > Health Care > Supports & Braces" }, + { id: "5923", name: "Health & Beauty > Health Care > Surgical Lubricants" }, + { id: "5573", name: "Health & Beauty > Jewelry Cleaning & Care" }, + { + id: "499919", + name: "Health & Beauty > Jewelry Cleaning & Care > Jewelry Cleaning Solutions & Polishes", + }, + { id: "500082", name: "Health & Beauty > Jewelry Cleaning & Care > Jewelry Cleaning Tools" }, + { id: "5974", name: "Health & Beauty > Jewelry Cleaning & Care > Jewelry Holders" }, + { id: "500083", name: "Health & Beauty > Jewelry Cleaning & Care > Jewelry Steam Cleaners" }, + { id: "5124", name: "Health & Beauty > Jewelry Cleaning & Care > Watch Repair Kits" }, + { id: "2915", name: "Health & Beauty > Personal Care" }, + { id: "493", name: "Health & Beauty > Personal Care > Back Care" }, + { + id: "7404", + name: "Health & Beauty > Personal Care > Back Care > Back & Lumbar Support Cushions", + }, + { id: "473", name: "Health & Beauty > Personal Care > Cosmetics" }, + { id: "474", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body" }, + { + id: "499913", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Adult Hygienic Wipes", + }, + { id: "2503", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Bar Soap" }, + { + id: "2522", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Bath Additives", + }, + { id: "2876", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Bath Brushes" }, + { + id: "2875", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Bath Sponges & Loofahs", + }, + { id: "2747", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Body Wash" }, + { + id: "3691", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Hand Sanitizers & Wipes", + }, + { + id: "3208", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Liquid Hand Soap", + }, + { + id: "7417", + name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Powdered Hand Soap", + }, + { id: "4049", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body > Shower Caps" }, + { id: "475", name: "Health & Beauty > Personal Care > Cosmetics > Bath & Body Gift Sets" }, + { id: "6069", name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Sets" }, + { id: "6331", name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tool Cleansers" }, + { id: "2619", name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools" }, + { + id: "2548", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools", + }, + { + id: "7356", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Double Eyelid Glue & Tape", + }, + { + id: "6555", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Eyebrow Stencils", + }, + { + id: "6282", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Eyelash Curler Refills", + }, + { + id: "2780", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Eyelash Curlers", + }, + { + id: "476", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Face Mirrors", + }, + { + id: "4121", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Facial Blotting Paper", + }, + { + id: "502996", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > False Eyelash Accessories", + }, + { + id: "7256", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > False Eyelash Accessories > False Eyelash Adhesive", + }, + { + id: "7493", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > False Eyelash Accessories > False Eyelash Applicators", + }, + { + id: "502997", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > False Eyelash Accessories > False Eyelash Remover", + }, + { + id: "3025", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Makeup Brushes", + }, + { + id: "4106", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Makeup Sponges", + }, + { + id: "499822", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Makeup Tools > Refillable Makeup Palettes & Cases", + }, + { id: "2975", name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools" }, + { + id: "2739", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Cuticle Pushers", + }, + { + id: "3037", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Cuticle Scissors", + }, + { + id: "7494", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Manicure & Pedicure Spacers", + }, + { + id: "6300", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Manicure Tool Sets", + }, + { + id: "6341", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Buffers", + }, + { + id: "2828", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Clippers", + }, + { + id: "499698", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Drill Accessories", + }, + { + id: "7490", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Drills", + }, + { + id: "5880", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Dryers", + }, + { + id: "2734", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Nail Tools > Nail Files & Emery Boards", + }, + { + id: "2958", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools", + }, + { + id: "6760", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Facial Saunas", + }, + { + id: "7190", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Foot Files", + }, + { + id: "499926", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Lotion & Sunscreen Applicators", + }, + { + id: "2511", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Pumice Stones", + }, + { + id: "6261", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Skin Care Extractors", + }, + { + id: "7018", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Skin Care Rollers", + }, + { + id: "8132", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Skin Cleansing Brush Heads", + }, + { + id: "6260", + name: "Health & Beauty > Personal Care > Cosmetics > Cosmetic Tools > Skin Care Tools > Skin Cleansing Brushes & Systems", + }, + { id: "477", name: "Health & Beauty > Personal Care > Cosmetics > Makeup" }, + { id: "5978", name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Body Makeup" }, + { + id: "5981", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Body Makeup > Body & Hair Glitter", + }, + { + id: "5979", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Body Makeup > Body Paint & Foundation", + }, + { + id: "4779", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Costume & Stage Makeup", + }, + { id: "2779", name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup" }, + { + id: "8220", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Eye Primer", + }, + { + id: "2904", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Eye Shadow", + }, + { + id: "2686", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Eyebrow Enhancers", + }, + { + id: "2807", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Eyeliner", + }, + { + id: "2761", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > False Eyelashes", + }, + { + id: "6340", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Lash & Brow Growth Treatments", + }, + { + id: "2834", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Mascara", + }, + { + id: "8219", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Eye Makeup > Mascara Primer", + }, + { id: "2571", name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup" }, + { + id: "6305", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup > Blushes & Bronzers", + }, + { + id: "2980", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup > Face Powder", + }, + { + id: "8218", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup > Face Primer", + }, + { + id: "2765", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup > Foundations & Concealers", + }, + { + id: "6304", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Face Makeup > Highlighters & Luminizers", + }, + { id: "2645", name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup" }, + { + id: "6306", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup > Lip & Cheek Stains", + }, + { + id: "2858", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup > Lip Gloss", + }, + { + id: "2589", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup > Lip Liner", + }, + { + id: "8217", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup > Lip Primer", + }, + { + id: "3021", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Lip Makeup > Lipstick", + }, + { + id: "6072", + name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Makeup Finishing Sprays", + }, + { id: "3509", name: "Health & Beauty > Personal Care > Cosmetics > Makeup > Temporary Tattoos" }, + { id: "478", name: "Health & Beauty > Personal Care > Cosmetics > Nail Care" }, + { + id: "3009", + name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Cuticle Cream & Oil", + }, + { id: "4218", name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > False Nails" }, + { id: "6893", name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Manicure Glue" }, + { + id: "5975", + name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Nail Art Kits & Accessories", + }, + { + id: "233419", + name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Nail Polish Drying Drops & Sprays", + }, + { + id: "2946", + name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Nail Polish Removers", + }, + { + id: "7445", + name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Nail Polish Thinners", + }, + { id: "2683", name: "Health & Beauty > Personal Care > Cosmetics > Nail Care > Nail Polishes" }, + { id: "479", name: "Health & Beauty > Personal Care > Cosmetics > Perfume & Cologne" }, + { id: "567", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care" }, + { + id: "481", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Acne Treatments & Kits", + }, + { + id: "7429", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Anti-Aging Skin Care Kits", + }, + { id: "6104", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Body Oil" }, + { id: "5980", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Body Powder" }, + { + id: "8029", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Compressed Skin Care Mask Sheets", + }, + { + id: "2526", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Facial Cleansers", + }, + { + id: "7467", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Facial Cleansing Kits", + }, + { + id: "6791", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Facial Pore Strips", + }, + { + id: "482", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Lip Balms & Treatments", + }, + { + id: "543573", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Lip Balms & Treatments > Lip Balms", + }, + { + id: "543574", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Lip Balms & Treatments > Medicated Lip Treatments", + }, + { + id: "2592", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Lotion & Moisturizer", + }, + { id: "6034", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Makeup Removers" }, + { id: "6753", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Petroleum Jelly" }, + { + id: "6262", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Skin Care Masks & Peels", + }, + { + id: "5820", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Skin Insect Repellent", + }, + { id: "2844", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Sunscreen" }, + { + id: "2740", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Tanning Products", + }, + { + id: "5338", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Tanning Products > Self Tanner", + }, + { + id: "5339", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Tanning Products > Tanning Oil & Lotion", + }, + { + id: "5976", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Toners & Astringents", + }, + { + id: "543659", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Toners & Astringents > Astringents", + }, + { + id: "543658", + name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Toners & Astringents > Toners", + }, + { id: "6863", name: "Health & Beauty > Personal Care > Cosmetics > Skin Care > Wart Removers" }, + { id: "4929", name: "Health & Beauty > Personal Care > Cotton Balls" }, + { id: "2934", name: "Health & Beauty > Personal Care > Cotton Swabs" }, + { id: "484", name: "Health & Beauty > Personal Care > Deodorant & Anti-Perspirant" }, + { + id: "543599", + name: "Health & Beauty > Personal Care > Deodorant & Anti-Perspirant > Anti-Perspirant", + }, + { + id: "543598", + name: "Health & Beauty > Personal Care > Deodorant & Anti-Perspirant > Deodorant", + }, + { id: "506", name: "Health & Beauty > Personal Care > Ear Care" }, + { id: "5706", name: "Health & Beauty > Personal Care > Ear Care > Ear Candles" }, + { id: "6559", name: "Health & Beauty > Personal Care > Ear Care > Ear Drops" }, + { id: "6560", name: "Health & Beauty > Personal Care > Ear Care > Ear Dryers" }, + { id: "500024", name: "Health & Beauty > Personal Care > Ear Care > Ear Picks & Spoons" }, + { id: "6561", name: "Health & Beauty > Personal Care > Ear Care > Ear Syringes" }, + { id: "6562", name: "Health & Beauty > Personal Care > Ear Care > Ear Wax Removal Kits" }, + { id: "7542", name: "Health & Beauty > Personal Care > Ear Care > Earplug Dispensers" }, + { id: "2596", name: "Health & Beauty > Personal Care > Ear Care > Earplugs" }, + { id: "7134", name: "Health & Beauty > Personal Care > Enema Kits & Supplies" }, + { id: "485", name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies" }, + { + id: "6862", + name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies > Feminine Deodorant", + }, + { + id: "5821", + name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies > Feminine Douches & Creams", + }, + { + id: "2387", + name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies > Feminine Pads & Protectors", + }, + { + id: "8122", + name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies > Menstrual Cups", + }, + { id: "2564", name: "Health & Beauty > Personal Care > Feminine Sanitary Supplies > Tampons" }, + { id: "515", name: "Health & Beauty > Personal Care > Foot Care" }, + { id: "2992", name: "Health & Beauty > Personal Care > Foot Care > Bunion Care Supplies" }, + { id: "3022", name: "Health & Beauty > Personal Care > Foot Care > Corn & Callus Care Supplies" }, + { id: "3049", name: "Health & Beauty > Personal Care > Foot Care > Foot Odor Removers" }, + { id: "2801", name: "Health & Beauty > Personal Care > Foot Care > Insoles & Inserts" }, + { id: "7495", name: "Health & Beauty > Personal Care > Foot Care > Toe Spacers" }, + { id: "486", name: "Health & Beauty > Personal Care > Hair Care" }, + { id: "8452", name: "Health & Beauty > Personal Care > Hair Care > Hair Care Kits" }, + { id: "2814", name: "Health & Beauty > Personal Care > Hair Care > Hair Color" }, + { id: "6053", name: "Health & Beauty > Personal Care > Hair Care > Hair Color Removers" }, + { id: "5977", name: "Health & Beauty > Personal Care > Hair Care > Hair Coloring Accessories" }, + { id: "6099", name: "Health & Beauty > Personal Care > Hair Care > Hair Loss Concealers" }, + { id: "4766", name: "Health & Beauty > Personal Care > Hair Care > Hair Loss Treatments" }, + { + id: "6052", + name: "Health & Beauty > Personal Care > Hair Care > Hair Permanents & Straighteners", + }, + { id: "3013", name: "Health & Beauty > Personal Care > Hair Care > Hair Shears" }, + { id: "6429", name: "Health & Beauty > Personal Care > Hair Care > Hair Steamers & Heat Caps" }, + { id: "1901", name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Products" }, + { + id: "6018", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tool Accessories", + }, + { + id: "5317", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tool Accessories > Hair Curler Clips & Pins", + }, + { + id: "4475", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tool Accessories > Hair Dryer Accessories", + }, + { + id: "4569", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tool Accessories > Hair Iron Accessories", + }, + { id: "6019", name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools" }, + { + id: "487", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Combs & Brushes", + }, + { + id: "489", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Curling Irons", + }, + { + id: "488", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Hair Curlers", + }, + { + id: "490", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Hair Dryers", + }, + { + id: "3407", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Hair Straighteners", + }, + { + id: "499992", + name: "Health & Beauty > Personal Care > Hair Care > Hair Styling Tools > Hair Styling Tool Sets", + }, + { id: "2441", name: "Health & Beauty > Personal Care > Hair Care > Shampoo & Conditioner" }, + { + id: "543616", + name: "Health & Beauty > Personal Care > Hair Care > Shampoo & Conditioner > Conditioners", + }, + { + id: "543615", + name: "Health & Beauty > Personal Care > Hair Care > Shampoo & Conditioner > Shampoo", + }, + { + id: "543617", + name: "Health & Beauty > Personal Care > Hair Care > Shampoo & Conditioner > Shampoo & Conditioner Sets", + }, + { id: "5663", name: "Health & Beauty > Personal Care > Massage & Relaxation" }, + { + id: "500060", + name: "Health & Beauty > Personal Care > Massage & Relaxation > Back Scratchers", + }, + { id: "233420", name: "Health & Beauty > Personal Care > Massage & Relaxation > Eye Pillows" }, + { id: "1442", name: "Health & Beauty > Personal Care > Massage & Relaxation > Massage Chairs" }, + { id: "5664", name: "Health & Beauty > Personal Care > Massage & Relaxation > Massage Oil" }, + { + id: "8530", + name: "Health & Beauty > Personal Care > Massage & Relaxation > Massage Stone Warmers", + }, + { id: "8135", name: "Health & Beauty > Personal Care > Massage & Relaxation > Massage Stones" }, + { id: "2074", name: "Health & Beauty > Personal Care > Massage & Relaxation > Massage Tables" }, + { id: "471", name: "Health & Beauty > Personal Care > Massage & Relaxation > Massagers" }, + { + id: "543596", + name: "Health & Beauty > Personal Care > Massage & Relaxation > Massagers > Electric Massagers", + }, + { + id: "543597", + name: "Health & Beauty > Personal Care > Massage & Relaxation > Massagers > Manual Massage Tools", + }, + { + id: "543595", + name: "Health & Beauty > Personal Care > Massage & Relaxation > Massagers > Massage Cushions", + }, + { id: "526", name: "Health & Beauty > Personal Care > Oral Care" }, + { id: "6189", name: "Health & Beauty > Personal Care > Oral Care > Breath Spray" }, + { id: "2620", name: "Health & Beauty > Personal Care > Oral Care > Dental Floss" }, + { id: "5823", name: "Health & Beauty > Personal Care > Oral Care > Dental Mouthguards" }, + { + id: "6455", + name: "Health & Beauty > Personal Care > Oral Care > Dental Water Jet Replacement Tips", + }, + { id: "5295", name: "Health & Beauty > Personal Care > Oral Care > Dental Water Jets" }, + { id: "5155", name: "Health & Beauty > Personal Care > Oral Care > Denture Adhesives" }, + { id: "5824", name: "Health & Beauty > Personal Care > Oral Care > Denture Cleaners" }, + { id: "8543", name: "Health & Beauty > Personal Care > Oral Care > Denture Repair Kits" }, + { id: "2527", name: "Health & Beauty > Personal Care > Oral Care > Dentures" }, + { id: "2769", name: "Health & Beauty > Personal Care > Oral Care > Gum Stimulators" }, + { id: "3040", name: "Health & Beauty > Personal Care > Oral Care > Mouthwash" }, + { + id: "505367", + name: "Health & Beauty > Personal Care > Oral Care > Orthodontic Appliance Cases", + }, + { id: "6715", name: "Health & Beauty > Personal Care > Oral Care > Power Flossers" }, + { id: "3019", name: "Health & Beauty > Personal Care > Oral Care > Teeth Whiteners" }, + { id: "6441", name: "Health & Beauty > Personal Care > Oral Care > Tongue Scrapers" }, + { id: "4775", name: "Health & Beauty > Personal Care > Oral Care > Toothbrush Accessories" }, + { + id: "6920", + name: "Health & Beauty > Personal Care > Oral Care > Toothbrush Accessories > Toothbrush Covers", + }, + { + id: "4776", + name: "Health & Beauty > Personal Care > Oral Care > Toothbrush Accessories > Toothbrush Replacement Heads", + }, + { + id: "4942", + name: "Health & Beauty > Personal Care > Oral Care > Toothbrush Accessories > Toothbrush Sanitizers", + }, + { id: "527", name: "Health & Beauty > Personal Care > Oral Care > Toothbrushes" }, + { id: "1360", name: "Health & Beauty > Personal Care > Oral Care > Toothpaste" }, + { + id: "5154", + name: "Health & Beauty > Personal Care > Oral Care > Toothpaste Squeezers & Dispensers", + }, + { id: "4316", name: "Health & Beauty > Personal Care > Oral Care > Toothpicks" }, + { id: "777", name: "Health & Beauty > Personal Care > Personal Lubricants" }, + { id: "528", name: "Health & Beauty > Personal Care > Shaving & Grooming" }, + { id: "529", name: "Health & Beauty > Personal Care > Shaving & Grooming > Aftershave" }, + { + id: "8214", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Body & Facial Hair Bleach", + }, + { + id: "531", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Electric Razor Accessories", + }, + { id: "532", name: "Health & Beauty > Personal Care > Shaving & Grooming > Electric Razors" }, + { + id: "6842", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Clipper & Trimmer Accessories", + }, + { + id: "533", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Clippers & Trimmers", + }, + { id: "4507", name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal" }, + { + id: "4508", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Depilatories", + }, + { + id: "4509", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Electrolysis Devices", + }, + { + id: "4510", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Epilators", + }, + { + id: "8136", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Hair Removal Wax Warmers", + }, + { + id: "7199", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Laser & IPL Hair Removal Devices", + }, + { + id: "4511", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Hair Removal > Waxing Kits & Supplies", + }, + { + id: "534", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Razors & Razor Blades", + }, + { + id: "8531", + name: "Health & Beauty > Personal Care > Shaving & Grooming > Shaving Bowls & Mugs", + }, + { id: "2681", name: "Health & Beauty > Personal Care > Shaving & Grooming > Shaving Brushes" }, + { id: "2971", name: "Health & Beauty > Personal Care > Shaving & Grooming > Shaving Cream" }, + { id: "5111", name: "Health & Beauty > Personal Care > Shaving & Grooming > Shaving Kits" }, + { id: "2508", name: "Health & Beauty > Personal Care > Shaving & Grooming > Styptic Pencils" }, + { id: "4076", name: "Health & Beauty > Personal Care > Sleeping Aids" }, + { id: "4313", name: "Health & Beauty > Personal Care > Sleeping Aids > Eye Masks" }, + { + id: "6017", + name: "Health & Beauty > Personal Care > Sleeping Aids > Snoring & Sleep Apnea Aids", + }, + { id: "4211", name: "Health & Beauty > Personal Care > Sleeping Aids > Travel Pillows" }, + { id: "4056", name: "Health & Beauty > Personal Care > Sleeping Aids > White Noise Machines" }, + { id: "6921", name: "Health & Beauty > Personal Care > Spray Tanning Tents" }, + { id: "472", name: "Health & Beauty > Personal Care > Tanning Beds" }, + { id: "2656", name: "Health & Beauty > Personal Care > Tweezers" }, + { id: "1380", name: "Health & Beauty > Personal Care > Vision Care" }, + { id: "3011", name: "Health & Beauty > Personal Care > Vision Care > Contact Lens Care" }, + { + id: "7363", + name: "Health & Beauty > Personal Care > Vision Care > Contact Lens Care > Contact Lens Care Kits", + }, + { + id: "6510", + name: "Health & Beauty > Personal Care > Vision Care > Contact Lens Care > Contact Lens Cases", + }, + { + id: "6509", + name: "Health & Beauty > Personal Care > Vision Care > Contact Lens Care > Contact Lens Solution", + }, + { id: "2923", name: "Health & Beauty > Personal Care > Vision Care > Contact Lenses" }, + { id: "2922", name: "Health & Beauty > Personal Care > Vision Care > Eye Drops & Lubricants" }, + { id: "2733", name: "Health & Beauty > Personal Care > Vision Care > Eyeglass Lenses" }, + { id: "524", name: "Health & Beauty > Personal Care > Vision Care > Eyeglasses" }, + { id: "2521", name: "Health & Beauty > Personal Care > Vision Care > Eyewear Accessories" }, + { + id: "5507", + name: "Health & Beauty > Personal Care > Vision Care > Eyewear Accessories > Eyewear Cases & Holders", + }, + { + id: "352853", + name: "Health & Beauty > Personal Care > Vision Care > Eyewear Accessories > Eyewear Lens Cleaning Solutions", + }, + { + id: "543538", + name: "Health & Beauty > Personal Care > Vision Care > Eyewear Accessories > Eyewear Replacement Parts", + }, + { + id: "8204", + name: "Health & Beauty > Personal Care > Vision Care > Eyewear Accessories > Eyewear Straps & Chains", + }, + { id: "6977", name: "Health & Beauty > Personal Care > Vision Care > Sunglass Lenses" }, + { id: "536", name: "Home & Garden" }, + { id: "574", name: "Home & Garden > Bathroom Accessories" }, + { id: "575", name: "Home & Garden > Bathroom Accessories > Bath Caddies" }, + { id: "577", name: "Home & Garden > Bathroom Accessories > Bath Mats & Rugs" }, + { id: "4366", name: "Home & Garden > Bathroom Accessories > Bath Pillows" }, + { id: "7093", name: "Home & Garden > Bathroom Accessories > Bathroom Accessory Mounts" }, + { id: "6858", name: "Home & Garden > Bathroom Accessories > Bathroom Accessory Sets" }, + { id: "579", name: "Home & Garden > Bathroom Accessories > Facial Tissue Holders" }, + { id: "8016", name: "Home & Garden > Bathroom Accessories > Hand Dryer Accessories" }, + { id: "5141", name: "Home & Garden > Bathroom Accessories > Hand Dryers" }, + { id: "2418", name: "Home & Garden > Bathroom Accessories > Medicine Cabinets" }, + { id: "2034", name: "Home & Garden > Bathroom Accessories > Robe Hooks" }, + { id: "8114", name: "Home & Garden > Bathroom Accessories > Safety Grab Bars" }, + { id: "578", name: "Home & Garden > Bathroom Accessories > Shower Curtain Rings" }, + { id: "580", name: "Home & Garden > Bathroom Accessories > Shower Curtains" }, + { id: "1962", name: "Home & Garden > Bathroom Accessories > Shower Rods" }, + { id: "4971", name: "Home & Garden > Bathroom Accessories > Soap & Lotion Dispensers" }, + { id: "582", name: "Home & Garden > Bathroom Accessories > Soap Dishes & Holders" }, + { id: "7509", name: "Home & Garden > Bathroom Accessories > Toilet Brush Replacement Heads" }, + { id: "583", name: "Home & Garden > Bathroom Accessories > Toilet Brushes & Holders" }, + { id: "584", name: "Home & Garden > Bathroom Accessories > Toilet Paper Holders" }, + { id: "585", name: "Home & Garden > Bathroom Accessories > Toothbrush Holders" }, + { id: "586", name: "Home & Garden > Bathroom Accessories > Towel Racks & Holders" }, + { id: "359", name: "Home & Garden > Business & Home Security" }, + { id: "5491", name: "Home & Garden > Business & Home Security > Dummy Surveillance Cameras" }, + { id: "3873", name: "Home & Garden > Business & Home Security > Home Alarm Systems" }, + { id: "2161", name: "Home & Garden > Business & Home Security > Motion Sensors" }, + { id: "500025", name: "Home & Garden > Business & Home Security > Safety & Security Mirrors" }, + { id: "363", name: "Home & Garden > Business & Home Security > Security Lights" }, + { id: "364", name: "Home & Garden > Business & Home Security > Security Monitors & Recorders" }, + { id: "499865", name: "Home & Garden > Business & Home Security > Security Safe Accessories" }, + { id: "3819", name: "Home & Garden > Business & Home Security > Security Safes" }, + { id: "365", name: "Home & Garden > Business & Home Security > Security System Sensors" }, + { id: "696", name: "Home & Garden > Decor" }, + { id: "572", name: "Home & Garden > Decor > Address Signs" }, + { id: "6265", name: "Home & Garden > Decor > Artificial Flora" }, + { id: "6266", name: "Home & Garden > Decor > Artificial Food" }, + { id: "9", name: "Home & Garden > Decor > Artwork" }, + { id: "500045", name: "Home & Garden > Decor > Artwork > Decorative Tapestries" }, + { id: "500044", name: "Home & Garden > Decor > Artwork > Posters, Prints, & Visual Artwork" }, + { id: "11", name: "Home & Garden > Decor > Artwork > Sculptures & Statues" }, + { id: "4456", name: "Home & Garden > Decor > Backrest Pillows" }, + { id: "573", name: "Home & Garden > Decor > Baskets" }, + { id: "5521", name: "Home & Garden > Decor > Bird & Wildlife Feeder Accessories" }, + { id: "6993", name: "Home & Garden > Decor > Bird & Wildlife Feeders" }, + { id: "698", name: "Home & Garden > Decor > Bird & Wildlife Feeders > Bird Feeders" }, + { id: "6995", name: "Home & Garden > Decor > Bird & Wildlife Feeders > Butterfly Feeders" }, + { id: "6994", name: "Home & Garden > Decor > Bird & Wildlife Feeders > Squirrel Feeders" }, + { id: "230911", name: "Home & Garden > Decor > Bird & Wildlife House Accessories" }, + { id: "500078", name: "Home & Garden > Decor > Bird & Wildlife Houses" }, + { id: "500079", name: "Home & Garden > Decor > Bird & Wildlife Houses > Bat Houses" }, + { id: "699", name: "Home & Garden > Decor > Bird & Wildlife Houses > Birdhouses" }, + { id: "500080", name: "Home & Garden > Decor > Bird & Wildlife Houses > Butterfly Houses" }, + { id: "697", name: "Home & Garden > Decor > Bird Baths" }, + { id: "587", name: "Home & Garden > Decor > Bookends" }, + { id: "7380", name: "Home & Garden > Decor > Cardboard Cutouts" }, + { id: "4453", name: "Home & Garden > Decor > Chair & Sofa Cushions" }, + { id: "505827", name: "Home & Garden > Decor > Clock Parts" }, + { id: "3890", name: "Home & Garden > Decor > Clocks" }, + { id: "4546", name: "Home & Garden > Decor > Clocks > Alarm Clocks" }, + { id: "6912", name: "Home & Garden > Decor > Clocks > Desk & Shelf Clocks" }, + { id: "3696", name: "Home & Garden > Decor > Clocks > Floor & Grandfather Clocks" }, + { id: "3840", name: "Home & Garden > Decor > Clocks > Wall Clocks" }, + { id: "5708", name: "Home & Garden > Decor > Coat & Hat Racks" }, + { id: "7206", name: "Home & Garden > Decor > Decorative Bells" }, + { id: "6317", name: "Home & Garden > Decor > Decorative Bottles" }, + { id: "6457", name: "Home & Garden > Decor > Decorative Bowls" }, + { id: "7113", name: "Home & Garden > Decor > Decorative Jars" }, + { id: "708", name: "Home & Garden > Decor > Decorative Plaques" }, + { id: "5875", name: "Home & Garden > Decor > Decorative Plates" }, + { id: "6456", name: "Home & Garden > Decor > Decorative Trays" }, + { id: "2675", name: "Home & Garden > Decor > Door Mats" }, + { id: "7172", name: "Home & Garden > Decor > Dreamcatchers" }, + { id: "6936", name: "Home & Garden > Decor > Dried Flowers" }, + { id: "6935", name: "Home & Garden > Decor > Ecospheres" }, + { id: "5609", name: "Home & Garden > Decor > Figurines" }, + { id: "7422", name: "Home & Garden > Decor > Finials" }, + { id: "7419", name: "Home & Garden > Decor > Flag & Windsock Accessories" }, + { + id: "7420", + name: "Home & Garden > Decor > Flag & Windsock Accessories > Flag & Windsock Pole Lights", + }, + { + id: "503010", + name: "Home & Garden > Decor > Flag & Windsock Accessories > Flag & Windsock Pole Mounting Hardware & Kits", + }, + { + id: "7421", + name: "Home & Garden > Decor > Flag & Windsock Accessories > Flag & Windsock Poles", + }, + { id: "701", name: "Home & Garden > Decor > Flags & Windsocks" }, + { id: "4770", name: "Home & Garden > Decor > Flameless Candles" }, + { id: "702", name: "Home & Garden > Decor > Fountains & Ponds" }, + { id: "2921", name: "Home & Garden > Decor > Fountains & Ponds > Fountain & Pond Accessories" }, + { id: "6763", name: "Home & Garden > Decor > Fountains & Ponds > Fountains & Waterfalls" }, + { id: "2763", name: "Home & Garden > Decor > Fountains & Ponds > Ponds" }, + { id: "704", name: "Home & Garden > Decor > Garden & Stepping Stones" }, + { id: "499693", name: "Home & Garden > Decor > Growth Charts" }, + { id: "3221", name: "Home & Garden > Decor > Home Decor Decals" }, + { id: "500121", name: "Home & Garden > Decor > Home Fragrance Accessories" }, + { id: "6336", name: "Home & Garden > Decor > Home Fragrance Accessories > Candle & Oil Warmers" }, + { id: "2784", name: "Home & Garden > Decor > Home Fragrance Accessories > Candle Holders" }, + { id: "500122", name: "Home & Garden > Decor > Home Fragrance Accessories > Candle Snuffers" }, + { id: "4741", name: "Home & Garden > Decor > Home Fragrance Accessories > Incense Holders" }, + { id: "592", name: "Home & Garden > Decor > Home Fragrances" }, + { id: "3898", name: "Home & Garden > Decor > Home Fragrances > Air Fresheners" }, + { id: "588", name: "Home & Garden > Decor > Home Fragrances > Candles" }, + { id: "5847", name: "Home & Garden > Decor > Home Fragrances > Fragrance Oil" }, + { id: "3686", name: "Home & Garden > Decor > Home Fragrances > Incense" }, + { id: "4740", name: "Home & Garden > Decor > Home Fragrances > Potpourri" }, + { id: "6767", name: "Home & Garden > Decor > Home Fragrances > Wax Tarts" }, + { id: "503000", name: "Home & Garden > Decor > Hourglasses" }, + { id: "7382", name: "Home & Garden > Decor > House Numbers & Letters" }, + { id: "6547", name: "Home & Garden > Decor > Lawn Ornaments & Garden Sculptures" }, + { id: "7436", name: "Home & Garden > Decor > Mail Slots" }, + { id: "6333", name: "Home & Garden > Decor > Mailbox Accessories" }, + { id: "7177", name: "Home & Garden > Decor > Mailbox Accessories > Mailbox Covers" }, + { id: "7052", name: "Home & Garden > Decor > Mailbox Accessories > Mailbox Enclosures" }, + { id: "7176", name: "Home & Garden > Decor > Mailbox Accessories > Mailbox Flags" }, + { id: "6334", name: "Home & Garden > Decor > Mailbox Accessories > Mailbox Posts" }, + { id: "7339", name: "Home & Garden > Decor > Mailbox Accessories > Mailbox Replacement Doors" }, + { id: "706", name: "Home & Garden > Decor > Mailboxes" }, + { id: "595", name: "Home & Garden > Decor > Mirrors" }, + { id: "3473", name: "Home & Garden > Decor > Music Boxes" }, + { id: "6324", name: "Home & Garden > Decor > Napkin Rings" }, + { id: "5885", name: "Home & Garden > Decor > Novelty Signs" }, + { id: "6927", name: "Home & Garden > Decor > Ottoman Cushions" }, + { id: "597", name: "Home & Garden > Decor > Picture Frames" }, + { id: "4295", name: "Home & Garden > Decor > Piggy Banks & Money Jars" }, + { id: "709", name: "Home & Garden > Decor > Rain Chains" }, + { id: "710", name: "Home & Garden > Decor > Rain Gauges" }, + { id: "5876", name: "Home & Garden > Decor > Refrigerator Magnets" }, + { id: "598", name: "Home & Garden > Decor > Rugs" }, + { id: "596", name: "Home & Garden > Decor > Seasonal & Holiday Decorations" }, + { id: "5359", name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Advent Calendars" }, + { + id: "5504", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Christmas Tree Skirts", + }, + { + id: "6603", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Christmas Tree Stands", + }, + { + id: "499805", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Easter Egg Decorating Kits", + }, + { + id: "6532", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Holiday Ornament Displays & Stands", + }, + { + id: "499804", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Holiday Ornament Hooks", + }, + { + id: "3144", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Holiday Ornaments", + }, + { + id: "5990", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Holiday Stocking Hangers", + }, + { + id: "5991", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Holiday Stockings", + }, + { + id: "5930", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Japanese Traditional Dolls", + }, + { id: "6531", name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Nativity Sets" }, + { + id: "505809", + name: "Home & Garden > Decor > Seasonal & Holiday Decorations > Seasonal Village Sets & Accessories", + }, + { id: "5922", name: "Home & Garden > Decor > Shadow Boxes" }, + { id: "599", name: "Home & Garden > Decor > Slipcovers" }, + { id: "6535", name: "Home & Garden > Decor > Snow Globes" }, + { id: "7173", name: "Home & Garden > Decor > Suncatchers" }, + { id: "711", name: "Home & Garden > Decor > Sundials" }, + { id: "4454", name: "Home & Garden > Decor > Throw Pillows" }, + { id: "4233", name: "Home & Garden > Decor > Trunks" }, + { id: "6424", name: "Home & Garden > Decor > Vase Fillers & Table Scatters" }, + { id: "602", name: "Home & Garden > Decor > Vases" }, + { id: "2334", name: "Home & Garden > Decor > Wallpaper" }, + { id: "712", name: "Home & Garden > Decor > Weather Vanes & Roof Decor" }, + { id: "714", name: "Home & Garden > Decor > Wind Chimes" }, + { id: "2839", name: "Home & Garden > Decor > Wind Wheels & Spinners" }, + { id: "6530", name: "Home & Garden > Decor > Window Magnets" }, + { id: "6254", name: "Home & Garden > Decor > Window Treatment Accessories" }, + { + id: "6256", + name: "Home & Garden > Decor > Window Treatment Accessories > Curtain & Drape Rings", + }, + { + id: "6257", + name: "Home & Garden > Decor > Window Treatment Accessories > Curtain & Drape Rods", + }, + { + id: "6255", + name: "Home & Garden > Decor > Window Treatment Accessories > Curtain Holdbacks & Tassels", + }, + { + id: "8042", + name: "Home & Garden > Decor > Window Treatment Accessories > Window Treatment Replacement Parts", + }, + { id: "603", name: "Home & Garden > Decor > Window Treatments" }, + { id: "2882", name: "Home & Garden > Decor > Window Treatments > Curtains & Drapes" }, + { id: "6492", name: "Home & Garden > Decor > Window Treatments > Stained Glass Panels" }, + { id: "2885", name: "Home & Garden > Decor > Window Treatments > Window Blinds & Shades" }, + { id: "5989", name: "Home & Garden > Decor > Window Treatments > Window Films" }, + { id: "4375", name: "Home & Garden > Decor > Window Treatments > Window Screens" }, + { id: "2621", name: "Home & Garden > Decor > Window Treatments > Window Valances & Cornices" }, + { id: "3262", name: "Home & Garden > Decor > World Globes" }, + { id: "6267", name: "Home & Garden > Decor > Wreaths & Garlands" }, + { id: "5835", name: "Home & Garden > Emergency Preparedness" }, + { id: "4490", name: "Home & Garden > Emergency Preparedness > Earthquake Alarms" }, + { id: "6897", name: "Home & Garden > Emergency Preparedness > Emergency Blankets" }, + { id: "5836", name: "Home & Garden > Emergency Preparedness > Emergency Food Kits" }, + { id: "7058", name: "Home & Garden > Emergency Preparedness > Emergency Tools & Kits" }, + { id: "4491", name: "Home & Garden > Emergency Preparedness > Furniture Anchors" }, + { id: "2862", name: "Home & Garden > Fireplace & Wood Stove Accessories" }, + { id: "2044", name: "Home & Garden > Fireplace & Wood Stove Accessories > Bellows" }, + { + id: "6563", + name: "Home & Garden > Fireplace & Wood Stove Accessories > Fireplace & Wood Stove Grates", + }, + { id: "7523", name: "Home & Garden > Fireplace & Wood Stove Accessories > Fireplace Andirons" }, + { id: "7109", name: "Home & Garden > Fireplace & Wood Stove Accessories > Fireplace Reflectors" }, + { id: "2365", name: "Home & Garden > Fireplace & Wood Stove Accessories > Fireplace Screens" }, + { id: "1530", name: "Home & Garden > Fireplace & Wood Stove Accessories > Fireplace Tools" }, + { id: "625", name: "Home & Garden > Fireplace & Wood Stove Accessories > Firewood & Fuel" }, + { id: "7091", name: "Home & Garden > Fireplace & Wood Stove Accessories > Hearth Pads" }, + { + id: "7029", + name: "Home & Garden > Fireplace & Wood Stove Accessories > Log Rack & Carrier Accessories", + }, + { id: "695", name: "Home & Garden > Fireplace & Wood Stove Accessories > Log Racks & Carriers" }, + { + id: "4918", + name: "Home & Garden > Fireplace & Wood Stove Accessories > Wood Stove Fans & Blowers", + }, + { id: "6792", name: "Home & Garden > Fireplaces" }, + { id: "1679", name: "Home & Garden > Flood, Fire & Gas Safety" }, + { id: "7226", name: "Home & Garden > Flood, Fire & Gas Safety > Fire Alarm Control Panels" }, + { id: "1871", name: "Home & Garden > Flood, Fire & Gas Safety > Fire Alarms" }, + { + id: "1639", + name: "Home & Garden > Flood, Fire & Gas Safety > Fire Extinguisher & Equipment Storage", + }, + { id: "1434", name: "Home & Garden > Flood, Fire & Gas Safety > Fire Extinguishers" }, + { id: "1934", name: "Home & Garden > Flood, Fire & Gas Safety > Fire Sprinklers" }, + { id: "7227", name: "Home & Garden > Flood, Fire & Gas Safety > Heat Detectors" }, + { + id: "499673", + name: "Home & Garden > Flood, Fire & Gas Safety > Smoke & Carbon Monoxide Detectors", + }, + { + id: "2164", + name: "Home & Garden > Flood, Fire & Gas Safety > Smoke & Carbon Monoxide Detectors > Carbon Monoxide Detectors", + }, + { + id: "1471", + name: "Home & Garden > Flood, Fire & Gas Safety > Smoke & Carbon Monoxide Detectors > Smoke Detectors", + }, + { id: "1306", name: "Home & Garden > Flood, Fire & Gas Safety > Water & Flood Detectors" }, + { id: "3348", name: "Home & Garden > Household Appliance Accessories" }, + { + id: "2367", + name: "Home & Garden > Household Appliance Accessories > Air Conditioner Accessories", + }, + { + id: "5826", + name: "Home & Garden > Household Appliance Accessories > Air Conditioner Accessories > Air Conditioner Covers", + }, + { + id: "3573", + name: "Home & Garden > Household Appliance Accessories > Air Conditioner Accessories > Air Conditioner Filters", + }, + { + id: "3410", + name: "Home & Garden > Household Appliance Accessories > Air Purifier Accessories", + }, + { + id: "3667", + name: "Home & Garden > Household Appliance Accessories > Air Purifier Accessories > Air Purifier Filters", + }, + { + id: "4667", + name: "Home & Garden > Household Appliance Accessories > Dehumidifier Accessories", + }, + { id: "5089", name: "Home & Garden > Household Appliance Accessories > Fan Accessories" }, + { + id: "4548", + name: "Home & Garden > Household Appliance Accessories > Floor & Steam Cleaner Accessories", + }, + { + id: "6773", + name: "Home & Garden > Household Appliance Accessories > Furnace & Boiler Accessories", + }, + { + id: "7110", + name: "Home & Garden > Household Appliance Accessories > Heating Radiator Accessories", + }, + { + id: "7111", + name: "Home & Garden > Household Appliance Accessories > Heating Radiator Accessories > Heating Radiator Reflectors", + }, + { id: "3862", name: "Home & Garden > Household Appliance Accessories > Humidifier Accessories" }, + { + id: "3402", + name: "Home & Garden > Household Appliance Accessories > Humidifier Accessories > Humidifier Filters", + }, + { + id: "3456", + name: "Home & Garden > Household Appliance Accessories > Laundry Appliance Accessories", + }, + { + id: "5158", + name: "Home & Garden > Household Appliance Accessories > Laundry Appliance Accessories > Garment Steamer Accessories", + }, + { + id: "5159", + name: "Home & Garden > Household Appliance Accessories > Laundry Appliance Accessories > Iron Accessories", + }, + { + id: "5160", + name: "Home & Garden > Household Appliance Accessories > Laundry Appliance Accessories > Steam Press Accessories", + }, + { + id: "500085", + name: "Home & Garden > Household Appliance Accessories > Laundry Appliance Accessories > Washer & Dryer Accessories", + }, + { + id: "4650", + name: "Home & Garden > Household Appliance Accessories > Patio Heater Accessories", + }, + { + id: "4651", + name: "Home & Garden > Household Appliance Accessories > Patio Heater Accessories > Patio Heater Covers", + }, + { id: "618", name: "Home & Garden > Household Appliance Accessories > Vacuum Accessories" }, + { + id: "2751", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories", + }, + { + id: "2310", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Anode Rods", + }, + { + id: "2175", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Hot Water Tanks", + }, + { + id: "1744", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Water Heater Elements", + }, + { + id: "500063", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Water Heater Expansion Tanks", + }, + { + id: "1835", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Water Heater Pans", + }, + { + id: "2221", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Water Heater Stacks", + }, + { + id: "1709", + name: "Home & Garden > Household Appliance Accessories > Water Heater Accessories > Water Heater Vents", + }, + { id: "604", name: "Home & Garden > Household Appliances" }, + { id: "1626", name: "Home & Garden > Household Appliances > Climate Control Appliances" }, + { + id: "605", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Air Conditioners", + }, + { + id: "606", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Air Purifiers", + }, + { + id: "607", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Dehumidifiers", + }, + { + id: "7328", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Duct Heaters", + }, + { + id: "6727", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Evaporative Coolers", + }, + { id: "608", name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans" }, + { + id: "1700", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans > Ceiling Fans", + }, + { + id: "2535", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans > Desk & Pedestal Fans", + }, + { + id: "7527", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans > Powered Hand Fans & Misters", + }, + { + id: "4485", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans > Ventilation Fans", + }, + { + id: "8090", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Fans > Wall Mount Fans", + }, + { + id: "3082", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Furnaces & Boilers", + }, + { + id: "2060", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Heating Radiators", + }, + { + id: "613", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Humidifiers", + }, + { + id: "6709", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Outdoor Misting Systems", + }, + { + id: "2649", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Patio Heaters", + }, + { + id: "611", + name: "Home & Garden > Household Appliances > Climate Control Appliances > Space Heaters", + }, + { id: "235920", name: "Home & Garden > Household Appliances > Floor & Carpet Dryers" }, + { id: "616", name: "Home & Garden > Household Appliances > Floor & Steam Cleaners" }, + { + id: "543601", + name: "Home & Garden > Household Appliances > Floor & Steam Cleaners > Carpet Shampooers", + }, + { + id: "543600", + name: "Home & Garden > Household Appliances > Floor & Steam Cleaners > Carpet Steamers", + }, + { + id: "543602", + name: "Home & Garden > Household Appliances > Floor & Steam Cleaners > Floor Scrubbers", + }, + { + id: "543603", + name: "Home & Garden > Household Appliances > Floor & Steam Cleaners > Steam Mops", + }, + { id: "5294", name: "Home & Garden > Household Appliances > Floor Polishers & Buffers" }, + { id: "4483", name: "Home & Garden > Household Appliances > Futon Dryers" }, + { id: "6741", name: "Home & Garden > Household Appliances > Garage Door Keypads & Remotes" }, + { id: "609", name: "Home & Garden > Household Appliances > Garage Door Openers" }, + { id: "2706", name: "Home & Garden > Household Appliances > Laundry Appliances" }, + { id: "2612", name: "Home & Garden > Household Appliances > Laundry Appliances > Dryers" }, + { + id: "5138", + name: "Home & Garden > Household Appliances > Laundry Appliances > Garment Steamers", + }, + { + id: "5139", + name: "Home & Garden > Household Appliances > Laundry Appliances > Irons & Ironing Systems", + }, + { + id: "2849", + name: "Home & Garden > Household Appliances > Laundry Appliances > Laundry Combo Units", + }, + { id: "5140", name: "Home & Garden > Household Appliances > Laundry Appliances > Steam Presses" }, + { + id: "2549", + name: "Home & Garden > Household Appliances > Laundry Appliances > Washing Machines", + }, + { id: "500081", name: "Home & Garden > Household Appliances > Ultrasonic Cleaners" }, + { id: "619", name: "Home & Garden > Household Appliances > Vacuums" }, + { id: "7121", name: "Home & Garden > Household Appliances > Wallpaper Steamers" }, + { id: "621", name: "Home & Garden > Household Appliances > Water Heaters" }, + { id: "630", name: "Home & Garden > Household Supplies" }, + { id: "7351", name: "Home & Garden > Household Supplies > Drawer & Shelf Liners" }, + { id: "499674", name: "Home & Garden > Household Supplies > Floor Protection Films & Runners" }, + { id: "7214", name: "Home & Garden > Household Supplies > Furniture Floor Protectors" }, + { id: "8522", name: "Home & Garden > Household Supplies > Garage Floor Mats" }, + { id: "2374", name: "Home & Garden > Household Supplies > Garbage Bags" }, + { id: "623", name: "Home & Garden > Household Supplies > Household Cleaning Supplies" }, + { + id: "4671", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Broom & Mop Handles", + }, + { + id: "499892", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Broom Heads", + }, + { id: "2857", name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Brooms" }, + { + id: "6437", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Buckets", + }, + { + id: "4677", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Carpet Sweepers", + }, + { + id: "5113", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Cleaning Gloves", + }, + { + id: "6263", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Duster Refills", + }, + { + id: "2250", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Dusters", + }, + { + id: "4515", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Dustpans", + }, + { + id: "6419", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Fabric & Upholstery Protectors", + }, + { + id: "4973", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products", + }, + { + id: "7330", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > All-Purpose Cleaners", + }, + { + id: "4974", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Carpet Cleaners", + }, + { + id: "500065", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Descalers & Decalcifiers", + }, + { + id: "4975", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Dish Detergent & Soap", + }, + { + id: "7510", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Dishwasher Cleaners", + }, + { + id: "8043", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Fabric & Upholstery Cleaners", + }, + { + id: "4977", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Floor Cleaners", + }, + { + id: "5825", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Furniture Cleaners & Polish", + }, + { + id: "4976", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Glass & Surface Cleaners", + }, + { + id: "543649", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Glass & Surface Cleaners > Glass Cleaners", + }, + { + id: "543650", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Glass & Surface Cleaners > Muti-surface Cleaners", + }, + { + id: "6474", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Household Disinfectants", + }, + { + id: "4978", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Oven & Grill Cleaners", + }, + { + id: "4979", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Pet Odor & Stain Removers", + }, + { + id: "7552", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Rinse Aids", + }, + { + id: "7426", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Stainless Steel Cleaners & Polishes", + }, + { + id: "4980", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Toilet Bowl Cleaners", + }, + { + id: "4981", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Tub & Tile Cleaners", + }, + { + id: "7462", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Household Cleaning Products > Washing Machine Cleaners", + }, + { + id: "6264", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Mop Heads & Refills", + }, + { id: "2713", name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Mops" }, + { + id: "499767", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Scrub Brush Heads & Refills", + }, + { + id: "4670", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Scrub Brushes", + }, + { + id: "8071", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Shop Towels & General-Purpose Cleaning Cloths", + }, + { + id: "2796", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Sponges & Scouring Pads", + }, + { + id: "2610", + name: "Home & Garden > Household Supplies > Household Cleaning Supplies > Squeegees", + }, + { id: "2530", name: "Home & Garden > Household Supplies > Household Paper Products" }, + { + id: "624", + name: "Home & Garden > Household Supplies > Household Paper Products > Facial Tissues", + }, + { + id: "3846", + name: "Home & Garden > Household Supplies > Household Paper Products > Paper Napkins", + }, + { + id: "2742", + name: "Home & Garden > Household Supplies > Household Paper Products > Paper Towels", + }, + { + id: "629", + name: "Home & Garden > Household Supplies > Household Paper Products > Toilet Paper", + }, + { id: "3355", name: "Home & Garden > Household Supplies > Household Thermometers" }, + { id: "627", name: "Home & Garden > Household Supplies > Laundry Supplies" }, + { id: "4982", name: "Home & Garden > Household Supplies > Laundry Supplies > Bleach" }, + { id: "5704", name: "Home & Garden > Household Supplies > Laundry Supplies > Clothespins" }, + { id: "7320", name: "Home & Garden > Household Supplies > Laundry Supplies > Dry Cleaning Kits" }, + { + id: "2677", + name: "Home & Garden > Household Supplies > Laundry Supplies > Drying Racks & Hangers", + }, + { id: "6240", name: "Home & Garden > Household Supplies > Laundry Supplies > Fabric Refreshers" }, + { id: "5705", name: "Home & Garden > Household Supplies > Laundry Supplies > Fabric Shavers" }, + { + id: "2794", + name: "Home & Garden > Household Supplies > Laundry Supplies > Fabric Softeners & Dryer Sheets", + }, + { + id: "4657", + name: "Home & Garden > Household Supplies > Laundry Supplies > Fabric Stain Removers", + }, + { id: "6387", name: "Home & Garden > Household Supplies > Laundry Supplies > Fabric Starch" }, + { id: "7457", name: "Home & Garden > Household Supplies > Laundry Supplies > Garment Shields" }, + { id: "499937", name: "Home & Garden > Household Supplies > Laundry Supplies > Iron Rests" }, + { + id: "4656", + name: "Home & Garden > Household Supplies > Laundry Supplies > Ironing Board Pads & Covers", + }, + { + id: "499931", + name: "Home & Garden > Household Supplies > Laundry Supplies > Ironing Board Replacement Parts", + }, + { id: "633", name: "Home & Garden > Household Supplies > Laundry Supplies > Ironing Boards" }, + { id: "5084", name: "Home & Garden > Household Supplies > Laundry Supplies > Laundry Balls" }, + { id: "634", name: "Home & Garden > Household Supplies > Laundry Supplies > Laundry Baskets" }, + { id: "2754", name: "Home & Garden > Household Supplies > Laundry Supplies > Laundry Detergent" }, + { + id: "5085", + name: "Home & Garden > Household Supplies > Laundry Supplies > Laundry Wash Bags & Frames", + }, + { id: "3080", name: "Home & Garden > Household Supplies > Laundry Supplies > Lint Rollers" }, + { + id: "7502", + name: "Home & Garden > Household Supplies > Laundry Supplies > Wrinkle Releasers & Anti-Static Sprays", + }, + { id: "7406", name: "Home & Garden > Household Supplies > Moisture Absorbers" }, + { id: "728", name: "Home & Garden > Household Supplies > Pest Control" }, + { id: "4220", name: "Home & Garden > Household Supplies > Pest Control > Fly Swatters" }, + { id: "2631", name: "Home & Garden > Household Supplies > Pest Control > Pest Control Traps" }, + { id: "2869", name: "Home & Garden > Household Supplies > Pest Control > Pesticides" }, + { id: "2865", name: "Home & Garden > Household Supplies > Pest Control > Repellents" }, + { + id: "7137", + name: "Home & Garden > Household Supplies > Pest Control > Repellents > Animal & Pet Repellents", + }, + { + id: "512", + name: "Home & Garden > Household Supplies > Pest Control > Repellents > Household Insect Repellents", + }, + { id: "3307", name: "Home & Garden > Household Supplies > Rug Pads" }, + { id: "628", name: "Home & Garden > Household Supplies > Shoe Care & Tools" }, + { id: "5600", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Boot Pulls" }, + { id: "2301", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Bags" }, + { id: "1874", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Brushes" }, + { id: "8033", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Care Kits" }, + { id: "2371", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Dryers" }, + { + id: "5601", + name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Horns & Dressing Aids", + }, + { id: "8032", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Polishers" }, + { + id: "1659", + name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Polishes & Waxes", + }, + { id: "8031", name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Scrapers" }, + { + id: "5604", + name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Treatments & Dyes", + }, + { + id: "2431", + name: "Home & Garden > Household Supplies > Shoe Care & Tools > Shoe Trees & Shapers", + }, + { id: "499885", name: "Home & Garden > Household Supplies > Stair Treads" }, + { id: "636", name: "Home & Garden > Household Supplies > Storage & Organization" }, + { + id: "5558", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage", + }, + { + id: "3722", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Charging Valets", + }, + { + id: "5714", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Closet Organizers & Garment Racks", + }, + { + id: "5716", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Clothes Valets", + }, + { + id: "631", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Hangers", + }, + { + id: "7514", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Hat Boxes", + }, + { + id: "5559", + name: "Home & Garden > Household Supplies > Storage & Organization > Clothing & Closet Storage > Shoe Racks & Organizers", + }, + { + id: "5128", + name: "Home & Garden > Household Supplies > Storage & Organization > Flatware Chests", + }, + { + id: "8058", + name: "Home & Garden > Household Supplies > Storage & Organization > Household Drawer Organizer Inserts", + }, + { + id: "3561", + name: "Home & Garden > Household Supplies > Storage & Organization > Household Storage Bags", + }, + { + id: "6986", + name: "Home & Garden > Household Supplies > Storage & Organization > Household Storage Caddies", + }, + { + id: "5631", + name: "Home & Garden > Household Supplies > Storage & Organization > Household Storage Containers", + }, + { + id: "7255", + name: "Home & Garden > Household Supplies > Storage & Organization > Household Storage Drawers", + }, + { + id: "4360", + name: "Home & Garden > Household Supplies > Storage & Organization > Photo Storage", + }, + { + id: "40", + name: "Home & Garden > Household Supplies > Storage & Organization > Photo Storage > Photo Albums", + }, + { + id: "4237", + name: "Home & Garden > Household Supplies > Storage & Organization > Photo Storage > Photo Storage Boxes", + }, + { + id: "2446", + name: "Home & Garden > Household Supplies > Storage & Organization > Storage Hooks & Racks", + }, + { + id: "499930", + name: "Home & Garden > Household Supplies > Storage & Organization > Storage Hooks & Racks > Ironing Board Hooks & Racks", + }, + { + id: "5494", + name: "Home & Garden > Household Supplies > Storage & Organization > Storage Hooks & Racks > Umbrella Stands & Racks", + }, + { + id: "5707", + name: "Home & Garden > Household Supplies > Storage & Organization > Storage Hooks & Racks > Utility Hooks", + }, + { id: "5056", name: "Home & Garden > Household Supplies > Trash Compactor Accessories" }, + { id: "4516", name: "Home & Garden > Household Supplies > Waste Containment" }, + { id: "500039", name: "Home & Garden > Household Supplies > Waste Containment > Dumpsters" }, + { + id: "5143", + name: "Home & Garden > Household Supplies > Waste Containment > Hazardous Waste Containers", + }, + { + id: "4517", + name: "Home & Garden > Household Supplies > Waste Containment > Recycling Containers", + }, + { + id: "637", + name: "Home & Garden > Household Supplies > Waste Containment > Trash Cans & Wastebaskets", + }, + { id: "6757", name: "Home & Garden > Household Supplies > Waste Containment Accessories" }, + { + id: "6765", + name: "Home & Garden > Household Supplies > Waste Containment Accessories > Waste Container Carts", + }, + { + id: "6726", + name: "Home & Garden > Household Supplies > Waste Containment Accessories > Waste Container Enclosures", + }, + { + id: "500115", + name: "Home & Garden > Household Supplies > Waste Containment Accessories > Waste Container Labels & Signs", + }, + { + id: "4717", + name: "Home & Garden > Household Supplies > Waste Containment Accessories > Waste Container Lids", + }, + { + id: "6758", + name: "Home & Garden > Household Supplies > Waste Containment Accessories > Waste Container Wheels", + }, + { id: "638", name: "Home & Garden > Kitchen & Dining" }, + { id: "649", name: "Home & Garden > Kitchen & Dining > Barware" }, + { id: "7075", name: "Home & Garden > Kitchen & Dining > Barware > Absinthe Fountains" }, + { id: "1817", name: "Home & Garden > Kitchen & Dining > Barware > Beer Dispensers & Taps" }, + { + id: "7569", + name: "Home & Garden > Kitchen & Dining > Barware > Beverage Chilling Cubes & Sticks", + }, + { id: "505806", name: "Home & Garden > Kitchen & Dining > Barware > Beverage Tubs & Chillers" }, + { id: "499990", name: "Home & Garden > Kitchen & Dining > Barware > Bottle Caps" }, + { id: "4562", name: "Home & Garden > Kitchen & Dining > Barware > Bottle Stoppers & Savers" }, + { id: "7238", name: "Home & Garden > Kitchen & Dining > Barware > Coaster Holders" }, + { id: "2363", name: "Home & Garden > Kitchen & Dining > Barware > Coasters" }, + { id: "6957", name: "Home & Garden > Kitchen & Dining > Barware > Cocktail & Barware Tool Sets" }, + { id: "651", name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools" }, + { + id: "4222", + name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools > Bar Ice Picks", + }, + { + id: "3427", + name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools > Bottle Openers", + }, + { + id: "6956", + name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools > Cocktail Shakers", + }, + { + id: "505327", + name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools > Cocktail Strainers", + }, + { + id: "503757", + name: "Home & Garden > Kitchen & Dining > Barware > Cocktail Shakers & Tools > Muddlers", + }, + { id: "2976", name: "Home & Garden > Kitchen & Dining > Barware > Corkscrews" }, + { id: "650", name: "Home & Garden > Kitchen & Dining > Barware > Decanters" }, + { id: "7139", name: "Home & Garden > Kitchen & Dining > Barware > Foil Cutters" }, + { id: "4563", name: "Home & Garden > Kitchen & Dining > Barware > Wine Aerators" }, + { id: "8493", name: "Home & Garden > Kitchen & Dining > Barware > Wine Bottle Holders" }, + { id: "7008", name: "Home & Garden > Kitchen & Dining > Barware > Wine Glass Charms" }, + { id: "6070", name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware" }, + { id: "640", name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware" }, + { + id: "4764", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Bakeware Sets", + }, + { + id: "641", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Baking & Cookie Sheets", + }, + { + id: "642", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Bread Pans & Molds", + }, + { + id: "6756", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Broiling Pans", + }, + { + id: "643", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Cake Pans & Molds", + }, + { + id: "644", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Muffin & Pastry Pans", + }, + { + id: "645", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Pie & Quiche Pans", + }, + { + id: "2843", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Pizza Pans", + }, + { + id: "646", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Pizza Stones", + }, + { + id: "647", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Ramekins & Souffle Dishes", + }, + { + id: "648", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware > Roasting Pans", + }, + { + id: "4502", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware Accessories", + }, + { + id: "4503", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware Accessories > Baking Mats & Liners", + }, + { + id: "7131", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware Accessories > Baking Weights", + }, + { + id: "4726", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Bakeware Accessories > Roasting Pan Racks", + }, + { id: "654", name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware" }, + { + id: "6071", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware & Bakeware Combo Sets", + }, + { + id: "655", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Casserole Dishes", + }, + { + id: "4721", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Cookware Sets", + }, + { + id: "6838", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Crêpe & Blini Pans", + }, + { + id: "656", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Double Boilers", + }, + { + id: "657", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Dutch Ovens", + }, + { + id: "6518", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Fermentation & Pickling Crocks", + }, + { + id: "658", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Griddles & Grill Pans", + }, + { + id: "5110", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Grill Presses", + }, + { + id: "4459", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Paella Pans", + }, + { + id: "660", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Pressure Cookers & Canners", + }, + { + id: "661", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Saucepans", + }, + { + id: "4423", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Sauté Pans", + }, + { + id: "662", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Skillets & Frying Pans", + }, + { + id: "663", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Stock Pots", + }, + { + id: "659", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Stovetop Kettles", + }, + { + id: "5340", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Tagines & Clay Cooking Pots", + }, + { id: "664", name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware > Woks" }, + { + id: "4424", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories", + }, + { + id: "4661", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Pot & Pan Handles", + }, + { + id: "4660", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Pot & Pan Lids", + }, + { + id: "4501", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Pressure Cooker & Canner Accessories", + }, + { + id: "4529", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Steamer Baskets", + }, + { + id: "4427", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Wok Accessories", + }, + { + id: "4663", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Wok Accessories > Wok Brushes", + }, + { + id: "4662", + name: "Home & Garden > Kitchen & Dining > Cookware & Bakeware > Cookware Accessories > Wok Accessories > Wok Rings", + }, + { id: "2920", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers" }, + { id: "4722", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Airpots" }, + { id: "3435", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Canteens" }, + { id: "1017", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Coolers" }, + { + id: "4520", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Drink Sleeves", + }, + { + id: "4521", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Drink Sleeves > Can & Bottle Sleeves", + }, + { + id: "4522", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Drink Sleeves > Cup Sleeves", + }, + { id: "1444", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Flasks" }, + { + id: "2507", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Insulated Bags", + }, + { + id: "669", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Lunch Boxes & Totes", + }, + { + id: "671", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Picnic Baskets", + }, + { + id: "5060", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Replacement Drink Lids", + }, + { id: "3800", name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Thermoses" }, + { + id: "3809", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Water Bottles", + }, + { + id: "6449", + name: "Home & Garden > Kitchen & Dining > Food & Beverage Carriers > Wine Carrier Bags", + }, + { id: "2626", name: "Home & Garden > Kitchen & Dining > Food Storage" }, + { id: "3337", name: "Home & Garden > Kitchen & Dining > Food Storage > Bread Boxes & Bags" }, + { id: "6534", name: "Home & Garden > Kitchen & Dining > Food Storage > Candy Buckets" }, + { id: "2644", name: "Home & Garden > Kitchen & Dining > Food Storage > Cookie Jars" }, + { id: "6481", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Container Covers" }, + { id: "3591", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Storage Bags" }, + { id: "667", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Storage Containers" }, + { id: "3110", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Wraps" }, + { id: "1496", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Wraps > Foil" }, + { + id: "5642", + name: "Home & Garden > Kitchen & Dining > Food Storage > Food Wraps > Parchment Paper", + }, + { + id: "3750", + name: "Home & Garden > Kitchen & Dining > Food Storage > Food Wraps > Plastic Wrap", + }, + { id: "3956", name: "Home & Garden > Kitchen & Dining > Food Storage > Food Wraps > Wax Paper" }, + { id: "5134", name: "Home & Garden > Kitchen & Dining > Food Storage > Honey Jars" }, + { id: "6478", name: "Home & Garden > Kitchen & Dining > Food Storage Accessories" }, + { + id: "499924", + name: "Home & Garden > Kitchen & Dining > Food Storage Accessories > Food & Beverage Labels", + }, + { + id: "8039", + name: "Home & Garden > Kitchen & Dining > Food Storage Accessories > Food Wrap Dispensers", + }, + { + id: "6479", + name: "Home & Garden > Kitchen & Dining > Food Storage Accessories > Oxygen Absorbers", + }, + { + id: "5837", + name: "Home & Garden > Kitchen & Dining > Food Storage Accessories > Twist Ties & Bag Clips", + }, + { id: "2901", name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories" }, + { + id: "3489", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Breadmaker Accessories", + }, + { + id: "3988", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories", + }, + { + id: "6888", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Decanter Warmers", + }, + { + id: "3239", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Decanters", + }, + { + id: "4500", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Filter Baskets", + }, + { + id: "3450", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Filters", + }, + { + id: "4786", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Grinder Accessories", + }, + { + id: "734", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Grinders", + }, + { + id: "503736", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Maker & Espresso Machine Replacement Parts", + }, + { + id: "5065", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Coffee Maker Water Filters", + }, + { + id: "5066", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Frothing Pitchers", + }, + { + id: "3838", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Coffee Maker & Espresso Machine Accessories > Portafilters", + }, + { + id: "500004", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Cooktop, Oven & Range Accessories", + }, + { + id: "5076", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Cotton Candy Machine Accessories", + }, + { + id: "3954", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Deep Fryer Accessories", + }, + { + id: "3443", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Dishwasher Parts & Accessories", + }, + { + id: "500066", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Electric Kettle Accessories", + }, + { + id: "7355", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Electric Skillet & Wok Accessories", + }, + { + id: "6944", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Fondue Set Accessories", + }, + { + id: "503725", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Fondue Set Accessories > Cooking Gel Fuels", + }, + { + id: "6945", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Fondue Set Accessories > Fondue Forks", + }, + { + id: "6946", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Fondue Set Accessories > Fondue Pot Stands", + }, + { + id: "4653", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Food Dehydrator Accessories", + }, + { + id: "4655", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Food Dehydrator Accessories > Food Dehydrator Sheets", + }, + { + id: "4654", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Food Dehydrator Accessories > Food Dehydrator Trays", + }, + { + id: "4763", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Food Grinder Accessories", + }, + { + id: "505765", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Food Mixer & Blender Accessories", + }, + { + id: "7570", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Freezer Accessories", + }, + { + id: "6747", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Garbage Disposal Accessories", + }, + { + id: "4674", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Ice Cream Maker Accessories", + }, + { + id: "4675", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Ice Cream Maker Accessories > Ice Cream Maker Freezer Bowls", + }, + { + id: "5042", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Ice Crusher & Shaver Accessories", + }, + { + id: "7187", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Ice Maker Accessories", + }, + { + id: "4519", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Juicer Accessories", + }, + { + id: "1334", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Microwave Oven Accessories", + }, + { + id: "3684", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories", + }, + { + id: "5694", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Charcoal Briquettes", + }, + { + id: "7540", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Charcoal Chimneys", + }, + { + id: "5670", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grill Carts", + }, + { + id: "3855", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grill Covers", + }, + { + id: "3382", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grill Racks & Toppers", + }, + { + id: "505667", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grill Replacement Parts", + }, + { + id: "4560", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grill Spits & Baskets", + }, + { + id: "5672", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Outdoor Grilling Planks", + }, + { + id: "5671", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Outdoor Grill Accessories > Smoking Chips & Pellets", + }, + { + id: "2540", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Pasta Maker Accessories", + }, + { + id: "5075", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Popcorn Maker Accessories", + }, + { + id: "7006", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Portable Cooking Stove Accessories", + }, + { + id: "8087", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Range Hood Accessories", + }, + { + id: "3848", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Refrigerator Accessories", + }, + { + id: "502989", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Soda Maker Accessories", + }, + { + id: "8051", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Steam Table Accessories", + }, + { + id: "8052", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Steam Table Accessories > Steam Table Pan Covers", + }, + { + id: "8053", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Steam Table Accessories > Steam Table Pans", + }, + { + id: "7444", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Toaster Accessories", + }, + { + id: "3523", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Vacuum Sealer Accessories", + }, + { + id: "3124", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Vacuum Sealer Accessories > Vacuum Sealer Bags", + }, + { + id: "499996", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Waffle Iron Accessories", + }, + { + id: "7118", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Water Cooler Accessories", + }, + { + id: "7119", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Water Cooler Accessories > Water Cooler Bottles", + }, + { + id: "8106", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Wine Fridge Accessories", + }, + { + id: "5570", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliance Accessories > Yogurt Maker Accessories", + }, + { id: "730", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances" }, + { id: "5287", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Beverage Warmers" }, + { id: "732", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Breadmakers" }, + { + id: "5090", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Chocolate Tempering Machines", + }, + { + id: "736", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines", + }, + { + id: "1388", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > Drip Coffee Makers", + }, + { + id: "1647", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > Electric & Stovetop Espresso Pots", + }, + { + id: "2422", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > Espresso Machines", + }, + { + id: "1557", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > French Presses", + }, + { + id: "2247", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > Percolators", + }, + { + id: "5286", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Coffee Makers & Espresso Machines > Vacuum Coffee Makers", + }, + { id: "679", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Cooktops" }, + { + id: "3319", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Cotton Candy Machines", + }, + { id: "738", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Deep Fryers" }, + { id: "3181", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Deli Slicers" }, + { id: "680", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Dishwashers" }, + { + id: "7165", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Electric Griddles & Grills", + }, + { id: "751", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Electric Kettles" }, + { + id: "4421", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Electric Skillets & Woks", + }, + { + id: "4720", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Fondue Pots & Sets", + }, + { + id: "4532", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers", + }, + { + id: "739", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Egg Cookers", + }, + { + id: "760", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Food Steamers", + }, + { + id: "757", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Rice Cookers", + }, + { + id: "737", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Slow Cookers", + }, + { + id: "6523", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Thermal Cookers", + }, + { + id: "6279", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Cookers & Steamers > Water Ovens", + }, + { id: "743", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Dehydrators" }, + { + id: "744", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Grinders & Mills", + }, + { + id: "505666", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Mixers & Blenders", + }, + { id: "687", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Smokers" }, + { id: "5103", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Warmers" }, + { + id: "6548", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Warmers > Chafing Dishes", + }, + { + id: "5349", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Warmers > Food Heat Lamps", + }, + { + id: "504633", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Warmers > Rice Keepers", + }, + { + id: "4292", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Food Warmers > Steam Tables", + }, + { id: "681", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Freezers" }, + { + id: "5156", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Frozen Drink Makers", + }, + { id: "610", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Garbage Disposals" }, + { id: "6524", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Gas Griddles" }, + { id: "6543", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Hot Drink Makers" }, + { id: "747", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Hot Plates" }, + { id: "748", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Ice Cream Makers" }, + { + id: "749", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Ice Crushers & Shavers", + }, + { id: "4161", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Ice Makers" }, + { id: "750", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Juicers" }, + { id: "752", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Knife Sharpeners" }, + { id: "753", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Microwave Ovens" }, + { + id: "3526", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Milk Frothers & Steamers", + }, + { id: "4482", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Mochi Makers" }, + { id: "2985", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Outdoor Grills" }, + { id: "683", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Ovens" }, + { id: "755", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Pasta Makers" }, + { id: "756", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Popcorn Makers" }, + { + id: "1015", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Portable Cooking Stoves", + }, + { id: "684", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Range Hoods" }, + { id: "685", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Ranges" }, + { id: "686", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Refrigerators" }, + { + id: "4495", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Roaster Ovens & Rotisseries", + }, + { id: "5577", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Soda Makers" }, + { id: "5057", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Soy Milk Makers" }, + { id: "4528", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Tea Makers" }, + { id: "5289", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills" }, + { + id: "761", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Countertop & Toaster Ovens", + }, + { + id: "6819", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Donut Makers", + }, + { + id: "5318", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Muffin & Cupcake Makers", + }, + { + id: "6278", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Pizza Makers & Ovens", + }, + { + id: "5291", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Pizzelle Makers", + }, + { + id: "6516", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Pretzel Makers", + }, + { + id: "759", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Sandwich Makers", + }, + { + id: "762", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Toasters", + }, + { + id: "5292", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Tortilla & Flatbread Makers", + }, + { + id: "764", + name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Toasters & Grills > Waffle Irons", + }, + { id: "688", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Trash Compactors" }, + { id: "763", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Vacuum Sealers" }, + { id: "3293", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Water Coolers" }, + { id: "765", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Water Filters" }, + { id: "4539", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Wine Fridges" }, + { id: "766", name: "Home & Garden > Kitchen & Dining > Kitchen Appliances > Yogurt Makers" }, + { id: "668", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils" }, + { id: "639", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Aprons" }, + { + id: "3768", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Baking Peels", + }, + { id: "3347", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Basters" }, + { + id: "3430", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Basting Brushes", + }, + { + id: "7149", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Beverage Dispensers", + }, + { + id: "4630", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cake Decorating Supplies", + }, + { + id: "6408", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cake Servers", + }, + { + id: "4247", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Can Crushers", + }, + { id: "733", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Can Openers" }, + { + id: "5078", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Carving Forks", + }, + { + id: "6522", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Channel Knives", + }, + { + id: "653", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Colanders & Strainers", + }, + { + id: "4777", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Condiment Dispensers", + }, + { + id: "3850", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cookie Cutters", + }, + { + id: "6342", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cookie Presses", + }, + { + id: "7331", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cooking Thermometer Accessories", + }, + { + id: "3091", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cooking Thermometers", + }, + { + id: "3713", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cooking Timers", + }, + { + id: "5928", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cooking Torches", + }, + { + id: "3835", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cooling Racks", + }, + { + id: "666", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Cutting Boards", + }, + { + id: "3268", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Dish Racks & Drain Boards", + }, + { + id: "6723", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Dough Wheels", + }, + { + id: "6411", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Electric Knife Accessories", + }, + { + id: "6412", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Electric Knife Accessories > Electric Knife Replacement Blades", + }, + { + id: "741", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Electric Knives", + }, + { + id: "5370", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Flour Sifters", + }, + { + id: "505316", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food & Drink Stencils", + }, + { + id: "3381", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Crackers", + }, + { + id: "3586", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Crackers > Lobster & Crab Crackers", + }, + { + id: "3685", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Crackers > Nutcrackers", + }, + { + id: "4214", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Crackers > Nutcrackers > Decorative Nutcrackers", + }, + { + id: "3723", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Dispensers", + }, + { + id: "3156", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Graters & Zesters", + }, + { + id: "3521", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Peelers & Corers", + }, + { + id: "7329", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Steaming Bags", + }, + { + id: "6554", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Food Sticks & Skewers", + }, + { id: "503005", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Funnels" }, + { + id: "3385", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Garlic Presses", + }, + { + id: "6787", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Gelatin Molds", + }, + { + id: "4746", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Ice Cube Trays", + }, + { id: "7485", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Jerky Guns" }, + { + id: "665", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Knives", + }, + { + id: "8006", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Molds", + }, + { + id: "2948", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers", + }, + { + id: "6480", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Can Organizers", + }, + { + id: "3479", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Drinkware Holders", + }, + { + id: "6487", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Kitchen Cabinet Organizers", + }, + { + id: "3177", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Kitchen Counter & Beverage Station Organizers", + }, + { + id: "8012", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Kitchen Utensil Holders & Racks", + }, + { + id: "5157", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Knife Blocks & Holders", + }, + { + id: "3072", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Napkin Holders & Dispensers", + }, + { + id: "3061", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Paper Towel Holders & Dispensers", + }, + { + id: "3845", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Pot Racks", + }, + { + id: "2344", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Spice Organizers", + }, + { + id: "5059", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Straw Holders & Dispensers", + }, + { + id: "6415", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Sugar Caddies", + }, + { + id: "4322", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Toothpick Holders & Dispensers", + }, + { + id: "3831", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Organizers > Utensil & Flatware Trays", + }, + { + id: "3256", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Scrapers", + }, + { + id: "3419", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Scrapers > Bench Scrapers", + }, + { + id: "3086", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Scrapers > Bowl Scrapers", + }, + { + id: "3633", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Scrapers > Grill Scrapers", + }, + { + id: "5251", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Shears", + }, + { + id: "3206", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Slicers", + }, + { + id: "4765", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Kitchen Utensil Sets", + }, + { id: "3620", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Ladles" }, + { id: "3294", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Mashers" }, + { + id: "3475", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Measuring Cups & Spoons", + }, + { + id: "3248", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Meat Tenderizers", + }, + { + id: "4530", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Mixing Bowls", + }, + { + id: "3999", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Mortars & Pestles", + }, + { + id: "6526", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Oil & Vinegar Dispensers", + }, + { id: "4771", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Oven Bags" }, + { + id: "670", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Oven Mitts & Pot Holders", + }, + { + id: "6749", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Pasta Molds & Stamps", + }, + { + id: "4332", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Pastry Blenders", + }, + { + id: "4708", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Pastry Cloths", + }, + { + id: "7365", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Pizza Cutter Accessories", + }, + { + id: "3421", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Pizza Cutters", + }, + { id: "5109", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Ricers" }, + { + id: "4705", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Rolling Pin Accessories", + }, + { + id: "4706", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Rolling Pin Accessories > Rolling Pin Covers & Sleeves", + }, + { + id: "4707", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Rolling Pin Accessories > Rolling Pin Rings", + }, + { + id: "3467", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Rolling Pins", + }, + { + id: "6497", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Salad Dressing Mixers & Shakers", + }, + { + id: "3914", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Salad Spinners", + }, + { id: "3175", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Scoops" }, + { + id: "3202", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Scoops > Ice Cream Scoops", + }, + { + id: "3708", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Scoops > Ice Scoops", + }, + { + id: "3258", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Scoops > Melon Ballers", + }, + { + id: "502966", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Scoops > Popcorn & French Fry Scoops", + }, + { + id: "6746", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Sink Caddies", + }, + { + id: "5080", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Sink Mats & Grids", + }, + { + id: "6388", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Slotted Spoons", + }, + { id: "3196", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Spatulas" }, + { + id: "4788", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Spice Grinder Accessories", + }, + { + id: "4762", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Spice Grinders", + }, + { id: "4334", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Spoon Rests" }, + { + id: "6974", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Sugar Dispensers", + }, + { id: "7247", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Sushi Mats" }, + { + id: "4559", + name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Tea Strainers", + }, + { id: "4005", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Tongs" }, + { id: "3597", name: "Home & Garden > Kitchen & Dining > Kitchen Tools & Utensils > Whisks" }, + { id: "8161", name: "Home & Garden > Kitchen & Dining > Prefabricated Kitchens & Kitchenettes" }, + { id: "672", name: "Home & Garden > Kitchen & Dining > Tableware" }, + { id: "6740", name: "Home & Garden > Kitchen & Dining > Tableware > Coffee & Tea Sets" }, + { id: "652", name: "Home & Garden > Kitchen & Dining > Tableware > Coffee Servers & Tea Pots" }, + { id: "673", name: "Home & Garden > Kitchen & Dining > Tableware > Dinnerware" }, + { id: "3498", name: "Home & Garden > Kitchen & Dining > Tableware > Dinnerware > Bowls" }, + { + id: "5537", + name: "Home & Garden > Kitchen & Dining > Tableware > Dinnerware > Dinnerware Sets", + }, + { id: "3553", name: "Home & Garden > Kitchen & Dining > Tableware > Dinnerware > Plates" }, + { id: "674", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware" }, + { id: "7568", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Beer Glasses" }, + { + id: "6049", + name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Coffee & Tea Cups", + }, + { + id: "6051", + name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Coffee & Tea Saucers", + }, + { id: "6958", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Drinkware Sets" }, + { id: "2169", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Mugs" }, + { id: "2694", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Shot Glasses" }, + { id: "2712", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Stemware" }, + { id: "2951", name: "Home & Garden > Kitchen & Dining > Tableware > Drinkware > Tumblers" }, + { id: "675", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware" }, + { + id: "6439", + name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Chopstick Accessories", + }, + { id: "3699", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Chopsticks" }, + { id: "5647", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Flatware Sets" }, + { id: "4015", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Forks" }, + { id: "3939", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Spoons" }, + { id: "3844", name: "Home & Garden > Kitchen & Dining > Tableware > Flatware > Table Knives" }, + { id: "676", name: "Home & Garden > Kitchen & Dining > Tableware > Salt & Pepper Shakers" }, + { id: "4026", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware" }, + { id: "6086", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Butter Dishes" }, + { id: "5135", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Cake Boards" }, + { id: "4372", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Cake Stands" }, + { id: "7550", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Egg Cups" }, + { id: "3703", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Gravy Boats" }, + { id: "4735", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Punch Bowls" }, + { + id: "3330", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Serving Pitchers & Carafes", + }, + { + id: "3802", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Serving Platters", + }, + { id: "4009", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Serving Trays" }, + { + id: "3373", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Sugar Bowls & Creamers", + }, + { id: "3941", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware > Tureens" }, + { id: "6425", name: "Home & Garden > Kitchen & Dining > Tableware > Serveware Accessories" }, + { + id: "6434", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware Accessories > Punch Bowl Stands", + }, + { + id: "6427", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware Accessories > Tureen Lids", + }, + { + id: "6426", + name: "Home & Garden > Kitchen & Dining > Tableware > Serveware Accessories > Tureen Stands", + }, + { id: "8046", name: "Home & Garden > Kitchen & Dining > Tableware > Tablecloth Clips & Weights" }, + { id: "677", name: "Home & Garden > Kitchen & Dining > Tableware > Trivets" }, + { id: "689", name: "Home & Garden > Lawn & Garden" }, + { id: "2962", name: "Home & Garden > Lawn & Garden > Gardening" }, + { id: "4085", name: "Home & Garden > Lawn & Garden > Gardening > Composting" }, + { id: "690", name: "Home & Garden > Lawn & Garden > Gardening > Composting > Compost" }, + { id: "6840", name: "Home & Garden > Lawn & Garden > Gardening > Composting > Compost Aerators" }, + { id: "6436", name: "Home & Garden > Lawn & Garden > Gardening > Composting > Composters" }, + { id: "691", name: "Home & Garden > Lawn & Garden > Gardening > Disease Control" }, + { id: "113", name: "Home & Garden > Lawn & Garden > Gardening > Fertilizers" }, + { id: "500033", name: "Home & Garden > Lawn & Garden > Gardening > Garden Pot Saucers & Trays" }, + { id: "5632", name: "Home & Garden > Lawn & Garden > Gardening > Gardening Accessories" }, + { + id: "503756", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Accessories > Gardening Scooters, Seats & Kneelers", + }, + { + id: "5633", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Accessories > Gardening Totes", + }, + { + id: "7184", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Accessories > Potting Benches", + }, + { id: "505326", name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tool Accessories" }, + { + id: "505322", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tool Accessories > Gardening Tool Handles", + }, + { + id: "505321", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tool Accessories > Gardening Tool Heads", + }, + { + id: "4972", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tool Accessories > Wheelbarrow Parts", + }, + { id: "3173", name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools" }, + { + id: "7537", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Bulb Planting Tools", + }, + { + id: "4000", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Cultivating Tools", + }, + { + id: "3071", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Gardening Forks", + }, + { + id: "505292", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Gardening Sickles & Machetes", + }, + { + id: "3644", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Gardening Trowels", + }, + { + id: "1967", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Lawn & Garden Sprayers", + }, + { + id: "499922", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Lawn Rollers", + }, + { + id: "6967", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Pruning Saws", + }, + { + id: "3841", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Pruning Shears", + }, + { id: "3388", name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Rakes" }, + { + id: "2147", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Shovels & Spades", + }, + { id: "3828", name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Spreaders" }, + { + id: "3616", + name: "Home & Garden > Lawn & Garden > Gardening > Gardening Tools > Wheelbarrows", + }, + { id: "693", name: "Home & Garden > Lawn & Garden > Gardening > Greenhouses" }, + { id: "3103", name: "Home & Garden > Lawn & Garden > Gardening > Herbicides" }, + { id: "6381", name: "Home & Garden > Lawn & Garden > Gardening > Landscape Fabric" }, + { id: "6413", name: "Home & Garden > Lawn & Garden > Gardening > Landscape Fabric Accessories" }, + { + id: "6422", + name: "Home & Garden > Lawn & Garden > Gardening > Landscape Fabric Accessories > Landscape Fabric Staples & Pins", + }, + { + id: "6421", + name: "Home & Garden > Lawn & Garden > Gardening > Landscape Fabric Accessories > Landscape Fabric Tape", + }, + { id: "2988", name: "Home & Garden > Lawn & Garden > Gardening > Mulch" }, + { id: "499894", name: "Home & Garden > Lawn & Garden > Gardening > Plant Cages & Supports" }, + { id: "6428", name: "Home & Garden > Lawn & Garden > Gardening > Plant Stands" }, + { id: "499962", name: "Home & Garden > Lawn & Garden > Gardening > Pot & Planter Liners" }, + { id: "721", name: "Home & Garden > Lawn & Garden > Gardening > Pots & Planters" }, + { id: "6834", name: "Home & Garden > Lawn & Garden > Gardening > Rain Barrels" }, + { id: "1794", name: "Home & Garden > Lawn & Garden > Gardening > Sands & Soils" }, + { id: "543677", name: "Home & Garden > Lawn & Garden > Gardening > Sands & Soils > Sand" }, + { id: "543678", name: "Home & Garden > Lawn & Garden > Gardening > Sands & Soils > Soil" }, + { id: "2918", name: "Home & Garden > Lawn & Garden > Outdoor Living" }, + { id: "499908", name: "Home & Garden > Lawn & Garden > Outdoor Living > Awning Accessories" }, + { id: "499907", name: "Home & Garden > Lawn & Garden > Outdoor Living > Awnings" }, + { + id: "6737", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Hammock Parts & Accessories", + }, + { id: "717", name: "Home & Garden > Lawn & Garden > Outdoor Living > Hammocks" }, + { id: "5910", name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Blankets" }, + { + id: "5911", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Blankets > Beach Mats", + }, + { + id: "5913", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Blankets > Picnic Blankets", + }, + { + id: "5912", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Blankets > Poncho Liners", + }, + { id: "2613", name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures" }, + { + id: "716", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopies & Gazebos", + }, + { + id: "6105", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories", + }, + { + id: "6107", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories > Canopy & Gazebo Enclosure Kits", + }, + { + id: "6106", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories > Canopy & Gazebo Frames", + }, + { + id: "6108", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories > Canopy & Gazebo Tops", + }, + { + id: "7423", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories > Canopy Poles", + }, + { + id: "7424", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Canopy & Gazebo Accessories > Canopy Weights", + }, + { + id: "703", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Garden Arches, Trellises, Arbors & Pergolas", + }, + { + id: "700", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Garden Bridges", + }, + { + id: "720", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Structures > Sheds, Garages & Carports", + }, + { + id: "6751", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories", + }, + { + id: "7108", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories > Outdoor Umbrella & Sunshade Fabric", + }, + { + id: "5493", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories > Outdoor Umbrella Bases", + }, + { + id: "7107", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories > Outdoor Umbrella Covers", + }, + { + id: "499948", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories > Outdoor Umbrella Enclosure Kits", + }, + { + id: "8020", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrella & Sunshade Accessories > Outdoor Umbrella Lights", + }, + { + id: "719", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Outdoor Umbrellas & Sunshades", + }, + { + id: "499955", + name: "Home & Garden > Lawn & Garden > Outdoor Living > Porch Swing Accessories", + }, + { id: "718", name: "Home & Garden > Lawn & Garden > Outdoor Living > Porch Swings" }, + { id: "3798", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment" }, + { id: "3610", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Chainsaws" }, + { id: "2218", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Grass Edgers" }, + { id: "3120", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Hedge Trimmers" }, + { + id: "500034", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Aerators & Dethatchers", + }, + { id: "694", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Mowers" }, + { + id: "3311", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Mowers > Riding Mowers", + }, + { + id: "6788", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Mowers > Robotic Mowers", + }, + { + id: "6258", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Mowers > Tow-Behind Mowers", + }, + { + id: "3730", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Mowers > Walk-Behind Mowers", + }, + { id: "6789", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Lawn Vacuums" }, + { id: "3340", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Leaf Blowers" }, + { + id: "7332", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Outdoor Power Equipment Base Units", + }, + { + id: "7245", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Outdoor Power Equipment Sets", + }, + { + id: "500016", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Power Sweepers", + }, + { + id: "2204", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Power Tillers & Cultivators", + }, + { + id: "1226", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Pressure Washers", + }, + { id: "1541", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Snow Blowers" }, + { id: "5866", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Tractors" }, + { id: "1223", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment > Weed Trimmers" }, + { id: "4564", name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories" }, + { + id: "4565", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Chainsaw Accessories", + }, + { + id: "4647", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Chainsaw Accessories > Chainsaw Bars", + }, + { + id: "4646", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Chainsaw Accessories > Chainsaw Chains", + }, + { + id: "7563", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Grass Edger Accessories", + }, + { + id: "7265", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Hedge Trimmer Accessories", + }, + { + id: "4566", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories", + }, + { + id: "6542", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Brush Mower Attachments", + }, + { + id: "4645", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Bags", + }, + { + id: "4643", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Belts", + }, + { + id: "4641", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Blades", + }, + { + id: "4642", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Covers", + }, + { + id: "499923", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Mulch Kits", + }, + { + id: "499960", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Mulch Plugs & Plates", + }, + { + id: "4644", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Pulleys & Idlers", + }, + { + id: "499872", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Tire Tubes", + }, + { + id: "6095", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Tires", + }, + { + id: "6094", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Mower Wheels", + }, + { + id: "499921", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Striping Kits", + }, + { + id: "6541", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Lawn Mower Accessories > Lawn Sweepers", + }, + { + id: "7168", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Leaf Blower Accessories", + }, + { + id: "7171", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Leaf Blower Accessories > Leaf Blower Tubes", + }, + { + id: "8485", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments", + }, + { + id: "7564", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Grass Edger Attachments", + }, + { + id: "8487", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Ground & Leaf Blower Attachments", + }, + { + id: "7334", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Hedge Trimmer Attachments", + }, + { + id: "8489", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Pole Saw Attachments", + }, + { + id: "8488", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Tiller & Cultivator Attachments", + }, + { + id: "7335", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Multifunction Outdoor Power Equipment Attachments > Weed Trimmer Attachments", + }, + { + id: "7333", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Outdoor Power Equipment Batteries", + }, + { + id: "6328", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Pressure Washer Accessories", + }, + { + id: "4567", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Snow Blower Accessories", + }, + { + id: "5867", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Tractor Parts & Accessories", + }, + { + id: "499880", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Tractor Parts & Accessories > Tractor Tires", + }, + { + id: "499881", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Tractor Parts & Accessories > Tractor Wheels", + }, + { + id: "7169", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Weed Trimmer Accessories", + }, + { + id: "7170", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Weed Trimmer Accessories > Weed Trimmer Blades & Spools", + }, + { + id: "8034", + name: "Home & Garden > Lawn & Garden > Outdoor Power Equipment Accessories > Weed Trimmer Accessories > Weed Trimmer Spool Covers", + }, + { id: "5362", name: "Home & Garden > Lawn & Garden > Snow Removal" }, + { + id: "5364", + name: "Home & Garden > Lawn & Garden > Snow Removal > Ice Scrapers & Snow Brushes", + }, + { id: "5363", name: "Home & Garden > Lawn & Garden > Snow Removal > Snow Shovels" }, + { id: "3568", name: "Home & Garden > Lawn & Garden > Watering & Irrigation" }, + { + id: "4718", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Garden Hose Fittings & Valves", + }, + { + id: "4201", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Garden Hose Spray Nozzles", + }, + { id: "2313", name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Garden Hoses" }, + { + id: "3780", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Sprinkler Accessories", + }, + { + id: "1302", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Sprinkler Accessories > Sprinkler Controls", + }, + { + id: "3491", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Sprinkler Accessories > Sprinkler Valves", + }, + { + id: "7561", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Sprinklers & Sprinkler Heads", + }, + { + id: "505814", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Watering Can Accesssories", + }, + { id: "6318", name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Watering Cans" }, + { + id: "230912", + name: "Home & Garden > Lawn & Garden > Watering & Irrigation > Watering Globes & Spikes", + }, + { id: "594", name: "Home & Garden > Lighting" }, + { id: "1436", name: "Home & Garden > Lighting > Emergency Lighting" }, + { id: "500003", name: "Home & Garden > Lighting > Floating & Submersible Lights" }, + { id: "1546", name: "Home & Garden > Lighting > Flood & Spot Lights" }, + { id: "7401", name: "Home & Garden > Lighting > In-Ground Lights" }, + { id: "4636", name: "Home & Garden > Lighting > Lamps" }, + { id: "7400", name: "Home & Garden > Lighting > Landscape Pathway Lighting" }, + { id: "2425", name: "Home & Garden > Lighting > Light Bulbs" }, + { id: "2947", name: "Home & Garden > Lighting > Light Bulbs > Compact Fluorescent Lamps" }, + { id: "2690", name: "Home & Garden > Lighting > Light Bulbs > Fluorescent Tubes" }, + { id: "2944", name: "Home & Garden > Lighting > Light Bulbs > Incandescent Light Bulbs" }, + { id: "3329", name: "Home & Garden > Lighting > Light Bulbs > LED Light Bulbs" }, + { id: "2608", name: "Home & Garden > Lighting > Light Ropes & Strings" }, + { id: "3006", name: "Home & Garden > Lighting > Lighting Fixtures" }, + { id: "2809", name: "Home & Garden > Lighting > Lighting Fixtures > Cabinet Light Fixtures" }, + { id: "2524", name: "Home & Garden > Lighting > Lighting Fixtures > Ceiling Light Fixtures" }, + { id: "2249", name: "Home & Garden > Lighting > Lighting Fixtures > Chandeliers" }, + { id: "6073", name: "Home & Garden > Lighting > Lighting Fixtures > Wall Light Fixtures" }, + { id: "505826", name: "Home & Garden > Lighting > Night Lights & Ambient Lighting" }, + { id: "2370", name: "Home & Garden > Lighting > Picture Lights" }, + { id: "7399", name: "Home & Garden > Lighting > Tiki Torches & Oil Lamps" }, + { id: "6274", name: "Home & Garden > Lighting > Track Lighting" }, + { id: "6272", name: "Home & Garden > Lighting > Track Lighting > Track Lighting Accessories" }, + { id: "4932", name: "Home & Garden > Lighting > Track Lighting > Track Lighting Fixtures" }, + { id: "6273", name: "Home & Garden > Lighting > Track Lighting > Track Lighting Rails" }, + { id: "2956", name: "Home & Garden > Lighting Accessories" }, + { id: "7338", name: "Home & Garden > Lighting Accessories > Lamp Post Bases" }, + { id: "7447", name: "Home & Garden > Lighting Accessories > Lamp Post Mounts" }, + { id: "3185", name: "Home & Garden > Lighting Accessories > Lamp Shades" }, + { id: "3522", name: "Home & Garden > Lighting Accessories > Lighting Timers" }, + { id: "505312", name: "Home & Garden > Lighting Accessories > Oil Lamp Fuel" }, + { id: "4171", name: "Home & Garden > Linens & Bedding" }, + { id: "569", name: "Home & Garden > Linens & Bedding > Bedding" }, + { id: "505803", name: "Home & Garden > Linens & Bedding > Bedding > Bed Canopies" }, + { id: "2314", name: "Home & Garden > Linens & Bedding > Bedding > Bed Sheets" }, + { id: "2974", name: "Home & Garden > Linens & Bedding > Bedding > Bedskirts" }, + { id: "1985", name: "Home & Garden > Linens & Bedding > Bedding > Blankets" }, + { id: "2541", name: "Home & Garden > Linens & Bedding > Bedding > Duvet Covers" }, + { id: "4452", name: "Home & Garden > Linens & Bedding > Bedding > Mattress Protectors" }, + { + id: "4420", + name: "Home & Garden > Linens & Bedding > Bedding > Mattress Protectors > Mattress Encasements", + }, + { + id: "2991", + name: "Home & Garden > Linens & Bedding > Bedding > Mattress Protectors > Mattress Pads", + }, + { id: "1599", name: "Home & Garden > Linens & Bedding > Bedding > Nap Mats" }, + { id: "2927", name: "Home & Garden > Linens & Bedding > Bedding > Pillowcases & Shams" }, + { id: "2700", name: "Home & Garden > Linens & Bedding > Bedding > Pillows" }, + { id: "505287", name: "Home & Garden > Linens & Bedding > Bedding > Quilts & Comforters" }, + { id: "505832", name: "Home & Garden > Linens & Bedding > Kitchen Linens Sets" }, + { id: "601", name: "Home & Garden > Linens & Bedding > Table Linens" }, + { id: "4203", name: "Home & Garden > Linens & Bedding > Table Linens > Cloth Napkins" }, + { id: "4343", name: "Home & Garden > Linens & Bedding > Table Linens > Doilies" }, + { id: "2547", name: "Home & Garden > Linens & Bedding > Table Linens > Placemats" }, + { id: "6325", name: "Home & Garden > Linens & Bedding > Table Linens > Table Runners" }, + { id: "6322", name: "Home & Garden > Linens & Bedding > Table Linens > Table Skirts" }, + { id: "4143", name: "Home & Garden > Linens & Bedding > Table Linens > Tablecloths" }, + { id: "4077", name: "Home & Garden > Linens & Bedding > Towels" }, + { id: "576", name: "Home & Garden > Linens & Bedding > Towels > Bath Towels & Washcloths" }, + { id: "4126", name: "Home & Garden > Linens & Bedding > Towels > Beach Towels" }, + { id: "4257", name: "Home & Garden > Linens & Bedding > Towels > Kitchen Towels" }, + { id: "4358", name: "Home & Garden > Parasols & Rain Umbrellas" }, + { id: "985", name: "Home & Garden > Plants" }, + { id: "5590", name: "Home & Garden > Plants > Aquatic Plants" }, + { id: "984", name: "Home & Garden > Plants > Flowers" }, + { id: "6762", name: "Home & Garden > Plants > Indoor & Outdoor Plants" }, + { id: "543559", name: "Home & Garden > Plants > Indoor & Outdoor Plants > Bushes & Shrubs" }, + { + id: "543560", + name: "Home & Garden > Plants > Indoor & Outdoor Plants > Landscaping & Garden Plants", + }, + { id: "543558", name: "Home & Garden > Plants > Indoor & Outdoor Plants > Potted Houseplants" }, + { id: "505285", name: "Home & Garden > Plants > Plant & Herb Growing Kits" }, + { id: "2802", name: "Home & Garden > Plants > Seeds" }, + { id: "543561", name: "Home & Garden > Plants > Seeds > Plant & Flower Bulbs" }, + { id: "543562", name: "Home & Garden > Plants > Seeds > Seeds & Seed Tape" }, + { id: "1684", name: "Home & Garden > Plants > Trees" }, + { id: "729", name: "Home & Garden > Pool & Spa" }, + { id: "2832", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories" }, + { id: "2939", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Diving Boards" }, + { + id: "500042", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool & Spa Chlorine Generators", + }, + { id: "2981", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool & Spa Filters" }, + { + id: "505815", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool & Spa Maintenance Kits", + }, + { + id: "6996", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Brushes & Brooms", + }, + { id: "6771", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Cleaner Hoses" }, + { + id: "3017", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Cleaners & Chemicals", + }, + { + id: "500050", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Cover Accessories", + }, + { + id: "2994", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Covers & Ground Cloths", + }, + { id: "7496", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Deck Kits" }, + { + id: "2860", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Floats & Loungers", + }, + { id: "5654", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Heaters" }, + { + id: "6766", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Ladders, Steps & Ramps", + }, + { id: "503751", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Liners" }, + { id: "2755", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Skimmers" }, + { + id: "2997", + name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Sweeps & Vacuums", + }, + { id: "2672", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Toys" }, + { id: "5546", name: "Home & Garden > Pool & Spa > Pool & Spa Accessories > Pool Water Slides" }, + { id: "543687", name: "Home & Garden > Pool & Spa > Sauna Accessories" }, + { id: "543633", name: "Home & Garden > Pool & Spa > Sauna Accessories > Sauna Buckets & Ladles" }, + { id: "543632", name: "Home & Garden > Pool & Spa > Sauna Accessories > Sauna Heaters" }, + { id: "543631", name: "Home & Garden > Pool & Spa > Sauna Accessories > Sauna Kits" }, + { id: "3992", name: "Home & Garden > Pool & Spa > Saunas" }, + { id: "2982", name: "Home & Garden > Pool & Spa > Spas" }, + { id: "2810", name: "Home & Garden > Pool & Spa > Swimming Pools" }, + { id: "600", name: "Home & Garden > Smoking Accessories" }, + { id: "4082", name: "Home & Garden > Smoking Accessories > Ashtrays" }, + { id: "6882", name: "Home & Garden > Smoking Accessories > Cigar Cases" }, + { id: "6879", name: "Home & Garden > Smoking Accessories > Cigar Cutters & Punches" }, + { id: "6881", name: "Home & Garden > Smoking Accessories > Cigarette Cases" }, + { id: "500007", name: "Home & Garden > Smoking Accessories > Cigarette Holders" }, + { id: "6880", name: "Home & Garden > Smoking Accessories > Humidor Accessories" }, + { id: "6878", name: "Home & Garden > Smoking Accessories > Humidors" }, + { id: "6173", name: "Home & Garden > Umbrella Sleeves & Cases" }, + { id: "2639", name: "Home & Garden > Wood Stoves" }, + { id: "5181", name: "Luggage & Bags" }, + { id: "100", name: "Luggage & Bags > Backpacks" }, + { id: "101", name: "Luggage & Bags > Briefcases" }, + { id: "108", name: "Luggage & Bags > Cosmetic & Toiletry Bags" }, + { id: "549", name: "Luggage & Bags > Diaper Bags" }, + { id: "502974", name: "Luggage & Bags > Dry Boxes" }, + { id: "103", name: "Luggage & Bags > Duffel Bags" }, + { id: "104", name: "Luggage & Bags > Fanny Packs" }, + { id: "105", name: "Luggage & Bags > Garment Bags" }, + { id: "110", name: "Luggage & Bags > Luggage Accessories" }, + { id: "503014", name: "Luggage & Bags > Luggage Accessories > Dry Box Liners & Inserts" }, + { id: "7521", name: "Luggage & Bags > Luggage Accessories > Luggage Covers" }, + { id: "499691", name: "Luggage & Bags > Luggage Accessories > Luggage Racks & Stands" }, + { id: "5652", name: "Luggage & Bags > Luggage Accessories > Luggage Straps" }, + { id: "5651", name: "Luggage & Bags > Luggage Accessories > Luggage Tags" }, + { id: "5620", name: "Luggage & Bags > Luggage Accessories > Packing Organizers" }, + { id: "6919", name: "Luggage & Bags > Luggage Accessories > Travel Bottles & Containers" }, + { id: "5650", name: "Luggage & Bags > Luggage Accessories > Travel Pouches" }, + { id: "106", name: "Luggage & Bags > Messenger Bags" }, + { id: "5608", name: "Luggage & Bags > Shopping Totes" }, + { id: "107", name: "Luggage & Bags > Suitcases" }, + { id: "6553", name: "Luggage & Bags > Train Cases" }, + { id: "772", name: "Mature" }, + { id: "773", name: "Mature > Erotic" }, + { id: "779", name: "Mature > Erotic > Erotic Books" }, + { id: "774", name: "Mature > Erotic > Erotic Clothing" }, + { id: "776", name: "Mature > Erotic > Erotic DVDs & Videos" }, + { id: "5055", name: "Mature > Erotic > Erotic Food & Edibles" }, + { id: "6040", name: "Mature > Erotic > Erotic Games" }, + { id: "4060", name: "Mature > Erotic > Erotic Magazines" }, + { id: "6536", name: "Mature > Erotic > Pole Dancing Kits" }, + { id: "778", name: "Mature > Erotic > Sex Toys" }, + { id: "780", name: "Mature > Weapons" }, + { id: "3833", name: "Mature > Weapons > Brass Knuckles" }, + { id: "7567", name: "Mature > Weapons > Clubs & Batons" }, + { id: "6109", name: "Mature > Weapons > Combat Knives" }, + { id: "2214", name: "Mature > Weapons > Gun Care & Accessories" }, + { id: "781", name: "Mature > Weapons > Gun Care & Accessories > Ammunition" }, + { id: "505762", name: "Mature > Weapons > Gun Care & Accessories > Ammunition Cases & Holders" }, + { id: "500048", name: "Mature > Weapons > Gun Care & Accessories > Gun Cases & Range Bags" }, + { id: "503021", name: "Mature > Weapons > Gun Care & Accessories > Gun Cleaning" }, + { + id: "499855", + name: "Mature > Weapons > Gun Care & Accessories > Gun Cleaning > Gun Cleaning Cloths & Swabs", + }, + { + id: "499856", + name: "Mature > Weapons > Gun Care & Accessories > Gun Cleaning > Gun Cleaning Patches", + }, + { + id: "499854", + name: "Mature > Weapons > Gun Care & Accessories > Gun Cleaning > Gun Cleaning Solvents", + }, + { id: "1806", name: "Mature > Weapons > Gun Care & Accessories > Gun Grips" }, + { id: "1783", name: "Mature > Weapons > Gun Care & Accessories > Gun Holsters" }, + { id: "5067", name: "Mature > Weapons > Gun Care & Accessories > Gun Lights" }, + { id: "1822", name: "Mature > Weapons > Gun Care & Accessories > Gun Rails" }, + { id: "499853", name: "Mature > Weapons > Gun Care & Accessories > Gun Slings" }, + { + id: "503026", + name: "Mature > Weapons > Gun Care & Accessories > Reloading Supplies & Equipment", + }, + { + id: "499857", + name: "Mature > Weapons > Gun Care & Accessories > Reloading Supplies & Equipment > Ammunition Reloading Presses", + }, + { id: "782", name: "Mature > Weapons > Guns" }, + { id: "726", name: "Mature > Weapons > Mace & Pepper Spray" }, + { id: "3092", name: "Mature > Weapons > Nunchucks" }, + { id: "7175", name: "Mature > Weapons > Spears" }, + { id: "3924", name: "Mature > Weapons > Staff & Stick Weapons" }, + { id: "727", name: "Mature > Weapons > Stun Guns & Tasers" }, + { id: "3666", name: "Mature > Weapons > Swords" }, + { id: "3694", name: "Mature > Weapons > Throwing Stars" }, + { id: "3437", name: "Mature > Weapons > Whips" }, + { id: "783", name: "Media" }, + { id: "784", name: "Media > Books" }, + { id: "543541", name: "Media > Books > Audiobooks" }, + { id: "543542", name: "Media > Books > E-books" }, + { id: "543543", name: "Media > Books > Print Books" }, + { id: "499995", name: "Media > Carpentry & Woodworking Project Plans" }, + { id: "839", name: "Media > DVDs & Videos" }, + { id: "543527", name: "Media > DVDs & Videos > Film & Television DVDs" }, + { id: "543529", name: "Media > DVDs & Videos > Film & Television Digital Downloads" }, + { id: "543528", name: "Media > DVDs & Videos > Film & Television VHS Tapes" }, + { id: "886", name: "Media > Magazines & Newspapers" }, + { id: "543539", name: "Media > Magazines & Newspapers > Magazines" }, + { id: "543540", name: "Media > Magazines & Newspapers > Newspapers" }, + { id: "855", name: "Media > Music & Sound Recordings" }, + { id: "543526", name: "Media > Music & Sound Recordings > Digital Music Downloads" }, + { id: "543522", name: "Media > Music & Sound Recordings > Music CDs" }, + { id: "543524", name: "Media > Music & Sound Recordings > Music Cassette Tapes" }, + { id: "543523", name: "Media > Music & Sound Recordings > Records & LPs" }, + { id: "543525", name: "Media > Music & Sound Recordings > Spoken Word & Field Recordings" }, + { id: "5037", name: "Media > Product Manuals" }, + { id: "499821", name: "Media > Product Manuals > Camera & Optics Manuals" }, + { id: "5038", name: "Media > Product Manuals > Electronics Manuals" }, + { id: "5861", name: "Media > Product Manuals > Exercise & Fitness Equipment Manuals" }, + { id: "5039", name: "Media > Product Manuals > Household Appliance Manuals" }, + { id: "5040", name: "Media > Product Manuals > Kitchen Appliance Manuals" }, + { id: "5860", name: "Media > Product Manuals > Model & Toys Manuals" }, + { id: "499866", name: "Media > Product Manuals > Office Supply Manuals" }, + { id: "7516", name: "Media > Product Manuals > Power Tool & Equipment Manuals" }, + { id: "5041", name: "Media > Product Manuals > Vehicle Service Manuals" }, + { id: "887", name: "Media > Sheet Music" }, + { id: "922", name: "Office Supplies" }, + { id: "6174", name: "Office Supplies > Book Accessories" }, + { id: "6176", name: "Office Supplies > Book Accessories > Book Covers" }, + { id: "4941", name: "Office Supplies > Book Accessories > Book Lights" }, + { id: "6175", name: "Office Supplies > Book Accessories > Book Stands & Rests" }, + { id: "93", name: "Office Supplies > Book Accessories > Bookmarks" }, + { id: "8078", name: "Office Supplies > Desk Pads & Blotters" }, + { id: "923", name: "Office Supplies > Filing & Organization" }, + { id: "5997", name: "Office Supplies > Filing & Organization > Address Books" }, + { id: "4312", name: "Office Supplies > Filing & Organization > Binding Supplies" }, + { + id: "4086", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binder Accessories", + }, + { + id: "4212", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binder Accessories > Binder Rings", + }, + { + id: "4183", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binder Accessories > Index Dividers", + }, + { + id: "2139", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binder Accessories > Sheet Protectors", + }, + { id: "4303", name: "Office Supplies > Filing & Organization > Binding Supplies > Binders" }, + { + id: "4182", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binding Combs & Spines", + }, + { + id: "7080", + name: "Office Supplies > Filing & Organization > Binding Supplies > Binding Machines", + }, + { id: "6190", name: "Office Supplies > Filing & Organization > Business Card Books" }, + { id: "6171", name: "Office Supplies > Filing & Organization > Business Card Stands" }, + { id: "926", name: "Office Supplies > Filing & Organization > CD/DVD Cases & Organizers" }, + { id: "927", name: "Office Supplies > Filing & Organization > Calendars, Organizers & Planners" }, + { id: "5531", name: "Office Supplies > Filing & Organization > Card Files" }, + { id: "6177", name: "Office Supplies > Filing & Organization > Card Sleeves" }, + { id: "928", name: "Office Supplies > Filing & Organization > Cash Boxes" }, + { id: "939", name: "Office Supplies > Filing & Organization > Desk Organizers" }, + { id: "925", name: "Office Supplies > Filing & Organization > File Boxes" }, + { id: "930", name: "Office Supplies > Filing & Organization > File Folders" }, + { id: "6884", name: "Office Supplies > Filing & Organization > Folders & Report Covers" }, + { + id: "543663", + name: "Office Supplies > Filing & Organization > Folders & Report Covers > Pocket Folders", + }, + { + id: "543662", + name: "Office Supplies > Filing & Organization > Folders & Report Covers > Report Covers", + }, + { id: "5070", name: "Office Supplies > Filing & Organization > Greeting Card Organizers" }, + { id: "6962", name: "Office Supplies > Filing & Organization > Mail Sorters" }, + { id: "3062", name: "Office Supplies > Filing & Organization > Pen & Pencil Cases" }, + { id: "6885", name: "Office Supplies > Filing & Organization > Portfolios & Padfolios" }, + { + id: "543641", + name: "Office Supplies > Filing & Organization > Portfolios & Padfolios > Padfolios", + }, + { + id: "543640", + name: "Office Supplies > Filing & Organization > Portfolios & Padfolios > Portfolios", + }, + { id: "6779", name: "Office Supplies > Filing & Organization > Recipe Card Boxes" }, + { id: "932", name: "Office Supplies > General Office Supplies" }, + { id: "6319", name: "Office Supplies > General Office Supplies > Brass Fasteners" }, + { + id: "2591", + name: "Office Supplies > General Office Supplies > Correction Fluids, Pens & Tapes", + }, + { + id: "543618", + name: "Office Supplies > General Office Supplies > Correction Fluids, Pens & Tapes > Correction Fluids", + }, + { + id: "543620", + name: "Office Supplies > General Office Supplies > Correction Fluids, Pens & Tapes > Correction Pens", + }, + { + id: "543619", + name: "Office Supplies > General Office Supplies > Correction Fluids, Pens & Tapes > Correction Tapes", + }, + { id: "938", name: "Office Supplies > General Office Supplies > Erasers" }, + { id: "960", name: "Office Supplies > General Office Supplies > Labels & Tags" }, + { + id: "4377", + name: "Office Supplies > General Office Supplies > Labels & Tags > Address Labels", + }, + { id: "4154", name: "Office Supplies > General Office Supplies > Labels & Tags > Folder Tabs" }, + { id: "4137", name: "Office Supplies > General Office Supplies > Labels & Tags > Label Clips" }, + { + id: "5502", + name: "Office Supplies > General Office Supplies > Labels & Tags > Label Tapes & Refill Rolls", + }, + { + id: "4200", + name: "Office Supplies > General Office Supplies > Labels & Tags > Shipping Labels", + }, + { id: "4117", name: "Office Supplies > General Office Supplies > Labels & Tags > Shipping Tags" }, + { + id: "8015", + name: "Office Supplies > General Office Supplies > Laminating Film, Pouches & Sheets", + }, + { id: "505805", name: "Office Supplies > General Office Supplies > Mounting Putty" }, + { id: "934", name: "Office Supplies > General Office Supplies > Office Tape" }, + { id: "936", name: "Office Supplies > General Office Supplies > Paper Clips & Clamps" }, + { + id: "543676", + name: "Office Supplies > General Office Supplies > Paper Clips & Clamps > Binder Clips", + }, + { + id: "543675", + name: "Office Supplies > General Office Supplies > Paper Clips & Clamps > Paper Clips", + }, + { id: "956", name: "Office Supplies > General Office Supplies > Paper Products" }, + { id: "2658", name: "Office Supplies > General Office Supplies > Paper Products > Binder Paper" }, + { + id: "5264", + name: "Office Supplies > General Office Supplies > Paper Products > Blank ID Cards", + }, + { + id: "957", + name: "Office Supplies > General Office Supplies > Paper Products > Business Cards", + }, + { + id: "5918", + name: "Office Supplies > General Office Supplies > Paper Products > Business Forms & Receipts", + }, + { id: "6930", name: "Office Supplies > General Office Supplies > Paper Products > Checks" }, + { id: "1513", name: "Office Supplies > General Office Supplies > Paper Products > Cover Paper" }, + { id: "958", name: "Office Supplies > General Office Supplies > Paper Products > Envelopes" }, + { id: "959", name: "Office Supplies > General Office Supplies > Paper Products > Index Cards" }, + { + id: "961", + name: "Office Supplies > General Office Supplies > Paper Products > Notebooks & Notepads", + }, + { id: "3871", name: "Office Supplies > General Office Supplies > Paper Products > Post Cards" }, + { + id: "962", + name: "Office Supplies > General Office Supplies > Paper Products > Printer & Copier Paper", + }, + { + id: "5919", + name: "Office Supplies > General Office Supplies > Paper Products > Receipt & Adding Machine Paper Rolls", + }, + { id: "3457", name: "Office Supplies > General Office Supplies > Paper Products > Stationery" }, + { id: "2689", name: "Office Supplies > General Office Supplies > Paper Products > Sticky Notes" }, + { id: "944", name: "Office Supplies > General Office Supplies > Rubber Bands" }, + { id: "948", name: "Office Supplies > General Office Supplies > Staples" }, + { id: "949", name: "Office Supplies > General Office Supplies > Tacks & Pushpins" }, + { id: "5829", name: "Office Supplies > Impulse Sealers" }, + { id: "8499", name: "Office Supplies > Lap Desks" }, + { id: "2435", name: "Office Supplies > Name Plates" }, + { id: "6519", name: "Office Supplies > Office & Chair Mats" }, + { id: "6462", name: "Office Supplies > Office & Chair Mats > Anti-Fatigue Mats" }, + { id: "6521", name: "Office Supplies > Office & Chair Mats > Chair Mats" }, + { id: "6520", name: "Office Supplies > Office & Chair Mats > Office Mats" }, + { id: "6373", name: "Office Supplies > Office Carts" }, + { id: "1996", name: "Office Supplies > Office Carts > AV Carts" }, + { id: "6182", name: "Office Supplies > Office Carts > Book Carts" }, + { id: "6180", name: "Office Supplies > Office Carts > File Carts" }, + { id: "6181", name: "Office Supplies > Office Carts > Mail Carts" }, + { id: "6179", name: "Office Supplies > Office Carts > Utility Carts" }, + { id: "950", name: "Office Supplies > Office Equipment" }, + { id: "499864", name: "Office Supplies > Office Equipment > Calculator Accessories" }, + { id: "333", name: "Office Supplies > Office Equipment > Calculators" }, + { id: "543518", name: "Office Supplies > Office Equipment > Calculators > Basic Calculators" }, + { + id: "543521", + name: "Office Supplies > Office Equipment > Calculators > Construction Calculators", + }, + { + id: "543519", + name: "Office Supplies > Office Equipment > Calculators > Financial Calculators", + }, + { id: "543517", name: "Office Supplies > Office Equipment > Calculators > Graphing Calculators" }, + { + id: "543520", + name: "Office Supplies > Office Equipment > Calculators > Scientific Calculators", + }, + { id: "337", name: "Office Supplies > Office Equipment > Electronic Dictionaries & Translators" }, + { id: "952", name: "Office Supplies > Office Equipment > Label Makers" }, + { id: "1625", name: "Office Supplies > Office Equipment > Laminators" }, + { id: "953", name: "Office Supplies > Office Equipment > Office Shredders" }, + { id: "1708", name: "Office Supplies > Office Equipment > Postage Meters" }, + { id: "6404", name: "Office Supplies > Office Equipment > Time & Attendance Clocks" }, + { id: "954", name: "Office Supplies > Office Equipment > Transcribers & Dictation Systems" }, + { id: "955", name: "Office Supplies > Office Equipment > Typewriters" }, + { id: "2986", name: "Office Supplies > Office Instruments" }, + { id: "2883", name: "Office Supplies > Office Instruments > Call Bells" }, + { id: "935", name: "Office Supplies > Office Instruments > Clipboards" }, + { id: "505830", name: "Office Supplies > Office Instruments > Letter Openers" }, + { id: "941", name: "Office Supplies > Office Instruments > Magnifiers" }, + { id: "4341", name: "Office Supplies > Office Instruments > Office Rubber Stamps" }, + { id: "943", name: "Office Supplies > Office Instruments > Pencil Sharpeners" }, + { id: "4499", name: "Office Supplies > Office Instruments > Staple Removers" }, + { id: "947", name: "Office Supplies > Office Instruments > Staplers" }, + { id: "503746", name: "Office Supplies > Office Instruments > Tape Dispensers" }, + { + id: "4470", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories", + }, + { + id: "7117", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories > Marker & Highlighter Ink Refills", + }, + { + id: "543667", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories > Marker & Highlighter Ink Refills > Highlighter Refills", + }, + { + id: "543666", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories > Marker & Highlighter Ink Refills > Marker Refills", + }, + { + id: "4471", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories > Pen Ink & Refills", + }, + { + id: "4472", + name: "Office Supplies > Office Instruments > Writing & Drawing Instrument Accessories > Pencil Lead & Refills", + }, + { id: "977", name: "Office Supplies > Office Instruments > Writing & Drawing Instruments" }, + { + id: "2623", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Art Charcoals", + }, + { + id: "978", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Chalk", + }, + { + id: "979", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Crayons", + }, + { + id: "980", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Markers & Highlighters", + }, + { + id: "543609", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Markers & Highlighters > Highlighters", + }, + { + id: "543608", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Markers & Highlighters > Markers", + }, + { + id: "6067", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Multifunction Writing Instruments", + }, + { + id: "4752", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pastels", + }, + { + id: "6065", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils", + }, + { + id: "6066", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pen & Pencil Sets", + }, + { + id: "6068", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pencils", + }, + { + id: "3026", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pencils > Art Pencils", + }, + { + id: "981", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pencils > Writing Pencils", + }, + { + id: "543660", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pencils > Writing Pencils > Mechanical Pencils", + }, + { + id: "543661", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pencils > Writing Pencils > Wooden Pencils", + }, + { + id: "982", + name: "Office Supplies > Office Instruments > Writing & Drawing Instruments > Pens & Pencils > Pens", + }, + { id: "2014", name: "Office Supplies > Paper Handling" }, + { id: "6486", name: "Office Supplies > Paper Handling > Fingertip Grips" }, + { id: "6467", name: "Office Supplies > Paper Handling > Hole Punches" }, + { id: "2207", name: "Office Supplies > Paper Handling > Paper Folding Machines" }, + { id: "1836", name: "Office Supplies > Paper Handling > Paper Joggers" }, + { id: "1803", name: "Office Supplies > Paper Handling > Paperweights" }, + { id: "6178", name: "Office Supplies > Paper Handling > Pencil Boards" }, + { id: "964", name: "Office Supplies > Presentation Supplies" }, + { id: "965", name: "Office Supplies > Presentation Supplies > Chalkboards" }, + { id: "966", name: "Office Supplies > Presentation Supplies > Display Boards" }, + { + id: "7525", + name: "Office Supplies > Presentation Supplies > Display Boards > Bulletin Board Accessories", + }, + { + id: "7526", + name: "Office Supplies > Presentation Supplies > Display Boards > Bulletin Board Accessories > Bulletin Board Trim", + }, + { + id: "543688", + name: "Office Supplies > Presentation Supplies > Display Boards > Bulletin Board Accessories > Bulletin Board Trim Sets", + }, + { + id: "2401", + name: "Office Supplies > Presentation Supplies > Display Boards > Bulletin Boards", + }, + { id: "2263", name: "Office Supplies > Presentation Supplies > Display Boards > Foam Boards" }, + { + id: "1627", + name: "Office Supplies > Presentation Supplies > Display Boards > Mounting Boards", + }, + { id: "2674", name: "Office Supplies > Presentation Supplies > Display Boards > Poster Boards" }, + { id: "4492", name: "Office Supplies > Presentation Supplies > Document Cameras" }, + { id: "971", name: "Office Supplies > Presentation Supplies > Dry-Erase Boards" }, + { id: "967", name: "Office Supplies > Presentation Supplies > Easel Pads" }, + { id: "968", name: "Office Supplies > Presentation Supplies > Easels" }, + { id: "969", name: "Office Supplies > Presentation Supplies > Laser Pointers" }, + { id: "970", name: "Office Supplies > Presentation Supplies > Lecterns" }, + { id: "963", name: "Office Supplies > Presentation Supplies > Transparencies" }, + { id: "4465", name: "Office Supplies > Presentation Supplies > Wireless Presenters" }, + { id: "2636", name: "Office Supplies > Shipping Supplies" }, + { id: "973", name: "Office Supplies > Shipping Supplies > Moving & Shipping Boxes" }, + { id: "974", name: "Office Supplies > Shipping Supplies > Packing Materials" }, + { id: "975", name: "Office Supplies > Shipping Supplies > Packing Tape" }, + { id: "5605", name: "Religious & Ceremonial" }, + { id: "5606", name: "Religious & Ceremonial > Memorial Ceremony Supplies" }, + { id: "5607", name: "Religious & Ceremonial > Memorial Ceremony Supplies > Memorial Urns" }, + { id: "97", name: "Religious & Ceremonial > Religious Items" }, + { id: "3923", name: "Religious & Ceremonial > Religious Items > Prayer Beads" }, + { id: "328060", name: "Religious & Ceremonial > Religious Items > Prayer Cards" }, + { id: "7120", name: "Religious & Ceremonial > Religious Items > Religious Altars" }, + { id: "1949", name: "Religious & Ceremonial > Religious Items > Religious Veils" }, + { id: "499711", name: "Religious & Ceremonial > Religious Items > Tarot Cards" }, + { id: "5455", name: "Religious & Ceremonial > Wedding Ceremony Supplies" }, + { id: "503723", name: "Religious & Ceremonial > Wedding Ceremony Supplies > Aisle Runners" }, + { id: "5456", name: "Religious & Ceremonial > Wedding Ceremony Supplies > Flower Girl Baskets" }, + { + id: "5457", + name: "Religious & Ceremonial > Wedding Ceremony Supplies > Ring Pillows & Holders", + }, + { id: "2092", name: "Software" }, + { id: "313", name: "Software > Computer Software" }, + { id: "5299", name: "Software > Computer Software > Antivirus & Security Software" }, + { id: "5300", name: "Software > Computer Software > Business & Productivity Software" }, + { id: "315", name: "Software > Computer Software > Compilers & Programming Tools" }, + { id: "5301", name: "Software > Computer Software > Computer Utilities & Maintenance Software" }, + { id: "5127", name: "Software > Computer Software > Dictionary & Translation Software" }, + { id: "317", name: "Software > Computer Software > Educational Software" }, + { id: "5304", name: "Software > Computer Software > Financial, Tax & Accounting Software" }, + { id: "3283", name: "Software > Computer Software > GPS Map Data & Software" }, + { id: "318", name: "Software > Computer Software > Handheld & PDA Software" }, + { id: "319", name: "Software > Computer Software > Multimedia & Design Software" }, + { + id: "6027", + name: "Software > Computer Software > Multimedia & Design Software > 3D Modeling Software", + }, + { + id: "4950", + name: "Software > Computer Software > Multimedia & Design Software > Animation Editing Software", + }, + { + id: "4951", + name: "Software > Computer Software > Multimedia & Design Software > Graphic Design & Illustration Software", + }, + { + id: "6029", + name: "Software > Computer Software > Multimedia & Design Software > Home & Interior Design Software", + }, + { + id: "4949", + name: "Software > Computer Software > Multimedia & Design Software > Home Publishing Software", + }, + { + id: "6028", + name: "Software > Computer Software > Multimedia & Design Software > Media Viewing Software", + }, + { + id: "5096", + name: "Software > Computer Software > Multimedia & Design Software > Music Composition Software", + }, + { + id: "4952", + name: "Software > Computer Software > Multimedia & Design Software > Sound Editing Software", + }, + { + id: "4953", + name: "Software > Computer Software > Multimedia & Design Software > Video Editing Software", + }, + { + id: "4954", + name: "Software > Computer Software > Multimedia & Design Software > Web Design Software", + }, + { id: "5302", name: "Software > Computer Software > Network Software" }, + { id: "5303", name: "Software > Computer Software > Office Application Software" }, + { id: "321", name: "Software > Computer Software > Operating Systems" }, + { id: "7225", name: "Software > Computer Software > Restore Disks" }, + { id: "5032", name: "Software > Digital Goods & Currency" }, + { id: "5034", name: "Software > Digital Goods & Currency > Computer Icons" }, + { id: "5035", name: "Software > Digital Goods & Currency > Desktop Wallpaper" }, + { id: "500046", name: "Software > Digital Goods & Currency > Digital Artwork" }, + { id: "8022", name: "Software > Digital Goods & Currency > Document Templates" }, + { id: "5036", name: "Software > Digital Goods & Currency > Fonts" }, + { id: "2065", name: "Software > Digital Goods & Currency > Stock Photographs & Video Footage" }, + { id: "5935", name: "Software > Digital Goods & Currency > Virtual Currency" }, + { id: "1279", name: "Software > Video Game Software" }, + { id: "988", name: "Sporting Goods" }, + { id: "499713", name: "Sporting Goods > Athletics" }, + { id: "1093", name: "Sporting Goods > Athletics > American Football" }, + { id: "3442", name: "Sporting Goods > Athletics > American Football > American Football Gloves" }, + { + id: "3492", + name: "Sporting Goods > Athletics > American Football > American Football Goal Posts", + }, + { + id: "3656", + name: "Sporting Goods > Athletics > American Football > American Football Kicking Tees & Holders", + }, + { + id: "1097", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear", + }, + { + id: "3510", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Girdles", + }, + { + id: "3060", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmet Accessories", + }, + { + id: "3247", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmet Accessories > American Football Chin Straps", + }, + { + id: "3090", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmet Accessories > American Football Face Masks", + }, + { + id: "3343", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmet Accessories > American Football Helmet Padding", + }, + { + id: "3063", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmet Accessories > American Football Helmet Visors", + }, + { + id: "1098", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Helmets", + }, + { + id: "3497", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Neck Rolls", + }, + { + id: "499778", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Rib Protection Shirts & Vests", + }, + { + id: "3621", + name: "Sporting Goods > Athletics > American Football > American Football Protective Gear > American Football Shoulder Pads", + }, + { + id: "3998", + name: "Sporting Goods > Athletics > American Football > American Football Training Equipment", + }, + { + id: "499779", + name: "Sporting Goods > Athletics > American Football > American Football Training Equipment > American Football Dummies & Sleds", + }, + { id: "1094", name: "Sporting Goods > Athletics > American Football > American Footballs" }, + { id: "1070", name: "Sporting Goods > Athletics > Baseball & Softball" }, + { + id: "3544", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Bases & Plates", + }, + { + id: "3747", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Batting Gloves", + }, + { + id: "1076", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Gloves & Mitts", + }, + { + id: "234671", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Pitching Mats", + }, + { + id: "234670", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Pitching Mounds", + }, + { + id: "1078", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear", + }, + { + id: "3668", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear > Baseball & Softball Batting Helmets", + }, + { + id: "499715", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear > Baseball & Softball Chest Protectors", + }, + { + id: "499718", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear > Baseball & Softball Leg Guards", + }, + { + id: "499716", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear > Catchers Equipment Sets", + }, + { + id: "499717", + name: "Sporting Goods > Athletics > Baseball & Softball > Baseball & Softball Protective Gear > Catchers Helmets & Masks", + }, + { id: "3790", name: "Sporting Goods > Athletics > Baseball & Softball > Baseball Bats" }, + { id: "3783", name: "Sporting Goods > Athletics > Baseball & Softball > Baseballs" }, + { id: "1077", name: "Sporting Goods > Athletics > Baseball & Softball > Pitching Machines" }, + { id: "3679", name: "Sporting Goods > Athletics > Baseball & Softball > Softball Bats" }, + { id: "3671", name: "Sporting Goods > Athletics > Baseball & Softball > Softballs" }, + { id: "1081", name: "Sporting Goods > Athletics > Basketball" }, + { + id: "4676", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories", + }, + { + id: "4089", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories > Basketball Backboards", + }, + { + id: "7251", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories > Basketball Hoop Padding", + }, + { + id: "4050", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories > Basketball Hoop Posts", + }, + { + id: "3829", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories > Basketball Nets", + }, + { + id: "4192", + name: "Sporting Goods > Athletics > Basketball > Basketball Hoop Parts & Accessories > Basketball Rims", + }, + { id: "1082", name: "Sporting Goods > Athletics > Basketball > Basketball Hoops" }, + { id: "499751", name: "Sporting Goods > Athletics > Basketball > Basketball Training Aids" }, + { id: "1083", name: "Sporting Goods > Athletics > Basketball > Basketballs" }, + { id: "499719", name: "Sporting Goods > Athletics > Boxing & Martial Arts" }, + { + id: "4008", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear", + }, + { + id: "499726", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > Boxing & MMA Hand Wraps", + }, + { + id: "499725", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > Boxing & Martial Arts Arm Guards", + }, + { + id: "499723", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > Boxing & Martial Arts Body Protectors", + }, + { + id: "499722", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > Boxing & Martial Arts Headgear", + }, + { + id: "3235", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > Boxing Gloves & Mitts", + }, + { + id: "499724", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Protective Gear > MMA Shin Guards", + }, + { + id: "499720", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment", + }, + { + id: "499769", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment > Boxing & MMA Punch Mitts", + }, + { + id: "7116", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment > Grappling Dummies", + }, + { + id: "7129", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment > Punching & Training Bag Accessories", + }, + { + id: "3297", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment > Punching & Training Bags", + }, + { + id: "499721", + name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing & Martial Arts Training Equipment > Strike Shields", + }, + { id: "3411", name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing Ring Parts" }, + { id: "3652", name: "Sporting Goods > Athletics > Boxing & Martial Arts > Boxing Rings" }, + { id: "3717", name: "Sporting Goods > Athletics > Boxing & Martial Arts > Martial Arts Belts" }, + { id: "4282", name: "Sporting Goods > Athletics > Boxing & Martial Arts > Martial Arts Weapons" }, + { id: "6734", name: "Sporting Goods > Athletics > Broomball Equipment" }, + { id: "3354", name: "Sporting Goods > Athletics > Cheerleading" }, + { id: "3953", name: "Sporting Goods > Athletics > Cheerleading > Cheerleading Pom Poms" }, + { id: "6739", name: "Sporting Goods > Athletics > Coaching & Officiating" }, + { id: "499729", name: "Sporting Goods > Athletics > Coaching & Officiating > Captains Armbands" }, + { + id: "505813", + name: "Sporting Goods > Athletics > Coaching & Officiating > Field & Court Boundary Markers", + }, + { + id: "499732", + name: "Sporting Goods > Athletics > Coaching & Officiating > Flip Coins & Discs", + }, + { id: "6731", name: "Sporting Goods > Athletics > Coaching & Officiating > Linesman Flags" }, + { + id: "6729", + name: "Sporting Goods > Athletics > Coaching & Officiating > Penalty Cards & Flags", + }, + { id: "499731", name: "Sporting Goods > Athletics > Coaching & Officiating > Pitch Counters" }, + { + id: "499733", + name: "Sporting Goods > Athletics > Coaching & Officiating > Referee Stands & Chairs", + }, + { id: "499727", name: "Sporting Goods > Athletics > Coaching & Officiating > Referee Wallets" }, + { id: "8505", name: "Sporting Goods > Athletics > Coaching & Officiating > Scoreboards" }, + { + id: "6730", + name: "Sporting Goods > Athletics > Coaching & Officiating > Sport & Safety Whistles", + }, + { id: "499730", name: "Sporting Goods > Athletics > Coaching & Officiating > Umpire Indicators" }, + { id: "1087", name: "Sporting Goods > Athletics > Cricket" }, + { id: "3870", name: "Sporting Goods > Athletics > Cricket > Cricket Balls" }, + { id: "499737", name: "Sporting Goods > Athletics > Cricket > Cricket Bat Accessories" }, + { + id: "499738", + name: "Sporting Goods > Athletics > Cricket > Cricket Bat Accessories > Cricket Bat Grips", + }, + { id: "3815", name: "Sporting Goods > Athletics > Cricket > Cricket Bats" }, + { id: "499735", name: "Sporting Goods > Athletics > Cricket > Cricket Equipment Sets" }, + { id: "499736", name: "Sporting Goods > Athletics > Cricket > Cricket Protective Gear" }, + { + id: "3339", + name: "Sporting Goods > Athletics > Cricket > Cricket Protective Gear > Cricket Gloves", + }, + { + id: "3543", + name: "Sporting Goods > Athletics > Cricket > Cricket Protective Gear > Cricket Helmets", + }, + { + id: "499739", + name: "Sporting Goods > Athletics > Cricket > Cricket Protective Gear > Cricket Leg Guards", + }, + { id: "499734", name: "Sporting Goods > Athletics > Cricket > Cricket Stumps" }, + { id: "989", name: "Sporting Goods > Athletics > Dancing" }, + { id: "3269", name: "Sporting Goods > Athletics > Dancing > Ballet Barres" }, + { id: "1006", name: "Sporting Goods > Athletics > Fencing" }, + { id: "3261", name: "Sporting Goods > Athletics > Fencing > Fencing Protective Gear" }, + { + id: "3366", + name: "Sporting Goods > Athletics > Fencing > Fencing Protective Gear > Fencing Gloves & Cuffs", + }, + { + id: "499740", + name: "Sporting Goods > Athletics > Fencing > Fencing Protective Gear > Fencing Jackets & Lamés", + }, + { + id: "3707", + name: "Sporting Goods > Athletics > Fencing > Fencing Protective Gear > Fencing Masks", + }, + { id: "3622", name: "Sporting Goods > Athletics > Fencing > Fencing Weapons" }, + { id: "499741", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse" }, + { + id: "499744", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey & Lacrosse Protective Gear", + }, + { + id: "499745", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey & Lacrosse Protective Gear > Field Hockey & Lacrosse Gloves", + }, + { + id: "499746", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey & Lacrosse Protective Gear > Field Hockey & Lacrosse Helmets", + }, + { + id: "499747", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey & Lacrosse Protective Gear > Field Hockey & Lacrosse Masks & Goggles", + }, + { + id: "502970", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey & Lacrosse Protective Gear > Field Hockey & Lacrosse Pads", + }, + { id: "1089", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey Balls" }, + { id: "3001", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey Goals" }, + { + id: "1092", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Field Hockey Sticks", + }, + { id: "3536", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Balls" }, + { + id: "499742", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Equipment Sets", + }, + { id: "3970", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Goals" }, + { + id: "3336", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Stick Parts", + }, + { + id: "3785", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Stick Parts > Lacrosse Mesh & String", + }, + { + id: "3418", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Stick Parts > Lacrosse Stick Heads", + }, + { + id: "3423", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Stick Parts > Lacrosse Stick Shafts", + }, + { id: "3817", name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Sticks" }, + { + id: "3204", + name: "Sporting Goods > Athletics > Field Hockey & Lacrosse > Lacrosse Training Aids", + }, + { id: "499915", name: "Sporting Goods > Athletics > Figure Skating & Hockey" }, + { + id: "6077", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Balls & Pucks", + }, + { id: "6074", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Goals" }, + { + id: "1105", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear", + }, + { + id: "499756", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Elbow Pads", + }, + { + id: "6078", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Gloves", + }, + { + id: "499890", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Goalie Equipment Sets", + }, + { + id: "6080", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Helmets", + }, + { + id: "3615", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Pants", + }, + { + id: "499755", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Shin Guards & Leg Pads", + }, + { + id: "499757", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Shoulder Pads & Chest Protectors", + }, + { + id: "499975", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Protective Gear > Hockey Suspenders & Belts", + }, + { id: "6857", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Sledges" }, + { id: "7012", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Stick Care" }, + { id: "7011", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Stick Parts" }, + { + id: "6852", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Stick Parts > Hockey Stick Blades", + }, + { + id: "6942", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Stick Parts > Hockey Stick Shafts", + }, + { id: "6076", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Hockey Sticks" }, + { + id: "3791", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories", + }, + { + id: "6708", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories > Figure Skate Boots", + }, + { + id: "7000", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories > Ice Skate Blades", + }, + { + id: "3623", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories > Ice Skate Sharpeners", + }, + { + id: "4019", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories > Skate Blade Guards", + }, + { + id: "3241", + name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skate Parts & Accessories > Skate Lace Tighteners", + }, + { id: "1057", name: "Sporting Goods > Athletics > Figure Skating & Hockey > Ice Skates" }, + { id: "499799", name: "Sporting Goods > Athletics > General Purpose Athletic Equipment" }, + { + id: "8222", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Altitude Training Masks", + }, + { + id: "499800", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Athletic Cups", + }, + { + id: "7397", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Ball Carrying Bags & Carts", + }, + { + id: "7433", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Ball Pump Accessories", + }, + { + id: "7435", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Ball Pump Accessories > Ball Pump Needles", + }, + { + id: "7434", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Ball Pumps", + }, + { + id: "499903", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Exercise & Gym Mat Storage Racks & Carts", + }, + { + id: "3971", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Grip Spray & Chalk", + }, + { + id: "499803", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Gym Mats", + }, + { + id: "8077", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Practice Nets & Screens", + }, + { + id: "499802", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Speed & Agility Ladders & Hurdles", + }, + { + id: "8319", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Sports & Agility Cones", + }, + { + id: "3877", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Sports Megaphones", + }, + { + id: "499801", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Sports Mouthguards", + }, + { + id: "6344", + name: "Sporting Goods > Athletics > General Purpose Athletic Equipment > Stadium Seats & Cushions", + }, + { id: "1000", name: "Sporting Goods > Athletics > Gymnastics" }, + { + id: "503763", + name: "Sporting Goods > Athletics > Gymnastics > Gymnastics Bars & Balance Beams", + }, + { id: "3808", name: "Sporting Goods > Athletics > Gymnastics > Gymnastics Protective Gear" }, + { + id: "499781", + name: "Sporting Goods > Athletics > Gymnastics > Gymnastics Protective Gear > Gymnastics Grips", + }, + { id: "3774", name: "Sporting Goods > Athletics > Gymnastics > Gymnastics Rings" }, + { id: "3123", name: "Sporting Goods > Athletics > Gymnastics > Gymnastics Springboards" }, + { id: "3182", name: "Sporting Goods > Athletics > Gymnastics > Pommel Horses" }, + { id: "3779", name: "Sporting Goods > Athletics > Gymnastics > Vaulting Horses" }, + { id: "503752", name: "Sporting Goods > Athletics > Racquetball & Squash" }, + { + id: "503753", + name: "Sporting Goods > Athletics > Racquetball & Squash > Racquetball & Squash Balls", + }, + { + id: "3119", + name: "Sporting Goods > Athletics > Racquetball & Squash > Racquetball & Squash Eyewear", + }, + { + id: "499783", + name: "Sporting Goods > Athletics > Racquetball & Squash > Racquetball & Squash Gloves", + }, + { id: "3714", name: "Sporting Goods > Athletics > Racquetball & Squash > Racquetball Racquets" }, + { id: "4002", name: "Sporting Goods > Athletics > Racquetball & Squash > Squash Racquets" }, + { id: "7156", name: "Sporting Goods > Athletics > Rounders" }, + { id: "7158", name: "Sporting Goods > Athletics > Rounders > Rounders Bats" }, + { id: "7157", name: "Sporting Goods > Athletics > Rounders > Rounders Gloves" }, + { id: "1110", name: "Sporting Goods > Athletics > Rugby" }, + { id: "3761", name: "Sporting Goods > Athletics > Rugby > Rugby Balls" }, + { id: "3487", name: "Sporting Goods > Athletics > Rugby > Rugby Gloves" }, + { id: "3881", name: "Sporting Goods > Athletics > Rugby > Rugby Posts" }, + { id: "499782", name: "Sporting Goods > Athletics > Rugby > Rugby Protective Gear" }, + { + id: "3077", + name: "Sporting Goods > Athletics > Rugby > Rugby Protective Gear > Rugby Headgear", + }, + { id: "3983", name: "Sporting Goods > Athletics > Rugby > Rugby Training Aids" }, + { id: "1111", name: "Sporting Goods > Athletics > Soccer" }, + { id: "1112", name: "Sporting Goods > Athletics > Soccer > Soccer Balls" }, + { id: "3973", name: "Sporting Goods > Athletics > Soccer > Soccer Corner Flags" }, + { id: "3141", name: "Sporting Goods > Athletics > Soccer > Soccer Gloves" }, + { id: "6055", name: "Sporting Goods > Athletics > Soccer > Soccer Goal Accessories" }, + { id: "1113", name: "Sporting Goods > Athletics > Soccer > Soccer Goals" }, + { id: "499784", name: "Sporting Goods > Athletics > Soccer > Soccer Protective Gear" }, + { + id: "1114", + name: "Sporting Goods > Athletics > Soccer > Soccer Protective Gear > Soccer Shin Guards", + }, + { id: "1047", name: "Sporting Goods > Athletics > Team Handball" }, + { id: "499785", name: "Sporting Goods > Athletics > Team Handball > Handballs" }, + { id: "1065", name: "Sporting Goods > Athletics > Tennis" }, + { id: "3105", name: "Sporting Goods > Athletics > Tennis > Tennis Ball Hoppers & Carts" }, + { id: "3985", name: "Sporting Goods > Athletics > Tennis > Tennis Ball Machines" }, + { id: "3565", name: "Sporting Goods > Athletics > Tennis > Tennis Ball Savers" }, + { id: "3113", name: "Sporting Goods > Athletics > Tennis > Tennis Balls" }, + { id: "3961", name: "Sporting Goods > Athletics > Tennis > Tennis Nets" }, + { id: "3658", name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories" }, + { + id: "3352", + name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories > Racquet Vibration Dampeners", + }, + { + id: "3638", + name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories > Tennis Racquet Bags", + }, + { + id: "3403", + name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories > Tennis Racquet Grips & Tape", + }, + { + id: "3295", + name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories > Tennis Racquet Grommets", + }, + { + id: "3922", + name: "Sporting Goods > Athletics > Tennis > Tennis Racquet Accessories > Tennis Racquet String", + }, + { id: "3906", name: "Sporting Goods > Athletics > Tennis > Tennis Racquets" }, + { id: "1060", name: "Sporting Goods > Athletics > Track & Field" }, + { id: "3478", name: "Sporting Goods > Athletics > Track & Field > Discus" }, + { id: "3445", name: "Sporting Goods > Athletics > Track & Field > High Jump Crossbars" }, + { id: "3864", name: "Sporting Goods > Athletics > Track & Field > High Jump Pits" }, + { id: "3389", name: "Sporting Goods > Athletics > Track & Field > Javelins" }, + { id: "3987", name: "Sporting Goods > Athletics > Track & Field > Pole Vault Pits" }, + { id: "3878", name: "Sporting Goods > Athletics > Track & Field > Relay Batons" }, + { id: "3770", name: "Sporting Goods > Athletics > Track & Field > Shot Puts" }, + { id: "3997", name: "Sporting Goods > Athletics > Track & Field > Starter Pistols" }, + { id: "3880", name: "Sporting Goods > Athletics > Track & Field > Throwing Hammers" }, + { id: "3149", name: "Sporting Goods > Athletics > Track & Field > Track Hurdles" }, + { id: "499786", name: "Sporting Goods > Athletics > Track & Field > Track Starting Blocks" }, + { id: "4020", name: "Sporting Goods > Athletics > Track & Field > Vaulting Poles" }, + { id: "1115", name: "Sporting Goods > Athletics > Volleyball" }, + { id: "1117", name: "Sporting Goods > Athletics > Volleyball > Volleyball Nets" }, + { id: "499788", name: "Sporting Goods > Athletics > Volleyball > Volleyball Protective Gear" }, + { + id: "499789", + name: "Sporting Goods > Athletics > Volleyball > Volleyball Protective Gear > Volleyball Knee Pads", + }, + { id: "499787", name: "Sporting Goods > Athletics > Volleyball > Volleyball Training Aids" }, + { id: "1116", name: "Sporting Goods > Athletics > Volleyball > Volleyballs" }, + { id: "499861", name: "Sporting Goods > Athletics > Wallyball Equipment" }, + { id: "1145", name: "Sporting Goods > Athletics > Water Polo" }, + { id: "3794", name: "Sporting Goods > Athletics > Water Polo > Water Polo Balls" }, + { id: "3575", name: "Sporting Goods > Athletics > Water Polo > Water Polo Caps" }, + { id: "3678", name: "Sporting Goods > Athletics > Water Polo > Water Polo Goals" }, + { id: "1068", name: "Sporting Goods > Athletics > Wrestling" }, + { id: "3057", name: "Sporting Goods > Athletics > Wrestling > Wrestling Protective Gear" }, + { + id: "499791", + name: "Sporting Goods > Athletics > Wrestling > Wrestling Protective Gear > Wrestling Headgear", + }, + { + id: "499790", + name: "Sporting Goods > Athletics > Wrestling > Wrestling Protective Gear > Wrestling Knee Pads", + }, + { id: "990", name: "Sporting Goods > Exercise & Fitness" }, + { id: "499797", name: "Sporting Goods > Exercise & Fitness > Ab Wheels & Rollers" }, + { id: "237166", name: "Sporting Goods > Exercise & Fitness > Aerobic Steps" }, + { id: "499796", name: "Sporting Goods > Exercise & Fitness > Balance Trainers" }, + { id: "499792", name: "Sporting Goods > Exercise & Fitness > Cardio" }, + { id: "4598", name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories" }, + { + id: "499703", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories > Elliptical Trainer Accessories", + }, + { + id: "499702", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories > Exercise Bike Accessories", + }, + { + id: "499701", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories > Rowing Machine Accessories", + }, + { + id: "499700", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories > Stair Climber & Stepper Accessories", + }, + { + id: "499699", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machine Accessories > Treadmill Accessories", + }, + { id: "4589", name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines" }, + { + id: "992", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Elliptical Trainers", + }, + { + id: "994", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Exercise Bikes", + }, + { + id: "995", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Rowing Machines", + }, + { + id: "996", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Stair Climbers & Steppers", + }, + { + id: "543610", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Stair Climbers & Steppers > Stair Climbers", + }, + { + id: "543611", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Stair Climbers & Steppers > Stair Steppers", + }, + { + id: "997", + name: "Sporting Goods > Exercise & Fitness > Cardio > Cardio Machines > Treadmills", + }, + { id: "2614", name: "Sporting Goods > Exercise & Fitness > Cardio > Jump Ropes" }, + { id: "993", name: "Sporting Goods > Exercise & Fitness > Exercise Balls" }, + { id: "5869", name: "Sporting Goods > Exercise & Fitness > Exercise Bands" }, + { id: "499795", name: "Sporting Goods > Exercise & Fitness > Exercise Benches" }, + { id: "4669", name: "Sporting Goods > Exercise & Fitness > Exercise Equipment Mats" }, + { id: "499978", name: "Sporting Goods > Exercise & Fitness > Exercise Machine & Equipment Sets" }, + { id: "8471", name: "Sporting Goods > Exercise & Fitness > Exercise Wedges" }, + { id: "6337", name: "Sporting Goods > Exercise & Fitness > Foam Roller Accessories" }, + { + id: "6338", + name: "Sporting Goods > Exercise & Fitness > Foam Roller Accessories > Foam Roller Storage Bags", + }, + { id: "5319", name: "Sporting Goods > Exercise & Fitness > Foam Rollers" }, + { id: "6867", name: "Sporting Goods > Exercise & Fitness > Hand Exercisers" }, + { id: "355576", name: "Sporting Goods > Exercise & Fitness > Inversion Tables & Systems" }, + { id: "3938", name: "Sporting Goods > Exercise & Fitness > Medicine Balls" }, + { id: "499912", name: "Sporting Goods > Exercise & Fitness > Power Towers" }, + { id: "8215", name: "Sporting Goods > Exercise & Fitness > Push Up & Pull Up Bars" }, + { id: "7174", name: "Sporting Goods > Exercise & Fitness > Reaction Balls" }, + { id: "8062", name: "Sporting Goods > Exercise & Fitness > Speed & Resistance Parachutes" }, + { id: "505302", name: "Sporting Goods > Exercise & Fitness > Sport Safety Lights & Reflectors" }, + { id: "5693", name: "Sporting Goods > Exercise & Fitness > Stopwatches" }, + { id: "499798", name: "Sporting Goods > Exercise & Fitness > Suspension Trainers" }, + { id: "8066", name: "Sporting Goods > Exercise & Fitness > Vibration Exercise Machines" }, + { id: "499793", name: "Sporting Goods > Exercise & Fitness > Weight Lifting" }, + { + id: "6452", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Free Weight Accessories", + }, + { + id: "8083", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Free Weight Accessories > Free Weight Storage Racks", + }, + { + id: "499794", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Free Weight Accessories > Weight Bar Collars", + }, + { + id: "3271", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Free Weight Accessories > Weight Bars", + }, + { id: "3164", name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Free Weights" }, + { + id: "3654", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Weight Lifting Belts", + }, + { + id: "3858", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Weight Lifting Gloves & Hand Supports", + }, + { + id: "3217", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Weight Lifting Machine & Exercise Bench Accessories", + }, + { + id: "3542", + name: "Sporting Goods > Exercise & Fitness > Weight Lifting > Weight Lifting Machines & Racks", + }, + { id: "6103", name: "Sporting Goods > Exercise & Fitness > Weighted Clothing" }, + { id: "999", name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates" }, + { id: "3810", name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates > Pilates Machines" }, + { + id: "6750", + name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates > Yoga & Pilates Blocks", + }, + { + id: "3640", + name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates > Yoga & Pilates Mats", + }, + { + id: "6743", + name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates > Yoga & Pilates Towels", + }, + { + id: "5107", + name: "Sporting Goods > Exercise & Fitness > Yoga & Pilates > Yoga Mat Bags & Straps", + }, + { id: "1001", name: "Sporting Goods > Indoor Games" }, + { id: "1002", name: "Sporting Goods > Indoor Games > Air Hockey" }, + { id: "505330", name: "Sporting Goods > Indoor Games > Air Hockey > Air Hockey Equipment" }, + { id: "3548", name: "Sporting Goods > Indoor Games > Air Hockey > Air Hockey Table Parts" }, + { id: "3245", name: "Sporting Goods > Indoor Games > Air Hockey > Air Hockey Tables" }, + { id: "1003", name: "Sporting Goods > Indoor Games > Billiards" }, + { id: "3059", name: "Sporting Goods > Indoor Games > Billiards > Billiard Ball Racks" }, + { id: "3135", name: "Sporting Goods > Indoor Games > Billiards > Billiard Balls" }, + { id: "3222", name: "Sporting Goods > Indoor Games > Billiards > Billiard Cue Accessories" }, + { + id: "499993", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Cue Accessories > Billiard Cue Cases", + }, + { + id: "499994", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Cue Accessories > Billiard Cue Chalk", + }, + { + id: "3720", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Cue Accessories > Billiard Cue Racks", + }, + { id: "3910", name: "Sporting Goods > Indoor Games > Billiards > Billiard Cues & Bridges" }, + { id: "3755", name: "Sporting Goods > Indoor Games > Billiards > Billiard Gloves" }, + { id: "3469", name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Lights" }, + { + id: "3183", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Parts & Accessories", + }, + { + id: "3574", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Parts & Accessories > Billiard Pockets", + }, + { + id: "3754", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Parts & Accessories > Billiard Table Brushes", + }, + { + id: "3547", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Parts & Accessories > Billiard Table Cloth", + }, + { + id: "8065", + name: "Sporting Goods > Indoor Games > Billiards > Billiard Table Parts & Accessories > Billiard Table Covers", + }, + { id: "3139", name: "Sporting Goods > Indoor Games > Billiards > Billiard Tables" }, + { id: "1004", name: "Sporting Goods > Indoor Games > Bowling" }, + { id: "3698", name: "Sporting Goods > Indoor Games > Bowling > Bowling Ball Bags" }, + { id: "3219", name: "Sporting Goods > Indoor Games > Bowling > Bowling Balls" }, + { id: "3535", name: "Sporting Goods > Indoor Games > Bowling > Bowling Gloves" }, + { id: "3669", name: "Sporting Goods > Indoor Games > Bowling > Bowling Pins" }, + { id: "3260", name: "Sporting Goods > Indoor Games > Bowling > Bowling Wrist Supports" }, + { id: "1007", name: "Sporting Goods > Indoor Games > Foosball" }, + { id: "3641", name: "Sporting Goods > Indoor Games > Foosball > Foosball Balls" }, + { + id: "3524", + name: "Sporting Goods > Indoor Games > Foosball > Foosball Table Parts & Accessories", + }, + { id: "3847", name: "Sporting Goods > Indoor Games > Foosball > Foosball Tables" }, + { id: "7010", name: "Sporting Goods > Indoor Games > Multi-Game Tables" }, + { id: "1008", name: "Sporting Goods > Indoor Games > Ping Pong" }, + { id: "3964", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Balls" }, + { id: "3788", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Nets & Posts" }, + { id: "3900", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Paddle Accessories" }, + { id: "3375", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Paddles & Sets" }, + { id: "3132", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Robot Accessories" }, + { id: "3546", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Robots" }, + { id: "3345", name: "Sporting Goods > Indoor Games > Ping Pong > Ping Pong Tables" }, + { id: "1009", name: "Sporting Goods > Indoor Games > Table Shuffleboard" }, + { id: "3148", name: "Sporting Goods > Indoor Games > Table Shuffleboard > Shuffleboard Tables" }, + { + id: "3996", + name: "Sporting Goods > Indoor Games > Table Shuffleboard > Table Shuffleboard Powder", + }, + { + id: "4021", + name: "Sporting Goods > Indoor Games > Table Shuffleboard > Table Shuffleboard Pucks", + }, + { id: "1005", name: "Sporting Goods > Indoor Games > Throwing Darts" }, + { id: "3957", name: "Sporting Goods > Indoor Games > Throwing Darts > Dart Backboards" }, + { id: "3327", name: "Sporting Goods > Indoor Games > Throwing Darts > Dart Parts" }, + { + id: "3766", + name: "Sporting Goods > Indoor Games > Throwing Darts > Dart Parts > Dart Flights", + }, + { id: "3109", name: "Sporting Goods > Indoor Games > Throwing Darts > Dart Parts > Dart Shafts" }, + { id: "3250", name: "Sporting Goods > Indoor Games > Throwing Darts > Dart Parts > Dart Tips" }, + { id: "3559", name: "Sporting Goods > Indoor Games > Throwing Darts > Dartboards" }, + { id: "3839", name: "Sporting Goods > Indoor Games > Throwing Darts > Darts" }, + { id: "1011", name: "Sporting Goods > Outdoor Recreation" }, + { id: "499811", name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports" }, + { + id: "1120", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting", + }, + { + id: "7449", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Boating Gloves", + }, + { + id: "6314", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Canoe Accessories", + }, + { + id: "1124", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Canoes", + }, + { + id: "6312", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Kayak Accessories", + }, + { + id: "1127", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Kayaks", + }, + { + id: "499964", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Paddle Leashes", + }, + { + id: "1129", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Paddles & Oars", + }, + { + id: "6097", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Pedal Boats", + }, + { + id: "3406", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Row Boats", + }, + { + id: "3476", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Rafting > Whitewater Rafts", + }, + { + id: "499813", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel", + }, + { + id: "1138", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Drysuits", + }, + { + id: "6496", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Life Jacket Accessories", + }, + { + id: "1128", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Life Jackets", + }, + { + id: "3376", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Rash Guards & Swim Shirts", + }, + { + id: "499687", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Water Sport Helmets", + }, + { + id: "499814", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Wetsuit Pieces", + }, + { + id: "5400", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Wetsuit Pieces > Wetsuit Bottoms", + }, + { + id: "5399", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Wetsuit Pieces > Wetsuit Hoods, Gloves & Boots", + }, + { + id: "5401", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Wetsuit Pieces > Wetsuit Tops", + }, + { + id: "1147", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Boating & Water Sport Apparel > Wetsuits", + }, + { + id: "1135", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling", + }, + { + id: "1136", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Buoyancy Compensators", + }, + { + id: "1137", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Dive Computers", + }, + { + id: "499867", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving & Snorkeling Equipment Sets", + }, + { + id: "1139", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving & Snorkeling Fins", + }, + { + id: "1140", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving & Snorkeling Masks", + }, + { + id: "6514", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving Belts", + }, + { + id: "5312", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving Knives & Shears", + }, + { + id: "1141", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Diving Regulators", + }, + { + id: "1142", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Diving & Snorkeling > Snorkels", + }, + { + id: "5579", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing", + }, + { + id: "5584", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing > Kiteboard Cases", + }, + { + id: "5581", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing > Kiteboard Parts", + }, + { + id: "5580", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing > Kiteboards", + }, + { + id: "5583", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing > Kitesurfing & Windsurfing Harnesses", + }, + { + id: "5582", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Kitesurfing > Kitesurfing Kites", + }, + { id: "1143", name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing" }, + { + id: "6287", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Bodyboards", + }, + { + id: "6288", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Paddleboards", + }, + { + id: "6286", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Skimboards", + }, + { + id: "3649", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surf Leashes", + }, + { + id: "3579", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfboard Cases & Bags", + }, + { + id: "3525", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfboard Fins", + }, + { + id: "3801", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfboard Wax", + }, + { + id: "3320", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfboards", + }, + { + id: "7451", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfing Gloves", + }, + { + id: "3762", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Surfing > Surfing Tail Pads", + }, + { id: "1144", name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming" }, + { + id: "7104", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Child Swimming Aids", + }, + { + id: "6473", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Hand Paddles", + }, + { + id: "2966", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Kickboards", + }, + { + id: "3595", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Pull Buoys", + }, + { + id: "6513", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Belts", + }, + { + id: "3807", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Caps", + }, + { + id: "3304", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Gloves", + }, + { + id: "6330", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Goggle & Mask Accessories", + }, + { + id: "3360", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Goggles & Masks", + }, + { + id: "6550", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swim Weights", + }, + { + id: "6511", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swimming Fins", + }, + { + id: "6512", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swimming Fins > Monofins", + }, + { + id: "2512", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swimming Fins > Training Fins", + }, + { + id: "3596", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swimming Machines", + }, + { + id: "6515", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Swimming > Swimming Nose Clips", + }, + { + id: "3195", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports", + }, + { + id: "3370", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Kneeboarding", + }, + { + id: "3101", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Kneeboarding > Kneeboards", + }, + { + id: "6301", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Towable Rafts & Tubes", + }, + { + id: "7452", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Towed Water Sport Gloves", + }, + { + id: "3282", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Wakeboarding", + }, + { + id: "505317", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Wakeboarding > Kiteboard & Wakeboard Bindings", + }, + { + id: "505291", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Wakeboarding > Wakeboard Parts", + }, + { + id: "3353", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Wakeboarding > Wakeboards", + }, + { + id: "1146", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Skiing", + }, + { + id: "3289", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Skiing > Sit-Down Hydrofoils", + }, + { + id: "6302", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Skiing > Water Ski Bindings", + }, + { + id: "6296", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Skiing > Water Ski Cases & Bags", + }, + { + id: "3350", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Skiing > Water Skis", + }, + { + id: "3636", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Towed Water Sports > Water Sport Tow Cables", + }, + { + id: "7178", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Watercraft Storage Racks", + }, + { + id: "8172", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Watercraft Storage Racks > Boat Storage Racks", + }, + { + id: "8173", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Watercraft Storage Racks > Water Sport Board Storage Racks", + }, + { + id: "1148", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing", + }, + { + id: "3624", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing > Windsurfing Board Parts", + }, + { + id: "3908", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing > Windsurfing Board Parts > Windsurfing Board Fins", + }, + { + id: "3285", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing > Windsurfing Board Parts > Windsurfing Board Masts", + }, + { + id: "3894", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing > Windsurfing Boards", + }, + { + id: "3413", + name: "Sporting Goods > Outdoor Recreation > Boating & Water Sports > Windsurfing > Windsurfing Sails", + }, + { id: "1013", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking" }, + { id: "1014", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camp Furniture" }, + { + id: "4451", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camp Furniture > Air Mattress & Sleeping Pad Accessories", + }, + { + id: "3695", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camp Furniture > Air Mattresses", + }, + { + id: "3089", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camp Furniture > Cots", + }, + { + id: "1016", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camping Cookware & Dinnerware", + }, + { + id: "1019", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camping Lights & Lanterns", + }, + { id: "3937", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camping Tools" }, + { + id: "3495", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camping Tools > Hunting & Survival Knives", + }, + { + id: "4095", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Camping Tools > Multifunction Tools & Knives", + }, + { + id: "3508", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Chemical Hand Warmers", + }, + { + id: "5636", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Compression Sacks", + }, + { + id: "7154", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Hiking Pole Accessories", + }, + { id: "3738", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Hiking Poles" }, + { + id: "3538", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Mosquito Nets & Insect Screens", + }, + { + id: "4785", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Navigational Compasses", + }, + { + id: "502993", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Portable Toilets & Showers", + }, + { + id: "502994", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Portable Toilets & Showers > Portable Showers & Privacy Enclosures", + }, + { + id: "503009", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Portable Toilets & Showers > Portable Toilets & Urination Devices", + }, + { + id: "1023", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Portable Water Filters & Purifiers", + }, + { + id: "5881", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Sleeping Bag Liners", + }, + { id: "1020", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Sleeping Bags" }, + { id: "1021", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Sleeping Pads" }, + { id: "5655", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tent Accessories" }, + { + id: "499680", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tent Accessories > Inner Tents", + }, + { + id: "5656", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tent Accessories > Tent Footprints", + }, + { + id: "5658", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tent Accessories > Tent Poles & Stakes", + }, + { + id: "5657", + name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tent Accessories > Tent Vestibules", + }, + { id: "1022", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Tents" }, + { id: "8079", name: "Sporting Goods > Outdoor Recreation > Camping & Hiking > Windbreaks" }, + { id: "7059", name: "Sporting Goods > Outdoor Recreation > Climbing" }, + { id: "3363", name: "Sporting Goods > Outdoor Recreation > Climbing > Belay Devices" }, + { id: "3746", name: "Sporting Goods > Outdoor Recreation > Climbing > Carabiners" }, + { + id: "499815", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Apparel & Accessories", + }, + { + id: "499816", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Apparel & Accessories > Climbing Gloves", + }, + { + id: "3314", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Apparel & Accessories > Climbing Helmets", + }, + { + id: "5394", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Apparel & Accessories > Crampons", + }, + { + id: "3454", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Ascenders & Descenders", + }, + { id: "3211", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Chalk Bags" }, + { id: "3322", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Crash Pads" }, + { id: "3218", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Harnesses" }, + { + id: "3266", + name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Protection Devices", + }, + { id: "3825", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Rope" }, + { id: "3201", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Rope Bags" }, + { id: "3369", name: "Sporting Goods > Outdoor Recreation > Climbing > Climbing Webbing" }, + { id: "7060", name: "Sporting Goods > Outdoor Recreation > Climbing > Ice Climbing Tools" }, + { id: "7061", name: "Sporting Goods > Outdoor Recreation > Climbing > Ice Screws" }, + { id: "3518", name: "Sporting Goods > Outdoor Recreation > Climbing > Indoor Climbing Holds" }, + { id: "3849", name: "Sporting Goods > Outdoor Recreation > Climbing > Quickdraws" }, + { id: "1025", name: "Sporting Goods > Outdoor Recreation > Cycling" }, + { id: "3214", name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories" }, + { + id: "3778", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Bags & Panniers", + }, + { + id: "3341", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Baskets", + }, + { + id: "3879", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Bells & Horns", + }, + { + id: "4145", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Cages", + }, + { + id: "500067", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Child Seat Accessories", + }, + { + id: "5842", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Child Seats", + }, + { + id: "5540", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Computer Accessories", + }, + { + id: "3243", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Computers", + }, + { + id: "6442", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Covers", + }, + { + id: "3719", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Fenders", + }, + { + id: "1028", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Front & Rear Racks", + }, + { + id: "500092", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Handlebar Grips & Decor", + }, + { + id: "1027", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Locks", + }, + { + id: "3368", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Mirrors", + }, + { + id: "3827", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Pumps", + }, + { + id: "6445", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Saddle Pads & Seat Covers", + }, + { + id: "6506", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Shock Pumps", + }, + { + id: "7448", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Spoke Beads", + }, + { + id: "3428", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Stands & Storage", + }, + { + id: "499694", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Tire Repair Supplies & Kits", + }, + { + id: "7223", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Toe Straps & Clips", + }, + { + id: "505668", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Tools", + }, + { + id: "3811", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Trailers", + }, + { + id: "3868", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Trainers", + }, + { + id: "3631", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Training Wheels", + }, + { + id: "3558", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Transport Bags & Cases", + }, + { + id: "6048", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Bicycle Water Sport Board Racks", + }, + { + id: "500109", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Accessories > Electric Bicycle Conversion Kits", + }, + { id: "3618", name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts" }, + { + id: "3740", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Brake Parts", + }, + { + id: "4574", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Brake Parts > Bicycle Brake Calipers", + }, + { + id: "4575", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Brake Parts > Bicycle Brake Levers", + }, + { + id: "4576", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Brake Parts > Bicycle Brake Rotors", + }, + { + id: "4577", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Brake Parts > Bicycle Brake Sets", + }, + { + id: "499684", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Cable Housings", + }, + { + id: "499685", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Cables", + }, + { + id: "4585", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts", + }, + { + id: "4590", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Bottom Brackets", + }, + { + id: "4586", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Cassettes & Freewheels", + }, + { + id: "4591", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Chainrings", + }, + { + id: "4587", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Chains", + }, + { + id: "4592", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Cranks", + }, + { + id: "4588", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Derailleurs", + }, + { + id: "4593", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Pedals", + }, + { + id: "4594", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Drivetrain Parts > Bicycle Shifters", + }, + { + id: "4603", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Forks", + }, + { + id: "3639", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Frames", + }, + { + id: "499868", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Groupsets", + }, + { + id: "6960", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Handlebar Extensions", + }, + { + id: "4582", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Handlebars", + }, + { + id: "7478", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Headset Parts", + }, + { + id: "7480", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Headset Parts > Bicycle Headset Bearings", + }, + { + id: "7479", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Headset Parts > Bicycle Headset Spacers", + }, + { + id: "7477", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Headsets", + }, + { + id: "8239", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Kickstands", + }, + { + id: "3292", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Saddles", + }, + { + id: "4595", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Seatpost Clamps", + }, + { + id: "4194", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Seatposts", + }, + { + id: "4596", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Small Parts", + }, + { + id: "4583", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Stems", + }, + { + id: "499871", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Tire Valve Adapters", + }, + { + id: "499869", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Tire Valve Caps", + }, + { + id: "499870", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Tire Valves", + }, + { + id: "4571", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Tires", + }, + { + id: "4572", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Tubes", + }, + { + id: "4597", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts", + }, + { + id: "7538", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Foot Pegs", + }, + { + id: "500053", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Hub Parts", + }, + { + id: "4599", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Hubs", + }, + { + id: "499875", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Rim Strips", + }, + { + id: "4600", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Spokes", + }, + { + id: "8528", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Wheel Axles & Skewers", + }, + { + id: "4601", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Wheel Nipples", + }, + { + id: "4602", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheel Parts > Bicycle Wheel Rims", + }, + { + id: "3216", + name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycle Parts > Bicycle Wheels", + }, + { id: "1026", name: "Sporting Goods > Outdoor Recreation > Cycling > Bicycles" }, + { + id: "3982", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories", + }, + { + id: "7474", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Cleat Accessories", + }, + { + id: "7476", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Cleat Accessories > Bicycle Cleat Bolts", + }, + { + id: "7453", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Cleat Accessories > Bicycle Cleat Covers", + }, + { + id: "7475", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Cleat Accessories > Bicycle Cleat Shims & Wedges", + }, + { + id: "3118", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Cleats", + }, + { + id: "3246", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Gloves", + }, + { + id: "500028", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Helmet Parts & Accessories", + }, + { + id: "1029", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Helmets", + }, + { + id: "8061", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Protective Pads", + }, + { + id: "3272", + name: "Sporting Goods > Outdoor Recreation > Cycling > Cycling Apparel & Accessories > Bicycle Shoe Covers", + }, + { id: "3634", name: "Sporting Goods > Outdoor Recreation > Cycling > Tricycle Accessories" }, + { id: "3531", name: "Sporting Goods > Outdoor Recreation > Cycling > Tricycles" }, + { id: "3070", name: "Sporting Goods > Outdoor Recreation > Cycling > Unicycle Accessories" }, + { id: "1030", name: "Sporting Goods > Outdoor Recreation > Cycling > Unicycles" }, + { id: "1031", name: "Sporting Goods > Outdoor Recreation > Equestrian" }, + { id: "3257", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care" }, + { + id: "6898", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Blankets & Sheets", + }, + { + id: "5569", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Boots & Leg Wraps", + }, + { + id: "7482", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Feed", + }, + { + id: "499817", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Fly Masks", + }, + { + id: "5025", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Grooming", + }, + { + id: "6386", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Grooming > Horse Clippers & Trimmers", + }, + { + id: "499818", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Grooming > Horse Grooming Combs, Brushes & Mitts", + }, + { + id: "7481", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Treats", + }, + { + id: "7459", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Vitamins & Supplements", + }, + { + id: "499819", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Care > Horse Wormers", + }, + { id: "5593", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack" }, + { + id: "4018", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Bridle Bits", + }, + { id: "3426", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Bridles" }, + { id: "1491", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Cinches" }, + { + id: "499710", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Horse Halters", + }, + { + id: "2756", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Horse Harnesses", + }, + { + id: "499709", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Horse Leads", + }, + { id: "1754", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Reins" }, + { id: "2210", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Saddles" }, + { id: "8109", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack > Stirrups" }, + { id: "7215", name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories" }, + { + id: "499820", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Horse Tack Boxes", + }, + { + id: "8107", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Saddle Accessories", + }, + { + id: "326122", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Saddle Accessories > Saddle Bags & Panniers", + }, + { + id: "499959", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Saddle Accessories > Saddle Covers & Cases", + }, + { + id: "8108", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Saddle Accessories > Saddle Pads & Blankets", + }, + { + id: "7216", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Horse Tack Accessories > Saddle Accessories > Saddle Racks", + }, + { + id: "5594", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Riding Apparel & Accessories", + }, + { + id: "3084", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Riding Apparel & Accessories > Equestrian Gloves", + }, + { + id: "3821", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Riding Apparel & Accessories > Equestrian Helmets", + }, + { + id: "3265", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Riding Apparel & Accessories > Riding Crops & Whips", + }, + { + id: "6914", + name: "Sporting Goods > Outdoor Recreation > Equestrian > Riding Apparel & Accessories > Riding Pants", + }, + { id: "3334", name: "Sporting Goods > Outdoor Recreation > Fishing" }, + { id: "8064", name: "Sporting Goods > Outdoor Recreation > Fishing > Bite Alarms" }, + { id: "5406", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing & Hunting Waders" }, + { + id: "6495", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Bait & Chum Containers", + }, + { id: "7342", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Gaffs" }, + { + id: "7344", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Hook Removal Tools", + }, + { id: "1037", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Lines & Leaders" }, + { id: "3614", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Nets" }, + { id: "8092", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Reel Accessories" }, + { + id: "8273", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Reel Accessories > Fishing Reel Bags & Cases", + }, + { + id: "8094", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Reel Accessories > Fishing Reel Lubricants", + }, + { + id: "8208", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Reel Accessories > Fishing Reel Replacement Spools", + }, + { id: "4926", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Reels" }, + { id: "8093", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Rod Accessories" }, + { + id: "8272", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Rod Accessories > Fishing Rod Bags & Cases", + }, + { + id: "499942", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Rod Accessories > Fishing Rod Holders & Storage Racks", + }, + { id: "4927", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Rods" }, + { id: "7343", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Spears" }, + { id: "499823", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle" }, + { + id: "3603", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle > Fishing Baits & Lures", + }, + { + id: "3859", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle > Fishing Floats", + }, + { + id: "3359", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle > Fishing Hooks", + }, + { + id: "3651", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle > Fishing Sinkers", + }, + { + id: "7222", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Tackle > Fishing Snaps & Swivels", + }, + { id: "7221", name: "Sporting Goods > Outdoor Recreation > Fishing > Fishing Traps" }, + { id: "7217", name: "Sporting Goods > Outdoor Recreation > Fishing > Fly Tying Materials" }, + { + id: "7125", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fly Tying Materials > Fishing Beads", + }, + { + id: "6440", + name: "Sporting Goods > Outdoor Recreation > Fishing > Fly Tying Materials > Fishing Yarn", + }, + { id: "3096", name: "Sporting Goods > Outdoor Recreation > Fishing > Live Bait" }, + { id: "1041", name: "Sporting Goods > Outdoor Recreation > Fishing > Tackle Bags & Boxes" }, + { id: "1043", name: "Sporting Goods > Outdoor Recreation > Golf" }, + { id: "8044", name: "Sporting Goods > Outdoor Recreation > Golf > Divot Tools" }, + { id: "7314", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Accessory Sets" }, + { id: "4605", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Bag Accessories" }, + { + id: "4537", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Bag Accessories > Golf Bag Carts", + }, + { + id: "4525", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Bag Accessories > Golf Bag Covers & Cases", + }, + { id: "1044", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Bags" }, + { id: "6864", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Ball Markers" }, + { id: "1045", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Balls" }, + { + id: "3642", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Club Parts & Accessories", + }, + { + id: "4254", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Club Parts & Accessories > Golf Club Grips", + }, + { + id: "4043", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Club Parts & Accessories > Golf Club Headcovers", + }, + { + id: "499780", + name: "Sporting Goods > Outdoor Recreation > Golf > Golf Club Parts & Accessories > Golf Club Shafts", + }, + { id: "1046", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Clubs" }, + { id: "3578", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Flags" }, + { id: "4466", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Gloves" }, + { id: "3106", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Tees" }, + { id: "4467", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Towels" }, + { id: "3772", name: "Sporting Goods > Outdoor Recreation > Golf > Golf Training Aids" }, + { id: "3789", name: "Sporting Goods > Outdoor Recreation > Hang Gliding & Skydiving" }, + { + id: "5877", + name: "Sporting Goods > Outdoor Recreation > Hang Gliding & Skydiving > Air Suits", + }, + { + id: "4327", + name: "Sporting Goods > Outdoor Recreation > Hang Gliding & Skydiving > Hang Gliders", + }, + { + id: "4023", + name: "Sporting Goods > Outdoor Recreation > Hang Gliding & Skydiving > Parachutes", + }, + { id: "499824", name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting" }, + { id: "1033", name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery" }, + { + id: "3773", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Archery Armguards", + }, + { + id: "499833", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Archery Gloves & Releases", + }, + { + id: "3883", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Archery Targets", + }, + { + id: "3291", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Arrow Parts & Accessories", + }, + { + id: "499831", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Arrow Parts & Accessories > Arrow Fletchings", + }, + { + id: "499832", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Arrow Parts & Accessories > Arrow Nocks", + }, + { + id: "499830", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Arrow Parts & Accessories > Broadheads & Field Points", + }, + { + id: "3533", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Arrows & Bolts", + }, + { + id: "499826", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Bow & Crossbow Accessories", + }, + { + id: "499825", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Bows & Crossbows", + }, + { + id: "3332", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Bows & Crossbows > Compound Bows", + }, + { + id: "3505", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Bows & Crossbows > Crossbows", + }, + { + id: "3715", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Bows & Crossbows > Recurve & Longbows", + }, + { + id: "3757", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Archery > Quivers", + }, + { + id: "3125", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Clay Pigeon Shooting", + }, + { + id: "3305", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Clay Pigeon Shooting > Clay Pigeon Throwers", + }, + { + id: "3528", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Clay Pigeon Shooting > Clay Pigeons", + }, + { id: "3136", name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting" }, + { + id: "7460", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting & Shooting Protective Gear", + }, + { + id: "7461", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting & Shooting Protective Gear > Hunting & Shooting Gloves", + }, + { + id: "7518", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting & Shooting Protective Gear > Hunting & Shooting Jackets", + }, + { + id: "3674", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Animal Traps", + }, + { + id: "7373", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Hearing Enhancers", + }, + { + id: "1034", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Hunting Blinds & Screens", + }, + { + id: "5917", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Hunting Dog Equipment", + }, + { + id: "3748", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Tree Stands", + }, + { + id: "6992", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wild Game Feeders", + }, + { + id: "8011", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wildlife Attractants", + }, + { + id: "8080", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wildlife Attractants > Cover Scents & Scent Attractants", + }, + { + id: "3756", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wildlife Attractants > Hunting & Wildlife Calls", + }, + { + id: "3583", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wildlife Attractants > Hunting & Wildlife Decoys", + }, + { + id: "8081", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Hunting > Wildlife Attractants > Wildlife Bait, Feed & Minerals", + }, + { + id: "499834", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft", + }, + { + id: "2443", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Airsoft", + }, + { + id: "3116", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Airsoft > Airsoft Gun Parts & Accessories", + }, + { + id: "8005", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Airsoft > Airsoft Gun Parts & Accessories > Airsoft Gun Batteries", + }, + { + id: "3093", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Airsoft > Airsoft Guns", + }, + { + id: "3925", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Airsoft > Airsoft Pellets", + }, + { + id: "1049", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball", + }, + { + id: "499835", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball & Airsoft Protective Gear", + }, + { + id: "499836", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball & Airsoft Protective Gear > Paintball & Airsoft Gloves", + }, + { + id: "499838", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball & Airsoft Protective Gear > Paintball & Airsoft Goggles & Masks", + }, + { + id: "499839", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball & Airsoft Protective Gear > Paintball & Airsoft Pads", + }, + { + id: "499837", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball & Airsoft Protective Gear > Paintball & Airsoft Vests", + }, + { + id: "6748", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Grenade Launchers", + }, + { + id: "3408", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Grenades", + }, + { + id: "3187", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Gun Parts & Accessories", + }, + { + id: "3244", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Gun Parts & Accessories > Paintball Air Tanks", + }, + { + id: "3690", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Gun Parts & Accessories > Paintball Gun Barrels", + }, + { + id: "8514", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Gun Parts & Accessories > Paintball Gun Drop Forwards", + }, + { + id: "3152", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Gun Parts & Accessories > Paintball Hoppers", + }, + { + id: "3234", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Guns", + }, + { + id: "6781", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintball Harnesses & Packs", + }, + { + id: "3438", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Paintball & Airsoft > Paintball > Paintballs", + }, + { + id: "499840", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Shooting & Range Accessories", + }, + { + id: "499842", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Shooting & Range Accessories > Shooting Rests", + }, + { + id: "499841", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Shooting & Range Accessories > Shooting Sticks & Bipods", + }, + { + id: "3170", + name: "Sporting Goods > Outdoor Recreation > Hunting & Shooting > Shooting & Range Accessories > Shooting Targets", + }, + { id: "5998", name: "Sporting Goods > Outdoor Recreation > Hydration System Accessories" }, + { id: "5635", name: "Sporting Goods > Outdoor Recreation > Hydration Systems" }, + { id: "499761", name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating" }, + { + id: "499771", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Inline & Roller Skating Protective Gear", + }, + { + id: "499775", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Inline & Roller Skating Protective Gear > Roller Skating Pads", + }, + { + id: "499759", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Inline Skate Parts", + }, + { + id: "1058", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Inline Skates", + }, + { + id: "499760", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Roller Skate Parts", + }, + { + id: "2837", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Roller Skates", + }, + { + id: "500029", + name: "Sporting Goods > Outdoor Recreation > Inline & Roller Skating > Roller Skis", + }, + { id: "7375", name: "Sporting Goods > Outdoor Recreation > Kite Buggying" }, + { id: "7376", name: "Sporting Goods > Outdoor Recreation > Kite Buggying > Kite Buggies" }, + { + id: "7377", + name: "Sporting Goods > Outdoor Recreation > Kite Buggying > Kite Buggy Accessories", + }, + { id: "499846", name: "Sporting Goods > Outdoor Recreation > Outdoor Games" }, + { id: "1062", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Badminton" }, + { + id: "3107", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Badminton > Badminton Nets", + }, + { + id: "3950", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Badminton > Badminton Racquets & Sets", + }, + { + id: "3907", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Badminton > Shuttlecocks", + }, + { id: "3787", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Deck Shuffleboard" }, + { + id: "3689", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Deck Shuffleboard > Deck Shuffleboard Cues", + }, + { + id: "3190", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Deck Shuffleboard > Deck Shuffleboard Pucks", + }, + { id: "3484", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Disc Golf" }, + { + id: "3993", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Disc Golf > Disc Golf Bags", + }, + { + id: "3227", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Disc Golf > Disc Golf Baskets", + }, + { id: "3405", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Lawn Games" }, + { id: "7430", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Paddle Ball Sets" }, + { id: "3390", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Pickleball" }, + { + id: "499848", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Pickleball > Pickleball Paddles", + }, + { + id: "499847", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Pickleball > Pickleballs", + }, + { + id: "499904", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Platform & Paddle Tennis", + }, + { + id: "499850", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Platform & Paddle Tennis > Platform & Paddle Tennis Paddles", + }, + { + id: "499849", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Platform & Paddle Tennis > Platform Tennis Balls", + }, + { id: "3126", name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Tetherball" }, + { + id: "499882", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Tetherball > Tetherball Poles", + }, + { + id: "499883", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Tetherball > Tetherball Sets", + }, + { + id: "499884", + name: "Sporting Goods > Outdoor Recreation > Outdoor Games > Tetherball > Tetherballs", + }, + { id: "5879", name: "Sporting Goods > Outdoor Recreation > Riding Scooters" }, + { id: "3276", name: "Sporting Goods > Outdoor Recreation > Skateboarding" }, + { id: "3127", name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skate Rails" }, + { id: "3626", name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skate Ramps" }, + { id: "3670", name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboard Parts" }, + { + id: "3869", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboard Parts > Skateboard Decks", + }, + { + id: "505817", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboard Parts > Skateboard Small Parts", + }, + { + id: "3192", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboard Parts > Skateboard Trucks", + }, + { + id: "3637", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboard Parts > Skateboard Wheels", + }, + { + id: "3067", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboarding Protective Gear", + }, + { + id: "499776", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboarding Protective Gear > Skate Helmets", + }, + { + id: "7789", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboarding Protective Gear > Skateboarding Gloves", + }, + { + id: "3488", + name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboarding Protective Gear > Skateboarding Pads", + }, + { id: "1059", name: "Sporting Goods > Outdoor Recreation > Skateboarding > Skateboards" }, + { id: "499844", name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities" }, + { + id: "499951", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Avalanche Safety", + }, + { + id: "499952", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Avalanche Safety > Avalanche Probes", + }, + { + id: "499877", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Avalanche Safety > Avalanche Safety Airbags", + }, + { + id: "499845", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding", + }, + { + id: "7224", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Bags", + }, + { + id: "8203", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Goggle Accessories", + }, + { + id: "5050", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Goggle Accessories > Ski & Snowboard Goggle Lenses", + }, + { + id: "3550", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Goggles", + }, + { + id: "1161", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Helmets", + }, + { + id: "499681", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Leashes", + }, + { + id: "7558", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Storage Racks", + }, + { + id: "505772", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Tuning Tools", + }, + { + id: "8074", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski & Snowboard Wax", + }, + { + id: "505296", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski Binding Parts", + }, + { + id: "6063", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski Bindings", + }, + { + id: "6062", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski Boots", + }, + { + id: "1157", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Ski Poles", + }, + { + id: "6064", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Skis", + }, + { + id: "3331", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Skis > Cross-Country Skis", + }, + { + id: "1158", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Skis > Downhill Skis", + }, + { + id: "5088", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Snowboard Binding Parts", + }, + { + id: "1162", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Snowboard Bindings", + }, + { + id: "1163", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Snowboard Boots", + }, + { + id: "1164", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Skiing & Snowboarding > Snowboards", + }, + { id: "7539", name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Sleds" }, + { + id: "1166", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Snowshoeing", + }, + { + id: "3073", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Snowshoeing > Snowshoe Bindings", + }, + { + id: "3064", + name: "Sporting Goods > Outdoor Recreation > Winter Sports & Activities > Snowshoeing > Snowshoes", + }, + { id: "1239", name: "Toys & Games" }, + { id: "4648", name: "Toys & Games > Game Timers" }, + { id: "3793", name: "Toys & Games > Games" }, + { id: "6794", name: "Toys & Games > Games > Battle Top Accessories" }, + { id: "6329", name: "Toys & Games > Games > Battle Tops" }, + { id: "3749", name: "Toys & Games > Games > Bingo Sets" }, + { id: "7411", name: "Toys & Games > Games > Blackjack & Craps Sets" }, + { id: "1246", name: "Toys & Games > Games > Board Games" }, + { id: "6853", name: "Toys & Games > Games > Card Game Accessories" }, + { id: "1247", name: "Toys & Games > Games > Card Games" }, + { id: "6054", name: "Toys & Games > Games > Dexterity Games" }, + { id: "6037", name: "Toys & Games > Games > Dice Sets & Games" }, + { id: "7383", name: "Toys & Games > Games > Poker Chip Accessories" }, + { + id: "7384", + name: "Toys & Games > Games > Poker Chip Accessories > Poker Chip Carriers & Trays", + }, + { id: "5403", name: "Toys & Games > Games > Poker Chips & Sets" }, + { id: "4554", name: "Toys & Games > Games > Portable Electronic Games" }, + { id: "7412", name: "Toys & Games > Games > Roulette Wheels & Sets" }, + { id: "8472", name: "Toys & Games > Games > Slot Machines" }, + { id: "6038", name: "Toys & Games > Games > Tile Games" }, + { id: "1249", name: "Toys & Games > Outdoor Play Equipment" }, + { id: "7219", name: "Toys & Games > Outdoor Play Equipment > Inflatable Bouncer Accessories" }, + { id: "6396", name: "Toys & Games > Outdoor Play Equipment > Inflatable Bouncers" }, + { id: "6270", name: "Toys & Games > Outdoor Play Equipment > Play Swings" }, + { id: "6397", name: "Toys & Games > Outdoor Play Equipment > Play Tents & Tunnels" }, + { id: "1251", name: "Toys & Games > Outdoor Play Equipment > Playhouses" }, + { id: "1863", name: "Toys & Games > Outdoor Play Equipment > Pogo Sticks" }, + { id: "2743", name: "Toys & Games > Outdoor Play Equipment > Sandboxes" }, + { id: "6450", name: "Toys & Games > Outdoor Play Equipment > See Saws" }, + { id: "2867", name: "Toys & Games > Outdoor Play Equipment > Slides" }, + { id: "3948", name: "Toys & Games > Outdoor Play Equipment > Stilts" }, + { id: "6269", name: "Toys & Games > Outdoor Play Equipment > Swing Set & Playset Accessories" }, + { id: "6271", name: "Toys & Games > Outdoor Play Equipment > Swing Sets & Playsets" }, + { id: "5524", name: "Toys & Games > Outdoor Play Equipment > Trampoline Accessories" }, + { id: "1738", name: "Toys & Games > Outdoor Play Equipment > Trampolines" }, + { id: "6464", name: "Toys & Games > Outdoor Play Equipment > Water Play Equipment" }, + { + id: "6465", + name: "Toys & Games > Outdoor Play Equipment > Water Play Equipment > Play Sprinkers", + }, + { + id: "500095", + name: "Toys & Games > Outdoor Play Equipment > Water Play Equipment > Water Parks & Slides", + }, + { + id: "3556", + name: "Toys & Games > Outdoor Play Equipment > Water Play Equipment > Water Tables", + }, + { id: "3867", name: "Toys & Games > Puzzles" }, + { id: "7081", name: "Toys & Games > Puzzles > Jigsaw Puzzle Accessories" }, + { id: "2618", name: "Toys & Games > Puzzles > Jigsaw Puzzles" }, + { id: "4011", name: "Toys & Games > Puzzles > Mechanical Puzzles" }, + { id: "6725", name: "Toys & Games > Puzzles > Wooden & Pegged Puzzles" }, + { id: "1253", name: "Toys & Games > Toys" }, + { id: "4352", name: "Toys & Games > Toys > Activity Toys" }, + { id: "7519", name: "Toys & Games > Toys > Activity Toys > Ball & Cup Games" }, + { id: "3733", name: "Toys & Games > Toys > Activity Toys > Bouncy Balls" }, + { id: "3212", name: "Toys & Games > Toys > Activity Toys > Bubble Blowing Solution" }, + { id: "3874", name: "Toys & Games > Toys > Activity Toys > Bubble Blowing Toys" }, + { id: "4177", name: "Toys & Games > Toys > Activity Toys > Coiled Spring Toys" }, + { id: "3534", name: "Toys & Games > Toys > Activity Toys > Marbles" }, + { id: "7425", name: "Toys & Games > Toys > Activity Toys > Paddle Ball Toys" }, + { id: "7473", name: "Toys & Games > Toys > Activity Toys > Ribbon & Streamer Toys" }, + { id: "3466", name: "Toys & Games > Toys > Activity Toys > Spinning Tops" }, + { id: "4216", name: "Toys & Games > Toys > Activity Toys > Toy Jacks" }, + { id: "7148", name: "Toys & Games > Toys > Activity Toys > Yo-Yo Parts & Accessories" }, + { id: "3929", name: "Toys & Games > Toys > Activity Toys > Yo-Yos" }, + { id: "3731", name: "Toys & Games > Toys > Art & Drawing Toys" }, + { id: "505818", name: "Toys & Games > Toys > Art & Drawing Toys > Play Dough & Putty" }, + { id: "3079", name: "Toys & Games > Toys > Art & Drawing Toys > Toy Drawing Tablets" }, + { id: "7311", name: "Toys & Games > Toys > Ball Pit Accessories" }, + { id: "7312", name: "Toys & Games > Toys > Ball Pit Accessories > Ball Pit Balls" }, + { id: "3207", name: "Toys & Games > Toys > Ball Pits" }, + { id: "3911", name: "Toys & Games > Toys > Bath Toys" }, + { id: "1268", name: "Toys & Games > Toys > Beach & Sand Toys" }, + { id: "1254", name: "Toys & Games > Toys > Building Toys" }, + { id: "3805", name: "Toys & Games > Toys > Building Toys > Construction Set Toys" }, + { id: "3172", name: "Toys & Games > Toys > Building Toys > Foam Blocks" }, + { id: "3287", name: "Toys & Games > Toys > Building Toys > Interlocking Blocks" }, + { id: "3163", name: "Toys & Games > Toys > Building Toys > Marble Track Sets" }, + { id: "3617", name: "Toys & Games > Toys > Building Toys > Wooden Blocks" }, + { id: "1255", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures" }, + { + id: "6058", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Action & Toy Figures", + }, + { id: "7114", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Bobblehead Figures" }, + { + id: "3584", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Doll & Action Figure Accessories", + }, + { + id: "2497", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Dollhouse Accessories", + }, + { id: "2499", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Dollhouses" }, + { id: "1257", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Dolls" }, + { + id: "8021", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Paper & Magnetic Dolls", + }, + { + id: "6056", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Puppet & Puppet Theater Accessories", + }, + { id: "6057", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Puppet Theaters" }, + { + id: "1258", + name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Puppets & Marionettes", + }, + { id: "1259", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Stuffed Animals" }, + { id: "3166", name: "Toys & Games > Toys > Dolls, Playsets & Toy Figures > Toy Playsets" }, + { id: "1262", name: "Toys & Games > Toys > Educational Toys" }, + { id: "3088", name: "Toys & Games > Toys > Educational Toys > Ant Farms" }, + { id: "499938", name: "Toys & Games > Toys > Educational Toys > Astronomy Toys & Models" }, + { id: "3928", name: "Toys & Games > Toys > Educational Toys > Bug Collecting Kits" }, + { id: "500015", name: "Toys & Games > Toys > Educational Toys > Educational Flash Cards" }, + { id: "5529", name: "Toys & Games > Toys > Educational Toys > Reading Toys" }, + { id: "3500", name: "Toys & Games > Toys > Educational Toys > Science & Exploration Sets" }, + { id: "6466", name: "Toys & Games > Toys > Educational Toys > Toy Abacuses" }, + { id: "3074", name: "Toys & Games > Toys > Executive Toys" }, + { id: "5872", name: "Toys & Games > Toys > Executive Toys > Magnet Toys" }, + { id: "7366", name: "Toys & Games > Toys > Flying Toy Accessories" }, + { id: "7368", name: "Toys & Games > Toys > Flying Toy Accessories > Kite Accessories" }, + { + id: "7371", + name: "Toys & Games > Toys > Flying Toy Accessories > Kite Accessories > Kite Line Reels & Winders", + }, + { id: "1261", name: "Toys & Games > Toys > Flying Toys" }, + { id: "3966", name: "Toys & Games > Toys > Flying Toys > Air & Water Rockets" }, + { id: "3460", name: "Toys & Games > Toys > Flying Toys > Kites" }, + { id: "3378", name: "Toys & Games > Toys > Flying Toys > Toy Gliders" }, + { id: "3263", name: "Toys & Games > Toys > Flying Toys > Toy Parachutes" }, + { id: "1264", name: "Toys & Games > Toys > Musical Toys" }, + { id: "3252", name: "Toys & Games > Toys > Musical Toys > Toy Instruments" }, + { id: "5970", name: "Toys & Games > Toys > Play Vehicle Accessories" }, + { + id: "5971", + name: "Toys & Games > Toys > Play Vehicle Accessories > Toy Race Car & Track Accessories", + }, + { id: "5153", name: "Toys & Games > Toys > Play Vehicle Accessories > Toy Train Accessories" }, + { id: "2505", name: "Toys & Games > Toys > Play Vehicles" }, + { id: "3444", name: "Toys & Games > Toys > Play Vehicles > Toy Airplanes" }, + { id: "3792", name: "Toys & Games > Toys > Play Vehicles > Toy Boats" }, + { id: "3551", name: "Toys & Games > Toys > Play Vehicles > Toy Cars" }, + { id: "3506", name: "Toys & Games > Toys > Play Vehicles > Toy Helicopters" }, + { id: "3590", name: "Toys & Games > Toys > Play Vehicles > Toy Motorcycles" }, + { id: "3474", name: "Toys & Games > Toys > Play Vehicles > Toy Race Car & Track Sets" }, + { id: "3589", name: "Toys & Games > Toys > Play Vehicles > Toy Spaceships" }, + { id: "5152", name: "Toys & Games > Toys > Play Vehicles > Toy Trains & Train Sets" }, + { id: "3296", name: "Toys & Games > Toys > Play Vehicles > Toy Trucks & Construction Vehicles" }, + { id: "3229", name: "Toys & Games > Toys > Pretend Play" }, + { id: "3680", name: "Toys & Games > Toys > Pretend Play > Play Money & Banking" }, + { id: "3659", name: "Toys & Games > Toys > Pretend Play > Pretend Electronics" }, + { id: "4004", name: "Toys & Games > Toys > Pretend Play > Pretend Housekeeping" }, + { id: "3288", name: "Toys & Games > Toys > Pretend Play > Pretend Lawn & Garden" }, + { id: "3129", name: "Toys & Games > Toys > Pretend Play > Pretend Professions & Role Playing" }, + { id: "8295", name: "Toys & Games > Toys > Pretend Play > Pretend Shopping & Grocery" }, + { id: "3298", name: "Toys & Games > Toys > Pretend Play > Toy Kitchens & Play Food" }, + { + id: "543624", + name: "Toys & Games > Toys > Pretend Play > Toy Kitchens & Play Food > Play Food", + }, + { + id: "543690", + name: "Toys & Games > Toys > Pretend Play > Toy Kitchens & Play Food > Toy Cookware", + }, + { + id: "543622", + name: "Toys & Games > Toys > Pretend Play > Toy Kitchens & Play Food > Toy Kitchens", + }, + { + id: "543623", + name: "Toys & Games > Toys > Pretend Play > Toy Kitchens & Play Food > Toy Tableware", + }, + { id: "3751", name: "Toys & Games > Toys > Pretend Play > Toy Tools" }, + { id: "2778", name: "Toys & Games > Toys > Remote Control Toy Accessories" }, + { id: "2546", name: "Toys & Games > Toys > Remote Control Toys" }, + { + id: "7090", + name: "Toys & Games > Toys > Remote Control Toys > Remote Control Airships & Blimps", + }, + { + id: "3532", + name: "Toys & Games > Toys > Remote Control Toys > Remote Control Boats & Watercraft", + }, + { id: "3601", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Cars & Trucks" }, + { id: "3554", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Helicopters" }, + { id: "5968", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Motorcycles" }, + { id: "3677", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Planes" }, + { id: "6059", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Robots" }, + { id: "5969", name: "Toys & Games > Toys > Remote Control Toys > Remote Control Tanks" }, + { id: "7202", name: "Toys & Games > Toys > Riding Toy Accessories" }, + { id: "2799", name: "Toys & Games > Toys > Riding Toys" }, + { id: "2753", name: "Toys & Games > Toys > Riding Toys > Electric Riding Vehicles" }, + { id: "6407", name: "Toys & Games > Toys > Riding Toys > Hobby Horses" }, + { id: "2724", name: "Toys & Games > Toys > Riding Toys > Push & Pedal Riding Vehicles" }, + { id: "3441", name: "Toys & Games > Toys > Riding Toys > Rocking & Spring Riding Toys" }, + { id: "6379", name: "Toys & Games > Toys > Riding Toys > Wagons" }, + { id: "3625", name: "Toys & Games > Toys > Robotic Toys" }, + { id: "8127", name: "Toys & Games > Toys > Sports Toy Accessories" }, + { id: "8129", name: "Toys & Games > Toys > Sports Toy Accessories > Fitness Toy Accessories" }, + { + id: "8128", + name: "Toys & Games > Toys > Sports Toy Accessories > Fitness Toy Accessories > Hula Hoop Accessories", + }, + { id: "1266", name: "Toys & Games > Toys > Sports Toys" }, + { id: "3371", name: "Toys & Games > Toys > Sports Toys > American Football Toys" }, + { id: "3776", name: "Toys & Games > Toys > Sports Toys > Baseball Toys" }, + { id: "3552", name: "Toys & Games > Toys > Sports Toys > Basketball Toys" }, + { id: "3675", name: "Toys & Games > Toys > Sports Toys > Boomerangs" }, + { id: "3665", name: "Toys & Games > Toys > Sports Toys > Bowling Toys" }, + { id: "500113", name: "Toys & Games > Toys > Sports Toys > Fingerboards & Fingerboard Sets" }, + { id: "8529", name: "Toys & Games > Toys > Sports Toys > Fishing Toys" }, + { id: "3199", name: "Toys & Games > Toys > Sports Toys > Fitness Toys" }, + { id: "3215", name: "Toys & Games > Toys > Sports Toys > Fitness Toys > Hula Hoops" }, + { id: "4167", name: "Toys & Games > Toys > Sports Toys > Flying Discs" }, + { id: "3909", name: "Toys & Games > Toys > Sports Toys > Footbags" }, + { id: "3226", name: "Toys & Games > Toys > Sports Toys > Golf Toys" }, + { id: "3943", name: "Toys & Games > Toys > Sports Toys > Hockey Toys" }, + { id: "499965", name: "Toys & Games > Toys > Sports Toys > Playground Balls" }, + { id: "505284", name: "Toys & Games > Toys > Sports Toys > Racquet Sport Toys" }, + { id: "499712", name: "Toys & Games > Toys > Toy Gift Baskets" }, + { id: "500005", name: "Toys & Games > Toys > Toy Weapon & Gadget Accessories" }, + { id: "3627", name: "Toys & Games > Toys > Toy Weapons & Gadgets" }, + { id: "3562", name: "Toys & Games > Toys > Visual Toys" }, + { id: "3301", name: "Toys & Games > Toys > Visual Toys > Kaleidoscopes" }, + { id: "3782", name: "Toys & Games > Toys > Visual Toys > Prisms" }, + { id: "2953", name: "Toys & Games > Toys > Wind-Up Toys" }, + { id: "888", name: "Vehicles & Parts" }, + { id: "5613", name: "Vehicles & Parts > Vehicle Parts & Accessories" }, + { + id: "3977", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Aircraft Parts & Accessories", + }, + { + id: "8526", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics", + }, + { + id: "505766", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle A/V Players & In-Dash Systems", + }, + { + id: "891", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Amplifiers", + }, + { + id: "5525", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Cassette Adapters", + }, + { + id: "5438", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Cassette Players", + }, + { + id: "894", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Equalizers & Crossovers", + }, + { + id: "6968", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Parking Cameras", + }, + { + id: "5572", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Speakerphones", + }, + { + id: "895", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Speakers", + }, + { + id: "2833", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Subwoofers", + }, + { + id: "8483", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Electronics > Motor Vehicle Video Monitor Mounts", + }, + { id: "899", name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts" }, + { + id: "2977", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Braking", + }, + { + id: "8232", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Carpet & Upholstery", + }, + { + id: "2805", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Climate Control", + }, + { + id: "8235", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Controls", + }, + { + id: "2550", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Engine Oil Circulation", + }, + { + id: "2820", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Engine Parts", + }, + { + id: "8137", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Engines", + }, + { + id: "908", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Exhaust", + }, + { + id: "8227", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Frame & Body Parts", + }, + { + id: "2727", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Fuel Systems", + }, + { + id: "8233", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Interior Fittings", + }, + { + id: "3318", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Lighting", + }, + { + id: "2642", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Mirrors", + }, + { + id: "8231", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Power & Electrical Systems", + }, + { + id: "8238", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Seating", + }, + { + id: "8234", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Sensors & Gauges", + }, + { + id: "2935", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Suspension Parts", + }, + { + id: "8228", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Towing", + }, + { + id: "2641", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Transmission & Drivetrain Parts", + }, + { + id: "3020", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems", + }, + { + id: "2932", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Rims & Wheels", + }, + { + id: "6090", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Rims & Wheels > Automotive Rims & Wheels", + }, + { + id: "6088", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Rims & Wheels > Motorcycle Rims & Wheels", + }, + { + id: "7253", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Rims & Wheels > Off-Road and All-Terrain Vehicle Rims & Wheels", + }, + { + id: "2989", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Tire Accessories", + }, + { + id: "911", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Tires", + }, + { + id: "6093", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Tires > Automotive Tires", + }, + { + id: "6091", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Tires > Motorcycle Tires", + }, + { + id: "7252", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Tires > Off-Road and All-Terrain Vehicle Tires", + }, + { + id: "2556", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Wheel Systems > Motor Vehicle Wheel Parts", + }, + { + id: "2534", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Motor Vehicle Parts > Motor Vehicle Window Parts & Accessories", + }, + { + id: "913", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor", + }, + { + id: "8534", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Portable Fuel Cans", + }, + { + id: "2895", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning", + }, + { + id: "2894", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Car Wash Brushes", + }, + { + id: "2590", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Car Wash Solutions", + }, + { + id: "2704", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Vehicle Carpet & Upholstery Cleaners", + }, + { + id: "499766", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Vehicle Fuel Injection Cleaning Kits", + }, + { + id: "2846", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Vehicle Glass Cleaners", + }, + { + id: "2643", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Cleaning > Vehicle Waxes, Polishes & Protectants", + }, + { + id: "3436", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers", + }, + { + id: "8306", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Golf Cart Enclosures", + }, + { + id: "8316", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Motor Vehicle Windshield Covers", + }, + { + id: "8308", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Tonneau Covers", + }, + { + id: "2494", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Hardtops", + }, + { + id: "7031", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Soft Tops", + }, + { + id: "8309", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers", + }, + { + id: "8310", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers > Automotive Storage Covers", + }, + { + id: "8314", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers > Golf Cart Storage Covers", + }, + { + id: "8313", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers > Motorcycle Storage Covers", + }, + { + id: "8311", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers > Recreational Vehicle Storage Covers", + }, + { + id: "8312", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Covers > Vehicle Storage Covers > Watercraft Storage Covers", + }, + { + id: "2495", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor", + }, + { + id: "2667", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Bumper Stickers", + }, + { + id: "2789", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Air Fresheners", + }, + { + id: "2588", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Antenna Balls", + }, + { + id: "2582", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Dashboard Accessories", + }, + { + id: "2722", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Decals", + }, + { + id: "8469", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Decor Accessory Sets", + }, + { + id: "2652", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Display Flags", + }, + { + id: "5995", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Emblems & Hood Ornaments", + }, + { + id: "8145", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Hitch Covers", + }, + { + id: "7022", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle License Plate Covers", + }, + { + id: "5994", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle License Plate Frames", + }, + { + id: "8298", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle License Plate Mounts & Holders", + }, + { + id: "2248", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle License Plates", + }, + { + id: "7532", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Magnets", + }, + { + id: "8478", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Rear View Mirror Ornaments", + }, + { + id: "8463", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Shift Boots", + }, + { + id: "8142", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Shift Knobs", + }, + { + id: "8464", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Steering Wheel Covers", + }, + { + id: "8202", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Decor > Vehicle Wraps", + }, + { + id: "2788", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids", + }, + { + id: "2635", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Antifreeze", + }, + { + id: "3051", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Brake Fluid", + }, + { + id: "2517", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Cooling System Additives", + }, + { + id: "2881", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Engine Degreasers", + }, + { + id: "2719", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Fuel System Cleaners", + }, + { + id: "2735", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Greases", + }, + { + id: "2916", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Hydraulic Clutch Fluid", + }, + { + id: "3044", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Motor Oil", + }, + { + id: "2770", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Performance Additives", + }, + { + id: "2513", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Power Steering Fluid", + }, + { + id: "2688", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Transmission Fluid", + }, + { + id: "2943", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Fluids > Vehicle Windshield Fluid", + }, + { + id: "3812", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Paint", + }, + { + id: "8450", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Paint > Motor Vehicle Body Paint", + }, + { + id: "8144", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Paint > Motor Vehicle Brake Caliper Paint", + }, + { + id: "8236", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools", + }, + { + id: "8260", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Motor Vehicle Brake Service Kits", + }, + { + id: "8259", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Motor Vehicle Clutch Alignment & Removal Tools", + }, + { + id: "7414", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Battery Chargers", + }, + { + id: "499929", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Battery Testers", + }, + { + id: "499774", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Body Filler", + }, + { + id: "6482", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Diagnostic Scanners", + }, + { + id: "5068", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Jump Starters", + }, + { + id: "3326", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Jumper Cables", + }, + { + id: "8261", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Vehicle Tire Repair & Tire Changing Tools", + }, + { + id: "2647", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Maintenance, Care & Decor > Vehicle Repair & Specialty Tools > Windshield Repair Kits", + }, + { + id: "8301", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security", + }, + { + id: "5547", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear", + }, + { + id: "5959", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Chest & Back Protectors", + }, + { + id: "5963", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Elbow & Wrist Guards", + }, + { + id: "5908", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Gloves", + }, + { + id: "5106", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Goggles", + }, + { + id: "8507", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Hand Guards", + }, + { + id: "6493", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Helmet Parts & Accessories", + }, + { + id: "2110", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Helmets", + }, + { + id: "5960", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Kidney Belts", + }, + { + id: "5962", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Knee & Shin Guards", + }, + { + id: "5961", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Motorcycle Protective Gear > Motorcycle Neck Braces", + }, + { + id: "362737", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Off-Road & All-Terrain Vehicle Protective Gear", + }, + { + id: "362738", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Off-Road & All-Terrain Vehicle Protective Gear > ATV & UTV Bar Pads", + }, + { + id: "2768", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks", + }, + { + id: "6084", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Automotive Alarm Accessories", + }, + { + id: "1802", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Automotive Alarm Systems", + }, + { + id: "6083", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Motorcycle Alarms & Locks", + }, + { + id: "8302", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Door Locks & Parts", + }, + { + id: "8305", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Door Locks & Parts > Vehicle Door Lock Actuators", + }, + { + id: "8304", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Door Locks & Parts > Vehicle Door Lock Knobs", + }, + { + id: "8303", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Door Locks & Parts > Vehicle Door Locks & Locking Systems", + }, + { + id: "235921", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Hitch Locks", + }, + { + id: "3024", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Immobilizers", + }, + { + id: "2699", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Remote Keyless Systems", + }, + { + id: "2750", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Steering Wheel Locks", + }, + { + id: "500077", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Alarms & Locks > Vehicle Wheel Clamps", + }, + { + id: "2879", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment", + }, + { + id: "8447", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Car Window Nets", + }, + { + id: "8445", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Emergency Road Flares", + }, + { + id: "8448", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Motor Vehicle Airbag Parts", + }, + { + id: "8446", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Motor Vehicle Roll Cages & Bars", + }, + { + id: "8477", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Seat Belt Buckles", + }, + { + id: "326120", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Seat Belt Covers", + }, + { + id: "8476", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Seat Belt Straps", + }, + { + id: "8449", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Seat Belts", + }, + { + id: "6966", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Warning Whips", + }, + { + id: "8506", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Safety & Security > Vehicle Safety Equipment > Vehicle Wheel Chocks", + }, + { id: "8237", name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo" }, + { + id: "6744", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Cargo Nets", + }, + { + id: "6454", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Rack Accessories", + }, + { + id: "7122", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Rack Accessories > Vehicle Bicycle Rack Accessories", + }, + { + id: "8086", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Rack Accessories > Vehicle Ski & Snowboard Rack Accessories", + }, + { + id: "3472", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks", + }, + { + id: "6041", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Base Rack Systems", + }, + { + id: "2836", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Bicycle Racks", + }, + { + id: "6047", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Boat Racks", + }, + { + id: "4240", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Cargo Racks", + }, + { + id: "6046", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Fishing Rod Racks", + }, + { + id: "7115", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Gun Racks", + }, + { + id: "6044", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Motorcycle & Scooter Racks", + }, + { + id: "6043", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Ski & Snowboard Racks", + }, + { + id: "6042", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Carrying Racks > Vehicle Water Sport Board Racks", + }, + { + id: "8147", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Loading Ramps", + }, + { + id: "4027", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Trailers", + }, + { + id: "1133", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Trailers > Boat Trailers", + }, + { + id: "4037", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Trailers > Horse & Livestock Trailers", + }, + { + id: "4243", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Trailers > Travel Trailers", + }, + { + id: "4044", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motor Vehicle Trailers > Utility & Cargo Trailers", + }, + { + id: "5512", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Motorcycle Bags & Panniers", + }, + { + id: "8378", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Truck Bed Storage Boxes & Organizers", + }, + { + id: "8475", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Vehicle Headrest Hangers & Hooks", + }, + { + id: "2290", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Vehicle Storage & Cargo > Vehicle Organizers", + }, + { + id: "3391", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories", + }, + { + id: "3315", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring", + }, + { + id: "3452", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Anchor Chains", + }, + { + id: "3362", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Anchor Lines & Ropes", + }, + { + id: "3480", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Anchor Windlasses", + }, + { + id: "3189", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Anchors", + }, + { + id: "3655", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Boat Hooks", + }, + { + id: "3718", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Boat Ladders", + }, + { + id: "3572", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Dock Cleats", + }, + { + id: "3899", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Docking & Anchoring > Dock Steps", + }, + { + id: "1132", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Sailboat Parts", + }, + { + id: "1122", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Care", + }, + { + id: "3866", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Care > Watercraft Cleaners", + }, + { + id: "3955", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Care > Watercraft Polishes", + }, + { + id: "3606", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts", + }, + { + id: "3143", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Alternators", + }, + { + id: "3463", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Carburetors & Parts", + }, + { + id: "3321", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Engine Controls", + }, + { + id: "3743", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Ignition Parts", + }, + { + id: "3097", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Impellers", + }, + { + id: "3507", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Motor Locks", + }, + { + id: "3566", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Motor Mounts", + }, + { + id: "3277", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Pistons & Parts", + }, + { + id: "3806", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engine Parts > Watercraft Propellers", + }, + { + id: "1125", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Engines & Motors", + }, + { + id: "3619", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Exhaust Parts", + }, + { + id: "3232", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Exhaust Parts > Watercraft Manifolds", + }, + { + id: "3309", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Exhaust Parts > Watercraft Mufflers & Parts", + }, + { + id: "3400", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Fuel Systems", + }, + { + id: "3415", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Fuel Systems > Watercraft Fuel Lines & Parts", + }, + { + id: "3968", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Fuel Systems > Watercraft Fuel Meters", + }, + { + id: "3892", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Fuel Systems > Watercraft Fuel Pumps & Parts", + }, + { + id: "3648", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Fuel Systems > Watercraft Fuel Tanks & Parts", + }, + { + id: "6293", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Lighting", + }, + { + id: "3995", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Steering Parts", + }, + { + id: "3308", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Steering Parts > Watercraft Steering Cables", + }, + { + id: "3663", + name: "Vehicles & Parts > Vehicle Parts & Accessories > Watercraft Parts & Accessories > Watercraft Steering Parts > Watercraft Steering Wheels", + }, + { id: "5614", name: "Vehicles & Parts > Vehicles" }, + { id: "3395", name: "Vehicles & Parts > Vehicles > Aircraft" }, + { id: "1267", name: "Vehicles & Parts > Vehicles > Motor Vehicles" }, + { id: "916", name: "Vehicles & Parts > Vehicles > Motor Vehicles > Cars, Trucks & Vans" }, + { id: "3931", name: "Vehicles & Parts > Vehicles > Motor Vehicles > Golf Carts" }, + { id: "919", name: "Vehicles & Parts > Vehicles > Motor Vehicles > Motorcycles & Scooters" }, + { + id: "503031", + name: "Vehicles & Parts > Vehicles > Motor Vehicles > Off-Road and All-Terrain Vehicles", + }, + { + id: "3018", + name: "Vehicles & Parts > Vehicles > Motor Vehicles > Off-Road and All-Terrain Vehicles > ATVs & UTVs", + }, + { + id: "2528", + name: "Vehicles & Parts > Vehicles > Motor Vehicles > Off-Road and All-Terrain Vehicles > Go Karts & Dune Buggies", + }, + { id: "920", name: "Vehicles & Parts > Vehicles > Motor Vehicles > Recreational Vehicles" }, + { id: "3549", name: "Vehicles & Parts > Vehicles > Motor Vehicles > Snowmobiles" }, + { id: "3540", name: "Vehicles & Parts > Vehicles > Watercraft" }, + { id: "3095", name: "Vehicles & Parts > Vehicles > Watercraft > Motor Boats" }, + { id: "1130", name: "Vehicles & Parts > Vehicles > Watercraft > Personal Watercraft" }, + { id: "3087", name: "Vehicles & Parts > Vehicles > Watercraft > Sailboats" }, + { id: "5644", name: "Vehicles & Parts > Vehicles > Watercraft > Yachts" }, +]; diff --git a/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-form.tsx b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-form.tsx new file mode 100644 index 0000000..b7aa7f4 --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-form.tsx @@ -0,0 +1,90 @@ +import { Controller, useForm } from "react-hook-form"; + +import React from "react"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { + SetCategoryMappingInputSchema, + SetCategoryMappingInputType, +} from "../category-mapping-input-schema"; +import { CategoryWithMappingFragmentFragment } from "../../../../generated/graphql"; +import { trpcClient } from "../../trpc/trpc-client"; +import { useDashboardNotification } from "@saleor/apps-shared"; +import { Box, Button, PropsWithBox } from "@saleor/macaw-ui/next"; +import { GoogleProductCategories } from "../google-product-categories"; +import { CategoryBreadcrumbs } from "../construct-category-breadcrumbs"; + +type CategoryMappingFormProps = { + category: CategoryWithMappingFragmentFragment; +}; + +/** + * Use Combobox, when virtualized. For such amount of data it almost crashes app due to slow rendering + * https://github.com/saleor/macaw-ui/issues/452 + */ +export const CategoryMappingForm = ({ + category, + ...props +}: PropsWithBox) => { + const { notifySuccess, notifyError } = useDashboardNotification(); + + const { control, handleSubmit, formState } = useForm({ + defaultValues: { + categoryId: category.id, + googleCategoryId: category.googleCategoryId || undefined, + }, + resolver: zodResolver(SetCategoryMappingInputSchema), + }); + const { mutate, isLoading } = trpcClient.categoryMapping.setCategoryMapping.useMutation({ + onError() { + notifyError("Could not save the category mapping"); + }, + onSuccess() { + notifySuccess("Success"); + }, + }); + + return ( + { + mutate(data); + })} + > + + + { + return ( + + ); + }} + /> + + + + ); +}; diff --git a/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-preview.tsx b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-preview.tsx new file mode 100644 index 0000000..3cc94a3 --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping-preview.tsx @@ -0,0 +1,50 @@ +import { Box, Text } from "@saleor/macaw-ui/next"; +import { trpcClient } from "../../trpc/trpc-client"; +import { CategoryBreadcrumbs } from "../construct-category-breadcrumbs"; +import { GoogleProductCategories } from "../google-product-categories"; +import { useMemo } from "react"; + +const GoogleCategory = (props: { categoryId: string }) => { + const googleCategory = useMemo(() => { + return GoogleProductCategories.find((cat) => cat.id === props.categoryId); + }, [props.categoryId]); + + return {googleCategory?.name}; +}; + +export const CategoryMappingPreview = () => { + const { data: categories, isLoading } = trpcClient.categoryMapping.getCategoryMappings.useQuery(); + + if (isLoading) { + return Loading; + } + + if (categories?.length === 0) { + return No categories; + } + + return ( + + + Mapped categories + + {categories! + .filter((c) => c.googleCategoryId) + .map((category) => { + return ( + + + + + ); + })} + + ); +}; diff --git a/apps/data-exporter/src/modules/category-mapping/ui/category-mapping.tsx b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping.tsx new file mode 100644 index 0000000..950a61c --- /dev/null +++ b/apps/data-exporter/src/modules/category-mapping/ui/category-mapping.tsx @@ -0,0 +1,25 @@ +import { trpcClient } from "../../trpc/trpc-client"; + +import React from "react"; +import { CategoryMappingForm } from "./category-mapping-form"; +import { Box, Text } from "@saleor/macaw-ui/next"; + +export const CategoryMapping = () => { + const { data: categories, isLoading } = trpcClient.categoryMapping.getCategoryMappings.useQuery(); + + if (isLoading) { + return Loading; + } + + if (categories && categories.length === 0) { + return No categories to map; + } + + return ( + + {categories!.map((category) => ( + + ))} + + ); +}; diff --git a/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.test.tsx b/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.test.tsx new file mode 100644 index 0000000..0c1c191 --- /dev/null +++ b/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.test.tsx @@ -0,0 +1,23 @@ +import React, { PropsWithChildren } from "react"; +import { describe, expect, it } from "vitest"; +import { renderHook } from "@testing-library/react"; +import { useGetFeedApiUrl } from "./use-get-feed-api-url"; +import { AppBridge, AppBridgeProvider } from "@saleor/app-sdk/app-bridge"; + +describe("useGetFeedApiUrl", function () { + const appBridge = new AppBridge({ saleorApiUrl: "https://example.com/graphql/" }); + + const HookWrapper = ({ children }: PropsWithChildren<{}>) => { + return {children}; + }; + + it("Constructs valid URL from window origin and channel slug", () => { + const { result } = renderHook(() => useGetFeedApiUrl("test-slug"), { + wrapper: HookWrapper, + }); + + expect(result.current).toEqual( + "http://localhost:3000/api/feed/https%3A%2F%2Fexample.com%2Fgraphql%2F/test-slug/google.xml" + ); + }); +}); diff --git a/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.tsx b/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.tsx new file mode 100644 index 0000000..3c09f1d --- /dev/null +++ b/apps/data-exporter/src/modules/feed-url/use-get-feed-api-url.tsx @@ -0,0 +1,13 @@ +import { useAppBridge } from "@saleor/app-sdk/app-bridge"; + +export const useGetFeedApiUrl = (channelSlug: string) => { + const { appBridgeState } = useAppBridge(); + + if (!appBridgeState || !window.location.origin) { + return null; + } + + return `${window.location.origin}/api/feed/${encodeURIComponent( + appBridgeState.saleorApiUrl as string + )}/${channelSlug}/google.xml`; +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/aws-region-list.ts b/apps/data-exporter/src/modules/file-storage/s3/aws-region-list.ts new file mode 100644 index 0000000..a945b6c --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/aws-region-list.ts @@ -0,0 +1,31 @@ +export const awsRegionList = [ + "af-south-1", + "ap-east-1", + "ap-northeast-1", + "ap-northeast-2", + "ap-northeast-3", + "ap-south-1", + "ap-south-2", + "ap-southeast-1", + "ap-southeast-2", + "ap-southeast-3", + "ap-southeast-4", + "ca-central-1", + "eu-central-1", + "eu-central-2", + "eu-north-1", + "eu-south-1", + "eu-south-2", + "eu-west-1", + "eu-west-2", + "eu-west-3", + "me-central-1", + "me-south-1", + "sa-east-1", + "us-east-1", + "us-east-2", + "us-gov-east-1", + "us-gov-west-1", + "us-west-1", + "us-west-2", +] as const; diff --git a/apps/data-exporter/src/modules/file-storage/s3/check-bucket-access.ts b/apps/data-exporter/src/modules/file-storage/s3/check-bucket-access.ts new file mode 100644 index 0000000..97469f2 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/check-bucket-access.ts @@ -0,0 +1,15 @@ +import { HeadBucketCommand, S3Client } from "@aws-sdk/client-s3"; + +interface checkBucketAccessArgs { + s3Client: S3Client; + bucketName: string; +} + +// Check if client can access the bucket. Throws an error otherwise +export const checkBucketAccess = async ({ s3Client, bucketName }: checkBucketAccessArgs) => { + await s3Client.send( + new HeadBucketCommand({ + Bucket: bucketName, + }) + ); +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/const.ts b/apps/data-exporter/src/modules/file-storage/s3/const.ts new file mode 100644 index 0000000..e079436 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/const.ts @@ -0,0 +1,6 @@ +/* + * AWS multipart uploads require a minimum file size of 5 MB. + * https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html + */ + +export const MULTI_PART_SIZE_THRESHOLD = 5 * 1024 * 1024; diff --git a/apps/data-exporter/src/modules/file-storage/s3/create-s3-client-from-configuration.ts b/apps/data-exporter/src/modules/file-storage/s3/create-s3-client-from-configuration.ts new file mode 100644 index 0000000..9676b9d --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/create-s3-client-from-configuration.ts @@ -0,0 +1,16 @@ +import { S3Client } from "@aws-sdk/client-s3"; +import { RootConfig } from "../../app-configuration/app-config"; + +export const createS3ClientFromConfiguration = ({ + accessKeyId, + secretAccessKey, + region, +}: Exclude) => { + return new S3Client({ + credentials: { + accessKeyId: accessKeyId, + secretAccessKey: secretAccessKey, + }, + region: region, + }); +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/get-file-details.ts b/apps/data-exporter/src/modules/file-storage/s3/get-file-details.ts new file mode 100644 index 0000000..db34371 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/get-file-details.ts @@ -0,0 +1,17 @@ +import { GetObjectAttributesCommand, S3Client } from "@aws-sdk/client-s3"; + +export interface GetFileDetailsArgs { + s3Client: S3Client; + fileName: string; + bucketName: string; +} + +export const getFileDetails = async ({ s3Client, bucketName, fileName }: GetFileDetailsArgs) => { + return await s3Client.send( + new GetObjectAttributesCommand({ + Bucket: bucketName, + Key: fileName, + ObjectAttributes: ["ObjectParts"], + }) + ); +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/upload-file.ts b/apps/data-exporter/src/modules/file-storage/s3/upload-file.ts new file mode 100644 index 0000000..effb981 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/upload-file.ts @@ -0,0 +1,18 @@ +import { S3Client } from "@aws-sdk/client-s3"; +import { UploadMultiPart } from "./upload-multi-part"; +import { UploadSinglePart } from "./upload-single-part"; +import { MULTI_PART_SIZE_THRESHOLD } from "./const"; + +export interface UploadFileArgs { + s3Client: S3Client; + fileName: string; + buffer: Buffer; + bucketName: string; +} + +export const uploadFile = async (args: UploadFileArgs) => { + if (args.buffer.length > MULTI_PART_SIZE_THRESHOLD) { + return await UploadMultiPart(args); + } + return await UploadSinglePart(args); +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/upload-multi-part.ts b/apps/data-exporter/src/modules/file-storage/s3/upload-multi-part.ts new file mode 100644 index 0000000..283946b --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/upload-multi-part.ts @@ -0,0 +1,94 @@ +import { + AbortMultipartUploadCommand, + CompleteMultipartUploadCommand, + CreateMultipartUploadCommand, + UploadPartCommand, +} from "@aws-sdk/client-s3"; +import { UploadFileArgs } from "./upload-file"; +import { createLogger } from "@saleor/apps-shared"; +import { MULTI_PART_SIZE_THRESHOLD } from "./const"; + +/* + * Code based on S3 docs: + * https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html + */ + +const logger = createLogger({ + fn: "UploadMultiPart", +}); + +export const UploadMultiPart = async ({ + s3Client, + fileName, + buffer, + bucketName, +}: UploadFileArgs) => { + let uploadId; + + try { + const multipartUpload = await s3Client.send( + new CreateMultipartUploadCommand({ + Bucket: bucketName, + Key: fileName, + }) + ); + + uploadId = multipartUpload.UploadId; + + const uploadPromises = []; + // Multipart uploads require a minimum size of 5 MB per part. + const partSize = MULTI_PART_SIZE_THRESHOLD; + const numberOfParts = Math.ceil(buffer.length / partSize); + + // Upload each part. + for (let i = 0; i < numberOfParts; i++) { + const start = i * partSize; + const end = start + partSize; + + uploadPromises.push( + s3Client + .send( + new UploadPartCommand({ + Bucket: bucketName, + Key: fileName, + UploadId: uploadId, + Body: buffer.subarray(start, end), + PartNumber: i + 1, + }) + ) + .then((d) => { + logger.debug(`Part ${i + 1}/${numberOfParts} uploaded`); + return d; + }) + ); + } + + const uploadResults = await Promise.all(uploadPromises); + + return await s3Client.send( + new CompleteMultipartUploadCommand({ + Bucket: bucketName, + Key: fileName, + UploadId: uploadId, + MultipartUpload: { + Parts: uploadResults.map(({ ETag }, i) => ({ + ETag, + PartNumber: i + 1, + })), + }, + }) + ); + } catch (err) { + logger.error(err); + + if (uploadId) { + const abortCommand = new AbortMultipartUploadCommand({ + Bucket: bucketName, + Key: fileName, + UploadId: uploadId, + }); + + await s3Client.send(abortCommand); + } + } +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/upload-single-part.ts b/apps/data-exporter/src/modules/file-storage/s3/upload-single-part.ts new file mode 100644 index 0000000..a0b29d6 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/upload-single-part.ts @@ -0,0 +1,17 @@ +import { PutObjectCommand } from "@aws-sdk/client-s3"; +import { UploadFileArgs } from "./upload-file"; + +export const UploadSinglePart = async ({ + s3Client, + fileName, + buffer, + bucketName, +}: UploadFileArgs) => { + return await s3Client.send( + new PutObjectCommand({ + Bucket: bucketName, + Body: buffer, + Key: fileName, + }) + ); +}; diff --git a/apps/data-exporter/src/modules/file-storage/s3/urls-and-names.ts b/apps/data-exporter/src/modules/file-storage/s3/urls-and-names.ts new file mode 100644 index 0000000..2545cc0 --- /dev/null +++ b/apps/data-exporter/src/modules/file-storage/s3/urls-and-names.ts @@ -0,0 +1,28 @@ +import { RootConfig } from "../../app-configuration/app-config"; + +interface GetDownloadUrlArgs { + s3BucketConfiguration: Exclude; + saleorApiUrl: string; + channel: string; +} + +export const getDownloadUrl = ({ + s3BucketConfiguration, + saleorApiUrl, + channel, +}: GetDownloadUrlArgs) => { + return `https://${s3BucketConfiguration.bucketName}.s3.${ + s3BucketConfiguration.region + }.amazonaws.com/${getFileName({ saleorApiUrl, channel })}`; +}; + +interface GetFileNameArgs { + saleorApiUrl: string; + channel: string; +} + +export const getFileName = ({ saleorApiUrl, channel }: GetFileNameArgs) => { + const apiUrl = new URL(saleorApiUrl); + + return `${apiUrl.hostname}/${channel}/google.xml`; +}; diff --git a/apps/data-exporter/src/modules/google-feed/attribute-mapping.test.ts b/apps/data-exporter/src/modules/google-feed/attribute-mapping.test.ts new file mode 100644 index 0000000..a74b5af --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/attribute-mapping.test.ts @@ -0,0 +1,268 @@ +import { describe, expect, it } from "vitest"; +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; +import { attributeArrayToValueString, getMappedAttributes } from "./attribute-mapping"; + +const productBase: GoogleFeedProductVariantFragment["product"] = { + name: "Product", + __typename: "Product", + id: "product-id", + category: { + id: "cat-id", + __typename: "Category", + name: "Category Name", + googleCategoryId: "1", + }, + description: "Product description", + seoDescription: "Seo description", + slug: "product-slug", + thumbnail: { __typename: "Image", url: "" }, + attributes: [ + { + attribute: { + id: "main-color", + }, + values: [{ name: "Black" }], + }, + { + attribute: { + id: "accent-color", + }, + values: [{ name: "Red" }], + }, + { + attribute: { + id: "size", + }, + values: [{ name: "XL" }], + }, + { + attribute: { + id: "pattern", + }, + values: [{ name: "plain" }], + }, + ], +}; + +const priceBase: GoogleFeedProductVariantFragment["pricing"] = { + __typename: "VariantPricingInfo", + price: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 1, + currency: "USD", + }, + }, +}; + +describe("attribute-mapping", () => { + describe("attributeArrayToValueString", () => { + it("Return undefined, when no attributes", () => { + expect(attributeArrayToValueString([])).toStrictEqual(undefined); + }); + + it("Return value, when attribute have value assigned", () => { + expect( + attributeArrayToValueString([ + { + attribute: { + id: "1", + }, + values: [ + { + name: "Red", + }, + ], + }, + { + attribute: { + id: "2", + }, + values: [], + }, + ]) + ).toStrictEqual("Red"); + }); + + it("Return all values, when attribute have multiple value assigned", () => { + expect( + attributeArrayToValueString([ + { + attribute: { + id: "1", + }, + values: [ + { + name: "Red", + }, + { + name: "Blue", + }, + ], + }, + { + attribute: { + id: "2", + }, + values: [ + { + name: "Yellow", + }, + ], + }, + ]) + ).toStrictEqual("Red/Blue/Yellow"); + }); + }); + + describe("getMappedAttributes", () => { + it("Return undefined, when no mapping is passed", () => { + expect( + getMappedAttributes({ + variant: { + id: "id1", + __typename: "ProductVariant", + sku: "sku1", + quantityAvailable: 1, + pricing: priceBase, + name: "Product variant", + product: productBase, + attributes: [], + }, + }) + ).toStrictEqual(undefined); + }); + + it("Return empty values, when variant has no related attributes", () => { + expect( + getMappedAttributes({ + variant: { + id: "id1", + __typename: "ProductVariant", + sku: "sku1", + quantityAvailable: 1, + pricing: priceBase, + name: "Product variant", + product: productBase, + attributes: [], + }, + attributeMapping: { + brandAttributeIds: ["brand-id"], + colorAttributeIds: ["color-id"], + patternAttributeIds: ["pattern-id"], + materialAttributeIds: ["material-id"], + sizeAttributeIds: ["size-id"], + }, + }) + ).toStrictEqual({ + material: undefined, + color: undefined, + size: undefined, + brand: undefined, + pattern: undefined, + }); + }); + + it("Return attribute values, when variant has attributes used by mapping", () => { + expect( + getMappedAttributes({ + variant: { + id: "id1", + __typename: "ProductVariant", + sku: "sku1", + quantityAvailable: 1, + pricing: priceBase, + name: "Product variant", + product: productBase, + attributes: [ + { + attribute: { + id: "should be ignored", + }, + values: [ + { + name: "ignored", + }, + ], + }, + { + attribute: { + id: "brand-id", + }, + values: [ + { + name: "Saleor", + }, + ], + }, + { + attribute: { + id: "size-id", + }, + values: [ + { + name: "XL", + }, + ], + }, + { + attribute: { + id: "color-base-id", + }, + values: [ + { + name: "Red", + }, + ], + }, + { + attribute: { + id: "color-secondary-id", + }, + values: [ + { + name: "Black", + }, + ], + }, + { + attribute: { + id: "material-id", + }, + values: [ + { + name: "Cotton", + }, + ], + }, + { + attribute: { + id: "pattern-id", + }, + values: [ + { + name: "Plain", + }, + ], + }, + ], + }, + attributeMapping: { + brandAttributeIds: ["brand-id"], + colorAttributeIds: ["color-base-id", "color-secondary-id"], + materialAttributeIds: ["material-id"], + sizeAttributeIds: ["size-id"], + patternAttributeIds: ["pattern-id"], + }, + }) + ).toStrictEqual({ + material: "Cotton", + color: "Red/Black", + size: "XL", + brand: "Saleor", + pattern: "Plain", + }); + }); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/attribute-mapping.ts b/apps/data-exporter/src/modules/google-feed/attribute-mapping.ts new file mode 100644 index 0000000..e27d5b5 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/attribute-mapping.ts @@ -0,0 +1,69 @@ +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; +import { RootConfig } from "../app-configuration/app-config"; + +interface GetMappedAttributesArgs { + variant: GoogleFeedProductVariantFragment; + attributeMapping?: RootConfig["attributeMapping"]; +} + +export const attributeArrayToValueString = ( + attributes?: GoogleFeedProductVariantFragment["attributes"] +) => { + if (!attributes?.length) { + return; + } + + return attributes + .map((a) => a.values) + .flat() // Multiple values can be assigned to the attribute + .map((v) => v.name) // get value to display + .filter((v) => !!v) // filter out empty values + .join("/"); // Format of multi value attribute recommended by Google +}; + +export const getMappedAttributes = ({ + variant, + attributeMapping: mapping, +}: GetMappedAttributesArgs) => { + /* + * We have to take in account both product and variant attributes since we use flat + * model in the feed + */ + if (!mapping) { + return; + } + const attributes = variant.attributes.concat(variant.product.attributes); + + const materialAttributes = attributes.filter((a) => + mapping.materialAttributeIds.includes(a.attribute.id) + ); + const materialValue = attributeArrayToValueString(materialAttributes); + + const brandAttributes = attributes.filter((a) => + mapping.brandAttributeIds.includes(a.attribute.id) + ); + const brandValue = attributeArrayToValueString(brandAttributes); + + const colorAttributes = attributes.filter((a) => + mapping.colorAttributeIds.includes(a.attribute.id) + ); + const colorValue = attributeArrayToValueString(colorAttributes); + + const patternAttributes = attributes.filter((a) => + mapping.patternAttributeIds.includes(a.attribute.id) + ); + const patternValue = attributeArrayToValueString(patternAttributes); + + const sizeAttributes = attributes.filter((a) => + mapping.sizeAttributeIds.includes(a.attribute.id) + ); + const sizeValue = attributeArrayToValueString(sizeAttributes); + + return { + material: materialValue, + brand: brandValue, + color: colorValue, + size: sizeValue, + pattern: patternValue, + }; +}; diff --git a/apps/data-exporter/src/modules/google-feed/fetch-product-data.ts b/apps/data-exporter/src/modules/google-feed/fetch-product-data.ts new file mode 100644 index 0000000..d39f538 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/fetch-product-data.ts @@ -0,0 +1,99 @@ +import { url } from "inspector"; +import { Client } from "urql"; +import { createLogger } from "@saleor/apps-shared"; +import { + FetchProductCursorsDocument, + FetchProductDataForFeedDocument, + GoogleFeedProductVariantFragment, +} from "../../../generated/graphql"; + +export const getCursors = async ({ client, channel }: { client: Client; channel: string }) => { + const logger = createLogger({ saleorApiUrl: url, channel, fn: "getCursors" }); + + logger.debug(`Fetching cursors for channel ${channel}`); + + let result = await client + .query(FetchProductCursorsDocument, { channel: channel, first: 100 }) + .toPromise(); + + const cursors: Array = []; + + while (result.data?.productVariants?.pageInfo.hasNextPage) { + result = await client + .query(FetchProductCursorsDocument, { + channel: channel, + first: 100, + after: result.data.productVariants.pageInfo.endCursor, + }) + .toPromise(); + + const endCursor = result.data?.productVariants?.pageInfo.endCursor; + + if (endCursor) { + cursors.push(endCursor); + } + } + return cursors; +}; + +const fetchVariants = async ({ + client, + after, + channel, + imageSize, +}: { + client: Client; + after?: string; + channel: string; + imageSize?: number; +}): Promise => { + const logger = createLogger({ saleorApiUrl: url, channel, fn: "fetchVariants" }); + + logger.debug(`Fetching variants for channel ${channel} with cursor ${after}`); + + const result = await client + .query(FetchProductDataForFeedDocument, { + channel: channel, + first: 100, + after, + imageSize, + }) + .toPromise(); + + if (result.error) { + logger.error(`Error during the GraphqlAPI call: ${result.error.message}`); + return []; + } + + return result.data?.productVariants?.edges.map((e) => e.node) || []; +}; + +interface FetchProductDataArgs { + client: Client; + channel: string; + cursors?: Array; + imageSize?: number; +} + +export const fetchProductData = async ({ + client, + channel, + cursors, + imageSize, +}: FetchProductDataArgs) => { + const logger = createLogger({ saleorApiUrl: url, channel, route: "Google Product Feed" }); + + const cachedCursors = cursors || (await getCursors({ client, channel })); + + const pageCursors = [undefined, ...cachedCursors]; + + logger.debug(`Query generated ${pageCursors.length} cursors`); + + const promises = pageCursors.map((cursor) => + fetchVariants({ client, after: cursor, channel, imageSize }), + ); + + const results = await Promise.all(promises); + + return results.flat(); +}; diff --git a/apps/data-exporter/src/modules/google-feed/fetch-shop-data.ts b/apps/data-exporter/src/modules/google-feed/fetch-shop-data.ts new file mode 100644 index 0000000..605c3d7 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/fetch-shop-data.ts @@ -0,0 +1,31 @@ +import { url } from "inspector"; +import { Client } from "urql"; +import { createLogger } from "@saleor/apps-shared"; +import { ShopDetailsDocument } from "../../../generated/graphql"; + +interface FetchShopDataArgs { + client: Client; + channel: string; +} + +export const fetchShopData = async ({ client, channel }: FetchShopDataArgs) => { + const logger = createLogger({ saleorApiUrl: url, channel, route: "Google Product Feed" }); + + const result = await client.query(ShopDetailsDocument, {}).toPromise(); + const shopDetails = result.data?.shop; + + if (result.error) { + logger.error(`Error during the GraphqlAPI call: ${result.error.message}`); + throw new Error("Error during the GraphQL API call"); + } + + if (!shopDetails) { + logger.error("Shop details query returned no data"); + throw new Error("Shop details query returned no data"); + } + + return { + shopName: shopDetails?.name, + shopDescription: shopDetails?.description || undefined, + }; +}; diff --git a/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.test.ts b/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.test.ts new file mode 100644 index 0000000..c10ab42 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.test.ts @@ -0,0 +1,176 @@ +import { describe, expect, it } from "vitest"; +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; +import { generateGoogleXmlFeed } from "./generate-google-xml-feed"; + +const productBase: GoogleFeedProductVariantFragment["product"] = { + name: "Product", + __typename: "Product", + id: "product-id", + category: { + id: "cat-id", + __typename: "Category", + name: "Category Name", + googleCategoryId: "1", + }, + description: "Product description", + seoDescription: "Seo description", + slug: "product-slug", + thumbnail: { __typename: "Image", url: "" }, + attributes: [], +}; + +const priceBase: GoogleFeedProductVariantFragment["pricing"] = { + __typename: "VariantPricingInfo", + price: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 1, + currency: "USD", + }, + }, + priceUndiscounted: { + __typename: "TaxedMoney", + gross: { + __typename: "Money", + amount: 2, + currency: "USD", + }, + }, +}; + +describe("generateGoogleXmlFeed", () => { + it("Generates feed", () => { + const result = generateGoogleXmlFeed({ + productStorefrontUrl: "https://example.com/p/{{ variant.product.slug }}", + shopDescription: "Description", + shopName: "Example", + storefrontUrl: "https://example.com", + titleTemplate: "{{ variant.product.name }} - {{ variant.name }}", + productVariants: [ + { + id: "id1", + __typename: "ProductVariant", + sku: "sku1", + quantityAvailable: 1, + pricing: priceBase, + name: "Product variant", + product: productBase, + attributes: [], + }, + { + id: "id2", + __typename: "ProductVariant", + sku: "sku2", + quantityAvailable: 0, + pricing: priceBase, + name: "Product variant 2", + product: productBase, + attributes: [], + }, + ], + }); + + expect(result).toMatchInlineSnapshot(` + " + + + Example + https://example.com + Description + + sku1 + product-id + Product - Product variant + new + in_stock + Category Name + 1 + https://example.com/p/product-slug + 2.00 USD + 1.00 USD + + + sku2 + product-id + Product - Product variant 2 + new + out_of_stock + Category Name + 1 + https://example.com/p/product-slug + 2.00 USD + 1.00 USD + + + " + `); + }); + + it("Generates feed with rendered urls, when provided old style URL template", () => { + const result = generateGoogleXmlFeed({ + productStorefrontUrl: "https://example.com/p/{productSlug}", + shopDescription: "Description", + shopName: "Example", + storefrontUrl: "https://example.com", + titleTemplate: "{{ variant.product.name }} - {{ variant.name }}", + productVariants: [ + { + id: "id1", + __typename: "ProductVariant", + sku: "sku1", + quantityAvailable: 1, + pricing: priceBase, + name: "Product variant", + product: productBase, + attributes: [], + }, + { + id: "id2", + __typename: "ProductVariant", + sku: "sku2", + quantityAvailable: 0, + pricing: priceBase, + name: "Product variant 2", + product: productBase, + attributes: [], + }, + ], + }); + + expect(result).toMatchInlineSnapshot(` + " + + + Example + https://example.com + Description + + sku1 + product-id + Product - Product variant + new + in_stock + Category Name + 1 + https://example.com/p/product-slug + 2.00 USD + 1.00 USD + + + sku2 + product-id + Product - Product variant 2 + new + out_of_stock + Category Name + 1 + https://example.com/p/product-slug + 2.00 USD + 1.00 USD + + + " + `); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.ts b/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.ts new file mode 100644 index 0000000..2cd7538 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/generate-google-xml-feed.ts @@ -0,0 +1,138 @@ +import { XMLBuilder } from "fast-xml-parser"; +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; +import { productToProxy } from "./product-to-proxy"; +import { shopDetailsToProxy } from "./shop-details-to-proxy"; +import { RootConfig } from "../app-configuration/app-config"; +import { getMappedAttributes } from "./attribute-mapping"; +import { priceMapping } from "./price-mapping"; +import { renderHandlebarsTemplate } from "../handlebarsTemplates/render-handlebars-template"; +import { transformTemplateFormat } from "../handlebarsTemplates/transform-template-format"; +import { EditorJsPlaintextRenderer } from "@saleor/apps-shared"; +import { getRelatedMedia, getVariantMediaMap } from "./get-related-media"; + +interface GenerateGoogleXmlFeedArgs { + productVariants: GoogleFeedProductVariantFragment[]; + storefrontUrl: string; + productStorefrontUrl: string; + titleTemplate: string; + attributeMapping?: RootConfig["attributeMapping"]; + shopName: string; + shopDescription?: string; +} + +export const generateGoogleXmlFeed = ({ + attributeMapping, + productVariants, + storefrontUrl, + titleTemplate, + productStorefrontUrl, + shopName, + shopDescription, +}: GenerateGoogleXmlFeedArgs) => { + const items = productVariants.map((variant) => { + const attributes = getMappedAttributes({ + attributeMapping: attributeMapping, + variant, + }); + + const pricing = priceMapping({ pricing: variant.pricing }); + + let title = ""; + + try { + title = renderHandlebarsTemplate({ + data: { + variant, + googleAttributes: attributes, + }, + template: titleTemplate, + }); + } catch {} + + let link = undefined; + + const { additionalImages, thumbnailUrl } = getRelatedMedia({ + productMedia: variant.product.media || [], + productVariantId: variant.id, + variantMediaMap: getVariantMediaMap({ variant }) || [], + }); + + try { + link = renderHandlebarsTemplate({ + data: { + variant, + googleAttributes: attributes, + }, + template: transformTemplateFormat({ template: productStorefrontUrl }), + }); + } catch {} + + return productToProxy({ + link, + title: title || "", + id: variant.product.id, + slug: variant.product.slug, + variantId: variant.id, + sku: variant.sku || undefined, + description: EditorJsPlaintextRenderer({ stringData: variant.product.description }), + availability: + variant.quantityAvailable && variant.quantityAvailable > 0 ? "in_stock" : "out_of_stock", + category: variant.product.category?.name || "unknown", + googleProductCategory: variant.product.category?.googleCategoryId || "", + imageUrl: thumbnailUrl, + additionalImageLinks: additionalImages, + material: attributes?.material, + color: attributes?.color, + brand: attributes?.brand, + pattern: attributes?.pattern, + size: attributes?.size, + ...pricing, + }); + }); + + const builder = new XMLBuilder({ + attributeNamePrefix: "@_", + attributesGroupName: "@", + textNodeName: "#text", + ignoreAttributes: false, + format: true, + indentBy: " ", + suppressEmptyNode: false, + preserveOrder: true, + }); + + const channelData = shopDetailsToProxy({ + title: shopName, + description: shopDescription, + storefrontUrl, + }); + + const data = [ + { + "?xml": [ + { + "#text": "", + }, + ], + ":@": { + "@_version": "1.0", + "@_encoding": "utf-8", + }, + }, + + { + rss: [ + { + // @ts-ignore - This is "just an object" that is transformed to XML. I don't see good way to type it, other than "any" + channel: channelData.concat(items), + }, + ], + ":@": { + "@_xmlns:g": "http://base.google.com/ns/1.0", + "@_version": "2.0", + }, + }, + ]; + + return builder.build(data); +}; diff --git a/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.test.ts b/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.test.ts new file mode 100644 index 0000000..12ccf14 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, it, vi } from "vitest"; +import { GoogleFeedSettingsFetcher } from "./get-google-feed-settings"; +import { AppConfig } from "../app-configuration/app-config"; + +describe("GoogleFeedSettingsFetcher", () => { + it("Fetches channel-specific config with S3 config from Metadata", async () => { + const getMetadataMock = vi.fn().mockImplementation(async () => { + const appConfig = new AppConfig({ + channelConfig: { + testChannel: { + storefrontUrls: { + storefrontUrl: "https://example.com", + productStorefrontUrl: + "https://example.com/p/{{ variant.product.slug }}/v/{{ variant.slug }}", + }, + }, + anotherChannel: { + storefrontUrls: { + storefrontUrl: "https://another.example.com", + productStorefrontUrl: + "https://another.example.com/p/{{ variant.product.slug }}/v/{{ variant.slug }}", + }, + }, + }, + s3: { + accessKeyId: "accessKeyId", + bucketName: "bucketName", + region: "region", + secretAccessKey: "secretAccessKey", + }, + attributeMapping: null, + titleTemplate: "{{ variant.name }}", + imageSize: 1024, + }); + + return appConfig.serialize(); + }); + + const instance = new GoogleFeedSettingsFetcher({ + settingsManager: { + get: getMetadataMock, + }, + }); + + const result = await instance.fetch("testChannel"); + + expect(result).toStrictEqual({ + storefrontUrl: "https://example.com", + productStorefrontUrl: "https://example.com/p/{{ variant.product.slug }}/v/{{ variant.slug }}", + s3BucketConfiguration: { + bucketName: "bucketName", + secretAccessKey: "secretAccessKey", + accessKeyId: "accessKeyId", + region: "region", + }, + attributeMapping: null, + titleTemplate: "{{ variant.name }}", + imageSize: 1024, + }); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.ts b/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.ts new file mode 100644 index 0000000..359eafe --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/get-google-feed-settings.ts @@ -0,0 +1,52 @@ +import { AuthData } from "@saleor/app-sdk/APL"; +import { AppConfigMetadataManager } from "../app-configuration/app-config-metadata-manager"; +import { GraphqlClientFactory } from "../../lib/create-graphql-client"; +import { createSettingsManager } from "../../lib/metadata-manager"; +import { AppConfig } from "../app-configuration/app-config"; + +export class GoogleFeedSettingsFetcher { + static createFromAuthData(authData: AuthData) { + return new GoogleFeedSettingsFetcher({ + settingsManager: new AppConfigMetadataManager( + createSettingsManager(GraphqlClientFactory.fromAuthData(authData)), + ), + }); + } + + settingsManager: Pick; + + constructor(params: { settingsManager: Pick }) { + this.settingsManager = params.settingsManager; + } + + async fetch(channelSlug: string) { + const configString = await this.settingsManager.get(); + + if (!configString) { + throw new Error("App is not configured"); + } + + const appConfig = AppConfig.parse(configString); + const channelConfig = appConfig.getUrlsForChannel(channelSlug); + + if (!channelConfig) { + throw new Error("App is not configured"); + } + + const storefrontUrl = channelConfig.storefrontUrl; + const productStorefrontUrl = channelConfig.productStorefrontUrl; + + if (!storefrontUrl.length || !productStorefrontUrl.length) { + throw new Error("The application has not been configured"); + } + + return { + storefrontUrl, + productStorefrontUrl, + s3BucketConfiguration: appConfig.getS3Config(), + attributeMapping: appConfig.getAttributeMapping(), + titleTemplate: appConfig.getTitleTemplate(), + imageSize: appConfig.getImageSize(), + }; + } +} diff --git a/apps/data-exporter/src/modules/google-feed/get-related-media.test.ts b/apps/data-exporter/src/modules/google-feed/get-related-media.test.ts new file mode 100644 index 0000000..f24aa5f --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/get-related-media.test.ts @@ -0,0 +1,128 @@ +import { describe, expect, it } from "vitest"; +import { getRelatedMedia } from "./get-related-media"; +import { ProductMediaType } from "../../../generated/graphql"; + +describe("getRelatedMedia", () => { + it("Returns thumbnail, when set to the product", () => { + expect( + getRelatedMedia({ + productMedia: [ + { + id: "id-1", + type: ProductMediaType.Image, + url: "http://example.com/1.jpg", + }, + ], + productVariantId: "variant-1", + variantMediaMap: {}, + }), + ).toStrictEqual({ + thumbnailUrl: "http://example.com/1.jpg", + additionalImages: [], + }); + }); + it("Returns undefined as thumbnail URL, when product has no media", () => { + expect( + getRelatedMedia({ + productMedia: [], + productVariantId: "variant-1", + variantMediaMap: {}, + }), + ).toStrictEqual({ + thumbnailUrl: undefined, + additionalImages: [], + }); + }); + it("Returns thumbnail and additional images, when all images are set to the product", () => { + expect( + getRelatedMedia({ + productMedia: [ + { + id: "id-1", + type: ProductMediaType.Image, + url: "http://example.com/1.jpg", + }, + { + id: "id-2", + type: ProductMediaType.Image, + url: "http://example.com/2.jpg", + }, + { + id: "id-3", + type: ProductMediaType.Image, + url: "http://example.com/3.jpg", + }, + ], + productVariantId: "variant-1", + variantMediaMap: {}, + }), + ).toStrictEqual({ + thumbnailUrl: "http://example.com/1.jpg", + additionalImages: ["http://example.com/2.jpg", "http://example.com/3.jpg"], + }); + }); + it("Returns filtered list of images, when some of the images are assigned to the other variants", () => { + expect( + getRelatedMedia({ + productMedia: [ + { + id: "id-1", + type: ProductMediaType.Image, + url: "http://example.com/1.jpg", + }, + { + id: "id-other-variant", + type: ProductMediaType.Image, + url: "http://example.com/2-other-variant.jpg", + }, + { + id: "id-3", + type: ProductMediaType.Image, + url: "http://example.com/3.jpg", + }, + ], + productVariantId: "variant-1", + variantMediaMap: { + "variant-2": [ + { + id: "id-other-variant", + type: ProductMediaType.Image, + url: "http://example.com/2-other-variant.jpg", + }, + ], + }, + }), + ).toStrictEqual({ + thumbnailUrl: "http://example.com/1.jpg", + additionalImages: ["http://example.com/3.jpg"], + }); + }); + it("Returns only URLs to photos, when product has both Image and Video media types", () => { + expect( + getRelatedMedia({ + productMedia: [ + { + id: "id-1", + type: ProductMediaType.Image, + url: "http://example.com/image-1.jpg", + }, + { + id: "id-2", + type: ProductMediaType.Video, + url: "http://example.com/video-2.mp4", + }, + { + id: "id-3", + type: ProductMediaType.Image, + url: "http://example.com/image-3.jpg", + }, + ], + productVariantId: "variant-1", + variantMediaMap: {}, + }), + ).toStrictEqual({ + thumbnailUrl: "http://example.com/image-1.jpg", + additionalImages: ["http://example.com/image-3.jpg"], + }); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/get-related-media.ts b/apps/data-exporter/src/modules/google-feed/get-related-media.ts new file mode 100644 index 0000000..5e1e7de --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/get-related-media.ts @@ -0,0 +1,63 @@ +import { GoogleFeedProductVariantFragment, ProductMediaType } from "../../../generated/graphql"; + +type Media = { + id: string; + url: string; + type: ProductMediaType; +}; + +interface getRelatedMediaArgs { + productVariantId: string; + productMedia: Media[]; + variantMediaMap: Record; +} + +/* + * Filters media related to the product variant and returns: + * - thumbnailUrl: Product thumbnail (since Saleor has no dedicated field to the variant thumbnail) + * - additionalImages: Url list of photos assigned to particular variant and product photos not associated with any other variant + */ +export const getRelatedMedia = ({ + productVariantId, + variantMediaMap, + productMedia, +}: getRelatedMediaArgs) => { + // Saleor always uses the first photo as thumbnail - even if it's assigned to the variant + const productThumbnailUrl = productMedia[0]?.url; + + const mediaAssignedToAnyVariant = Object.values(variantMediaMap).flat() || []; + + const mediaAssignedToNoVariant = + productMedia?.filter((m) => !mediaAssignedToAnyVariant.find((vm) => vm.id === m.id)) || []; + + const mediaAssignedToVariant = variantMediaMap[productVariantId] || []; + + const additionalImages = + [...mediaAssignedToVariant, ...mediaAssignedToNoVariant] + ?.filter((media) => media.type === ProductMediaType.Image) // Videos are not supported by the field + .map((media) => media.url) + .filter((url) => url !== productThumbnailUrl) || []; // Exclude image used as thumbnail + + return { + thumbnailUrl: productThumbnailUrl, + additionalImages, + }; +}; + +interface GetVariantMediaMapArgs { + variant: GoogleFeedProductVariantFragment; +} + +export const getVariantMediaMap = ({ variant }: GetVariantMediaMapArgs) => { + return ( + variant.product.variants?.reduce((accumulator: Record>, currentValue) => { + const id = currentValue?.id; + + if (!id) { + return accumulator; + } + accumulator[id] = currentValue.media?.filter((m) => !!m) || []; + return accumulator; + }, {}) || {} + ); +}; diff --git a/apps/data-exporter/src/modules/google-feed/price-mapping.test.ts b/apps/data-exporter/src/modules/google-feed/price-mapping.test.ts new file mode 100644 index 0000000..d12a2d3 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/price-mapping.test.ts @@ -0,0 +1,60 @@ +import { describe, expect, it } from "vitest"; +import { priceMapping } from "./price-mapping"; + +describe("priceMapping", () => { + it("Return undefined, when no pricing available", () => { + expect( + priceMapping({ + pricing: undefined, + }) + ).toStrictEqual(undefined); + }); + it("Return undefined, when amount is equal to 0", () => { + expect( + priceMapping({ + pricing: { + priceUndiscounted: { + gross: { + amount: 0, + currency: "USD", + }, + }, + }, + }) + ).toStrictEqual(undefined); + }); + it("Return formatted base price, when there is no sale", () => { + expect( + priceMapping({ + pricing: { + priceUndiscounted: { + gross: { + amount: 10.5, + currency: "USD", + }, + }, + }, + }) + ).toStrictEqual({ price: "10.50 USD" }); + }); + it("Return formatted base and sale prices, when there is a sale", () => { + expect( + priceMapping({ + pricing: { + priceUndiscounted: { + gross: { + amount: 10.5, + currency: "USD", + }, + }, + price: { + gross: { + amount: 5.25, + currency: "USD", + }, + }, + }, + }) + ).toStrictEqual({ price: "10.50 USD", salePrice: "5.25 USD" }); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/price-mapping.ts b/apps/data-exporter/src/modules/google-feed/price-mapping.ts new file mode 100644 index 0000000..cb0ecea --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/price-mapping.ts @@ -0,0 +1,56 @@ +import { GoogleFeedProductVariantFragment } from "../../../generated/graphql"; + +/** + * Price format has to be altered from the en format to the one expected by Google + * eg. 1.00 USD, 5.00 PLN + */ +const formatCurrency = (currency: string, amount: number) => { + return ( + new Intl.NumberFormat("en-EN", { + useGrouping: false, + minimumFractionDigits: 2, + style: "decimal", + currencyDisplay: "code", + currency: currency, + }).format(amount) + ` ${currency}` + ); +}; + +interface priceMappingArgs { + pricing: GoogleFeedProductVariantFragment["pricing"]; +} + +/* + * Maps variant pricing to Google Feed format. + * https://support.google.com/merchants/answer/6324371 + */ +export const priceMapping = ({ pricing }: priceMappingArgs) => { + const priceUndiscounted = pricing?.priceUndiscounted?.gross; + + // Pricing should not be submitted empty or with 0 value + if (!priceUndiscounted?.amount) { + return; + } + + // Price attribute is expected to be a base price + const formattedUndiscountedPrice = formatCurrency( + priceUndiscounted.currency, + priceUndiscounted.amount + ); + + const discountedPrice = pricing?.price?.gross; + + // Return early if there is no sale + if (!discountedPrice || discountedPrice?.amount === priceUndiscounted.amount) { + return { + price: formattedUndiscountedPrice, + }; + } + + const formattedDiscountedPrice = formatCurrency(discountedPrice.currency, discountedPrice.amount); + + return { + price: formattedUndiscountedPrice, + salePrice: formattedDiscountedPrice, + }; +}; diff --git a/apps/data-exporter/src/modules/google-feed/product-to-proxy.test.ts b/apps/data-exporter/src/modules/google-feed/product-to-proxy.test.ts new file mode 100644 index 0000000..a0b3029 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/product-to-proxy.test.ts @@ -0,0 +1,167 @@ +import { describe, it, expect } from "vitest"; +import { productToProxy } from "./product-to-proxy"; + +describe("productToProxy", () => { + it("Falls back product ID, if product SKU doesn't exist", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + id: "product-id", + title: "title", + variantId: "variant-id", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:id": expect.arrayContaining([{ "#text": "variant-id" }]), + }, + ]), + ); + }); + + it('Falls back g:condition to "new" if product condition doesn\'t exist', () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + /* + * Missing condition field: + * condition: "new", + */ + id: "product-id", + title: "title", + variantId: "variant-id", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:condition": expect.arrayContaining([{ "#text": "new" }]), + }, + ]), + ); + }); + + it("Fills product description if exist", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + id: "product-id", + title: "title", + variantId: "variant-id", + description: "Product description", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:description": expect.arrayContaining([{ "#text": "Product description" }]), + }, + ]), + ); + }); + + it("Fills google product category if exist", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + googleProductCategory: "1", + id: "product-id", + title: "title", + variantId: "variant-id", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:google_product_category": expect.arrayContaining([{ "#text": "1" }]), + }, + ]), + ); + }); + + it("Adds link section, when url is provided", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + googleProductCategory: "1", + id: "product-id", + title: "title", + variantId: "variant-id", + link: "https://example.com/p/product-id", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + link: expect.arrayContaining([ + { + "#text": "https://example.com/p/product-id", + }, + ]), + }, + ]), + ); + }); + + it("Adds g:image_link if imageUrl exist in product", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + googleProductCategory: "1", + id: "product-id", + title: "title", + variantId: "variant-id", + imageUrl: "https://image.example.com", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:image_link": expect.arrayContaining([{ "#text": "https://image.example.com" }]), + }, + ]), + ); + }); + + it("Adds g:price if product price exists", () => { + const result = productToProxy({ + slug: "slug", + availability: "in_stock", + category: "1", + condition: "new", + googleProductCategory: "1", + id: "product-id", + title: "title", + variantId: "variant-id", + imageUrl: "https://image.example.com", + price: "50.00 USD", + additionalImageLinks: [], + }); + + expect(result.item).toEqual( + expect.arrayContaining([ + { + "g:price": expect.arrayContaining([{ "#text": "50.00 USD" }]), + }, + ]), + ); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/product-to-proxy.ts b/apps/data-exporter/src/modules/google-feed/product-to-proxy.ts new file mode 100644 index 0000000..a964c05 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/product-to-proxy.ts @@ -0,0 +1,179 @@ +import { GoogleProxyItem, ProductEntry } from "./types"; + +export const productToProxy = (p: ProductEntry) => { + const item: GoogleProxyItem[] = [ + { + "g:id": [ + { + "#text": p.sku || p.variantId, + }, + ], + }, + { + "g:item_group_id": [ + { + "#text": p.id, + }, + ], + }, + { + title: [ + { + "#text": p.title, + }, + ], + }, + { + "g:condition": [ + { + "#text": p.condition || "new", + }, + ], + }, + + { + "g:availability": [ + { + "#text": p.availability, + }, + ], + }, + { + "g:product_type": [ + { + "#text": p.category, + }, + ], + }, + ]; + + if (p.description?.length) { + item.push({ + "g:description": [ + { + "#text": p.description, + }, + ], + }); + } + + /** + * This field is optional and Google automatically match category if not has been provided + * + * https://support.google.com/merchants/answer/6324436?hl=en + */ + + if (p.googleProductCategory?.length) { + item.push({ + "g:google_product_category": [ + { + "#text": p.googleProductCategory, + }, + ], + }); + } + + if (p.link?.length) { + item.push({ + link: [ + { + "#text": p.link, + }, + ], + }); + } + + if (p.imageUrl?.length) { + item.push({ + "g:image_link": [ + { + "#text": p.imageUrl, + }, + ], + }); + } + + for (const additional_image of p.additionalImageLinks) { + item.push({ + "g:additional_image_link": [ + { + "#text": additional_image, + }, + ], + }); + } + + if (p.price?.length) { + item.push({ + "g:price": [ + { + "#text": p.price, + }, + ], + }); + } + + if (p.salePrice?.length) { + item.push({ + "g:sale_price": [ + { + "#text": p.salePrice, + }, + ], + }); + } + + if (p.material) { + item.push({ + "g:material": [ + { + "#text": p.material, + }, + ], + }); + } + + if (p.brand) { + item.push({ + "g:brand": [ + { + "#text": p.brand, + }, + ], + }); + } + + if (p.color) { + item.push({ + "g:color": [ + { + "#text": p.color, + }, + ], + }); + } + + if (p.size) { + item.push({ + "g:size": [ + { + "#text": p.size, + }, + ], + }); + } + + if (p.pattern) { + item.push({ + "g:pattern": [ + { + "#text": p.pattern, + }, + ], + }); + } + + return { + item, + }; +}; diff --git a/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.test.ts b/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.test.ts new file mode 100644 index 0000000..5159693 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.test.ts @@ -0,0 +1,64 @@ +import { describe, expect, it } from "vitest"; +import { shopDetailsToProxy } from "./shop-details-to-proxy"; + +describe("shopDetailsToProxy", () => { + it("Renders title and storefront url", () => { + expect( + shopDetailsToProxy({ + description: "Shop description", + storefrontUrl: "https://example.com", + title: "Shop title", + }) + ).toMatchInlineSnapshot(` + [ + { + "title": [ + { + "#text": "Shop title", + }, + ], + }, + { + "link": [ + { + "#text": "https://example.com", + }, + ], + }, + { + "description": [ + { + "#text": "Shop description", + }, + ], + }, + ] + `); + }); + + it("Renders without description if not provided", () => { + expect( + shopDetailsToProxy({ + storefrontUrl: "https://example.com", + title: "Shop title", + }) + ).toMatchInlineSnapshot(` + [ + { + "title": [ + { + "#text": "Shop title", + }, + ], + }, + { + "link": [ + { + "#text": "https://example.com", + }, + ], + }, + ] + `); + }); +}); diff --git a/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.ts b/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.ts new file mode 100644 index 0000000..6d9e61e --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/shop-details-to-proxy.ts @@ -0,0 +1,32 @@ +import { GoogleProxyItem, ShopDetailsEntry } from "./types"; + +export const shopDetailsToProxy = ({ title, storefrontUrl, description }: ShopDetailsEntry) => { + const data: GoogleProxyItem[] = [ + { + title: [ + { + "#text": title, + }, + ], + }, + { + link: [ + { + "#text": storefrontUrl, + }, + ], + }, + ]; + + if (description) { + data.push({ + description: [ + { + "#text": description, + }, + ], + }); + } + + return data; +}; diff --git a/apps/data-exporter/src/modules/google-feed/types.ts b/apps/data-exporter/src/modules/google-feed/types.ts new file mode 100644 index 0000000..78a2770 --- /dev/null +++ b/apps/data-exporter/src/modules/google-feed/types.ts @@ -0,0 +1,30 @@ +export type ProductEntry = { + id: string; + title: string; + sku?: string; + slug: string; + variantId: string; + description?: string; + link?: string; + imageUrl?: string; + additionalImageLinks: string[]; + condition?: "new" | "refurbished" | "used"; + price?: string; + salePrice?: string; + googleProductCategory?: string; + availability: "in_stock" | "out_of_stock" | "preorder" | "backorder"; + category: string; + material?: string; + color?: string; + size?: string; + brand?: string; + pattern?: string; +}; + +export type ShopDetailsEntry = { + title: string; + storefrontUrl: string; + description?: string; +}; + +export type GoogleProxyItem = Record>>; diff --git a/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.test.ts b/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.test.ts new file mode 100644 index 0000000..56e292e --- /dev/null +++ b/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; +import { renderHandlebarsTemplate } from "./render-handlebars-template"; + +describe("renderHandlebarsTemplate", () => { + it("Returns formatted string, when valid template and data are provided", () => { + expect( + renderHandlebarsTemplate({ + data: { name: "John", hobby: "fishing" }, + template: "Hello, my name is {{ name }}. My hobby is {{ hobby }}.", + }) + ).toStrictEqual("Hello, my name is John. My hobby is fishing."); + }); + it("Throws an error, when provided template is not valid", () => { + expect(() => + renderHandlebarsTemplate({ + data: { name: "John", hobby: "fishing" }, + template: "Hello, my name is {{ name }}. My hobby is {{ hobby", // no closing brackets to trigger an error + }) + ).toThrowError("Could not render the template"); + }); +}); diff --git a/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.ts b/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.ts new file mode 100644 index 0000000..dbe2d6d --- /dev/null +++ b/apps/data-exporter/src/modules/handlebarsTemplates/render-handlebars-template.ts @@ -0,0 +1,24 @@ +// TODO: PF and EAM apps use handlebars. Extract this module to shared package. + +import Handlebars from "handlebars"; +import { createLogger } from "@saleor/apps-shared"; + +const logger = createLogger({ + name: "renderHandlebarsTemplate", +}); + +interface RenderHandlebarsTemplateArgs { + template: string; + data: Record; +} + +export const renderHandlebarsTemplate = ({ template, data }: RenderHandlebarsTemplateArgs) => { + try { + const compiledTemplate = Handlebars.compile(template); + + return compiledTemplate(data); + } catch (error) { + logger.error(error, "Template compilation failed"); + throw new Error("Could not render the template"); + } +}; diff --git a/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.test.ts b/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.test.ts new file mode 100644 index 0000000..41e1ebd --- /dev/null +++ b/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from "vitest"; +import { transformTemplateFormat } from "./transform-template-format"; + +describe("templateTransformer", () => { + it("Returns unchanged string, when no v1 tags are found", () => { + const template = "No changes, {unknownTag}"; + + expect(transformTemplateFormat({ template })).toBe(template); + }); + it("Transforms tags to handlebars format, when template contain any", () => { + const oldTemplate = "Test: {productId} {productName} {productSlug} {variantId} {variantName}"; + const handlebarsTemplate = + "Test: {{ variant.product.id }} {{ variant.product.name }} {{ variant.product.slug }} {{ variant.id }} {{ variant.name }}"; + + expect(transformTemplateFormat({ template: oldTemplate })).toBe(handlebarsTemplate); + }); +}); diff --git a/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.ts b/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.ts new file mode 100644 index 0000000..596445a --- /dev/null +++ b/apps/data-exporter/src/modules/handlebarsTemplates/transform-template-format.ts @@ -0,0 +1,15 @@ +interface transformTemplateFormatArgs { + template: string; +} + +/* + * Transform simple templates to handlebars format. + * Example: `{productID}` will be transformed to `{{ variant. product.id}}`. + */ +export const transformTemplateFormat = ({ template }: transformTemplateFormatArgs) => + template + .replace("{productId}", "{{ variant.product.id }}") + .replace("{productSlug}", "{{ variant.product.slug }}") + .replace("{productName}", "{{ variant.product.name }}") + .replace("{variantId}", "{{ variant.id }}") + .replace("{variantName}", "{{ variant.name }}"); diff --git a/apps/data-exporter/src/modules/metadata-cache/cache-configurator.ts b/apps/data-exporter/src/modules/metadata-cache/cache-configurator.ts new file mode 100644 index 0000000..a272717 --- /dev/null +++ b/apps/data-exporter/src/modules/metadata-cache/cache-configurator.ts @@ -0,0 +1,33 @@ +import { SettingsManager } from "@saleor/app-sdk/settings-manager"; + +export class CacheConfigurator { + private metadataKeyPrefix = "cursor-cache-"; + + constructor(private metadataManager: SettingsManager, private saleorApiUrl: string) {} + + private constructKey(channel: string) { + return this.metadataKeyPrefix + channel; + } + + get({ channel }: { channel: string }): Promise { + return this.metadataManager.get(this.constructKey(channel), this.saleorApiUrl).then((data) => { + if (!data) { + return undefined; + } + + try { + return JSON.parse(data); + } catch (e) { + throw new Error("Invalid metadata value, can't be parsed"); + } + }); + } + + set({ channel, value }: { channel: string; value: string[] }): Promise { + return this.metadataManager.set({ + key: this.constructKey(channel), + value: JSON.stringify(value), + domain: this.saleorApiUrl, + }); + } +} diff --git a/apps/data-exporter/src/modules/metadata-cache/update-cache-for-configurations.ts b/apps/data-exporter/src/modules/metadata-cache/update-cache-for-configurations.ts new file mode 100644 index 0000000..36c81fe --- /dev/null +++ b/apps/data-exporter/src/modules/metadata-cache/update-cache-for-configurations.ts @@ -0,0 +1,33 @@ +import { createLogger } from "@saleor/apps-shared"; +import { CacheConfigurator } from "./cache-configurator"; +import { createSettingsManager } from "../../lib/metadata-manager"; +import { getCursors } from "../google-feed/fetch-product-data"; +import { Client } from "urql"; + +interface UpdateCacheForConfigurationsArgs { + client: Client; + saleorApiUrl: string; + channelsSlugs: string[]; +} + +export const updateCacheForConfigurations = async ({ + client, + channelsSlugs, + saleorApiUrl, +}: UpdateCacheForConfigurationsArgs) => { + const logger = createLogger({ saleorApiUrl: saleorApiUrl }); + + logger.debug("Updating the cursor cache"); + + const cache = new CacheConfigurator(createSettingsManager(client), saleorApiUrl); + + const cacheUpdatePromises = channelsSlugs.map(async (channel) => { + const cursors = await getCursors({ client, channel }); + + await cache.set({ channel, value: cursors }); + }); + + await Promise.all(cacheUpdatePromises); + + logger.debug("Cursor cache updated"); +}; diff --git a/apps/data-exporter/src/modules/metadata-cache/update-cache-on-webhook.ts b/apps/data-exporter/src/modules/metadata-cache/update-cache-on-webhook.ts new file mode 100644 index 0000000..06d12f5 --- /dev/null +++ b/apps/data-exporter/src/modules/metadata-cache/update-cache-on-webhook.ts @@ -0,0 +1,41 @@ +import { GraphqlClientFactory } from "../../lib/create-graphql-client"; +import { updateCacheForConfigurations } from "./update-cache-for-configurations"; +import { AuthData } from "@saleor/app-sdk/APL"; +import { + ProductVariantWebhookPayloadFragment, + ProductWebhookPayloadFragment, +} from "../../../generated/graphql"; +import { NextApiResponse } from "next"; + +type ChannelFragment = + | Pick + | Pick; + +export const updateCacheOnWebhook = async ({ + channels, + authData, + res, +}: { + authData: AuthData; + channels: ChannelFragment; + res: NextApiResponse; +}) => { + const client = GraphqlClientFactory.fromAuthData(authData); + + const channelsSlugs = [ + channels.channel, + ...(channels.channelListings?.map((cl) => cl.channel.slug) ?? []), + ].filter((c) => c) as string[]; + + if (channelsSlugs.length === 0) { + return res.status(200).end(); + } + + await updateCacheForConfigurations({ + channelsSlugs, + client, + saleorApiUrl: authData.saleorApiUrl, + }); + + return res.status(200).end(); +}; diff --git a/apps/data-exporter/src/modules/trpc/middlewares.ts b/apps/data-exporter/src/modules/trpc/middlewares.ts new file mode 100644 index 0000000..b3e9250 --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/middlewares.ts @@ -0,0 +1,32 @@ +import { createLogger } from "@saleor/apps-shared"; +import { middleware } from "./trpc-server"; + +export const attachLogger = middleware(async ({ ctx, next, type, path }) => { + const loggerName = `tRPC ${type} ${path.replace(/\./g, "/")}`; + + const logger = createLogger({ + name: loggerName, + requestType: type, + path, + saleorApiUrl: ctx.saleorApiUrl, + }); + + const start = Date.now(); + + logger.debug(`Requested received`); + + const result = await next({ + ctx: { + logger, + }, + }); + const durationMs = Date.now() - start; + + if (result.ok) { + logger.debug({ durationMs }, `Response successful`); + } else { + logger.debug({ durationMs }, `Response with error`); + } + + return result; +}); diff --git a/apps/data-exporter/src/modules/trpc/protected-client-procedure.ts b/apps/data-exporter/src/modules/trpc/protected-client-procedure.ts new file mode 100644 index 0000000..ea4046b --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/protected-client-procedure.ts @@ -0,0 +1,127 @@ +import { verifyJWT } from "@saleor/app-sdk/verify-jwt"; +import { middleware, procedure } from "./trpc-server"; +import { TRPCError } from "@trpc/server"; +import { ProtectedHandlerError } from "@saleor/app-sdk/handlers/next"; +import { saleorApp } from "../../saleor-app"; +import { createLogger } from "@saleor/apps-shared"; +import { GraphqlClientFactory } from "../../lib/create-graphql-client"; +import { AppConfigMetadataManager } from "../app-configuration/app-config-metadata-manager"; +import { createSettingsManager } from "../../lib/metadata-manager"; +import { AppConfig } from "../app-configuration/app-config"; +import { attachLogger } from "./middlewares"; + +const attachAppToken = middleware(async ({ ctx, next }) => { + const logger = createLogger({ name: "attachAppToken" }); + + if (!ctx.saleorApiUrl) { + logger.debug("ctx.saleorApiUrl not found, throwing"); + + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Missing saleorApiUrl in request", + }); + } + + logger.debug("Getting auth data"); + const authData = await saleorApp.apl.get(ctx.saleorApiUrl); + + if (!authData) { + logger.debug("authData not found, throwing 401"); + + throw new TRPCError({ + code: "UNAUTHORIZED", + message: "Missing auth data", + }); + } + logger.debug("Auth data found, attaching it to the context"); + + return next({ + ctx: { + appToken: authData.token, + saleorApiUrl: authData.saleorApiUrl, + appId: authData.appId, + }, + }); +}); + +const validateClientToken = middleware(async ({ ctx, next, meta }) => { + const logger = createLogger({ name: "validateClientToken" }); + + if (!ctx.token) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Missing token in request. This middleware can be used only in frontend", + }); + } + + if (!ctx.appId) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: "Missing appId in request. This middleware can be used after auth is attached", + }); + } + + if (!ctx.saleorApiUrl) { + throw new TRPCError({ + code: "INTERNAL_SERVER_ERROR", + message: + "Missing saleorApiUrl in request. This middleware can be used after auth is attached", + }); + } + + logger.debug( + { + permissions: meta?.requiredClientPermissions, + }, + "Calling validateClientToken middleware with permissions required", + ); + + try { + await verifyJWT({ + appId: ctx.appId, + token: ctx.token, + saleorApiUrl: ctx.saleorApiUrl, + requiredPermissions: meta?.requiredClientPermissions ?? [], + }); + } catch (e) { + logger.debug("JWT verification failed, throwing"); + throw new ProtectedHandlerError("JWT verification failed: ", "JWT_VERIFICATION_FAILED"); + } + + logger.debug("Token verified"); + return next(); +}); + +/** + * Construct common graphQL client and attach it to the context + * + * Can be used only if called from the frontend (react-query), + * otherwise jwks validation will fail (if createCaller used) + */ +export const protectedClientProcedure = procedure + .use(attachLogger) + .use(attachAppToken) + .use(validateClientToken) + .use(async ({ ctx, next }) => { + const client = GraphqlClientFactory.fromAuthData({ + token: ctx.appToken, + saleorApiUrl: ctx.saleorApiUrl, + }); + + const metadataManager = new AppConfigMetadataManager(createSettingsManager(client)); + + return next({ + ctx: { + apiClient: client, + appToken: ctx.appToken, + saleorApiUrl: ctx.saleorApiUrl, + appId: ctx.appId, + appConfigMetadataManager: metadataManager, + getConfig: async () => { + const metadata = await metadataManager.get(); + + return metadata ? AppConfig.parse(metadata) : new AppConfig(); + }, + }, + }); + }); diff --git a/apps/data-exporter/src/modules/trpc/trpc-app-router.ts b/apps/data-exporter/src/modules/trpc/trpc-app-router.ts new file mode 100644 index 0000000..155fc47 --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/trpc-app-router.ts @@ -0,0 +1,12 @@ +import { channelsRouter } from "../app-configuration/channels/channels.router"; +import { router } from "./trpc-server"; +import { appConfigurationRouter } from "../app-configuration/app-configuration.router"; +import { categoryMappingRouter } from "../category-mapping/category-mapping.router"; + +export const appRouter = router({ + channels: channelsRouter, + appConfiguration: appConfigurationRouter, + categoryMapping: categoryMappingRouter, +}); + +export type AppRouter = typeof appRouter; diff --git a/apps/data-exporter/src/modules/trpc/trpc-client.ts b/apps/data-exporter/src/modules/trpc/trpc-client.ts new file mode 100644 index 0000000..7411da9 --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/trpc-client.ts @@ -0,0 +1,36 @@ +import { httpBatchLink } from "@trpc/client"; +import { createTRPCNext } from "@trpc/next"; + +import { SALEOR_API_URL_HEADER, SALEOR_AUTHORIZATION_BEARER_HEADER } from "@saleor/app-sdk/const"; +import { appBridgeInstance } from "../../pages/_app"; +import { AppRouter } from "./trpc-app-router"; + +function getBaseUrl() { + if (typeof window !== "undefined") return ""; + if (process.env.VERCEL_URL) return `https://${process.env.VERCEL_URL}`; + + return `http://localhost:${process.env.PORT ?? 3000}`; +} + +export const trpcClient = createTRPCNext({ + config({ ctx }) { + return { + links: [ + httpBatchLink({ + url: `${getBaseUrl()}/api/trpc`, + headers() { + return { + /** + * Attach headers from app to client requests, so tRPC can add them to context + */ + [SALEOR_AUTHORIZATION_BEARER_HEADER]: appBridgeInstance?.getState().token, + [SALEOR_API_URL_HEADER]: appBridgeInstance?.getState().saleorApiUrl, + }; + }, + }), + ], + // queryClientConfig: { defaultOptions: { queries: { staleTime: 60 } } }, + }; + }, + ssr: false, +}); diff --git a/apps/data-exporter/src/modules/trpc/trpc-context.ts b/apps/data-exporter/src/modules/trpc/trpc-context.ts new file mode 100644 index 0000000..b524084 --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/trpc-context.ts @@ -0,0 +1,14 @@ +import * as trpcNext from "@trpc/server/adapters/next"; +import { SALEOR_API_URL_HEADER, SALEOR_AUTHORIZATION_BEARER_HEADER } from "@saleor/app-sdk/const"; +import { inferAsyncReturnType } from "@trpc/server"; + +export const createTrpcContext = async ({ res, req }: trpcNext.CreateNextContextOptions) => { + return { + token: req.headers[SALEOR_AUTHORIZATION_BEARER_HEADER] as string | undefined, + saleorApiUrl: req.headers[SALEOR_API_URL_HEADER] as string | undefined, + appId: undefined as undefined | string, + ssr: undefined as undefined | boolean, + }; +}; + +export type TrpcContext = inferAsyncReturnType; diff --git a/apps/data-exporter/src/modules/trpc/trpc-server.ts b/apps/data-exporter/src/modules/trpc/trpc-server.ts new file mode 100644 index 0000000..9a930bd --- /dev/null +++ b/apps/data-exporter/src/modules/trpc/trpc-server.ts @@ -0,0 +1,13 @@ +import { initTRPC } from "@trpc/server"; +import { TrpcContext } from "./trpc-context"; +import { Permission } from "@saleor/app-sdk/types"; + +interface Meta { + requiredClientPermissions?: Permission[]; +} + +const t = initTRPC.context().meta().create(); + +export const router = t.router; +export const procedure = t.procedure; +export const middleware = t.middleware; diff --git a/apps/data-exporter/src/modules/ui/app-section.tsx b/apps/data-exporter/src/modules/ui/app-section.tsx new file mode 100644 index 0000000..c9a61e9 --- /dev/null +++ b/apps/data-exporter/src/modules/ui/app-section.tsx @@ -0,0 +1,36 @@ +import { Box, PropsWithBox, Text } from "@saleor/macaw-ui/next"; +import { ReactNode } from "react"; + +// todo move to shared +export const AppSection = ({ + heading, + sideContent, + mainContent, + includePadding = false, + ...props +}: PropsWithBox<{ + heading: string; + sideContent?: ReactNode; + mainContent: ReactNode; + includePadding?: boolean; +}>) => { + return ( + + + + {heading} + + {sideContent} + + + {mainContent} + + + ); +}; diff --git a/apps/data-exporter/src/modules/ui/paragraph.tsx b/apps/data-exporter/src/modules/ui/paragraph.tsx new file mode 100644 index 0000000..2881f37 --- /dev/null +++ b/apps/data-exporter/src/modules/ui/paragraph.tsx @@ -0,0 +1,3 @@ +import { Text, TextProps } from "@saleor/macaw-ui/next"; + +export const Paragraph = (props: TextProps) => ; diff --git a/apps/data-exporter/src/pages/_app.tsx b/apps/data-exporter/src/pages/_app.tsx new file mode 100644 index 0000000..e1bfe4a --- /dev/null +++ b/apps/data-exporter/src/pages/_app.tsx @@ -0,0 +1,43 @@ +import "@saleor/macaw-ui/next/style"; +import { AppBridge, AppBridgeProvider } from "@saleor/app-sdk/app-bridge"; +import React from "react"; +import { AppProps } from "next/app"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { RoutePropagator } from "@saleor/app-sdk/app-bridge/next"; +import { ThemeSynchronizer } from "../lib/theme-synchronizer"; +import { Box, ThemeProvider } from "@saleor/macaw-ui/next"; +import { NoSSRWrapper } from "@saleor/apps-shared"; +import { trpcClient } from "../modules/trpc/trpc-client"; + +/** + * Ensure instance is a singleton. + */ +export const appBridgeInstance = typeof window !== "undefined" ? new AppBridge() : undefined; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + }, + }, +}); + +function NextApp({ Component, pageProps }: AppProps) { + return ( + + + + + + + + + + + + + + ); +} + +export default trpcClient.withTRPC(NextApp); diff --git a/apps/data-exporter/src/pages/api/feed/[url]/[channel]/google.xml.ts b/apps/data-exporter/src/pages/api/feed/[url]/[channel]/google.xml.ts new file mode 100644 index 0000000..7f97188 --- /dev/null +++ b/apps/data-exporter/src/pages/api/feed/[url]/[channel]/google.xml.ts @@ -0,0 +1,235 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { GoogleFeedProductVariantFragment } from "../../../../../../generated/graphql"; +import { apl } from "../../../../../saleor-app"; +import { createGraphQLClient, createLogger } from "@saleor/apps-shared"; +import { fetchProductData } from "../../../../../modules/google-feed/fetch-product-data"; +import { GoogleFeedSettingsFetcher } from "../../../../../modules/google-feed/get-google-feed-settings"; +import { generateGoogleXmlFeed } from "../../../../../modules/google-feed/generate-google-xml-feed"; +import { fetchShopData } from "../../../../../modules/google-feed/fetch-shop-data"; +import { CacheConfigurator } from "../../../../../modules/metadata-cache/cache-configurator"; +import { createSettingsManager } from "../../../../../lib/metadata-manager"; +import { GraphqlClientFactory } from "../../../../../lib/create-graphql-client"; +import { uploadFile } from "../../../../../modules/file-storage/s3/upload-file"; +import { createS3ClientFromConfiguration } from "../../../../../modules/file-storage/s3/create-s3-client-from-configuration"; +import { getFileDetails } from "../../../../../modules/file-storage/s3/get-file-details"; +import { getDownloadUrl, getFileName } from "../../../../../modules/file-storage/s3/urls-and-names"; +import { RootConfig } from "../../../../../modules/app-configuration/app-config"; +import { z, ZodError } from "zod"; + +// By default we cache the feed for 5 minutes. This can be changed by setting the FEED_CACHE_MAX_AGE +const FEED_CACHE_MAX_AGE = process.env.FEED_CACHE_MAX_AGE + ? parseInt(process.env.FEED_CACHE_MAX_AGE, 10) + : 60 * 5; + +const validateRequestParams = (req: NextApiRequest) => { + const queryShape = z.object({ + url: z.string().url("Valid API URL must be provided"), + channel: z.string().min(1, "Provide valid channel slug"), + }); + + queryShape.parse(req.query); +}; + +/** + * TODO Refactor and test + */ +export const handler = async (req: NextApiRequest, res: NextApiResponse) => { + const url = req.query.url as string; + const channel = req.query.channel as string; + + const logger = createLogger({ + saleorApiUrl: url, + channel, + route: "api/feed/{url}/{channel}/google.xml", + }); + + logger.debug("Feed route visited"); + + try { + validateRequestParams(req); + } catch (e) { + const error = e as ZodError; + + return res.status(400).json({ error: error.flatten().fieldErrors }); + } + + logger.debug("Checking if app is installed in the given env"); + const authData = await apl.get(url as string); + + if (!authData) { + logger.error(`The app has not been configured with the ${url}`); + return res.status(400).json({ error: "The given instance has not been registered" }); + } + + logger.debug("The app is registered for the given URL, checking the configuration"); + + /** + * use unauthorized client to eliminate possibility of spilling the non-public data + */ + const client = createGraphQLClient({ + saleorApiUrl: authData.saleorApiUrl, + token: authData.token, + }); + + if (!client) { + logger.error("Can't create the gql client"); + + return res.status(500).send("Error creating feed"); + } + + let storefrontUrl: string; + let productStorefrontUrl: string; + let bucketConfiguration: RootConfig["s3"] | undefined; + let attributeMapping: RootConfig["attributeMapping"] | undefined; + let titleTemplate: RootConfig["titleTemplate"] | undefined; + let imageSize: RootConfig["imageSize"] | undefined; + + try { + const settingsFetcher = GoogleFeedSettingsFetcher.createFromAuthData(authData); + const settings = await settingsFetcher.fetch(channel); + + storefrontUrl = settings.storefrontUrl; + productStorefrontUrl = settings.productStorefrontUrl; + bucketConfiguration = settings.s3BucketConfiguration; + attributeMapping = settings.attributeMapping; + titleTemplate = settings.titleTemplate; + imageSize = settings.imageSize; + } catch (error) { + logger.warn("The application has not been configured"); + + return res + .status(400) + .json({ error: "Please configure the Google Feed settings at the dashboard" }); + } + + let shopName: string; + let shopDescription: string | undefined; + + try { + const shopDetails = await fetchShopData({ client, channel }); + + shopName = shopDetails.shopName; + shopDescription = shopDetails.shopDescription; + } catch (error) { + logger.error("Could not fetch the shop details"); + + return res.status(500).json({ error: "Could not fetch the shop details" }); + } + + if (bucketConfiguration) { + logger.debug("Bucket configuration found, checking if the feed has been generated recently"); + + const s3Client = createS3ClientFromConfiguration(bucketConfiguration); + const fileName = getFileName({ + saleorApiUrl: authData.saleorApiUrl, + channel, + }); + + const feedLastModificationDate = await getFileDetails({ + s3Client, + bucketName: bucketConfiguration.bucketName, + fileName, + }) + .then((data) => data.LastModified) + // If the file does not exist, error is thrown and we can ignore it + .catch(() => undefined); + + if (feedLastModificationDate) { + logger.debug("Feed has been generated previously, checking the last modification date"); + + const secondsSinceLastModification = (Date.now() - feedLastModificationDate.getTime()) / 1000; + + if (secondsSinceLastModification < FEED_CACHE_MAX_AGE) { + logger.debug("Feed has been generated recently, returning the last version"); + + const downloadUrl = getDownloadUrl({ + s3BucketConfiguration: bucketConfiguration, + saleorApiUrl: authData.saleorApiUrl, + channel, + }); + + return res.redirect(downloadUrl); + } + + logger.debug("Feed is outdated, generating a new one"); + } + } + + logger.debug("Generating a new feed"); + + const cacheClient = GraphqlClientFactory.fromAuthData(authData); + + if (!cacheClient) { + logger.error("Can't create the gql client"); + return res.status(500).end(); + } + + // get cached cursors + const cache = new CacheConfigurator(createSettingsManager(cacheClient), authData.saleorApiUrl); + + const cursors = await cache.get({ channel }); + + // TODO: instead of separate variants, use group id https://support.google.com/merchants/answer/6324507?hl=en + let productVariants: GoogleFeedProductVariantFragment[] = []; + + try { + productVariants = await fetchProductData({ client, channel, cursors, imageSize }); + } catch (error) { + logger.error(error); + return res.status(400).end(); + } + + logger.debug("Product data fetched. Generating the output"); + + const xmlContent = generateGoogleXmlFeed({ + shopDescription, + shopName, + storefrontUrl, + productStorefrontUrl, + productVariants, + attributeMapping, + titleTemplate, + }); + + logger.debug("Feed generated. Returning formatted XML"); + + if (!bucketConfiguration) { + logger.debug("Bucket configuration not found, returning feed directly"); + + res.setHeader("Content-Type", "text/xml"); + res.setHeader("Cache-Control", `s-maxage=${FEED_CACHE_MAX_AGE}`); + res.write(xmlContent); + res.end(); + return; + } + + logger.debug("Bucket configuration found, uploading the feed to S3"); + const s3Client = createS3ClientFromConfiguration(bucketConfiguration); + const fileName = getFileName({ + saleorApiUrl: authData.saleorApiUrl, + channel, + }); + + try { + await uploadFile({ + s3Client, + bucketName: bucketConfiguration.bucketName, + buffer: Buffer.from(xmlContent), + fileName, + }); + + logger.debug("Feed uploaded to S3, redirecting the download URL"); + const downloadUrl = getDownloadUrl({ + s3BucketConfiguration: bucketConfiguration, + saleorApiUrl: authData.saleorApiUrl, + channel, + }); + + return res.redirect(downloadUrl); + } catch (error) { + logger.error("Could not upload the feed to S3"); + return res.status(500).json({ error: "Could not upload the feed to S3" }); + } +}; + +export default handler; diff --git a/apps/data-exporter/src/pages/api/manifest.ts b/apps/data-exporter/src/pages/api/manifest.ts new file mode 100644 index 0000000..a254b13 --- /dev/null +++ b/apps/data-exporter/src/pages/api/manifest.ts @@ -0,0 +1,63 @@ +import { createManifestHandler } from "@saleor/app-sdk/handlers/next"; +import { AppManifest } from "@saleor/app-sdk/types"; + +import packageJson from "../../../package.json"; +import { webhookProductCreated } from "./webhooks/product_created"; +import { webhookProductDeleted } from "./webhooks/product_deleted"; +import { webhookProductVariantCreated } from "./webhooks/product_variant_created"; +import { webhookProductVariantDeleted } from "./webhooks/product_variant_deleted"; +import { webhookProductVariantUpdated } from "./webhooks/product_variant_updated"; + +export default createManifestHandler({ + async manifestFactory({ appBaseUrl }) { + const iframeBaseUrl = process.env.APP_IFRAME_BASE_URL ?? appBaseUrl; + const apiBaseURL = process.env.APP_API_BASE_URL ?? appBaseUrl; + + const popupUrl = new URL("/popup", apiBaseURL).href; + const pageUrl = "/page"; //new URL("/page", apiBaseURL).href; + + const manifest: AppManifest = { + about: "Generate feeds consumed by Merchant Platforms", + appUrl: iframeBaseUrl, + author: "Saleor Commerce", + brand: { + logo: { + default: `${apiBaseURL}/logo.png`, + }, + }, + dataPrivacyUrl: "https://saleor.io/legal/privacy/", + extensions: [ + { + label: "Export orders popup", + mount: "ORDER_OVERVIEW_MORE_ACTIONS", + target: "POPUP", + permissions: ["MANAGE_ORDERS"], + url: popupUrl, + }, + { + label: "Export orders page", + mount: "ORDER_OVERVIEW_MORE_ACTIONS", + target: "APP_PAGE", + permissions: ["MANAGE_ORDERS"], + url: pageUrl, + }, + ], + homepageUrl: "https://github.com/saleor/apps", + id: "saleor.app.data-exporter", + name: "Data Exporter", + permissions: ["MANAGE_PRODUCTS", "MANAGE_ORDERS"], + supportUrl: "https://github.com/saleor/apps/discussions", + tokenTargetUrl: `${apiBaseURL}/api/register`, + version: packageJson.version, + webhooks: [ + webhookProductCreated.getWebhookManifest(apiBaseURL), + webhookProductDeleted.getWebhookManifest(apiBaseURL), + webhookProductVariantCreated.getWebhookManifest(apiBaseURL), + webhookProductVariantDeleted.getWebhookManifest(apiBaseURL), + webhookProductVariantUpdated.getWebhookManifest(apiBaseURL), + ], + }; + + return manifest; + }, +}); diff --git a/apps/data-exporter/src/pages/api/register.ts b/apps/data-exporter/src/pages/api/register.ts new file mode 100644 index 0000000..382f71a --- /dev/null +++ b/apps/data-exporter/src/pages/api/register.ts @@ -0,0 +1,24 @@ +import { createAppRegisterHandler } from "@saleor/app-sdk/handlers/next"; + +import { saleorApp } from "../../saleor-app"; + +const allowedUrlsPattern = process.env.ALLOWED_DOMAIN_PATTERN; + +/** + * Required endpoint, called by Saleor to install app. + * It will exchange tokens with app, so saleorApp.apl will contain token + */ +export default createAppRegisterHandler({ + apl: saleorApp.apl, + allowedSaleorUrls: [ + (url) => { + if (allowedUrlsPattern) { + const regex = new RegExp(allowedUrlsPattern); + + return regex.test(url); + } + + return true; + }, + ], +}); diff --git a/apps/data-exporter/src/pages/api/trpc/[trpc].ts b/apps/data-exporter/src/pages/api/trpc/[trpc].ts new file mode 100644 index 0000000..80bfedf --- /dev/null +++ b/apps/data-exporter/src/pages/api/trpc/[trpc].ts @@ -0,0 +1,18 @@ +import * as trpcNext from "@trpc/server/adapters/next"; +import { createTrpcContext } from "../../../modules/trpc/trpc-context"; +import { appRouter } from "../../../modules/trpc/trpc-app-router"; +import { createLogger } from "@saleor/apps-shared"; + +const logger = createLogger({ name: "tRPC error" }); + +export default trpcNext.createNextApiHandler({ + router: appRouter, + createContext: createTrpcContext, + onError: ({ path, error }) => { + if (error.code === "INTERNAL_SERVER_ERROR") { + logger.error(error, `${path} returned error:`); + return; + } + logger.debug(error, `${path} returned error:`); + }, +}); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_created.ts b/apps/data-exporter/src/pages/api/webhooks/product_created.ts new file mode 100644 index 0000000..d06aa92 --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_created.ts @@ -0,0 +1,41 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { createLogger } from "@saleor/apps-shared"; +import { saleorApp } from "../../../saleor-app"; +import { + ProductCreatedDocument, + ProductWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductCreated = new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_created", + event: "PRODUCT_CREATED", + apl: saleorApp.apl, + query: ProductCreatedDocument, + // todo make it disabled by default, enable when app is configured + isActive: true, +}); + +const logger = createLogger({ + service: "webhook-product_created", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductCreated.createHandler(handler); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_deleted.ts b/apps/data-exporter/src/pages/api/webhooks/product_deleted.ts new file mode 100644 index 0000000..98c94dc --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_deleted.ts @@ -0,0 +1,40 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { + ProductDeletedDocument, + ProductWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { saleorApp } from "../../../saleor-app"; +import { createLogger } from "@saleor/apps-shared"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductDeleted = new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_deleted", + event: "PRODUCT_DELETED", + apl: saleorApp.apl, + query: ProductDeletedDocument, + isActive: true, +}); + +const logger = createLogger({ + service: "webhook_product_deleted", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductDeleted.createHandler(handler); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_updated.ts b/apps/data-exporter/src/pages/api/webhooks/product_updated.ts new file mode 100644 index 0000000..8c03561 --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_updated.ts @@ -0,0 +1,40 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { + ProductUpdatedDocument, + ProductWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { saleorApp } from "../../../saleor-app"; +import { createLogger } from "@saleor/apps-shared"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductUpdated = new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_updated", + event: "PRODUCT_UPDATED", + apl: saleorApp.apl, + query: ProductUpdatedDocument, + isActive: true, +}); + +const logger = createLogger({ + service: "webhookProductUpdatedWebhookHandler", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductUpdated.createHandler(handler); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_variant_created.ts b/apps/data-exporter/src/pages/api/webhooks/product_variant_created.ts new file mode 100644 index 0000000..30c2a54 --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_variant_created.ts @@ -0,0 +1,41 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { + ProductVariantCreatedDocument, + ProductVariantWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { saleorApp } from "../../../saleor-app"; +import { createLogger } from "@saleor/apps-shared"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductVariantCreated = + new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_variant_created", + event: "PRODUCT_VARIANT_CREATED", + apl: saleorApp.apl, + query: ProductVariantCreatedDocument, + isActive: true, + }); + +const logger = createLogger({ + service: "PRODUCT_VARIANT_CREATED webhook", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductVariantCreated.createHandler(handler); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_variant_deleted.ts b/apps/data-exporter/src/pages/api/webhooks/product_variant_deleted.ts new file mode 100644 index 0000000..533b73f --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_variant_deleted.ts @@ -0,0 +1,41 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { createLogger } from "@saleor/apps-shared"; +import { + ProductVariantDeletedDocument, + ProductVariantWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { saleorApp } from "../../../saleor-app"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductVariantDeleted = + new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_variant_deleted", + event: "PRODUCT_VARIANT_DELETED", + apl: saleorApp.apl, + query: ProductVariantDeletedDocument, + isActive: true, + }); + +const logger = createLogger({ + service: "PRODUCT_VARIANT_DELETED", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductVariantDeleted.createHandler(handler); diff --git a/apps/data-exporter/src/pages/api/webhooks/product_variant_updated.ts b/apps/data-exporter/src/pages/api/webhooks/product_variant_updated.ts new file mode 100644 index 0000000..f932bc9 --- /dev/null +++ b/apps/data-exporter/src/pages/api/webhooks/product_variant_updated.ts @@ -0,0 +1,41 @@ +import { NextWebhookApiHandler, SaleorAsyncWebhook } from "@saleor/app-sdk/handlers/next"; +import { createLogger } from "@saleor/apps-shared"; +import { + ProductVariantUpdatedDocument, + ProductVariantWebhookPayloadFragment, +} from "../../../../generated/graphql"; +import { saleorApp } from "../../../saleor-app"; +import { updateCacheOnWebhook } from "../../../modules/metadata-cache/update-cache-on-webhook"; + +export const config = { + api: { + bodyParser: false, + }, +}; + +export const webhookProductVariantUpdated = + new SaleorAsyncWebhook({ + webhookPath: "api/webhooks/product_variant_updated", + event: "PRODUCT_VARIANT_UPDATED", + apl: saleorApp.apl, + query: ProductVariantUpdatedDocument, + isActive: true, + }); + +const logger = createLogger({ + service: "webhookProductVariantUpdatedWebhookHandler", +}); + +export const handler: NextWebhookApiHandler = async ( + req, + res, + context +) => { + await updateCacheOnWebhook({ + authData: context.authData, + channels: context.payload, + res, + }); +}; + +export default webhookProductVariantUpdated.createHandler(handler); diff --git a/apps/data-exporter/src/pages/categories.tsx b/apps/data-exporter/src/pages/categories.tsx new file mode 100644 index 0000000..6f14a3f --- /dev/null +++ b/apps/data-exporter/src/pages/categories.tsx @@ -0,0 +1,25 @@ +import { NextPage } from "next"; +import { Breadcrumbs } from "@saleor/apps-ui"; +import { Box, Text } from "@saleor/macaw-ui/next"; +import dynamic from "next/dynamic"; + +const DynamicCategoryMapping = dynamic( + () => import("../modules/category-mapping/ui/category-mapping").then((m) => m.CategoryMapping), + { + loading: () => Loading..., + } +); + +const CategoriesPage: NextPage = () => { + return ( + + + Configuration + Categories Mapping + + + + ); +}; + +export default CategoriesPage; diff --git a/apps/data-exporter/src/pages/configuration.tsx b/apps/data-exporter/src/pages/configuration.tsx new file mode 100644 index 0000000..0c6f8d9 --- /dev/null +++ b/apps/data-exporter/src/pages/configuration.tsx @@ -0,0 +1,244 @@ +import { NextPage } from "next"; +import React from "react"; + +import { useChannelsExistenceChecking } from "../modules/app-configuration/channels/use-channels-existence-checking"; +import { Box, Button, Text } from "@saleor/macaw-ui/next"; +import { AppSection } from "../modules/ui/app-section"; +import { Paragraph } from "../modules/ui/paragraph"; +import { TextLink } from "@saleor/apps-ui"; +import { ConnectedS3ConfigurationForm } from "../modules/app-configuration/s3-configuration-form"; +import { ChannelsConfigAccordion } from "../modules/app-configuration/channels-config-accordion"; +import { useRouter } from "next/router"; +import { CategoryMappingPreview } from "../modules/category-mapping/ui/category-mapping-preview"; +import { ConnectedAttributeMappingForm } from "../modules/app-configuration/attribute-mapping-form"; +import { ConnectedTitleFormattingForm } from "../modules/app-configuration/title-formatting-form"; +import { ConnectedImageConfigurationForm } from "../modules/app-configuration/image-configuration-form"; + +const ConfigurationPage: NextPage = () => { + useChannelsExistenceChecking(); + const { push } = useRouter(); + + return ( + + + + Configuration + + + Configure app to enable Product Feed, that{" "} + + Google Merchant Center + {" "} + can consume + + + Check{" "} + + this article how to configure feed + + + + } + sideContent={ + + + Your product database can be quite large. To generate a big XML file, we need to put + it somewhere so Google can consume it. You need to generate an S3 bucket with public + read access and provide its credentials to the app. + + + Please use this bucket only for XMLs. They meant to be public - but other files may + leak if you put them to the same bucket. + + + Read about generating AWS credentials{" "} + + here + + + + } + /> + + + + } + sideContent={ + + App will generate separate feed for each channel + + Provide your storefront homepage URL and product template. Use{" "} + + Handlebars + {" "} + format. Example of the variables you can use: + +
    +
  • + + {"{{ variant.product.slug }}"} - product `slug` + +
  • +
  • + + {"{{ variant.id }}"} - product variant id + +
  • +
+ For example following pattern: + + {"https://my-shop.com/p/{{ variant.product.slug}/{{ variant.id }}"} + + Will produce: + + {"https://my-shop.com/p/t-shirt/Xyp2asZ"} + +
+ } + /> + + + + } + sideContent={ + + + Customize title of the products. Use{" "} + + Handlebars + {" "} + format. + + + Item title specification. + + + } + /> + + + + + + + } + sideContent={ + + + Map Saleor categories to pre-defined Google categories. It is not required.{" "} + + Read more + + + + } + /> + } + sideContent={ + + + Choose which product attributes should be used for the feed. If product has multiple + attribute values, for example "Primary color" and "Secondary + color", both values will be used according to Google guidelines: + +
    +
  • + + Brand + +
  • +
  • + + Color + +
  • +
  • + + Material + +
  • +
  • + + Pattern + +
  • +
  • + + Size + +
  • +
+
+ } + /> + + } + sideContent={ + + + Configure size of the images submitted in the feed. + +
    +
  • + + Image link documentation + +
  • +
+
+ } + /> + + ); +}; + +export default ConfigurationPage; diff --git a/apps/data-exporter/src/pages/index.tsx b/apps/data-exporter/src/pages/index.tsx new file mode 100644 index 0000000..bc9b5f4 --- /dev/null +++ b/apps/data-exporter/src/pages/index.tsx @@ -0,0 +1,35 @@ +import { NextPage } from "next"; +import { useAppBridge } from "@saleor/app-sdk/app-bridge"; +import { useEffect } from "react"; +import { useIsMounted } from "usehooks-ts"; +import { useRouter } from "next/router"; +import { isInIframe } from "@saleor/apps-shared"; +import { Text } from "@saleor/macaw-ui/next"; + +const IndexPage: NextPage = () => { + const { appBridgeState } = useAppBridge(); + const isMounted = useIsMounted(); + const { replace } = useRouter(); + + useEffect(() => { + if (isMounted() && appBridgeState?.ready) { + replace("/configuration"); + } + }, [isMounted, appBridgeState?.ready]); + + if (isInIframe()) { + return Loading...; + } + + return ( +
+ + Saleor Product Feed + + This is Saleor App that allows product feed generation + Install app in your Saleor instance and open in with Dashboard +
+ ); +}; + +export default IndexPage; diff --git a/apps/data-exporter/src/pages/not-ready.tsx b/apps/data-exporter/src/pages/not-ready.tsx new file mode 100644 index 0000000..71a1442 --- /dev/null +++ b/apps/data-exporter/src/pages/not-ready.tsx @@ -0,0 +1,31 @@ +import { Box, Button, Text } from "@saleor/macaw-ui/next"; +import React from "react"; +import { actions, useAppBridge } from "@saleor/app-sdk/app-bridge"; + +const NotReadyPage = () => { + const { appBridge } = useAppBridge(); + + return ( +
+

Saleor Product Feed App

+ + App can not be used + To configure Product Feed App you need to create at least 1 channel + + +
+ ); +}; + +export default NotReadyPage; diff --git a/apps/data-exporter/src/pages/page.tsx b/apps/data-exporter/src/pages/page.tsx new file mode 100644 index 0000000..df32b46 --- /dev/null +++ b/apps/data-exporter/src/pages/page.tsx @@ -0,0 +1,24 @@ +import { NextPage } from "next"; +import React from "react"; + +import { Box, Text } from "@saleor/macaw-ui/next"; + +const PagePage: NextPage = () => { + return ( + + + + Page extension + + + + ); +}; + +export default PagePage; diff --git a/apps/data-exporter/src/pages/popup.tsx b/apps/data-exporter/src/pages/popup.tsx new file mode 100644 index 0000000..837d6e5 --- /dev/null +++ b/apps/data-exporter/src/pages/popup.tsx @@ -0,0 +1,24 @@ +import { NextPage } from "next"; +import React from "react"; + +import { Box, Text } from "@saleor/macaw-ui/next"; + +const PopupPage: NextPage = () => { + return ( + + + + Popup page + + + + ); +}; + +export default PopupPage; diff --git a/apps/data-exporter/src/saleor-app.ts b/apps/data-exporter/src/saleor-app.ts new file mode 100644 index 0000000..67fb20d --- /dev/null +++ b/apps/data-exporter/src/saleor-app.ts @@ -0,0 +1,35 @@ +import { APL, FileAPL, SaleorCloudAPL, UpstashAPL } from "@saleor/app-sdk/APL"; +import { SaleorApp } from "@saleor/app-sdk/saleor-app"; + +const aplType = process.env.APL ?? "file"; + +export let apl: APL; + +switch (aplType) { + case "upstash": + apl = new UpstashAPL(); + + break; + case "file": + apl = new FileAPL(); + + break; + case "saleor-cloud": { + if (!process.env.REST_APL_ENDPOINT || !process.env.REST_APL_TOKEN) { + throw new Error("Rest APL is not configured - missing env variables. Check saleor-app.ts"); + } + + apl = new SaleorCloudAPL({ + resourceUrl: process.env.REST_APL_ENDPOINT, + token: process.env.REST_APL_TOKEN, + }); + + break; + } + default: { + throw new Error("Invalid APL config, "); + } +} +export const saleorApp = new SaleorApp({ + apl, +}); diff --git a/apps/data-exporter/src/setup-tests.ts b/apps/data-exporter/src/setup-tests.ts new file mode 100644 index 0000000..5f1e198 --- /dev/null +++ b/apps/data-exporter/src/setup-tests.ts @@ -0,0 +1,6 @@ +/** + * Add test setup logic here + * + * https://vitest.dev/config/#setupfiles + */ +export {}; diff --git a/apps/data-exporter/tsconfig.json b/apps/data-exporter/tsconfig.json new file mode 100644 index 0000000..99710e8 --- /dev/null +++ b/apps/data-exporter/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/apps/data-exporter/turbo.json b/apps/data-exporter/turbo.json new file mode 100644 index 0000000..1479d14 --- /dev/null +++ b/apps/data-exporter/turbo.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://turbo.build/schema.json", + "extends": ["//"], + "pipeline": { + "build": { + "env": [ + "APL", + "APP_DEBUG", + "NODE_ENV", + "SECRET_KEY", + "ALLOWED_DOMAIN_PATTERN", + "REST_APL_ENDPOINT", + "REST_APL_TOKEN", + "NEXT_PUBLIC_SENTRY_DSN", + "SENTRY_DSN", + "SENTRY_ORG", + "SENTRY_PROJECT", + "SENTRY_AUTH_TOKEN", + "NEXT_PUBLIC_VERCEL_ENV", + "FEED_CACHE_MAX_AGE", + "VERCEL_URL", + "PORT", + "SENTRY_ENVIRONMENT", + "APP_IFRAME_BASE_URL", + "APP_API_BASE_URL" + ] + } + } +} diff --git a/apps/data-exporter/vitest.config.ts b/apps/data-exporter/vitest.config.ts new file mode 100644 index 0000000..1dde5bc --- /dev/null +++ b/apps/data-exporter/vitest.config.ts @@ -0,0 +1,13 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vitest/config"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + test: { + passWithNoTests: true, + environment: "jsdom", + setupFiles: "./src/setup-tests.ts", + css: false, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8c02314..aa12c93 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -338,6 +338,151 @@ importers: specifier: 5.1.6 version: 5.1.6 + apps/data-exporter: + dependencies: + '@aws-sdk/client-s3': + specifier: ^3.332.0 + version: 3.332.0 + '@hookform/resolvers': + specifier: ^3.3.1 + version: 3.3.1(react-hook-form@7.44.3) + '@saleor/app-sdk': + specifier: 0.43.1 + version: 0.43.1(graphql@16.7.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0) + '@saleor/apps-shared': + specifier: workspace:* + version: link:../../packages/shared + '@saleor/apps-ui': + specifier: workspace:* + version: link:../../packages/ui + '@saleor/macaw-ui': + specifier: 0.8.0-pre.127 + version: 0.8.0-pre.127(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) + '@saleor/react-hook-form-macaw': + specifier: workspace:* + version: link:../../packages/react-hook-form-macaw + '@sentry/nextjs': + specifier: 7.67.0 + version: 7.67.0(next@13.4.8)(react@18.2.0) + '@tanstack/react-query': + specifier: 4.29.19 + version: 4.29.19(react-dom@18.2.0)(react@18.2.0) + '@trpc/client': + specifier: 10.38.1 + version: 10.38.1(@trpc/server@10.38.1) + '@trpc/next': + specifier: 10.38.1 + version: 10.38.1(@tanstack/react-query@4.29.19)(@trpc/client@10.38.1)(@trpc/react-query@10.38.1)(@trpc/server@10.38.1)(next@13.4.8)(react-dom@18.2.0)(react@18.2.0) + '@trpc/react-query': + specifier: 10.38.1 + version: 10.38.1(@tanstack/react-query@4.29.19)(@trpc/client@10.38.1)(@trpc/server@10.38.1)(react-dom@18.2.0)(react@18.2.0) + '@trpc/server': + specifier: 10.38.1 + version: 10.38.1 + '@urql/exchange-auth': + specifier: ^2.1.4 + version: 2.1.4(graphql@16.7.1) + '@vitejs/plugin-react': + specifier: 4.0.4 + version: 4.0.4(vite@4.4.8) + fast-xml-parser: + specifier: ^4.0.15 + version: 4.0.15 + graphql: + specifier: 16.7.1 + version: 16.7.1 + graphql-tag: + specifier: ^2.12.6 + version: 2.12.6(graphql@16.7.1) + handlebars: + specifier: ^4.7.7 + version: 4.7.7 + jsdom: + specifier: ^20.0.3 + version: 20.0.3 + next: + specifier: 13.4.8 + version: 13.4.8(@babel/core@7.22.17)(react-dom@18.2.0)(react@18.2.0) + pino: + specifier: ^8.14.1 + version: 8.14.1 + pino-pretty: + specifier: ^10.0.0 + version: 10.0.0 + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + react-hook-form: + specifier: ^7.43.9 + version: 7.44.3(react@18.2.0) + react-is: + specifier: ^18.2.0 + version: 18.2.0 + urql: + specifier: ^4.0.4 + version: 4.0.4(graphql@16.7.1)(react@18.2.0) + usehooks-ts: + specifier: ^2.9.1 + version: 2.9.1(react-dom@18.2.0)(react@18.2.0) + vite: + specifier: 4.4.8 + version: 4.4.8(@types/node@18.15.3) + vitest: + specifier: 0.34.1 + version: 0.34.1(jsdom@20.0.3) + zod: + specifier: 3.21.4 + version: 3.21.4 + devDependencies: + '@graphql-codegen/cli': + specifier: 5.0.0 + version: 5.0.0(@babel/core@7.22.17)(@types/node@18.15.3)(graphql@16.7.1) + '@graphql-codegen/introspection': + specifier: 4.0.0 + version: 4.0.0(graphql@16.7.1) + '@graphql-codegen/schema-ast': + specifier: 4.0.0 + version: 4.0.0(graphql@16.7.1) + '@graphql-codegen/typed-document-node': + specifier: 5.0.1 + version: 5.0.1(graphql@16.7.1) + '@graphql-codegen/typescript': + specifier: 4.0.1 + version: 4.0.1(graphql@16.7.1) + '@graphql-codegen/typescript-operations': + specifier: 4.0.1 + version: 4.0.1(graphql@16.7.1) + '@graphql-codegen/typescript-urql': + specifier: 3.7.3 + version: 3.7.3(graphql-tag@2.12.6)(graphql@16.7.1) + '@graphql-typed-document-node/core': + specifier: 3.2.0 + version: 3.2.0(graphql@16.7.1) + '@testing-library/react': + specifier: ^14.0.0 + version: 14.0.0(react-dom@18.2.0)(react@18.2.0) + '@testing-library/react-hooks': + specifier: ^8.0.1 + version: 8.0.1(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) + '@types/react': + specifier: 18.2.5 + version: 18.2.5 + '@types/react-dom': + specifier: 18.2.5 + version: 18.2.5 + eslint: + specifier: 8.46.0 + version: 8.46.0 + eslint-config-saleor: + specifier: workspace:* + version: link:../../packages/eslint-config-saleor + typescript: + specifier: 5.1.6 + version: 5.1.6 + apps/data-importer: dependencies: '@material-ui/core': @@ -2076,13 +2221,13 @@ packages: peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/generator': 7.22.15 '@babel/parser': 7.22.16 '@babel/runtime': 7.22.15 '@babel/traverse': 7.22.17 '@babel/types': 7.22.17 - babel-preset-fbjs: 3.4.0(@babel/core@7.22.11) + babel-preset-fbjs: 3.4.0(@babel/core@7.22.17) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 @@ -2255,7 +2400,7 @@ packages: '@aws-sdk/util-waiter': 3.329.0 '@aws-sdk/xml-builder': 3.310.0 fast-xml-parser: 4.1.2 - tslib: 2.5.3 + tslib: 2.6.2 transitivePeerDependencies: - '@aws-sdk/signature-v4-crt' - aws-crt @@ -3097,32 +3242,9 @@ packages: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.22.13 '@babel/generator': 7.22.15 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.21.8) - '@babel/helpers': 7.22.11 - '@babel/parser': 7.22.16 - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/core@7.22.11: - resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.22.15 - '@babel/helper-compilation-targets': 7.22.10 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) - '@babel/helpers': 7.22.11 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.8) + '@babel/helpers': 7.22.15 '@babel/parser': 7.22.16 '@babel/template': 7.22.15 '@babel/traverse': 7.22.17 @@ -3246,17 +3368,6 @@ packages: '@babel/types': 7.22.17 dev: true - /@babel/helper-compilation-targets@7.22.10: - resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.9 - '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.10 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-compilation-targets@7.22.15: resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} engines: {node: '>=6.9.0'} @@ -3289,7 +3400,7 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.9 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 @@ -3314,13 +3425,13 @@ packages: - supports-color dev: true - /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.11): + /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 @@ -3384,7 +3495,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -3400,7 +3511,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -3445,6 +3556,21 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.17 + dev: true + + /@babel/helper-module-transforms@7.22.17(@babel/core@7.21.8): + resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.8 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 + dev: true /@babel/helper-module-transforms@7.22.17(@babel/core@7.22.17): resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} @@ -3459,6 +3585,20 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.15 + /@babel/helper-module-transforms@7.22.17(@babel/core@7.22.5): + resolution: {integrity: sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.15 + dev: true + /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} @@ -3475,48 +3615,6 @@ packages: - supports-color dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.21.8): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.8 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.11 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 - dev: true - - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.5): - resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.15 - dev: true - /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} @@ -3525,7 +3623,7 @@ packages: dependencies: '@babel/core': 7.22.9 '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.15 @@ -3619,6 +3717,7 @@ packages: /@babel/helper-validator-option@7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-wrap-function@7.22.5: resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==} @@ -3632,17 +3731,6 @@ packages: - supports-color dev: true - /@babel/helpers@7.22.11: - resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.22.17 - '@babel/types': 7.22.17 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helpers@7.22.15: resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} engines: {node: '>=6.9.0'} @@ -3767,6 +3855,7 @@ packages: /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.21.8): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -3777,14 +3866,15 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.17): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.22.17 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.17) '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color @@ -3859,15 +3949,15 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.8) dev: true - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.11): + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.17): resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.17) dev: true /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.8): @@ -3884,29 +3974,31 @@ packages: /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.8): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.21.8 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.21.8) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.21.8) dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.11): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.17): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: '@babel/compat-data': 7.22.9 - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/core': 7.22.17 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.17) dev: true /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.8): @@ -3932,16 +4024,16 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.8) dev: true - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.11): + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.17): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.17) dev: true /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.8): @@ -4030,12 +4122,12 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.17): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4104,13 +4196,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4190,13 +4282,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4227,12 +4319,12 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.17): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4272,12 +4364,12 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.17): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4317,12 +4409,12 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.17): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4375,13 +4467,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4406,13 +4498,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4448,7 +4540,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.21.8) transitivePeerDependencies: @@ -4462,7 +4554,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.22.5(@babel/core@7.22.5) transitivePeerDependencies: @@ -4479,13 +4571,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4509,13 +4601,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-block-scoping@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4564,7 +4656,7 @@ packages: dependencies: '@babel/core': 7.21.8 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 @@ -4576,15 +4668,15 @@ packages: - supports-color dev: true - /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-classes@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 @@ -4604,7 +4696,7 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-function-name': 7.22.5 '@babel/helper-optimise-call-expression': 7.22.5 @@ -4627,13 +4719,13 @@ packages: '@babel/template': 7.22.15 dev: true - /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.22.15 dev: true @@ -4659,13 +4751,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-destructuring@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4765,15 +4857,15 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.5) dev: true - /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.17) dev: true /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.21.8): @@ -4786,13 +4878,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4813,19 +4905,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/core': 7.22.17 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4837,7 +4929,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-function-name': 7.22.5 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4863,13 +4955,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4904,13 +4996,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4931,7 +5023,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4942,7 +5034,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -4953,19 +5045,19 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true - /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-modules-commonjs@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/core': 7.22.17 + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true @@ -4977,7 +5069,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.22.5 dev: true @@ -4990,7 +5082,7 @@ packages: dependencies: '@babel/core': 7.21.8 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.15 dev: true @@ -5003,7 +5095,7 @@ packages: dependencies: '@babel/core': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.22.15 dev: true @@ -5015,7 +5107,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.8 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.21.8) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.21.8) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5026,7 +5118,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.5) + '@babel/helper-module-transforms': 7.22.17(@babel/core@7.22.5) '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5102,7 +5194,7 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) @@ -5121,13 +5213,13 @@ packages: - supports-color dev: true - /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-replace-supers': 7.22.5 transitivePeerDependencies: @@ -5192,13 +5284,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5250,13 +5342,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5270,23 +5362,23 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5299,13 +5391,13 @@ packages: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5318,17 +5410,17 @@ packages: '@babel/core': 7.22.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) '@babel/types': 7.22.17 dev: true @@ -5384,13 +5476,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5415,13 +5507,13 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true - /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true @@ -5467,13 +5559,13 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 dev: true @@ -5507,17 +5599,17 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true - /@babel/plugin-transform-typescript@7.22.5(@babel/core@7.22.11): + /@babel/plugin-transform-typescript@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.11) + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.17) '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.17) transitivePeerDependencies: - supports-color dev: true @@ -5594,9 +5686,9 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.21.8 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.21.8) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.21.8) '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.21.8) @@ -5681,9 +5773,9 @@ packages: dependencies: '@babel/compat-data': 7.22.9 '@babel/core': 7.22.5 - '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 + '@babel/helper-validator-option': 7.22.15 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.5) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.5) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.5) @@ -5764,16 +5856,16 @@ packages: - supports-color dev: true - /@babel/preset-flow@7.22.5(@babel/core@7.22.11): + /@babel/preset-flow@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.11) + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.17) dev: true /@babel/preset-modules@0.1.5(@babel/core@7.21.8): @@ -5802,29 +5894,29 @@ packages: esutils: 2.0.3 dev: true - /@babel/preset-typescript@7.22.5(@babel/core@7.22.11): + /@babel/preset-typescript@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.22.5 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.22.11) + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-typescript': 7.22.5(@babel/core@7.22.17) transitivePeerDependencies: - supports-color dev: true - /@babel/register@7.22.5(@babel/core@7.22.11): + /@babel/register@7.22.5(@babel/core@7.22.17): resolution: {integrity: sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -5841,6 +5933,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 + dev: true /@babel/runtime@7.22.15: resolution: {integrity: sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==} @@ -6535,7 +6628,7 @@ packages: /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: - '@babel/helper-module-imports': 7.22.5 + '@babel/helper-module-imports': 7.22.15 '@babel/runtime': 7.22.15 '@emotion/hash': 0.9.1 '@emotion/memoize': 0.8.1 @@ -7436,7 +7529,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.0(graphql@16.7.1) + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1) '@graphql-tools/utils': 10.0.4(graphql@16.7.1) graphql: 16.7.1 tslib: 2.5.3 @@ -7533,7 +7626,7 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.0(graphql@16.7.1) + '@graphql-codegen/plugin-helpers': 5.0.1(graphql@16.7.1) '@graphql-tools/optimize': 2.0.0(graphql@16.7.1) '@graphql-tools/relay-operation-optimizer': 7.0.0(graphql@16.7.1) '@graphql-tools/utils': 10.0.4(graphql@16.7.1) @@ -8050,7 +8143,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 @@ -8627,7 +8720,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) @@ -8675,7 +8768,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -8778,7 +8871,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -8848,7 +8941,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -8960,7 +9053,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -9023,7 +9116,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.5 '@types/react-dom': 18.2.5 @@ -9084,7 +9177,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -9141,7 +9234,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) @@ -9195,7 +9288,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.5)(@types/react@18.2.5)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -9217,7 +9310,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.5)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.5)(react@18.2.0) @@ -9797,8 +9890,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.22.17 + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.17) '@jest/transform': 29.5.0 '@mdx-js/react': 2.3.0(react@18.2.0) '@storybook/blocks': 7.0.12(react-dom@18.2.0)(react@18.2.0) @@ -10143,7 +10236,7 @@ packages: resolution: {integrity: sha512-OABCRIujxsszIJ0CCpKg8Uj4C1UlAwBpBQhv2aMX3lA/pur6Od524syv2ypWu6J2FyvK/ooeyMbjoP7330cIuA==} hasBin: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/preset-env': 7.22.5(@babel/core@7.22.5) '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.0.12 @@ -10369,7 +10462,7 @@ packages: /@storybook/docs-tools@7.0.12: resolution: {integrity: sha512-+HykeQLgjyDyF9G7HqY0FHXlX7X5YpQcmNjftJzBrc/GO1EeO0M78d54avcOPyyTfuWOh7oZtSJ0MzjA1qrqaQ==} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@storybook/core-common': 7.0.12 '@storybook/preview-api': 7.0.12 '@storybook/types': 7.0.12 @@ -10699,7 +10792,7 @@ packages: engines: {node: '>=14'} dependencies: '@babel/code-frame': 7.22.10 - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 '@types/aria-query': 5.0.1 aria-query: 5.1.3 chalk: 4.1.2 @@ -11442,7 +11535,7 @@ packages: /@vanilla-extract/babel-plugin-debug-ids@1.0.3: resolution: {integrity: sha512-vm4jYu1xhSa6ofQ9AhIpR3DkAp4c+eoR1Rpm8/TQI4DmWbmGbOjYRcqV0aWsfaIlNhN4kFuxFMKBNN9oG6iRzA==} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 transitivePeerDependencies: - supports-color dev: true @@ -11469,8 +11562,8 @@ packages: /@vanilla-extract/integration@6.2.1(@types/node@18.15.3): resolution: {integrity: sha512-+xYJz07G7TFAMZGrOqArOsURG+xcYvqctujEkANjw2McCBvGEK505RxQqOuNiA9Mi9hgGdNp2JedSa94f3eoLg==} dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.22.17 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.17) '@vanilla-extract/babel-plugin-debug-ids': 1.0.3 '@vanilla-extract/css': 1.11.1 esbuild: 0.17.6 @@ -11525,9 +11618,9 @@ packages: peerDependencies: vite: ^4.1.0-beta.0 dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.22.17 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.17) magic-string: 0.27.0 react-refresh: 0.14.0 vite: 4.4.8(@types/node@18.15.3) @@ -12347,12 +12440,12 @@ packages: resolution: {integrity: sha512-L3nSu8GgF4iEyNYakCQSfL2F5GI5aCXcot9mNTf+4N0/BMhpxqqHyOb6jIR24iq2xLjQZLG8FOt3gnUcV+9NVg==} dev: false - /babel-core@7.0.0-bridge.0(@babel/core@7.22.11): + /babel-core@7.0.0-bridge.0(@babel/core@7.22.17): resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 dev: true /babel-plugin-istanbul@6.1.1: @@ -12453,38 +12546,38 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.22.11): + /babel-preset-fbjs@3.4.0(@babel/core@7.22.17): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.22.11 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.11) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) - '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.11) - '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.11) + '@babel/core': 7.22.17 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.17) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.17) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.17) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.17) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.17) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.17) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color @@ -12720,7 +12813,7 @@ packages: streamsearch: 1.1.0 /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} engines: {node: '>= 0.8'} dev: true @@ -13265,7 +13358,7 @@ packages: dev: false /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} /concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -14089,7 +14182,7 @@ packages: peerDependencies: react: '>=16.12.0' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 compute-scroll-into-view: 1.0.20 prop-types: 15.8.1 react: 18.2.0 @@ -14258,7 +14351,7 @@ packages: string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 + which-typed-array: 1.1.11 dev: true /es-abstract@1.22.1: @@ -16647,7 +16740,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/parser': 7.22.16 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -16836,17 +16929,17 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/parser': 7.22.16 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.17) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.17) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.17) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.17) '@babel/preset-env': 7.21.5(@babel/core@7.21.8) - '@babel/preset-flow': 7.22.5(@babel/core@7.22.11) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.11) - '@babel/register': 7.22.5(@babel/core@7.22.11) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.11) + '@babel/preset-flow': 7.22.5(@babel/core@7.22.17) + '@babel/preset-typescript': 7.22.5(@babel/core@7.22.17) + '@babel/register': 7.22.5(@babel/core@7.22.17) + babel-core: 7.0.0-bridge.0(@babel/core@7.22.17) chalk: 4.1.2 flow-parser: 0.209.0 graceful-fs: 4.2.11 @@ -16866,17 +16959,17 @@ packages: peerDependencies: '@babel/preset-env': ^7.1.6 dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/parser': 7.22.16 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.11) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.11) - '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.17) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.17) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.17) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.17) '@babel/preset-env': 7.22.5(@babel/core@7.22.5) - '@babel/preset-flow': 7.22.5(@babel/core@7.22.11) - '@babel/preset-typescript': 7.22.5(@babel/core@7.22.11) - '@babel/register': 7.22.5(@babel/core@7.22.11) - babel-core: 7.0.0-bridge.0(@babel/core@7.22.11) + '@babel/preset-flow': 7.22.5(@babel/core@7.22.17) + '@babel/preset-typescript': 7.22.5(@babel/core@7.22.17) + '@babel/register': 7.22.5(@babel/core@7.22.17) + babel-core: 7.0.0-bridge.0(@babel/core@7.22.17) chalk: 4.1.2 flow-parser: 0.209.0 graceful-fs: 4.2.11 @@ -19451,7 +19544,7 @@ packages: engines: {node: '>=12.0.0'} hasBin: true dependencies: - '@babel/core': 7.22.11 + '@babel/core': 7.22.17 '@babel/generator': 7.22.15 ast-types: 0.14.2 commander: 2.20.3 @@ -19505,7 +19598,7 @@ packages: peerDependencies: react: '>=16.13.1' dependencies: - '@babel/runtime': 7.22.11 + '@babel/runtime': 7.22.15 react: 18.2.0 dev: true @@ -21396,6 +21489,7 @@ packages: /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: true /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} @@ -21944,7 +22038,7 @@ packages: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.10 - which-typed-array: 1.1.9 + which-typed-array: 1.1.11 /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} @@ -22377,17 +22471,6 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true