diff --git a/.env.example b/.env.example index dc6582eb5..a4666dd31 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ -TWITTER_CREATOR="@vercel" -TWITTER_SITE="https://nextjs.org/commerce" -SITE_NAME="Next.js Commerce" -SHOPIFY_REVALIDATION_SECRET= -SHOPIFY_STOREFRONT_ACCESS_TOKEN= -SHOPIFY_STORE_DOMAIN= +TWITTER_CREATOR="@shopware" +TWITTER_SITE="https://www.shopware.com/en/solutions/shopware-composable-frontends/" +SITE_NAME="Next.js Commerce with Shopware Composable Frontends" +SHOPWARE_STORE_DOMAIN="" +SHOPWARE_API_TYPE="store-api" +SHOPWARE_ACCESS_TOKEN="" diff --git a/README.md b/README.md index 07b281de7..aefe269f4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fcommerce&project-name=commerce&repo-name=commerce&demo-title=Next.js%20Commerce&demo-url=https%3A%2F%2Fdemo.vercel.store&demo-image=https%3A%2F%2Fbigcommerce-demo-asset-ksvtgfvnd.vercel.app%2Fbigcommerce.png&env=SHOPIFY_REVALIDATION_SECRET,SHOPIFY_STOREFRONT_ACCESS_TOKEN,SHOPIFY_STORE_DOMAIN,SITE_NAME,TWITTER_CREATOR,TWITTER_SITE) - -# Next.js Commerce +# Next.js Commerce & Shopware Composable Frontends A Next.js 13 and App Router-ready ecommerce template featuring: @@ -12,27 +10,21 @@ A Next.js 13 and App Router-ready ecommerce template featuring: - New fetching and caching paradigms - Dynamic OG images - Styling with Tailwind CSS -- Checkout and payments with Shopify - Automatic light/dark mode based on system settings > Note: Looking for Next.js Commerce v1? View the [code](https://github.com/vercel/commerce/tree/v1), [demo](https://commerce-v1.vercel.store), and [release notes](https://github.com/vercel/commerce/releases/tag/v1) -## Providers +## Prerequisites -Vercel will only be actively maintaining a Shopify version [as outlined in our vision and strategy for Next.js Commerce](https://github.com/vercel/commerce/pull/966). +Next.js + Shopware requires a running [Shopware 6 Instance (Installation Guide)](https://developer.shopware.com/docs/guides/installation). -Vercel is more than happy to partner and work with any commerce provider to help them get a similar template up and running and listed below. Alternative providers should be able to fork this repository and swap out the `lib/shopify` file with their own implementation while leaving the rest of the template mostly unchanged. - -- Shopify (this repository) -- [BigCommerce](https://github.com/bigcommerce/nextjs-commerce) ([Demo](https://next-commerce-v2.vercel.app/)) -- [Medusa](https://github.com/medusajs/vercel-commerce) ([Demo](https://medusa-nextjs-commerce.vercel.app/)) -- [Saleor](https://github.com/saleor/nextjs-commerce) ([Demo](https://saleor-commerce.vercel.app/)) +To get started, use this README and the example environment variable comments. ## Running locally You will need to use the environment variables [defined in `.env.example`](.env.example) to run Next.js Commerce. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables) for this, but a `.env` file is all that is necessary. -> Note: You should not commit your `.env` file or it will expose secrets that will allow others to control your Shopify store. +> Note: You should not commit your `.env` file or it will expose secrets that will allow others to control your Shopware store. 1. Install Vercel CLI: `npm i -g vercel` 2. Link local instance with Vercel and GitHub accounts (creates `.vercel` directory): `vercel link` @@ -45,220 +37,24 @@ pnpm dev Your app should now be running on [localhost:3000](http://localhost:3000/). -## How to configure your Shopify store for Next.js Commerce +## How to configure your Shopware store for Next.js Commerce -Next.js Commerce requires a [paid Shopify plan](https://www.shopify.com/pricing). +You can find the `SHOPWARE_ACCESS_TOKEN` in the Admin at your SalesChannel configuration. -> Note: Next.js Commerce will not work with a Shopify Starter plan as it does not allow installation of custom themes, which is required to run as a headless storefront. +### Add Shopware domain to an environment variable -### Add Shopify domain to an environment variable +Copy `.env.example` file to `.env` and change the environment variables like descibed below. -Create a `SHOPIFY_STORE_DOMAIN` environment variable and use your Shopify domain as the the value (ie. `SHOPIFY_STORE_SUBDOMAIN.myshopify.com`). +Create a `SHOPWARE_STORE_DOMAIN` environment variable and use your Shopware domain as the the value (ie. `demo-frontends.shopware.store`). > Note: Do not include the `https://`. -### Accessing the Shopify Storefront API +### Accessing the Shopware store API -Next.js Commerce utilizes [Shopify's Storefront API](https://shopify.dev/docs/api/storefront) to create unique customer experiences. The API offers a full range of commerce options making it possible for customers to control products, collections, menus, pages, cart, checkout, and more. +Next.js Commerce utilizes [Shopware's store API](https://shopware.stoplight.io/docs/store-api/) to create unique customer experiences. The API offers a full range of commerce options making it possible for customers to control products, collections, menus, pages, cart, checkout, and more. -In order to use the Shopify's Storefront API, you need to install the [Headless app](https://apps.shopify.com/headless) in your Shopify store. +In order to use the Shopware's store API, you need at least one _(Storefront)_ SalesChannel _(for speaking URL's)_ in your Shopware instance. -Once installed, you'll need to create a `SHOPIFY_STOREFRONT_ACCESS_TOKEN` environment variable and use the public access token as the value +Once installed, you'll need to create a `SHOPWARE_ACCESS_TOKEN` environment variable and use the public access token as the value -> Note: Shopify does offer a Node.js Storefront API SDK. We use the Storefront API via GraphQL directly instead of the Node.js SDK so we have more control over fetching and caching. - -<details> - <summary>Expand to view detailed walkthrough</summary> - -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/settings/apps`. -1. Click the green `Shopify App Store` button. -  -1. Search for `Headless` and click on the `Headless` app. -  -1. Click the black `Add app` button. -  -1. Click the green `Add sales channel` button. -  -1. Click the green `Create storefront` button. -  -1. Copy and paste the public access token and assign it to a `SHOPIFY_STOREFRONT_ACCESS_TOKEN` environment variable. -  -1. If you ever need to reference the public access token again, you can navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/headless_storefronts`. -</details> - -### Install a headless theme - -When using a headless Shopify setup, you normally don't want customers to access any of the theme pages except for checkout. However, you can't totally disable the theme and a lot of links will still point to the theme (e.g. links in emails, order details, plugins, checkout, etc.). - -To enable a seamless flow between your headless site and Shopify, you can install the [Shopify Headless Theme](https://github.com/instantcommerce/shopify-headless-theme). - -Follow the installation instructions and configure the theme with your headless site's values. - -<details> - <summary>Expand to view detailed walkthrough</summary> - -1. Download [Shopify Headless Theme](https://github.com/instantcommerce/shopify-headless-theme). -  -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/themes`. -1. Click `Add theme`, then `Upload zip file`. -  -1. Select the downloaded zip file from above, and click the green `Upload file` button. -  -1. Click `Customize`. -  -1. Click `Theme settings` (ie. the paintbrush icon), expand the `STOREFRONT` section, enter your headless store domain, click the gray `Publish` button. -  -1. Confirm the theme change by clicking the green `Save and publish` button. -  -1. The headless theme should now be your current active theme. - -</details> - -### Branding & Design - -Since you're creating a headless Shopify store, you'll be in full control of your brand and design. However, there are still a few aspects we're leaving within Shopify's control. - -- Checkout -- Emails -- Order status -- Order history -- Favicon (for any Shopify controlled pages) - -You can use Shopify's admin to customize these pages to match your brand and design. - -<details> - <summary>Expand to view detailed walkthrough</summary> - -#### Checkout, order status, and order history - -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/settings/checkout`. -1. Click the green `Customize` button. -  -1. Click `Branding` (ie. the paintbrush icon) and customize your brand. Please note, there are three steps / pages to the checkout flow. Use the dropdown to change pages and adjust branding as needed on each page. Click `Save` when you are done. -  -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/settings/branding`. -1. Customize settings to match your brand. -  - -#### Emails - -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/settings/email_settings`. -1. Customize settings to match your brand. -  - -#### Favicon - -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/themes`. -1. Click the green `Customize` button. -  -1. Click `Theme settings` (ie. the paintbrush icon), expand the `FAVICON` section, upload favicon, then click the `Save` button. -  - -</details> - -### Configure webhooks for on-demand incremental static regeneration (ISR) - -Utilizing [Shopify's webhooks](https://shopify.dev/docs/apps/webhooks), and listening for select [Shopify webhook event topics](https://shopify.dev/docs/api/admin-rest/2022-04/resources/webhook#event-topics), we can use [Next'js on-demand revalidation](https://nextjs.org/docs/app/building-your-application/data-fetching/revalidating#using-on-demand-revalidation) to keep data fetches indefinitely cached until certain events in the Shopify store occur. - -Next.js is pre-configured to listen for the following Shopify webhook events and automatically revalidate fetches. - -- `collections/create` -- `collections/delete` -- `collections/update` -- `products/create` -- `products/delete` -- `products/update` (this also includes when variants are added, updated, and removed as well as when products are purchased so inventory and out of stocks can be updated) - -<details> - <summary>Expand to view detailed walkthrough</summary> - -#### Setup secret for secure revalidation - -1. Create your own secret or [generate a random UUID](https://www.uuidgenerator.net/guid). -1. Create a [Vercel Environment Variable](https://vercel.com/docs/concepts/projects/environment-variables) named `SHOPIFY_REVALIDATION_SECRET` and use the value from above. - -#### Configure Shopify webhooks - -1. Navigate to `https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/settings/notifications`. -1. Add webhooks for all six event topics listed above. You can add more sets for other preview urls, environments, or local development. Append `?secret=[SECRET]` to each url, where `[SECRET]` is the secret you created above. -  -  - -#### Testing webhooks during local development - -The easiest way to test webhooks while developing locally is to use [ngrok](https://ngrok.com). - -1. [Install and configure ngrok](https://ngrok.com/download) (you will need to create an account). -1. Run your app locally, `npm run dev`. -1. In a separate terminal session, run `ngrok http 3000`. -1. Use the url generated by ngrok and add or update your webhook urls in Shopify. -  -  -1. You can now make changes to your store and your local app should receive updates. You can also use the `Send test notification` button to trigger a generic webhook test. -  - -</details> - -### Using Shopify as a CMS - -Next.js Commerce is fully powered by Shopify in a truly headless and data driven way. - -#### Products - -`https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/products` - -Only `Active` products are shown. `Draft` products will not be shown until they are marked as `Active`. - -`Active` products can still be hidden and not seen by navigating the site, by adding a `nextjs-frontend-hidden` tag on the product. This tag will also tell search engines to not index or crawl the product. The product is still directly accessible via url. This feature is great for "secret" products you only want to people you share the url with. - -Product options and option combinations are driven from Shopify options and variants. When selecting options on the product detail page, other option and variant combinations will be visually validated and verified for availability, like Amazon does. - -Products that are active and "out of stock" are still shown on the site, but the ability to add the product to the cart is disabled. - -#### Collections - -`https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/collections` - -Create whatever collections you want and configure them however you want. All available collections will show on the search page as filters on the left, with one exception... - -Any collection names that start with the word "hidden" will not show up on the headless front end. The Next.js Commerce theme comes pre-configured to look for two hidden collections. Collections were chosen for this over tags so that order of products could be controlled (collections allow for manual ordering). - -Create the following collections: - -- `Hidden: Homepage Featured Items` -- Products in this collection are displayed in the three featured blocks on the homepage. -- `Hidden: Homepage Carousel` -- Products in this collection are displayed in the auto-scrolling carousel section on the homepage. - - - - - -#### Pages - -`https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/pages` - -Next.js Commerce contains a dynamic `[page]` route. It will use the value to look for a corresponding page in Shopify. If a page is found, it will display its rich content using Tailwind's prose. If a page is not found, a 404 page is displayed. - - - - - -#### Navigation menus - -`https://SHOPIFY_STORE_SUBDOMAIN.myshopify.com/admin/menus` - -Next.js Commerce's header and footer navigation is pre-configured to be controlled by Shopify navigation menus. This means you have full control over what links go here. They can be to collections, pages, external links, and more. - -Create the following navigation menus: - -- `Next.js Frontend Header Menu` -- Menu items to be shown in the headless frontend header. -- `Next.js Frontend Footer Menu` -- Menu items to be shown in the headless frontend footer. - - - - - -#### SEO - -Shopify's products, collections, pages, etc. allow you to create custom SEO titles and descriptions. Next.js Commerce is pre-configured to display these custom values, but also comes with sensible default fallbacks if they are not provided. - - +> Note: We using an [api Client package](https://www.npmjs.com/package/@shopware/api-client) that helps you with types, endpoints, params and returns. diff --git a/app/[page]/opengraph-image.tsx b/app/[page]/opengraph-image.tsx index 2fd59281e..db45917a7 100644 --- a/app/[page]/opengraph-image.tsx +++ b/app/[page]/opengraph-image.tsx @@ -1,11 +1,11 @@ import OpengraphImage from 'components/opengraph-image'; -import { getPage } from 'lib/shopify'; +import { getPage } from 'lib/shopware'; export const runtime = 'edge'; export default async function Image({ params }: { params: { page: string } }) { const page = await getPage(params.page); - const title = page.seo?.title || page.title; + const title = page ? page.seo?.title || page.title : ''; return await OpengraphImage({ title }); } diff --git a/app/[page]/page.tsx b/app/[page]/page.tsx index 7e0defed3..52eefdb06 100644 --- a/app/[page]/page.tsx +++ b/app/[page]/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from 'next'; import Prose from 'components/prose'; -import { getPage } from 'lib/shopify'; +import { getPage } from 'lib/shopware'; import { notFound } from 'next/navigation'; export const runtime = 'edge'; @@ -39,6 +39,10 @@ export default async function Page({ params }: { params: { page: string } }) { const page = await getPage(params.page); if (!page) return notFound(); + let date = page.createdAt; + if (page.updatedAt !== '') { + date = page.updatedAt; + } return ( <> @@ -49,7 +53,7 @@ export default async function Page({ params }: { params: { page: string } }) { year: 'numeric', month: 'long', day: 'numeric' - }).format(new Date(page.updatedAt))}.`} + }).format(new Date(date))}.`} </p> </> ); diff --git a/app/layout.tsx b/app/layout.tsx index dca2c624f..b93239710 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -7,7 +7,7 @@ const { TWITTER_CREATOR, TWITTER_SITE, SITE_NAME } = process.env; export const metadata = { title: { - default: SITE_NAME, + default: SITE_NAME || 'Shopware Composable Frontends', template: `%s | ${SITE_NAME}` }, robots: { diff --git a/app/page.tsx b/app/page.tsx index 991a7345e..5f357726a 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -6,7 +6,7 @@ import { Suspense } from 'react'; export const runtime = 'edge'; export const metadata = { - description: 'High-performance ecommerce store built with Next.js, Vercel, and Shopify.', + description: 'High-performance ecommerce store built with Next.js, Vercel, and Shopware.', openGraph: { images: [ { diff --git a/app/product/[handle]/page.tsx b/app/product/[...handle]/page.tsx similarity index 94% rename from app/product/[handle]/page.tsx rename to app/product/[...handle]/page.tsx index 45286cdbe..573fe475b 100644 --- a/app/product/[handle]/page.tsx +++ b/app/product/[...handle]/page.tsx @@ -10,8 +10,8 @@ import { Gallery } from 'components/product/gallery'; import { VariantSelector } from 'components/product/variant-selector'; import Prose from 'components/prose'; import { HIDDEN_PRODUCT_TAG } from 'lib/constants'; -import { getProduct, getProductRecommendations } from 'lib/shopify'; -import { Image } from 'lib/shopify/types'; +import { getProduct, getProductRecommendations } from 'lib/shopware'; +import { Image } from 'lib/shopware/types'; export const runtime = 'edge'; @@ -20,6 +20,7 @@ export async function generateMetadata({ }: { params: { handle: string }; }): Promise<Metadata> { + // @ToDo: create a simpler function and do not do the heavy options/variant stuff here const product = await getProduct(params.handle); if (!product) return notFound(); diff --git a/app/search/[collection]/page.tsx b/app/search/(collection)/[...collection]/page.tsx similarity index 87% rename from app/search/[collection]/page.tsx rename to app/search/(collection)/[...collection]/page.tsx index 4ec62f2f4..847aaa258 100644 --- a/app/search/[collection]/page.tsx +++ b/app/search/(collection)/[...collection]/page.tsx @@ -1,4 +1,4 @@ -import { getCollection, getCollectionProducts } from 'lib/shopify'; +import { getCollection, getCollectionProducts } from 'lib/shopware'; import { Metadata } from 'next'; import { notFound } from 'next/navigation'; @@ -33,7 +33,12 @@ export default async function CategoryPage({ }) { const { sort } = searchParams as { [key: string]: string }; const { sortKey, reverse } = sorting.find((item) => item.slug === sort) || defaultSort; - const products = await getCollectionProducts({ collection: params.collection, sortKey, reverse }); + + const products = await getCollectionProducts({ + collection: params.collection, + sortKey, + reverse + }); return ( <section> diff --git a/app/search/[collection]/opengraph-image.tsx b/app/search/(collection)/opengraph-image.tsx similarity index 88% rename from app/search/[collection]/opengraph-image.tsx rename to app/search/(collection)/opengraph-image.tsx index 9eb9c47f7..98cd40853 100644 --- a/app/search/[collection]/opengraph-image.tsx +++ b/app/search/(collection)/opengraph-image.tsx @@ -1,5 +1,5 @@ import OpengraphImage from 'components/opengraph-image'; -import { getCollection } from 'lib/shopify'; +import { getCollection } from 'lib/shopware'; export const runtime = 'edge'; diff --git a/app/search/page.tsx b/app/search/page.tsx index 354a2022f..3eeac0c6a 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,7 +1,7 @@ import Grid from 'components/grid'; import ProductGridItems from 'components/layout/product-grid-items'; import { defaultSort, sorting } from 'lib/constants'; -import { getProducts } from 'lib/shopify'; +import { getSearchCollectionProducts } from 'lib/shopware'; export const runtime = 'edge'; @@ -18,7 +18,7 @@ export default async function SearchPage({ const { sort, q: searchValue } = searchParams as { [key: string]: string }; const { sortKey, reverse } = sorting.find((item) => item.slug === sort) || defaultSort; - const products = await getProducts({ sortKey, reverse, query: searchValue }); + const products = await getSearchCollectionProducts({ sortKey, reverse, query: searchValue }); const resultsText = products.length > 1 ? 'results' : 'result'; return ( diff --git a/components/carousel.tsx b/components/carousel.tsx index d86d17f45..86f05c54c 100644 --- a/components/carousel.tsx +++ b/components/carousel.tsx @@ -1,39 +1,41 @@ -import { getCollectionProducts } from 'lib/shopify'; +import { getCollectionProducts } from 'lib/shopware'; import Image from 'next/image'; import Link from 'next/link'; export async function Carousel() { // Collections that start with `hidden-*` are hidden from the search page. - const products = await getCollectionProducts({ collection: 'hidden-homepage-carousel' }); + // const products = await getCollectionProducts({ collection: 'hidden-homepage-carousel' }); - if (!products?.length) return null; + // if (!products?.length) return null; - return ( - <div className="relative w-full overflow-hidden bg-black dark:bg-white"> - <div className="flex animate-carousel"> - {[...products, ...products].map((product, i) => ( - <Link - key={`${product.handle}${i}`} - href={`/product/${product.handle}`} - className="relative h-[30vh] w-1/2 flex-none md:w-1/3" - > - {product.featuredImage ? ( - <Image - alt={product.title} - className="h-full object-contain" - fill - sizes="33vw" - src={product.featuredImage.url} - /> - ) : null} - <div className="absolute inset-y-0 right-0 flex items-center justify-center"> - <div className="inline-flex bg-white p-4 text-xl font-semibold text-black dark:bg-black dark:text-white"> - {product.title} - </div> - </div> - </Link> - ))} - </div> - </div> - ); + return null; + + // return ( + // <div className="relative w-full overflow-hidden bg-black dark:bg-white"> + // <div className="flex animate-carousel"> + // {[...products, ...products].map((product, i) => ( + // <Link + // key={`${product.handle}${i}`} + // href={`/product/${product.handle}`} + // className="relative h-[30vh] w-1/2 flex-none md:w-1/3" + // > + // {product.featuredImage ? ( + // <Image + // alt={product.title} + // className="h-full object-contain" + // fill + // sizes="33vw" + // src={product.featuredImage.url} + // /> + // ) : null} + // <div className="absolute inset-y-0 right-0 flex items-center justify-center"> + // <div className="inline-flex bg-white p-4 text-xl font-semibold text-black dark:bg-black dark:text-white"> + // {product.title} + // </div> + // </div> + // </Link> + // ))} + // </div> + // </div> + // ); } diff --git a/components/cart/index.tsx b/components/cart/index.tsx index 75b6978fe..b75166bd2 100644 --- a/components/cart/index.tsx +++ b/components/cart/index.tsx @@ -3,21 +3,18 @@ import { cookies } from 'next/headers'; import CartModal from './modal'; export default async function Cart() { - const cartId = cookies().get('cartId')?.value; - let cartIdUpdated = false; - let cart; - - if (cartId) { - cart = await getCart(cartId); - } - - // If the `cartId` from the cookie is not set or the cart is empty - // (old carts becomes `null` when you checkout), then get a new `cartId` - // and re-fetch the cart. - if (!cartId || !cart) { - cart = await createCart(); - cartIdUpdated = true; - } - - return <CartModal cart={cart} cartIdUpdated={cartIdUpdated} />; + // const cartId = cookies().get('cartId')?.value; + // let cartIdUpdated = false; + // let cart; + // if (cartId) { + // cart = await getCart(cartId); + // } + // // If the `cartId` from the cookie is not set or the cart is empty + // // (old carts becomes `null` when you checkout), then get a new `cartId` + // // and re-fetch the cart. + // if (!cartId || !cart) { + // cart = await createCart(); + // cartIdUpdated = true; + // } + // return <CartModal cart={cart} cartIdUpdated={cartIdUpdated} />; } diff --git a/components/grid/three-items.tsx b/components/grid/three-items.tsx index 2280de26e..a47af2ed5 100644 --- a/components/grid/three-items.tsx +++ b/components/grid/three-items.tsx @@ -1,6 +1,6 @@ import { GridTileImage } from 'components/grid/tile'; -import { getCollectionProducts } from 'lib/shopify'; -import type { Product } from 'lib/shopify/types'; +import { getCollectionProducts } from 'lib/shopware'; +import type { Product } from 'lib/shopware/types'; import Link from 'next/link'; function ThreeItemGridItem({ @@ -16,7 +16,7 @@ function ThreeItemGridItem({ <div className={size === 'full' ? 'lg:col-span-4 lg:row-span-2' : 'lg:col-span-2 lg:row-span-1'} > - <Link className="block h-full" href={`/product/${item.handle}`}> + <Link className="block h-full" href={`/product/${item.path}`}> <GridTileImage src={item.featuredImage.url} width={size === 'full' ? 1080 : 540} @@ -38,7 +38,7 @@ function ThreeItemGridItem({ export async function ThreeItemGrid() { // Collections that start with `hidden-*` are hidden from the search page. const homepageItems = await getCollectionProducts({ - collection: 'hidden-homepage-featured-items' + collection: 'Summer-BBQ/Hidden-Category' }); if (!homepageItems[0] || !homepageItems[1] || !homepageItems[2]) return null; diff --git a/components/layout/footer.tsx b/components/layout/footer.tsx index 72e9e03fc..7e10c3168 100644 --- a/components/layout/footer.tsx +++ b/components/layout/footer.tsx @@ -2,16 +2,15 @@ import Link from 'next/link'; import GitHubIcon from 'components/icons/github'; import LogoIcon from 'components/icons/logo'; -import VercelIcon from 'components/icons/vercel'; -import { getMenu } from 'lib/shopify'; -import { Menu } from 'lib/shopify/types'; +import { getMenu } from 'lib/shopware'; +import { Menu } from 'lib/shopware/types'; const { SITE_NAME } = process.env; export default async function Footer() { const currentYear = new Date().getFullYear(); const copyrightDate = 2023 + (currentYear > 2023 ? `-${currentYear}` : ''); - const menu = await getMenu('next-js-frontend-footer-menu'); + const menu = await getMenu({ type: 'footer-navigation' }); return ( <footer className="border-t border-gray-700 bg-white text-black dark:bg-black dark:text-white"> @@ -52,15 +51,22 @@ export default async function Footer() { © {copyrightDate} {SITE_NAME}. All rights reserved. </p> <div className="flex items-center text-sm text-white dark:text-black"> - <span className="text-black dark:text-white">Created by</span> + <span className="text-black dark:text-white"> + Created by Shopware Composable Frontends + </span> <a rel="noopener noreferrer" - href="https://vercel.com" - aria-label="Vercel.com Link" + href="https://frontends.shopware.com/" + aria-label="Shopware Composable Frontends Link" target="_blank" className="text-black dark:text-white" > - <VercelIcon className="ml-3 inline-block h-6" /> + <div className="ml-4 h-auto w-10"> + <img + src="https://www.shopware.com/media/pages/solutions/shopware-frontends/shopware-frontends-intro-graphic-base.svg" + alt="Shopware Composable Frontends Logo" + ></img> + </div> </a> </div> </div> diff --git a/components/layout/navbar/index.tsx b/components/layout/navbar/index.tsx index 8d036b315..301982468 100644 --- a/components/layout/navbar/index.tsx +++ b/components/layout/navbar/index.tsx @@ -4,20 +4,20 @@ import { Suspense } from 'react'; import Cart from 'components/cart'; import CartIcon from 'components/icons/cart'; import LogoIcon from 'components/icons/logo'; -import { getMenu } from 'lib/shopify'; -import { Menu } from 'lib/shopify/types'; +import { getMenu } from 'lib/shopware'; +import { Menu } from 'lib/shopware/types'; import MobileMenu from './mobile-menu'; import Search from './search'; export default async function Navbar() { - const menu = await getMenu('next-js-frontend-header-menu'); + const menu = await getMenu({ type: 'main-navigation' }); return ( <nav className="relative flex items-center justify-between bg-white p-4 dark:bg-black lg:px-6"> <div className="block w-1/3 md:hidden"> <MobileMenu menu={menu} /> </div> - <div className="flex justify-self-center md:w-1/3 md:justify-self-start"> + <div className="flex justify-self-center md:w-6/12 md:justify-self-start"> <div className="md:mr-4"> <Link href="/" aria-label="Go back home"> <LogoIcon className="h-8 transition-transform hover:scale-110" /> @@ -38,11 +38,11 @@ export default async function Navbar() { </ul> ) : null} </div> - <div className="hidden w-1/3 md:block"> + <div className="hidden w-3/12 md:block"> <Search /> </div> - <div className="flex w-1/3 justify-end"> + <div className="flex w-3/12 justify-end"> <Suspense fallback={<CartIcon className="h-6" />}> <Cart /> </Suspense> diff --git a/components/layout/product-grid-items.tsx b/components/layout/product-grid-items.tsx index 0c0e907ed..e2fdf10cb 100644 --- a/components/layout/product-grid-items.tsx +++ b/components/layout/product-grid-items.tsx @@ -1,14 +1,14 @@ import Grid from 'components/grid'; import { GridTileImage } from 'components/grid/tile'; -import { Product } from 'lib/shopify/types'; +import { Product } from 'lib/shopware/types'; import Link from 'next/link'; export default function ProductGridItems({ products }: { products: Product[] }) { return ( <> {products.map((product) => ( - <Grid.Item key={product.handle} className="animate-fadeIn"> - <Link className="h-full w-full" href={`/product/${product.handle}`}> + <Grid.Item key={product.path} className="animate-fadeIn"> + <Link className="h-full w-full" href={`/product/${product.path}`}> <GridTileImage alt={product.title} labels={{ diff --git a/components/layout/search/collections.tsx b/components/layout/search/collections.tsx index 14305c7ee..0d2289e1a 100644 --- a/components/layout/search/collections.tsx +++ b/components/layout/search/collections.tsx @@ -1,12 +1,16 @@ import clsx from 'clsx'; import { Suspense } from 'react'; -import { getCollections } from 'lib/shopify'; +import { getStaticCollections } from 'lib/shopware'; import FilterList from './filter'; +import { transformStaticCollectionToList } from 'lib/shopware/transform'; async function CollectionList() { - const collections = await getCollections(); - return <FilterList list={collections} title="Collections" />; + const collections = await getStaticCollections(); + if (collections) { + const list = transformStaticCollectionToList(collections); + return <FilterList list={list} title="Collections" />; + } } const skeleton = 'mb-3 h-4 w-5/6 animate-pulse rounded'; diff --git a/lib/shopware/api-types/apiTypes-6.5.2.0.d.ts b/lib/shopware/api-types/apiTypes-6.5.2.0.d.ts new file mode 100644 index 000000000..08da1330e --- /dev/null +++ b/lib/shopware/api-types/apiTypes-6.5.2.0.d.ts @@ -0,0 +1,7733 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +/** OneOf type helpers */ +type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never }; +type XOR<T, U> = T | U extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U; +type OneOf<T extends any[]> = T extends [infer Only] + ? Only + : T extends [infer A, infer B, ...infer Rest] + ? OneOf<[XOR<A, B>, ...Rest]> + : never; + +type GenericRecord = never | { [key: string]: GenericRecord }; + +export type paths = { + '/account/address': { + /** + * Create a new address for a customer + * Creates a new address for a customer. + */ + post: operations['createCustomerAddress']; + }; + '/account/address/{addressId}': { + /** + * Delete an address of a customer + * Delete an address of customer. + * + * Only addresses which are not set as default addresses for shipping or billing can be deleted. You can check the current default addresses of your customer using the profile information endpoint and change them using the default address endpoint. + * + * **A customer must have at least one address (which can be used for shipping and billing).** + * + * An automatic fallback is not applied. + */ + delete: operations['deleteCustomerAddress']; + /** + * Modify an address of a customer + * Modifies an existing address of a customer. + */ + patch: operations['updateCustomerAddress']; + }; + '/account/address/default-billing/{addressId}': { + /** + * Change a customer's default billing address + * Updates the default (preselected) billing addresses of a customer. + */ + patch: operations['defaultBillingAddress']; + }; + '/account/address/default-shipping/{addressId}': { + /** + * Change a customer's default shipping address + * Updates the default (preselected) shipping addresses of a customer. + */ + patch: operations['defaultShippingAddress']; + }; + '/account/change-email': { + /** + * Change the customer's email address + * Changes a customer's email address to a new email address, using their current password as a validation. + */ + post: operations['changeEmail']; + }; + '/account/change-language': { + /** + * Change the customer's language. + * Changes the language of the logged in customer + */ + post: operations['changeLanguage']; + }; + '/account/change-password': { + /** + * Change the customer's password + * Changes a customer's password using their current password as a validation. + */ + post: operations['changePassword']; + }; + '/account/change-payment-method/{paymentMethodId}': { + /** + * Change the customer's default payment method + * Changes a customer's default (preselected) payment method. + */ + post: operations['changePaymentMethod']; + }; + '/account/change-profile': { + /** + * Change the customer's information + * Make changes to a customer's account, like changing their name, salutation or title. + */ + post: operations['changeProfile']; + }; + '/account/customer': { + /** + * Get information about current customer + * Returns information about the current customer. + */ + post: operations['readCustomer']; + /** + * Delete the customer's profile + * Deletes a customer profile along with their addresses, wishlists and associated data. Created orders and their payment/shipping information (addresses) and reviews are not deleted. + */ + delete: operations['deleteCustomer']; + }; + '/account/customer-recovery-is-expired': { + /** + * Checks if the customer recovery entry for a given hash is expired. + * This can be used to validate a provided hash has a valid and not expired customer recovery hash. + */ + post: operations['getCustomerRecoveryIsExpired']; + }; + '/account/list-address': { + /** + * Fetch addresses of a customer + * Lists all addresses of the current customer and allows filtering them based on a criteria. + */ + post: operations['listAddress']; + }; + '/account/login': { + /** + * Log in a customer + * Logs in customers given their credentials. + */ + post: operations['loginCustomer']; + }; + '/account/logout': { + /** + * Log out a customer + * Logs out a customer. + */ + post: operations['logoutCustomer']; + }; + '/account/newsletter-recipient': { + /** + * Fetch newsletter recipients + * Perform a filtered search for newsletter recipients. + */ + post: operations['readNewsletterRecipient']; + }; + '/account/recovery-password': { + /** + * Send a password recovery mail + * This operation is Step 1 of the password reset flow. Make sure to implement Step 2 "Reset password with recovery credentials" in order to allow for the complete flow in your application. Sends a recovery mail containing a link with credentials that allows a customer to reset their password. + */ + post: operations['sendRecoveryMail']; + }; + '/account/recovery-password-confirm': { + /** + * Reset a password with recovery credentials + * This operation is Step 2 of the password reset flow. It is required to conduct Step 1 "Send a password recovery mail" in order to obtain the required credentials for this step.Resets a customer's password using credentials from a password recovery mail as a validation. + */ + post: operations['recoveryPassword']; + }; + '/account/register': { + /** + * Register a customer + * Registers a customer. Used both for normal customers and guest customers.See the Guide "Register a customer" for more information on customer registration. + */ + post: operations['register']; + }; + '/account/register-confirm': { + /** + * Confirm a customer registration + * Confirms a customer registration when double opt-in is activated. + * + * Learn more about double opt-in registration in our guide "Register a customer". + */ + post: operations['registerConfirm']; + }; + '/category': { + /** + * Fetch a list of categories + * Perform a filtered search for categories. + */ + post: operations['readCategoryList']; + }; + '/category/{navigationId}': { + /** + * Fetch a single category + * This endpoint returns information about the category, as well as a fully resolved (hydrated with mapping values) CMS page, if one is assigned to the category. You can pass slots which should be resolved exclusively. + */ + post: operations['readCategory']; + }; + '/checkout/cart': { + /** + * Fetch or create a cart + * Used to fetch the current cart or for creating a new one. + */ + get: operations['readCart']; + /** + * Delete a cart + * This route deletes the cart of the customer. + */ + delete: operations['deleteCart']; + }; + '/checkout/cart/line-item': { + /** + * Add items to the cart + * This route adds items to the cart. An item can be a product or promotion for example. They are referenced by the `referencedId`-parameter. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#adding-new-items-to-the-cart) + */ + post: operations['addLineItem']; + /** + * Remove items from the cart + * This route removes items from the cart and recalculates it. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#deleting-items-in-the-cart) + */ + delete: operations['removeLineItem']; + /** + * Update items in the cart + * This route updates items in the cart. A typical example is updating the quantity of an item. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#updating-items-in-the-cart) + */ + patch: operations['updateLineItem']; + }; + '/checkout/order': { + /** + * Create an order from a cart + * Creates a new order from the current cart and deletes the cart. + * + * If you are using the [prepared payment flow](https://developer.shopware.com/docs/concepts/commerce/checkout-concept/payments#2.1-prepare-payment-optional), this endpoint also receives additional transaction details. The exact name of the parameters depends on the implementation of the corresponding *payment handler*. + */ + post: operations['createOrder']; + }; + '/cms/{id}': { + /** + * Fetch and resolve a CMS page + * Loads a content management page by its identifier and resolve the slot data. This could be media files, product listing and so on. + * + * **Important notice** + * + * The criteria passed with this route also affects the listing, if there is one within the cms page. + */ + post: operations['readCms']; + }; + '/contact-form': { + /** + * Submit a contact form message + * Used for submitting contact forms. Be aware that there can be more required fields, depending on the system settings. + */ + post: operations['sendContactMail']; + }; + '/context': { + /** + * Fetch the current context + * Fetches the current context. This includes for example the `customerGroup`, `currency`, `taxRules` and many more. + */ + get: operations['readContext']; + /** + * Modify the current context + * Used for switching the context. A typical example would be changing the language or changing the currency. + */ + patch: operations['updateContext']; + }; + '/country': { + /** + * Fetch countries + * Perform a filtered search for countries + */ + post: operations['readCountry']; + }; + '/country-state/{countryId}': { + /** + * Fetch the states of a country + * Perform a filtered search the states for a country + */ + post: operations['readCountryState']; + }; + '/currency': { + /** + * Fetch currencies + * Perform a filtered search for currencies. + */ + post: operations['readCurrency']; + }; + '/customer-group-registration/config/{customerGroupId}': { + /** Fetch registration settings for customer group */ + get: operations['getCustomerGroupRegistrationInfo']; + }; + '/customer/wishlist': { + /** + * Fetch a wishlist + * Fetch a customer's wishlist. Products on the wishlist can be filtered using a criteria object. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + post: operations['readCustomerWishlist']; + }; + '/customer/wishlist/add/{productId}': { + /** + * Add a product to a wishlist + * Adds a product to a customers wishlist. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + post: operations['addProductOnWishlist']; + }; + '/customer/wishlist/delete/{productId}': { + /** + * Remove a product from a wishlist + * Removes a product from a customer's wishlist. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + delete: operations['deleteProductOnWishlist']; + }; + '/customer/wishlist/merge': { + /** + * Create a wishlist for a customer + * Create a new wishlist for a logged in customer or extend the existing wishlist given a set of products. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * A customer can only have a single wishlist. + * * The wishlist feature has to be activated. + */ + post: operations['mergeProductOnWishlist']; + }; + '/document/download/{documentId}/{deepLinkCode}': { + /** + * Download generated document + * Returns blob file of a generated document to download. + */ + post: operations['download']; + }; + '/handle-payment': { + /** + * Initiate a payment for an order + * This generic endpoint is should be called to initiate a payment flow after an order has been created. The details of the payment flow can differ depending on the payment integration and might require calling additional operations or the setup of webhooks. + * + * The endpoint internally calls the payment handler of the payment method currently set for the order. + */ + post: operations['handlePaymentMethod']; + }; + '/landing-page/{landingPageId}': { + /** + * Fetch a landing page with the resolved CMS page + * Loads a landing page by its identifier and resolves the CMS page. + * + * **Important notice** + * + * The criteria passed with this route also affects the listing, if there is one within the cms page. + */ + post: operations['readLandingPage']; + }; + '/language': { + /** + * Fetch languages + * Perform a filtered search for languages. + */ + post: operations['readLanguages']; + }; + '/navigation/{activeId}/{rootId}': { + /** + * Fetch a navigation menu + * This endpoint returns categories that can be used as a page navigation. You can either return them as a tree or as a flat list. You can also control the depth of the tree. + * + * Instead of passing uuids, you can also use one of the following aliases for the activeId and rootId parameters to get the respective navigations of your sales channel. + * + * * main-navigation + * * service-navigation + * * footer-navigation + */ + post: operations['readNavigation']; + }; + '/newsletter/confirm': { + /** + * Confirm a newsletter registration + * You have to use the hash from the link sent out via email to confirm the user registration. + */ + post: operations['confirmNewsletter']; + }; + '/newsletter/subscribe': { + /** + * Create or remove a newsletter subscription + * This route is used to create/remove/confirm a newsletter subscription. + * + * The `option` property controls what should happen: + * * `direct`: The subscription is directly active and does not need a confirmation. + * * `subscribe`: An email will be send to the provided email addrees containing a link to the /newsletter/confirm route. + * The subscription is only successful, if the /newsletter/confirm route is called with the generated hashes. + * * `unsubscribe`: The email address will be removed from the newsletter subscriptions. + * * `confirmSubscribe`: Confirmes the newsletter subscription for the provided email address. + */ + post: operations['subscribeToNewsletter']; + }; + '/newsletter/unsubscribe': { + /** + * Remove a newsletter subscription + * Removes a newsletter recipient from the mailing lists. + */ + post: operations['unsubscribeToNewsletter']; + }; + '/order': { + /** + * Fetch a list of orders + * List orders of a customer. + */ + post: operations['readOrder']; + }; + '/order/download/{orderId}/{downloadId}': { + /** + * Download a purchased file + * Download a file included in the given order and with the given id. Access must be granted. + */ + get: operations['orderDownloadFile']; + }; + '/order/payment': { + /** + * Update the payment method of an order + * Changes the payment method of a specific order. You can use the /order route to find out if the payment method of an order can be changed - take a look at the `paymentChangeable`- array in the response. + */ + post: operations['orderSetPayment']; + }; + '/order/state/cancel': { + /** + * Cancel an order + * Cancels an order. The order state will be set to 'cancelled'. + */ + post: operations['cancelOrder']; + }; + '/payment-method': { + /** Loads all available payment methods */ + post: operations['readPaymentMethod']; + }; + '/product': { + /** + * Fetch a list of products + * List products that match the given criteria. For performance ressons a limit should always be set. + */ + post: operations['readProduct']; + }; + '/product-export/{accessKey}/{fileName}': { + /** Export product export */ + get: operations['readProductExport']; + }; + '/product-listing/{categoryId}': { + /** + * Fetch a product listing by category + * Fetches a product listing for a specific category. It also provides filters, sortings and property aggregations, analogous to the /search endpoint. + */ + post: operations['readProductListing']; + }; + '/product/{productId}': { + /** + * Fetch a single product + * This route is used to load a single product with the corresponding details. In addition to loading the data, the best variant of the product is determined when a parent id is passed. + */ + post: operations['readProductDetail']; + }; + '/product/{productId}/cross-selling': { + /** + * Fetch cross-selling groups of a product + * This route is used to load the cross sellings for a product. A product has several cross selling definitions in which several products are linked. The route returns the cross sellings together with the linked products + */ + post: operations['readProductCrossSellings']; + }; + '/product/{productId}/find-variant': { + /** + * Search for a matching variant by product options. + * Performs a search for product variants and returns the best matching variant. + */ + post: operations['searchProductVariantIds']; + }; + '/product/{productId}/review': { + /** + * Save a product review + * Saves a review for a product. Reviews have to be activated in the settings. + */ + post: operations['saveProductReview']; + }; + '/product/{productId}/reviews': { + /** + * Fetch product reviews + * Perform a filtered search for product reviews. + */ + post: operations['readProductReviews']; + }; + '/salutation': { + /** + * Fetch salutations + * Perform a filtered search for salutations. + */ + post: operations['readSalutation']; + }; + '/script/{hook}': { + /** Access point for different api logics which are provided by apps over script hooks */ + post: operations['postScriptStoreApiRoute']; + }; + '/search': { + /** + * Search for products + * Performs a search for products which can be used to display a product listing. + */ + post: operations['searchPage']; + }; + '/search-suggest': { + /** + * Search for products (suggest) + * Can be used to implement search previews or suggestion listings, that don’t require any interaction. + */ + post: operations['searchSuggest']; + }; + '/seo-url': { + /** + * Fetch SEO routes + * Perform a filtered search for seo urls. + */ + post: operations['readSeoUrl']; + }; + '/shipping-method': { + /** + * Fetch shipping methods + * Perform a filtered search for shipping methods. + */ + post: operations['readShippingMethod']; + }; + '/sitemap': { + /** + * Fetch sitemaps + * Fetches a list of compressed sitemap files, which are often used by search engines. + */ + get: operations['readSitemap']; + }; +}; + +export type webhooks = Record<string, never>; + +export type components = { + schemas: { + AccountNewsletterRecipientResult: components['schemas']['Struct'] & { + status?: string; + }; + /** Added since version: 6.0.0.0 */ + AclRole: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.1.0 */ + App: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.1.0 */ + AppActionButton: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.15.0 */ + AppAdministrationSnippet: { + appId: string; + /** Format: date-time */ + createdAt: string; + id?: string; + localeId: string; + /** Format: date-time */ + updatedAt?: string; + value: string; + }; + /** Added since version: 6.4.2.0 */ + AppCmsBlock: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.10.0 */ + AppFlowAction: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.5.2.0 */ + AppFlowEvent: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.1.0 */ + AppPaymentMethod: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.10.3 */ + AppScriptCondition: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.1.0 */ + AppTemplate: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + ArrayStruct: components['schemas']['Struct']; + /** Members of the attributes object ("attributes") represent information about the resource object in which it's defined. */ + attributes: GenericRecord; + Cart: components['schemas']['ArrayStruct'] & { + /** An affiliate tracking code */ + affiliateCode?: string; + /** A campaign tracking code */ + campaignCode?: string; + /** A comment that can be added to the cart. */ + customerComment?: string; + /** A list of all cart errors, such as insufficient stocks, invalid addresses or vouchers. */ + errors?: { + key?: string; + level?: string; + message?: string; + }[]; + /** All items within the cart */ + lineItems?: components['schemas']['LineItem'][]; + modified?: boolean; + /** Name of the cart - for example `guest-cart` */ + name?: string; + price?: { + /** + * Format: float + * Net price of the cart + */ + netPrice?: number; + /** + * Format: float + * Price for all line items in the cart + */ + positionPrice?: number; + /** Tax calculation for the cart. One of `gross`, `net` or `tax-free` */ + taxStatus?: string; + /** + * Format: float + * Total price of the cart, including shipping costs, discounts and taxes + */ + totalPrice?: number; + }; + /** Context token identifying the cart and the user session */ + token?: string; + /** A list of all payment transactions associated with the current cart. */ + transactions?: { + paymentMethodId?: string; + }[]; + }; + CartItems: components['schemas']['ArrayStruct'] & { + items?: components['schemas']['LineItem'][]; + }; + /** Added since version: 6.0.0.0 */ + Category: { + active?: boolean; + afterCategoryId?: string; + afterCategoryVersionId?: string; + breadcrumb?: readonly unknown[]; + /** Format: int64 */ + childCount?: number; + children?: components['schemas']['Category']; + cmsPage?: components['schemas']['CmsPage']; + cmsPageId?: string; + /** Runtime field, cannot be used as part of the criteria. */ + cmsPageIdSwitched?: boolean; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + customEntityTypeId?: string; + customFields?: GenericRecord; + description?: string; + displayNestedProducts: boolean; + externalLink?: string; + id?: string; + internalLink?: string; + keywords?: string; + /** Format: int64 */ + level?: number; + linkNewTab?: boolean; + linkType?: string; + media?: components['schemas']['Media']; + mediaId?: string; + metaDescription?: string; + metaTitle?: string; + name: string; + parent?: components['schemas']['Category']; + parentId?: string; + parentVersionId?: string; + path?: string; + productAssignmentType: string; + seoUrls?: Array<components['schemas']['SeoUrl']>; + translated?: { + afterCategoryId?: string; + afterCategoryVersionId?: string; + cmsPageId?: string; + cmsPageVersionId?: string; + customEntityTypeId?: string; + description?: string; + externalLink?: string; + internalLink?: string; + keywords?: string; + linkType?: string; + mediaId?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + parentId?: string; + parentVersionId?: string; + path?: string; + productAssignmentType?: string; + type?: string; + versionId?: string; + }; + type: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + visible?: boolean; + /** + * Format: int64 + * Runtime field, cannot be used as part of the criteria. + */ + visibleChildCount?: number; + }; + /** Added since version: 6.0.0.0 */ + CategoryJsonApi: components['schemas']['resource'] & { + active?: boolean; + afterCategoryId?: string; + afterCategoryVersionId?: string; + breadcrumb?: readonly unknown[]; + /** Format: int64 */ + childCount?: number; + cmsPageId?: string; + /** Runtime field, cannot be used as part of the criteria. */ + cmsPageIdSwitched?: boolean; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + customEntityTypeId?: string; + customFields?: GenericRecord; + description?: string; + displayNestedProducts: boolean; + externalLink?: string; + id?: string; + internalLink?: string; + keywords?: string; + /** Format: int64 */ + level?: number; + linkNewTab?: boolean; + linkType?: string; + mediaId?: string; + metaDescription?: string; + metaTitle?: string; + name: string; + parentId?: string; + parentVersionId?: string; + path?: string; + productAssignmentType: string; + relationships?: { + children?: { + data?: { + /** @example 0188f8334a2a7224bc6f4f9d2589f76e */ + id?: string; + /** @example category */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /category/0188f8334a2a7224bc6f4f9d23ddd8ec/children + */ + related?: string; + }; + }; + cmsPage?: { + data?: { + /** @example 0188f8334a2a7224bc6f4f9d26fe9251 */ + id?: string; + /** @example cms_page */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /category/0188f8334a2a7224bc6f4f9d23ddd8ec/cmsPage + */ + related?: string; + }; + }; + media?: { + data?: { + /** @example 0188f8334a2a7224bc6f4f9d261b0ef8 */ + id?: string; + /** @example media */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /category/0188f8334a2a7224bc6f4f9d23ddd8ec/media + */ + related?: string; + }; + }; + parent?: { + data?: { + /** @example 0188f8334a2a7224bc6f4f9d24c6c257 */ + id?: string; + /** @example category */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /category/0188f8334a2a7224bc6f4f9d23ddd8ec/parent + */ + related?: string; + }; + }; + seoUrls?: { + data?: { + /** @example 0188f8334a2a7224bc6f4f9d2755e03b */ + id?: string; + /** @example seo_url */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /category/0188f8334a2a7224bc6f4f9d23ddd8ec/seoUrls + */ + related?: string; + }; + }; + }; + translated?: { + afterCategoryId?: string; + afterCategoryVersionId?: string; + cmsPageId?: string; + cmsPageVersionId?: string; + customEntityTypeId?: string; + description?: string; + externalLink?: string; + internalLink?: string; + keywords?: string; + linkType?: string; + mediaId?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + parentId?: string; + parentVersionId?: string; + path?: string; + productAssignmentType?: string; + type?: string; + versionId?: string; + }; + type: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + visible?: boolean; + /** + * Format: int64 + * Runtime field, cannot be used as part of the criteria. + */ + visibleChildCount?: number; + }; + /** Added since version: 6.0.0.0 */ + CmsBlock: { + backgroundColor?: string; + backgroundMedia?: components['schemas']['Media']; + backgroundMediaId?: string; + backgroundMediaMode?: string; + cmsSectionVersionId?: string; + /** Format: date-time */ + createdAt: string; + cssClass?: string; + customFields?: GenericRecord; + extensions?: { + swagCmsExtensionsBlockRule?: { + data?: { + /** @example 0188f8334a2b7161b75c68356973a98a */ + id?: string; + /** @example swag_cms_extensions_block_rule */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /cms-block/0188f8334a2a7224bc6f4f9d284557ed/swagCmsExtensionsBlockRule + */ + related?: string; + }; + }; + swagCmsExtensionsQuickview?: { + data?: { + /** @example 0188f8334a2b7161b75c6835696f14f7 */ + id?: string; + /** @example swag_cms_extensions_quickview */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /cms-block/0188f8334a2a7224bc6f4f9d284557ed/swagCmsExtensionsQuickview + */ + related?: string; + }; + }; + }; + id?: string; + marginBottom?: string; + marginLeft?: string; + marginRight?: string; + marginTop?: string; + name?: string; + /** Format: int64 */ + position: number; + sectionId: string; + sectionPosition?: string; + slots?: components['schemas']['CmsSlot']; + type: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + visibility?: { + desktop?: boolean; + mobile?: boolean; + tablet?: boolean; + }; + }; + /** Added since version: 6.0.0.0 */ + CmsPage: { + config?: { + backgroundColor?: string; + }; + /** Format: date-time */ + createdAt: string; + cssClass?: string; + customFields?: GenericRecord; + entity?: string; + extensions?: { + swagCmsExtensionsScrollNavigationPageSettings?: { + data?: { + /** @example 0188f8334a2b7161b75c68356c80b6b2 */ + id?: string; + /** @example swag_cms_extensions_scroll_navigation_page_settings */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /cms-page/0188f8334a2b7161b75c683569f9dfb7/swagCmsExtensionsScrollNavigationPageSettings + */ + related?: string; + }; + }; + }; + id?: string; + landingPages?: components['schemas']['LandingPage']; + name?: string; + previewMedia?: components['schemas']['Media']; + previewMediaId?: string; + sections?: components['schemas']['CmsSection']; + translated?: { + cssClass?: string; + entity?: string; + name?: string; + previewMediaId?: string; + type?: string; + versionId?: string; + }; + type: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + CmsPageActivity: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + CmsPageDraft: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CmsSection: { + backgroundColor?: string; + backgroundMedia?: components['schemas']['Media']; + backgroundMediaId?: string; + backgroundMediaMode?: string; + blocks?: components['schemas']['CmsBlock']; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + cssClass?: string; + customFields?: GenericRecord; + extensions?: { + swagCmsExtensionsScrollNavigation?: { + data?: { + /** @example 0188f8334a2c70408696d00e502c9862 */ + id?: string; + /** @example swag_cms_extensions_scroll_navigation */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /cms-section/0188f8334a2c70408696d00e4e76e691/swagCmsExtensionsScrollNavigation + */ + related?: string; + }; + }; + }; + id?: string; + mobileBehavior?: string; + name?: string; + page?: components['schemas']['CmsPage']; + pageId: string; + /** Format: int64 */ + position: number; + sizingMode?: string; + type: string; + /** Format: date-time */ + updatedAt?: string; + visibility?: { + desktop?: boolean; + mobile?: boolean; + tablet?: boolean; + }; + }; + /** Added since version: 6.0.0.0 */ + CmsSlot: { + block?: components['schemas']['CmsBlock']; + blockId: string; + cmsBlockVersionId?: string; + config?: GenericRecord; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + data?: GenericRecord; + fieldConfig?: GenericRecord; + id?: string; + locked?: boolean; + slot: string; + translated?: { + blockId?: string; + cmsBlockVersionId?: string; + slot?: string; + type?: string; + versionId?: string; + }; + type: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + ContextTokenResponse: { + /** Context token identifying the current user session. */ + contextToken?: string; + }; + /** Added since version: 6.0.0.0 */ + Country: { + active?: boolean; + addressFormat: GenericRecord; + advancedPostalCodePattern?: string; + checkAdvancedPostalCodePattern?: boolean; + checkPostalCodePattern?: boolean; + checkVatIdPattern?: boolean; + companyTax?: { + /** Format: float */ + amount: number; + currencyId: string; + enabled: boolean; + }; + /** Format: date-time */ + createdAt: string; + customerTax?: { + /** Format: float */ + amount: number; + currencyId: string; + enabled: boolean; + }; + customFields?: GenericRecord; + defaultPostalCodePattern?: string; + displayStateInRegistration?: boolean; + forceStateInRegistration?: boolean; + id?: string; + iso?: string; + iso3?: string; + name: string; + /** Format: int64 */ + position?: number; + postalCodeRequired?: boolean; + shippingAvailable?: boolean; + states?: components['schemas']['CountryState']; + translated?: { + advancedPostalCodePattern?: string; + defaultPostalCodePattern?: string; + iso?: string; + iso3?: string; + name?: string; + vatIdPattern?: string; + }; + /** Format: date-time */ + updatedAt?: string; + vatIdPattern?: string; + vatIdRequired?: boolean; + }; + /** Added since version: 6.0.0.0 */ + CountryJsonApi: components['schemas']['resource'] & { + active?: boolean; + addressFormat: GenericRecord; + advancedPostalCodePattern?: string; + checkAdvancedPostalCodePattern?: boolean; + checkPostalCodePattern?: boolean; + checkVatIdPattern?: boolean; + companyTax?: { + /** Format: float */ + amount: number; + currencyId: string; + enabled: boolean; + }; + /** Format: date-time */ + createdAt: string; + customerTax?: { + /** Format: float */ + amount: number; + currencyId: string; + enabled: boolean; + }; + customFields?: GenericRecord; + defaultPostalCodePattern?: string; + displayStateInRegistration?: boolean; + forceStateInRegistration?: boolean; + id?: string; + iso?: string; + iso3?: string; + name: string; + /** Format: int64 */ + position?: number; + postalCodeRequired?: boolean; + relationships?: { + states?: { + data?: { + /** @example 0188f8334a2d7287b5c9797ef464fd7a */ + id?: string; + /** @example country_state */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /country/0188f8334a2c70408696d00e522c26db/states + */ + related?: string; + }; + }; + }; + shippingAvailable?: boolean; + translated?: { + advancedPostalCodePattern?: string; + defaultPostalCodePattern?: string; + iso?: string; + iso3?: string; + name?: string; + vatIdPattern?: string; + }; + /** Format: date-time */ + updatedAt?: string; + vatIdPattern?: string; + vatIdRequired?: boolean; + }; + /** Added since version: 6.0.0.0 */ + CountryState: { + active?: boolean; + countryId: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + /** Format: int64 */ + position?: number; + shortCode: string; + translated?: { + countryId?: string; + name?: string; + shortCode?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CountryStateJsonApi: components['schemas']['resource'] & { + active?: boolean; + countryId: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + /** Format: int64 */ + position?: number; + shortCode: string; + translated?: { + countryId?: string; + name?: string; + shortCode?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Search parameters. For more information, see our documentation on [Search Queries](https://shopware.stoplight.io/docs/store-api/docs/concepts/search-queries.md#structure) */ + Criteria: { + /** Used to perform aggregations on the search result. For more information, see [Search Queries > Aggregations](https://shopware.stoplight.io/docs/store-api/docs/concepts/search-queries.md#aggregations) */ + aggregations?: { + /** The field you want to aggregate over. */ + field: string; + /** Give your aggregation an identifier, so you can find it easier */ + name: string; + /** The type of aggregation */ + type: string; + }[]; + /** Used to fetch associations which are not fetched by default. */ + associations?: GenericRecord; + /** Fields which should be returned in the search result. */ + fields?: string[]; + /** List of filters to restrict the search result. For more information, see [Search Queries > Filter](https://shopware.stoplight.io/docs/store-api/docs/concepts/search-queries.md#filter) */ + filter?: { + field: string; + type: string; + value: string | null | boolean; + }[]; + /** Perform groupings over certain fields */ + grouping?: string[]; + /** Number of items per result page */ + limit?: number; + /** Search result page */ + page?: number; + /** Filters that applied without affecting aggregations. For more information, see [Search Queries > Post Filter](https://shopware.stoplight.io/docs/store-api/docs/concepts/search-queries.md#post-filter) */ + 'post-filter'?: { + field: string; + type: string; + value: string; + }[]; + /** Sorting in the search result. */ + sort?: { + field: string; + naturalSorting?: boolean; + order?: string; + }[]; + /** + * Whether the total for the total number of hits should be determined for the search query. 0 = disabled total count, 1 = calculate exact total amount (slow), 2 = calculate only for next page (fast) + * @default 0 + * @enum {integer} + */ + 'total-count-mode'?: 0 | 1 | 2; + }; + CrossSellingElementCollection: { + crossSelling?: { + active?: boolean; + /** Format: int32 */ + limit?: number; + name?: string; + /** Format: int32 */ + position?: number; + productId?: string; + productStreamId?: string; + sortBy?: string; + sortDirection?: string; + type?: string; + }; + products?: components['schemas']['Product'][]; + /** Format: int32 */ + total?: number; + }[]; + /** Added since version: 6.0.0.0 */ + Currency: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + /** Format: float */ + factor: number; + id?: string; + isoCode: string; + /** Runtime field, cannot be used as part of the criteria. */ + isSystemDefault?: boolean; + itemRounding: { + /** Format: int64 */ + decimals?: number; + /** Format: float */ + interval?: number; + roundForNet?: boolean; + }; + name: string; + /** Format: int64 */ + position?: number; + shortName: string; + symbol: string; + /** Format: float */ + taxFreeFrom?: number; + totalRounding: { + /** Format: int64 */ + decimals?: number; + /** Format: float */ + interval?: number; + roundForNet?: boolean; + }; + translated?: { + isoCode?: string; + name?: string; + shortName?: string; + symbol?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.0.0 */ + CurrencyCountryRounding: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CurrencyJsonApi: components['schemas']['resource'] & { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + /** Format: float */ + factor: number; + id?: string; + isoCode: string; + /** Runtime field, cannot be used as part of the criteria. */ + isSystemDefault?: boolean; + itemRounding: { + /** Format: int64 */ + decimals?: number; + /** Format: float */ + interval?: number; + roundForNet?: boolean; + }; + name: string; + /** Format: int64 */ + position?: number; + shortName: string; + symbol: string; + /** Format: float */ + taxFreeFrom?: number; + totalRounding: { + /** Format: int64 */ + decimals?: number; + /** Format: float */ + interval?: number; + roundForNet?: boolean; + }; + translated?: { + isoCode?: string; + name?: string; + shortName?: string; + symbol?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.9.0 */ + CustomEntity: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Customer: { + accountType: string; + active?: boolean; + addresses?: components['schemas']['CustomerAddress']; + affiliateCode?: string; + birthday?: string; + campaignCode?: string; + company?: string; + /** Format: date-time */ + createdAt: string; + createdById?: string; + customerNumber: string; + customFields?: GenericRecord; + defaultBillingAddress?: components['schemas']['CustomerAddress']; + defaultBillingAddressId: string; + defaultPaymentMethod?: components['schemas']['PaymentMethod']; + defaultPaymentMethodId: string; + defaultShippingAddress?: components['schemas']['CustomerAddress']; + defaultShippingAddressId: string; + /** Format: date-time */ + doubleOptInConfirmDate?: string; + /** Format: date-time */ + doubleOptInEmailSentDate?: string; + doubleOptInRegistration?: boolean; + email: string; + /** Format: date-time */ + firstLogin?: string; + firstName: string; + group?: components['schemas']['CustomerGroup']; + groupId: string; + guest?: boolean; + hash?: string; + id?: string; + language?: components['schemas']['Language']; + languageId: string; + /** Format: date-time */ + lastLogin?: string; + lastName: string; + /** Format: date-time */ + lastOrderDate?: string; + lastPaymentMethod?: components['schemas']['PaymentMethod']; + lastPaymentMethodId?: string; + /** Format: int64 */ + orderCount?: number; + /** Format: float */ + orderTotalAmount?: number; + /** Format: int64 */ + reviewCount?: number; + salesChannelId: string; + salutation?: components['schemas']['Salutation']; + salutationId?: string; + tagIds?: readonly string[]; + title?: string; + /** Format: date-time */ + updatedAt?: string; + updatedById?: string; + vatIds?: string[]; + }; + /** Added since version: 6.0.0.0 */ + CustomerAddress: { + additionalAddressLine1?: string; + additionalAddressLine2?: string; + city: string; + company?: string; + country?: components['schemas']['Country']; + countryId: string; + countryState?: components['schemas']['CountryState']; + countryStateId?: string; + /** Format: date-time */ + createdAt: string; + customerId: string; + customFields?: GenericRecord; + department?: string; + firstName: string; + id?: string; + lastName: string; + phoneNumber?: string; + salutation?: components['schemas']['Salutation']; + salutationId?: string; + street: string; + title?: string; + /** Format: date-time */ + updatedAt?: string; + zipcode?: string; + }; + /** Added since version: 6.0.0.0 */ + CustomerGroup: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + displayGross?: boolean; + id?: string; + name: string; + registrationActive?: boolean; + registrationIntroduction?: string; + registrationOnlyCompanyRegistration?: boolean; + registrationSeoMetaDescription?: string; + registrationTitle?: string; + translated?: { + name?: string; + registrationIntroduction?: string; + registrationSeoMetaDescription?: string; + registrationTitle?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.1.0.0 */ + CustomerRecovery: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CustomerTag: { + customerId: string; + id?: string; + tag?: components['schemas']['Tag']; + tagId: string; + }; + /** Added since version: 6.3.4.0 */ + CustomerWishlist: { + /** Format: date-time */ + createdAt: string; + customerId: string; + customFields?: GenericRecord; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.4.0 */ + CustomerWishlistProduct: { + /** Format: date-time */ + createdAt: string; + id?: string; + productId: string; + productVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CustomField: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CustomFieldSet: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + CustomFieldSetRelation: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + CustomPrice: { + /** Format: date-time */ + createdAt: string; + customer?: components['schemas']['Customer']; + customerGroup?: components['schemas']['CustomerGroup']; + customerGroupId?: string; + customerId?: string; + id?: string; + price: GenericRecord; + product?: components['schemas']['Product']; + productId: string; + productVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** The document's "primary data" is a representation of the resource or collection of resources targeted by a request. */ + data: components['schemas']['resource'] | components['schemas']['resource'][]; + /** Added since version: 6.0.0.0 */ + DeliveryTime: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + /** Format: int64 */ + max: number; + /** Format: int64 */ + min: number; + name: string; + translated?: { + name?: string; + unit?: string; + }; + unit: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Document: { + config: GenericRecord; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + deepLinkCode: string; + dependentDocuments?: components['schemas']['Document']; + documentMediaFile?: components['schemas']['Media']; + documentMediaFileId?: string; + documentType?: components['schemas']['DocumentType']; + documentTypeId: string; + fileType: string; + id?: string; + order?: components['schemas']['Order']; + orderId: string; + orderVersionId?: string; + referencedDocument?: components['schemas']['Document']; + referencedDocumentId?: string; + sent?: boolean; + static?: boolean; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + DocumentBaseConfig: { + config?: GenericRecord; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + documentNumber?: string; + documentTypeId: string; + filenamePrefix?: string; + filenameSuffix?: string; + global: boolean; + id?: string; + logo?: components['schemas']['Media']; + logoId?: string; + name: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + DocumentBaseConfigSalesChannel: { + /** Format: date-time */ + createdAt: string; + documentBaseConfigId: string; + documentTypeId?: string; + id?: string; + salesChannelId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + DocumentType: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + technicalName: string; + translated?: { + name?: string; + technicalName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + EntitySearchResult: components['schemas']['ArrayStruct'] & { + /** Contains aggregated data. A simple example is the determination of the average price from a product search query. */ + aggregations?: GenericRecord[]; + entity?: string; + /** The actual limit. This is used for pagination and goes together with the page. */ + limit?: number; + /** The actual page. This can be used for pagination. */ + page?: number; + /** The total number of found entities */ + total?: number; + }; + error: { + /** An application-specific error code, expressed as a string value. */ + code?: string; + /** A human-readable explanation specific to this occurrence of the problem. */ + detail?: string; + /** A unique identifier for this particular occurrence of the problem. */ + id?: string; + links?: components['schemas']['links']; + meta?: components['schemas']['meta']; + source?: { + /** A string indicating which query parameter caused the error. */ + parameter?: string; + /** A JSON Pointer [RFC6901] to the associated entity in the request document [e.g. "/data" for a primary data object, or "/data/attributes/title" for a specific attribute]. */ + pointer?: string; + }; + /** The HTTP status code applicable to this problem, expressed as a string value. */ + status?: string; + /** A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization. */ + title?: string; + }; + failure: { + errors: components['schemas']['error'][]; + links?: components['schemas']['links']; + meta?: components['schemas']['meta']; + }; + FindProductVariantRouteResponse: { + foundCombination?: { + options?: string[]; + variantId?: string; + }; + }; + /** Added since version: 6.4.6.0 */ + Flow: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.6.0 */ + FlowSequence: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.18.0 */ + FlowTemplate: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ImportExportFile: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ImportExportLog: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ImportExportProfile: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + info: { + jsonapi?: components['schemas']['jsonapi']; + links?: components['schemas']['links']; + meta: components['schemas']['meta']; + }; + /** Added since version: 6.0.0.0 */ + Integration: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** An object describing the server's implementation */ + jsonapi: { + meta?: components['schemas']['meta']; + version?: string; + }; + /** Added since version: 6.4.0.0 */ + LandingPage: { + active?: boolean; + cmsPage?: components['schemas']['CmsPage']; + cmsPageId?: string; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + keywords?: string; + metaDescription?: string; + metaTitle?: string; + name: string; + seoUrls?: components['schemas']['SeoUrl']; + slotConfig?: GenericRecord; + translated?: { + cmsPageId?: string; + cmsPageVersionId?: string; + keywords?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + url?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + url: string; + versionId?: string; + }; + /** Added since version: 6.4.0.0 */ + LandingPageJsonApi: components['schemas']['resource'] & { + active?: boolean; + cmsPageId?: string; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + keywords?: string; + metaDescription?: string; + metaTitle?: string; + name: string; + relationships?: { + cmsPage?: { + data?: { + /** @example 0188f8334a3371508da83536076f5d02 */ + id?: string; + /** @example cms_page */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /landing-page/0188f8334a3371508da835360727da28/cmsPage + */ + related?: string; + }; + }; + seoUrls?: { + data?: { + /** @example 0188f8334a3371508da8353607fb977f */ + id?: string; + /** @example seo_url */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /landing-page/0188f8334a3371508da835360727da28/seoUrls + */ + related?: string; + }; + }; + }; + slotConfig?: GenericRecord; + translated?: { + cmsPageId?: string; + cmsPageVersionId?: string; + keywords?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + url?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + url: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + Language: { + children?: components['schemas']['Language']; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + locale?: components['schemas']['Locale']; + localeId: string; + name: string; + parent?: components['schemas']['Language']; + parentId?: string; + translationCode?: components['schemas']['Locale']; + translationCodeId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + LanguageJsonApi: components['schemas']['resource'] & { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + localeId: string; + name: string; + parentId?: string; + relationships?: { + children?: { + data?: { + /** @example 0188f8334a3471fb97fef3b5dd5bdeef */ + id?: string; + /** @example language */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /language/0188f8334a3471fb97fef3b5dbb3b49f/children + */ + related?: string; + }; + }; + locale?: { + data?: { + /** @example 0188f8334a3471fb97fef3b5dc1432ad */ + id?: string; + /** @example locale */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /language/0188f8334a3471fb97fef3b5dbb3b49f/locale + */ + related?: string; + }; + }; + parent?: { + data?: { + /** @example 0188f8334a3471fb97fef3b5dbbdb24d */ + id?: string; + /** @example language */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /language/0188f8334a3471fb97fef3b5dbb3b49f/parent + */ + related?: string; + }; + }; + translationCode?: { + data?: { + /** @example 0188f8334a3471fb97fef3b5dce52fac */ + id?: string; + /** @example locale */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /language/0188f8334a3471fb97fef3b5dbb3b49f/translationCode + */ + related?: string; + }; + }; + }; + translationCodeId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + LineItem: { + description?: string; + good?: boolean; + id?: string; + label?: string; + modified?: boolean; + /** Format: int32 */ + quantity?: number; + referencedId?: string; + removable?: boolean; + stackable?: boolean; + type?: string; + }; + /** A link **MUST** be represented as either: a string containing the link's URL or a link object. */ + link: OneOf< + [ + string, + { + /** + * Format: uri-reference + * A string containing the link's URL. + */ + href: string; + meta?: components['schemas']['meta']; + } + ] + >; + /** The "type" and "id" to non-empty members. */ + linkage: { + id: string; + meta?: components['schemas']['meta']; + type: string; + }; + links: GenericRecord; + /** Added since version: 6.0.0.0 */ + Locale: { + code: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + territory: string; + translated?: { + code?: string; + name?: string; + territory?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + LogEntry: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MailHeaderFooter: { + /** Format: date-time */ + createdAt: string; + description?: string; + footerHtml?: string; + footerPlain?: string; + headerHtml?: string; + headerPlain?: string; + id?: string; + name: string; + systemDefault?: boolean; + translated?: { + description?: string; + footerHtml?: string; + footerPlain?: string; + headerHtml?: string; + headerPlain?: string; + name?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MailTemplate: { + contentHtml: string; + contentPlain: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + mailTemplateType?: components['schemas']['MailTemplateType']; + media?: components['schemas']['MailTemplateMedia']; + senderName?: string; + systemDefault?: boolean; + translated?: { + contentHtml?: string; + contentPlain?: string; + senderName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MailTemplateMedia: { + id?: string; + languageId: string; + mailTemplateId: string; + media?: components['schemas']['Media']; + mediaId: string; + /** Format: int64 */ + position?: number; + }; + /** Added since version: 6.0.0.0 */ + MailTemplateType: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + technicalName: string; + translated?: { + name?: string; + technicalName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.1.0.0 */ + MainCategory: { + categoryId: string; + categoryVersionId?: string; + /** Format: date-time */ + createdAt: string; + id?: string; + productId: string; + productVersionId?: string; + salesChannelId: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.1.0.0 */ + MainCategoryJsonApi: components['schemas']['resource'] & { + categoryId: string; + categoryVersionId?: string; + /** Format: date-time */ + createdAt: string; + id?: string; + productId: string; + productVersionId?: string; + salesChannelId: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Media: { + alt?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + extensions?: { + mediaAiTag?: { + data?: { + /** @example 0188f8334a3670679577cca714656bdf */ + id?: string; + /** @example media_ai_tag */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /media/0188f8334a3670679577cca713097429/mediaAiTag + */ + related?: string; + }; + }; + }; + fileExtension?: string; + fileName?: string; + /** Format: int64 */ + fileSize?: number; + /** Runtime field, cannot be used as part of the criteria. */ + hasFile?: boolean; + id?: string; + metaData?: GenericRecord; + mimeType?: string; + private?: boolean; + thumbnails?: components['schemas']['MediaThumbnail']; + title?: string; + translated?: { + alt?: string; + fileExtension?: string; + fileName?: string; + mimeType?: string; + title?: string; + uploadedAt?: string; + url?: string; + }; + /** Format: date-time */ + updatedAt?: string; + /** Format: date-time */ + uploadedAt?: string; + /** Runtime field, cannot be used as part of the criteria. */ + url?: string; + }; + /** Added since version: */ + MediaAiTag: { + /** Format: date-time */ + createdAt: string; + id?: string; + media?: components['schemas']['Media']; + tags?: unknown[]; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MediaDefaultFolder: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MediaFolder: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MediaFolderConfiguration: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + MediaTag: { + id?: string; + media?: components['schemas']['Media']; + mediaId: string; + tag?: components['schemas']['Tag']; + tagId: string; + }; + /** Added since version: 6.0.0.0 */ + MediaThumbnail: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + /** Format: int64 */ + height: number; + id?: string; + mediaId: string; + /** Format: date-time */ + updatedAt?: string; + /** Runtime field, cannot be used as part of the criteria. */ + url?: string; + /** Format: int64 */ + width: number; + }; + /** Added since version: 6.0.0.0 */ + MediaThumbnailSize: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + /** Format: int64 */ + height: number; + id?: string; + /** Format: date-time */ + updatedAt?: string; + /** Format: int64 */ + width: number; + }; + /** Non-standard meta-information that can not be represented as an attribute or relationship. */ + meta: GenericRecord; + NavigationRouteResponse: components['schemas']['Category'][]; + /** Added since version: 6.0.0.0 */ + NewsletterRecipient: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + NewsletterRecipientJsonApi: components['schemas']['resource'] & { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.7.0 */ + Notification: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + NumberRange: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + NumberRangeSalesChannel: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + NumberRangeState: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + NumberRangeType: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Order: { + addresses?: components['schemas']['OrderAddress']; + affiliateCode?: string; + /** Format: float */ + amountNet?: number; + /** Format: float */ + amountTotal?: number; + billingAddress?: components['schemas']['OrderAddress']; + billingAddressId: string; + billingAddressVersionId?: string; + campaignCode?: string; + /** Format: date-time */ + createdAt: string; + createdById?: string; + currency?: components['schemas']['Currency']; + /** Format: float */ + currencyFactor: number; + currencyId: string; + customerComment?: string; + customFields?: GenericRecord; + deepLinkCode?: string; + deliveries?: components['schemas']['OrderDelivery']; + documents?: components['schemas']['Document']; + extensions?: { + returns?: { + data?: { + /** @example 0188f8334a3971cabdd5f601ba4bcdc4 */ + id?: string; + /** @example order_return */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /order/0188f8334a387386ab9b000ef2e2f216/returns + */ + related?: string; + }; + }; + }; + id?: string; + language?: components['schemas']['Language']; + languageId: string; + lineItems?: components['schemas']['OrderLineItem']; + orderCustomer?: components['schemas']['OrderCustomer']; + orderDate?: string; + /** Format: date-time */ + orderDateTime: string; + orderNumber?: string; + /** Format: float */ + positionPrice?: number; + price?: { + calculatedTaxes?: GenericRecord; + /** Format: float */ + netPrice: number; + /** Format: float */ + positionPrice: number; + /** Format: float */ + rawTotal: number; + taxRules?: GenericRecord; + taxStatus: string; + /** Format: float */ + totalPrice: number; + }; + salesChannelId: string; + shippingCosts?: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + /** Format: float */ + shippingTotal?: number; + stateMachineState?: components['schemas']['StateMachineState']; + tags?: components['schemas']['Tag']; + taxStatus?: string; + transactions?: components['schemas']['OrderTransaction']; + /** Format: date-time */ + updatedAt?: string; + updatedById?: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + OrderAddress: { + additionalAddressLine1?: string; + additionalAddressLine2?: string; + city: string; + company?: string; + country?: components['schemas']['Country']; + countryId: string; + countryState?: components['schemas']['CountryState']; + countryStateId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + department?: string; + firstName: string; + id?: string; + lastName: string; + phoneNumber?: string; + salutation?: components['schemas']['Salutation']; + street: string; + title?: string; + /** Format: date-time */ + updatedAt?: string; + vatId?: string; + versionId?: string; + zipcode?: string; + }; + /** Added since version: 6.0.0.0 */ + OrderCustomer: { + company?: string; + /** Format: date-time */ + createdAt: string; + customerNumber?: string; + customFields?: GenericRecord; + email: string; + firstName: string; + id?: string; + lastName: string; + salutation?: components['schemas']['Salutation']; + salutationId: string; + title?: string; + /** Format: date-time */ + updatedAt?: string; + vatIds?: string[]; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + OrderDelivery: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + orderId: string; + orderVersionId?: string; + positions?: components['schemas']['OrderDeliveryPosition']; + shippingCosts?: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + /** Format: date-time */ + shippingDateEarliest: string; + /** Format: date-time */ + shippingDateLatest: string; + shippingMethod?: components['schemas']['ShippingMethod']; + shippingMethodId: string; + shippingOrderAddress?: components['schemas']['OrderAddress']; + shippingOrderAddressId: string; + shippingOrderAddressVersionId?: string; + stateId: string; + stateMachineState?: components['schemas']['StateMachineState']; + trackingCodes: string[]; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + OrderDeliveryPosition: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + orderDeliveryId: string; + orderDeliveryVersionId?: string; + orderLineItemId: string; + orderLineItemVersionId?: string; + price?: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + /** Format: int64 */ + quantity?: number; + /** Format: float */ + totalPrice?: number; + /** Format: float */ + unitPrice?: number; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + OrderLineItem: { + children: components['schemas']['OrderLineItem']; + cover?: components['schemas']['Media']; + coverId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + downloads?: components['schemas']['OrderLineItemDownload']; + extensions?: { + returns?: { + data?: { + /** @example 0188f8334a3b72a794436c60aa753810 */ + id?: string; + /** @example order_return_line_item */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /order-line-item/0188f8334a3b72a794436c60a7f605e7/returns + */ + related?: string; + }; + }; + state?: { + data?: { + /** @example 0188f8334a3b72a794436c60aad25086 */ + id?: string; + /** @example state_machine_state */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /order-line-item/0188f8334a3b72a794436c60a7f605e7/state + */ + related?: string; + }; + }; + }; + good?: boolean; + id?: string; + identifier: string; + label: string; + orderDeliveryPositions?: components['schemas']['OrderDeliveryPosition']; + orderId: string; + orderVersionId?: string; + parent?: components['schemas']['OrderLineItem']; + parentId?: string; + parentVersionId?: string; + payload?: GenericRecord; + /** Format: int64 */ + position: number; + priceDefinition?: GenericRecord; + productId?: string; + productVersionId?: string; + /** Format: int64 */ + quantity: number; + referencedId?: string; + removable?: boolean; + stackable?: boolean; + states: string[]; + /** Format: float */ + totalPrice?: number; + type?: string; + /** Format: float */ + unitPrice?: number; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.4.19.0 */ + OrderLineItemDownload: { + accessGranted: boolean; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + media?: components['schemas']['Media']; + mediaId: string; + orderLineItem?: components['schemas']['OrderLineItem']; + orderLineItemId: string; + orderLineItemVersionId?: string; + /** Format: int64 */ + position: number; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + OrderProductWarehouse: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + OrderReturn: { + /** Format: float */ + amountNet?: number; + /** Format: float */ + amountTotal?: number; + /** Format: date-time */ + createdAt: string; + createdById?: string; + id?: string; + lineItems?: components['schemas']['OrderReturnLineItem']; + orderId: string; + orderVersionId?: string; + price?: { + calculatedTaxes?: GenericRecord; + /** Format: float */ + netPrice: number; + /** Format: float */ + positionPrice: number; + /** Format: float */ + rawTotal: number; + taxRules?: GenericRecord; + taxStatus: string; + /** Format: float */ + totalPrice: number; + }; + /** Format: date-time */ + requestedAt: string; + returnNumber: string; + shippingCosts?: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + state?: components['schemas']['StateMachineState']; + stateId: string; + /** Format: date-time */ + updatedAt?: string; + updatedById?: string; + versionId?: string; + }; + /** Added since version: */ + OrderReturnLineItem: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + orderLineItemId: string; + orderLineItemVersionId?: string; + orderReturnId: string; + orderReturnVersionId?: string; + /** Format: int64 */ + quantity: number; + reason?: components['schemas']['OrderReturnLineItemReason']; + reasonId: string; + /** Format: float */ + refundAmount?: number; + /** Format: int64 */ + restockQuantity?: number; + state?: components['schemas']['StateMachineState']; + stateId: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + OrderReturnLineItemReason: { + content: string; + /** Format: date-time */ + createdAt: string; + id?: string; + reasonKey: string; + translated?: { + content?: string; + reasonKey?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + OrderRouteResponse: { + orders?: Record<string, never>; + /** The key-value pairs contain the uuid of the order as key and a boolean as value, indicating that the payment method can still be changed. */ + paymentChangeable?: GenericRecord; + }; + /** Added since version: 6.0.0.0 */ + OrderTag: { + id?: string; + order?: components['schemas']['Order']; + orderId: string; + orderVersionId?: string; + tag?: components['schemas']['Tag']; + tagId: string; + }; + /** Added since version: 6.0.0.0 */ + OrderTransaction: { + amount: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + captures?: components['schemas']['OrderTransactionCapture']; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + orderId: string; + orderVersionId?: string; + paymentMethod?: components['schemas']['PaymentMethod']; + paymentMethodId: string; + stateId: string; + stateMachineState?: components['schemas']['StateMachineState']; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.4.12.0 */ + OrderTransactionCapture: { + amount: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + externalReference?: string; + id?: string; + orderTransactionId: string; + orderTransactionVersionId?: string; + refunds?: components['schemas']['OrderTransactionCaptureRefund']; + stateId: string; + stateMachineState?: components['schemas']['StateMachineState']; + transaction?: components['schemas']['OrderTransaction']; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.12.0 */ + OrderTransactionCaptureRefund: { + amount: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + captureId: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + externalReference?: string; + id?: string; + positions?: components['schemas']['OrderTransactionCaptureRefundPosition']; + reason?: string; + stateId: string; + stateMachineState?: components['schemas']['StateMachineState']; + transactionCapture?: components['schemas']['OrderTransactionCapture']; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.12.0 */ + OrderTransactionCaptureRefundPosition: { + amount: { + calculatedTaxes?: GenericRecord; + listPrice?: { + /** Format: float */ + discount?: number; + /** Format: float */ + percentage?: number; + /** Format: float */ + price?: number; + }; + /** Format: int64 */ + quantity: number; + referencePrice?: GenericRecord; + regulationPrice?: { + /** Format: float */ + price?: number; + }; + taxRules?: GenericRecord; + /** Format: float */ + totalPrice: number; + /** Format: float */ + unitPrice: number; + }; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + externalReference?: string; + id?: string; + orderLineItem?: components['schemas']['OrderLineItem']; + orderLineItemId: string; + orderLineItemVersionId?: string; + orderTransactionCaptureRefund?: components['schemas']['OrderTransactionCaptureRefund']; + /** Format: int64 */ + quantity?: number; + reason?: string; + refundId: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + OrderWarehouseGroup: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + pagination: { + /** + * Format: uri-reference + * The first page of data + */ + first?: string; + /** + * Format: uri-reference + * The last page of data + */ + last?: string; + /** + * Format: uri-reference + * The next page of data + */ + next?: string; + /** + * Format: uri-reference + * The previous page of data + */ + prev?: string; + }; + /** Added since version: 6.0.0.0 */ + PaymentMethod: { + active?: boolean; + afterOrderEnabled?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + asynchronous?: boolean; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + distinguishableName?: string; + id?: string; + media?: components['schemas']['Media']; + mediaId?: string; + name: string; + /** Format: int64 */ + position?: number; + /** Runtime field, cannot be used as part of the criteria. */ + prepared?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + refundable?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + shortName?: string; + /** Runtime field, cannot be used as part of the criteria. */ + synchronous?: boolean; + translated?: { + description?: string; + distinguishableName?: string; + mediaId?: string; + name?: string; + shortName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PaymentMethodJsonApi: components['schemas']['resource'] & { + active?: boolean; + afterOrderEnabled?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + asynchronous?: boolean; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + distinguishableName?: string; + id?: string; + mediaId?: string; + name: string; + /** Format: int64 */ + position?: number; + /** Runtime field, cannot be used as part of the criteria. */ + prepared?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + refundable?: boolean; + relationships?: { + media?: { + data?: { + /** @example 0188f8334a3e72eaac34aa0e8fdba60c */ + id?: string; + /** @example media */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /payment-method/0188f8334a3e72eaac34aa0e8f0d11e9/media + */ + related?: string; + }; + }; + }; + /** Runtime field, cannot be used as part of the criteria. */ + shortName?: string; + /** Runtime field, cannot be used as part of the criteria. */ + synchronous?: boolean; + translated?: { + description?: string; + distinguishableName?: string; + mediaId?: string; + name?: string; + shortName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Plugin: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Product: { + active?: boolean; + available?: boolean; + /** Format: int64 */ + availableStock?: number; + calculatedCheapestPrice?: GenericRecord; + /** + * Format: int64 + * Runtime field, cannot be used as part of the criteria. + */ + calculatedMaxPurchase?: number; + calculatedPrice?: GenericRecord; + calculatedPrices?: unknown[]; + canonicalProduct?: components['schemas']['Product']; + canonicalProductId?: string; + categories?: components['schemas']['Category']; + categoriesRo?: components['schemas']['Category']; + categoryIds?: readonly string[]; + categoryTree?: readonly string[]; + /** Format: int64 */ + childCount?: number; + children?: components['schemas']['Product'][]; + cmsPage?: components['schemas']['CmsPage']; + cmsPageId?: string; + cmsPageVersionId?: string; + configuratorSettings?: components['schemas']['ProductConfiguratorSetting']; + cover?: components['schemas']['ProductMedia']; + coverId?: string; + /** Format: date-time */ + createdAt: string; + crossSellings?: components['schemas']['ProductCrossSelling']; + customFields?: GenericRecord; + deliveryTime?: components['schemas']['DeliveryTime']; + deliveryTimeId?: string; + description?: string; + displayGroup?: string; + downloads?: components['schemas']['ProductDownload']; + ean?: string; + extensions?: { + reviewSummaries?: { + data?: { + /** @example 0188f8334a407238b554caed891d5bf9 */ + id?: string; + /** @example product_review_summary */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/reviewSummaries + */ + related?: string; + }; + }; + swagCustomizedProductsTemplate?: { + data?: { + /** @example 0188f8334a407238b554caed8958c5e7 */ + id?: string; + /** @example swag_customized_products_template */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/swagCustomizedProductsTemplate + */ + related?: string; + }; + }; + }; + /** Format: float */ + height?: number; + id?: string; + isCloseout?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + isNew?: boolean; + keywords?: string; + /** Format: float */ + length?: number; + mainCategories?: components['schemas']['MainCategory']; + manufacturer?: components['schemas']['ProductManufacturer']; + manufacturerId?: string; + manufacturerNumber?: string; + markAsTopseller?: boolean; + /** Format: int64 */ + maxPurchase?: number; + media?: Array<components['schemas']['ProductMedia']>; + metaDescription?: string; + metaTitle?: string; + /** Format: int64 */ + minPurchase?: number; + name: string; + optionIds?: readonly string[]; + options?: components['schemas']['PropertyGroupOption'][]; + packUnit?: string; + packUnitPlural?: string; + parent?: components['schemas']['Product']; + parentId?: string; + parentVersionId?: string; + productManufacturerVersionId?: string; + productMediaVersionId?: string; + productNumber: string; + productReviews?: components['schemas']['ProductReview']; + properties?: components['schemas']['PropertyGroupOption']; + propertyIds?: readonly string[]; + /** Format: int64 */ + purchaseSteps?: number; + /** Format: float */ + purchaseUnit?: number; + /** Format: float */ + ratingAverage?: number; + /** Format: float */ + referenceUnit?: number; + /** Format: date-time */ + releaseDate?: string; + /** Format: int64 */ + restockTime?: number; + /** Format: int64 */ + sales?: number; + seoCategory?: components['schemas']['Category']; + seoUrls?: Array<components['schemas']['SeoUrl']>; + shippingFree?: boolean; + sortedProperties?: GenericRecord; + states?: readonly string[]; + /** Format: int64 */ + stock: number; + streamIds?: readonly string[]; + streams?: components['schemas']['ProductStream']; + tax?: components['schemas']['Tax']; + taxId: string; + translated?: { + canonicalProductId?: string; + cmsPageId?: string; + cmsPageVersionId?: string; + coverId?: string; + deliveryTimeId?: string; + description?: string; + displayGroup?: string; + ean?: string; + keywords?: string; + manufacturerId?: string; + manufacturerNumber?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + packUnit?: string; + packUnitPlural?: string; + parentId?: string; + parentVersionId?: string; + productManufacturerVersionId?: string; + productMediaVersionId?: string; + productNumber?: string; + releaseDate?: string; + taxId?: string; + unitId?: string; + versionId?: string; + }; + unit?: components['schemas']['Unit']; + unitId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + /** Format: float */ + weight?: number; + /** Format: float */ + width?: number; + }; + /** Added since version: 6.0.0.0 */ + ProductConfiguratorSetting: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + media?: components['schemas']['Media']; + mediaId?: string; + option?: components['schemas']['PropertyGroupOption']; + optionId: string; + /** Format: int64 */ + position?: number; + productId: string; + productVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.1.0.0 */ + ProductCrossSelling: { + active?: boolean; + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: int64 */ + limit?: number; + name: string; + /** Format: int64 */ + position: number; + sortBy?: string; + sortDirection?: string; + translated?: { + name?: string; + sortBy?: string; + sortDirection?: string; + type?: string; + }; + type: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.2.0.0 */ + ProductCrossSellingAssignedProducts: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Represents a product along with detailed information required to display a variant selection. */ + ProductDetailResponse: { + /** List of property groups with their corresponding options and information on how to display them. */ + configurator?: components['schemas']['PropertyGroup'][]; + product?: components['schemas']['Product']; + }; + /** Added since version: 6.4.19.0 */ + ProductDownload: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + media?: components['schemas']['Media']; + mediaId: string; + /** Format: int64 */ + position?: number; + product?: components['schemas']['Product']; + productId: string; + productVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.1.0.0 */ + ProductExport: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.0.0 */ + ProductFeatureSet: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductJsonApi: components['schemas']['resource'] & { + active?: boolean; + available?: boolean; + /** Format: int64 */ + availableStock?: number; + calculatedCheapestPrice?: GenericRecord; + /** + * Format: int64 + * Runtime field, cannot be used as part of the criteria. + */ + calculatedMaxPurchase?: number; + calculatedPrice?: GenericRecord; + calculatedPrices?: unknown[]; + canonicalProductId?: string; + categoryIds?: readonly string[]; + categoryTree?: readonly string[]; + /** Format: int64 */ + childCount?: number; + cmsPageId?: string; + cmsPageVersionId?: string; + coverId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + deliveryTimeId?: string; + description?: string; + displayGroup?: string; + ean?: string; + extensions?: { + reviewSummaries?: { + data?: { + /** @example 0188f8334a407238b554caed891d5bf9 */ + id?: string; + /** @example product_review_summary */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/reviewSummaries + */ + related?: string; + }; + }; + swagCustomizedProductsTemplate?: { + data?: { + /** @example 0188f8334a407238b554caed8958c5e7 */ + id?: string; + /** @example swag_customized_products_template */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/swagCustomizedProductsTemplate + */ + related?: string; + }; + }; + }; + /** Format: float */ + height?: number; + id?: string; + isCloseout?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + isNew?: boolean; + keywords?: string; + /** Format: float */ + length?: number; + manufacturerId?: string; + manufacturerNumber?: string; + markAsTopseller?: boolean; + /** Format: int64 */ + maxPurchase?: number; + metaDescription?: string; + metaTitle?: string; + /** Format: int64 */ + minPurchase?: number; + name: string; + optionIds?: readonly string[]; + packUnit?: string; + packUnitPlural?: string; + parentId?: string; + parentVersionId?: string; + productManufacturerVersionId?: string; + productMediaVersionId?: string; + productNumber: string; + propertyIds?: readonly string[]; + /** Format: int64 */ + purchaseSteps?: number; + /** Format: float */ + purchaseUnit?: number; + /** Format: float */ + ratingAverage?: number; + /** Format: float */ + referenceUnit?: number; + relationships?: { + canonicalProduct?: { + data?: { + /** @example 0188f8334a407238b554caed828d5d76 */ + id?: string; + /** @example product */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/canonicalProduct + */ + related?: string; + }; + }; + categories?: { + data?: { + /** @example 0188f8334a407238b554caed86f22aeb */ + id?: string; + /** @example category */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/categories + */ + related?: string; + }; + }; + categoriesRo?: { + data?: { + /** @example 0188f8334a407238b554caed87f3c986 */ + id?: string; + /** @example category */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/categoriesRo + */ + related?: string; + }; + }; + children?: { + data?: { + /** @example 0188f8334a3f7253b847b4936f987d95 */ + id?: string; + /** @example product */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/children + */ + related?: string; + }; + }; + cmsPage?: { + data?: { + /** @example 0188f8334a3f7253b847b49373864110 */ + id?: string; + /** @example cms_page */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/cmsPage + */ + related?: string; + }; + }; + configuratorSettings?: { + data?: { + /** @example 0188f8334a407238b554caed84e10090 */ + id?: string; + /** @example product_configurator_setting */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/configuratorSettings + */ + related?: string; + }; + }; + cover?: { + data?: { + /** @example 0188f8334a3f7253b847b493729736ca */ + id?: string; + /** @example product_media */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/cover + */ + related?: string; + }; + }; + crossSellings?: { + data?: { + /** @example 0188f8334a407238b554caed83f60d79 */ + id?: string; + /** @example product_cross_selling */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/crossSellings + */ + related?: string; + }; + }; + deliveryTime?: { + data?: { + /** @example 0188f8334a3f7253b847b493701a96ea */ + id?: string; + /** @example delivery_time */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/deliveryTime + */ + related?: string; + }; + }; + downloads?: { + data?: { + /** @example 0188f8334a3f7253b847b4936f08f801 */ + id?: string; + /** @example product_download */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/downloads + */ + related?: string; + }; + }; + mainCategories?: { + data?: { + /** @example 0188f8334a407238b554caed8593aecf */ + id?: string; + /** @example main_category */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/mainCategories + */ + related?: string; + }; + }; + manufacturer?: { + data?: { + /** @example 0188f8334a3f7253b847b493712fbfc9 */ + id?: string; + /** @example product_manufacturer */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/manufacturer + */ + related?: string; + }; + }; + media?: { + data?: { + /** @example 0188f8334a407238b554caed832b9d78 */ + id?: string; + /** @example product_media */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/media + */ + related?: string; + }; + }; + options?: { + data?: { + /** @example 0188f8334a407238b554caed86a31928 */ + id?: string; + /** @example property_group_option */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/options + */ + related?: string; + }; + }; + parent?: { + data?: { + /** @example 0188f8334a3f7253b847b4936f97cdbd */ + id?: string; + /** @example product */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/parent + */ + related?: string; + }; + }; + productReviews?: { + data?: { + /** @example 0188f8334a407238b554caed84f7846e */ + id?: string; + /** @example product_review */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/productReviews + */ + related?: string; + }; + }; + properties?: { + data?: { + /** @example 0188f8334a407238b554caed86e4ee70 */ + id?: string; + /** @example property_group_option */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/properties + */ + related?: string; + }; + }; + seoCategory?: { + data?: { + /** @example 0188f8334a407238b554caed886084b2 */ + id?: string; + /** @example category */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/seoCategory + */ + related?: string; + }; + }; + seoUrls?: { + data?: { + /** @example 0188f8334a407238b554caed85b35097 */ + id?: string; + /** @example seo_url */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/seoUrls + */ + related?: string; + }; + }; + streams?: { + data?: { + /** @example 0188f8334a407238b554caed877212b4 */ + id?: string; + /** @example product_stream */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/streams + */ + related?: string; + }; + }; + tax?: { + data?: { + /** @example 0188f8334a3f7253b847b49370fb0a4b */ + id?: string; + /** @example tax */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/tax + */ + related?: string; + }; + }; + unit?: { + data?: { + /** @example 0188f8334a3f7253b847b493720b964c */ + id?: string; + /** @example unit */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /product/0188f8334a3e72eaac34aa0e9089a538/unit + */ + related?: string; + }; + }; + }; + /** Format: date-time */ + releaseDate?: string; + /** Format: int64 */ + restockTime?: number; + /** Format: int64 */ + sales?: number; + shippingFree?: boolean; + sortedProperties?: GenericRecord; + states?: readonly string[]; + /** Format: int64 */ + stock: number; + streamIds?: readonly string[]; + taxId: string; + translated?: { + canonicalProductId?: string; + cmsPageId?: string; + cmsPageVersionId?: string; + coverId?: string; + deliveryTimeId?: string; + description?: string; + displayGroup?: string; + ean?: string; + keywords?: string; + manufacturerId?: string; + manufacturerNumber?: string; + metaDescription?: string; + metaTitle?: string; + name?: string; + packUnit?: string; + packUnitPlural?: string; + parentId?: string; + parentVersionId?: string; + productManufacturerVersionId?: string; + productMediaVersionId?: string; + productNumber?: string; + releaseDate?: string; + taxId?: string; + unitId?: string; + versionId?: string; + }; + unitId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + /** Format: float */ + weight?: number; + /** Format: float */ + width?: number; + }; + /** Added since version: 6.0.0.0 */ + ProductKeywordDictionary: { + id?: string; + keyword: string; + languageId: string; + }; + ProductListingCriteria: components['schemas']['Criteria'] & { + /** Number of items per result page. If not set, the limit will be set according to the default products per page, defined in the system settings. */ + limit?: number; + /** Filter by manufacturers. List of manufacturer identifiers separated by a `|`. */ + manufacturer?: string; + /** + * Enables/disabled filtering by manufacturer. If set to false, the `manufacturer` filter will be ignored. Also the `aggregations[manufacturer]` key will be removed from the response. + * @default true + */ + 'manufacturer-filter'?: boolean; + /** + * Filters by a maximum product price. Has to be higher than the `min-price` filter. + * @default 0 + */ + 'max-price'?: number; + /** + * Filters by a minimum product price. Has to be lower than the `max-price` filter. + * @default 0 + */ + 'min-price'?: number; + /** Specifies the sorting of the products by `availableSortings`. If not set, the default sorting will be set according to the shop settings. The available sorting options are sent within the response under the `availableSortings` key. In order to sort by a field, consider using the `sort` parameter from the listing criteria. Do not use both parameters together, as it might lead to unexpected results. */ + order?: string; + /** + * Search result page + * @default 1 + */ + p?: number; + /** + * Enables/disabled filtering by price. If set to false, the `min-price` and `max-price` filter will be ignored. Also the `aggregations[price]` key will be removed from the response. + * @default true + */ + 'price-filter'?: boolean; + /** Filters products by their properties. List of property identifiers separated by a `|`. */ + properties?: string; + /** + * Enables/disabled filtering by properties products. If set to false, the `properties` filter will be ignored. Also the `aggregations[properties]` key will be removed from the response. + * @default true + */ + 'property-filter'?: boolean; + /** A whitelist of property identifiers which can be used for filtering. List of property identifiers separated by a `|`. The `property-filter` must be `true`, otherwise the whitelist has no effect. */ + 'property-whitelist'?: string; + /** Filter products with a minimum average rating. */ + rating?: number; + /** + * Enables/disabled filtering by rating. If set to false, the `rating` filter will be ignored. Also the `aggregations[rating]` key will be removed from the response. + * @default true + */ + 'rating-filter'?: boolean; + /** By sending the parameter `reduce-aggregations` , the post-filters that were applied by the customer, are also applied to the aggregations. This has the consequence that only values are returned in the aggregations that would lead to further filter results. This parameter is a flag, the value has no effect. */ + 'reduce-aggregations'?: string | null; + /** + * Filters products that are marked as shipping-free. + * @default false + */ + 'shipping-free'?: boolean; + /** + * Enables/disabled filtering by shipping-free products. If set to false, the `shipping-free` filter will be ignored. Also the `aggregations[shipping-free]` key will be removed from the response. + * @default true + */ + 'shipping-free-filter'?: boolean; + }; + /** Additional flags for product listings */ + ProductListingFlags: { + /** Resets all aggregations in the criteria. This parameter is a flag, the value has no effect. */ + 'no-aggregations'?: string | null; + /** If this flag is set, no products are fetched. Sorting and associations are also ignored. This parameter is a flag, the value has no effect. */ + 'only-aggregations'?: string | null; + }; + ProductListingResult: components['schemas']['EntitySearchResult'] & { + /** Contains the available sorting. These can be used to show a sorting select-box in the product listing. */ + availableSortings?: GenericRecord[]; + /** Contains the state of the filters. These can be used to create listing filters. */ + currentFilters?: { + manufacturer?: GenericRecord[]; + navigationId?: string; + price?: { + max?: number; + min?: number; + }; + properties?: GenericRecord[]; + rating?: number; + 'shipping-free'?: boolean; + }; + elements?: components['schemas']['Product'][]; + sorting?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductManufacturer: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + id?: string; + link?: string; + media?: components['schemas']['Media']; + mediaId?: string; + name: string; + translated?: { + description?: string; + link?: string; + mediaId?: string; + name?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductMedia: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + media?: components['schemas']['Media']; + mediaId: string; + /** Format: int64 */ + position?: number; + productId: string; + productVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductPrice: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductReview: { + comment?: string; + content: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + languageId: string; + /** Format: float */ + points?: number; + productId: string; + productVersionId?: string; + salesChannelId: string; + status?: boolean; + title: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + ProductReviewSummary: { + /** Format: date-time */ + createdAt: string; + id?: string; + product?: components['schemas']['Product']; + productId: string; + salesChannel?: components['schemas']['SalesChannel']; + salesChannelId: string; + summary?: string; + translated?: { + productId?: string; + salesChannelId?: string; + summary?: string; + }; + /** Format: date-time */ + updatedAt?: string; + visible?: boolean; + }; + /** Added since version: 6.3.5.0 */ + ProductSearchConfig: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.5.0 */ + ProductSearchConfigField: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductSearchKeyword: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.2.0 */ + ProductSorting: { + /** Format: date-time */ + createdAt: string; + id?: string; + key: string; + label: string; + /** Format: int64 */ + priority: number; + translated?: { + key?: string; + label?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductStream: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + id?: string; + name: string; + translated?: { + description?: string; + name?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductStreamFilter: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ProductVisibility: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + ProductWarehouse: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Promotion: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PromotionDiscount: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PromotionDiscountPrices: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PromotionIndividualCode: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PromotionSalesChannel: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PromotionSetgroup: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + PropertyGroup: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + displayType: string; + filterable?: boolean; + id?: string; + name: string; + options?: components['schemas']['PropertyGroupOption']; + /** Format: int64 */ + position?: number; + sortingType: string; + translated?: { + description?: string; + displayType?: string; + name?: string; + sortingType?: string; + }; + /** Format: date-time */ + updatedAt?: string; + visibleOnProductDetailPage?: boolean; + }; + /** Added since version: 6.0.0.0 */ + PropertyGroupOption: { + colorHexCode?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + group?: components['schemas']['PropertyGroup']; + groupId: string; + id?: string; + media?: components['schemas']['Media']; + mediaId?: string; + name: string; + /** Format: int64 */ + position?: number; + translated?: { + colorHexCode?: string; + groupId?: string; + mediaId?: string; + name?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** A resource object **MAY** contain references to other resource objects ("relationships"). Relationships may be to-one or to-many. Relationships can be specified by including a member in a resource's links object. */ + relationshipLinks: { + related?: components['schemas']['link']; + self?: GenericRecord[] & components['schemas']['link']; + [key: string]: unknown; + }; + /** Members of the relationships object ("relationships") represent references from the resource object in which it's defined to other resource objects. */ + relationships: unknown; + /** An array of objects each containing \"type\" and \"id\" members for to-many relationships. */ + relationshipToMany: components['schemas']['linkage'][]; + relationshipToOne: components['schemas']['linkage']; + /** "Resource objects" appear in a JSON API document to represent resources. */ + resource: { + attributes?: components['schemas']['attributes']; + id: string; + links?: components['schemas']['links']; + meta?: components['schemas']['meta']; + relationships?: components['schemas']['relationships']; + type: string; + }; + /** Added since version: 6.0.0.0 */ + Rule: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + extensions?: { + warehouseGroup?: { + data?: { + /** @example 0188f8334a4672a58b03a3d55bfc502f */ + id?: string; + /** @example warehouse_group */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /rule/0188f8334a4672a58b03a3d55bb70070/warehouseGroup + */ + related?: string; + }; + }; + }; + id?: string; + name: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + RuleCondition: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SaasAppStorefrontConfig: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SaasSbpUserData: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SaasStorefrontDemoToken: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SaasUserLoginToken: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + SalesChannel: { + active?: boolean; + configuration?: GenericRecord; + country?: components['schemas']['Country']; + countryId: string; + /** Format: date-time */ + createdAt: string; + currency?: components['schemas']['Currency']; + currencyId: string; + customerGroupId: string; + customFields?: GenericRecord; + domains?: components['schemas']['SalesChannelDomain']; + footerCategory?: components['schemas']['Category']; + footerCategoryId?: string; + footerCategoryVersionId?: string; + hreflangActive?: boolean; + hreflangDefaultDomain?: components['schemas']['SalesChannelDomain']; + hreflangDefaultDomainId?: string; + id?: string; + language?: components['schemas']['Language']; + languageId: string; + mailHeaderFooterId?: string; + maintenance?: boolean; + name: string; + navigationCategory?: components['schemas']['Category']; + /** Format: int64 */ + navigationCategoryDepth?: number; + navigationCategoryId: string; + navigationCategoryVersionId?: string; + paymentMethod?: components['schemas']['PaymentMethod']; + paymentMethodId: string; + serviceCategory?: components['schemas']['Category']; + serviceCategoryId?: string; + serviceCategoryVersionId?: string; + shippingMethod?: components['schemas']['ShippingMethod']; + shippingMethodId: string; + shortName?: string; + taxCalculationType?: string; + translated?: { + countryId?: string; + currencyId?: string; + customerGroupId?: string; + footerCategoryId?: string; + footerCategoryVersionId?: string; + hreflangDefaultDomainId?: string; + languageId?: string; + mailHeaderFooterId?: string; + name?: string; + navigationCategoryId?: string; + navigationCategoryVersionId?: string; + paymentMethodId?: string; + serviceCategoryId?: string; + serviceCategoryVersionId?: string; + shippingMethodId?: string; + shortName?: string; + taxCalculationType?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.2.0.0 */ + SalesChannelAnalytics: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + SalesChannelContext: components['schemas']['ArrayStruct'] & { + /** Core context with general configuration values and state */ + context?: { + currencyFactor?: number; + currencyId?: string; + /** Format: int32 */ + currencyPrecision?: number; + scope?: string; + source?: string; + taxState?: string; + useCache?: boolean; + versionId?: string; + }; + /** Currency associated with the current user */ + currency?: { + /** Format: int32 */ + decimalPrecision?: number; + factor?: number; + isoCode?: string; + isSystemDefault?: boolean; + name?: string; + /** Format: int32 */ + position?: number; + shortName?: string; + symbol?: string; + }; + /** Customer group of the current user */ + currentCustomerGroup?: { + displayGross?: boolean; + name?: string; + }; + /** Information about the current customer - `null` if the customer is not logged in */ + customer?: { + active?: boolean; + affiliateCode?: string; + /** Format: int32 */ + autoIncrement?: number; + /** Format: date-time */ + birthday?: string; + campaignCode?: string; + company?: string; + customerNumber?: string; + defaultBillingAddressId?: string; + defaultPaymentMethodId?: string; + defaultShippingAddressId?: string; + /** Format: date-time */ + doubleOptInConfirmDate?: string; + /** Format: date-time */ + doubleOptInEmailSentDate?: string; + doubleOptInRegistration?: boolean; + email?: string; + /** Format: date-time */ + firstLogin?: string; + firstName?: string; + groupId?: string; + guest?: boolean; + hash?: string; + languageId?: string; + /** Format: date-time */ + lastLogin?: string; + lastName?: string; + /** Format: date-time */ + lastOrderDate?: string; + lastPaymentMethodId?: string; + legacyEncoder?: string; + legacyPassword?: string; + newsletter?: boolean; + /** Format: int32 */ + orderCount?: number; + password?: string; + remoteAddress?: string; + salesChannelId?: string; + salutationId?: string; + title?: string; + }; + /** Fallback group if the default customer group is not applicable */ + fallbackCustomerGroup?: { + displayGross?: boolean; + name?: string; + }; + /** Selected payment method */ + paymentMethod?: { + active?: boolean; + availabilityRuleId?: string; + description?: string; + formattedHandlerIdentifier?: string; + handlerIdentifier?: string; + mediaId?: string; + name?: string; + pluginId?: string; + /** Format: int32 */ + position?: number; + }; + /** Information about the current sales channel */ + salesChannel?: { + accessKey?: string; + active?: boolean; + analyticsId?: string; + countryId?: string; + currencyId?: string; + customerGroupId?: string; + footerCategoryId?: string; + hreflangActive?: boolean; + hreflangDefaultDomainId?: string; + languageId?: string; + mailHeaderFooterId?: string; + maintenance?: boolean; + maintenanceIpWhitelist?: string; + name?: string; + /** Format: int32 */ + navigationCategoryDepth?: number; + navigationCategoryId?: string; + paymentMethodId?: string; + serviceCategoryId?: string; + shippingMethodId?: string; + shortName?: string; + typeId?: string; + }; + /** Selected shipping method */ + shippingMethod?: { + active?: boolean; + availabilityRuleId?: string; + deliveryTimeId?: string; + description?: string; + mediaId?: string; + name?: string; + trackingUrl?: string; + }; + /** Currently active tax rules and/or rates */ + taxRules?: { + name?: string; + /** Format: float */ + taxRate?: number; + }[]; + /** Context the user session */ + token?: string; + }; + /** Added since version: 6.0.0.0 */ + SalesChannelDomain: { + /** Format: date-time */ + createdAt: string; + currency?: components['schemas']['Currency']; + currencyId: string; + customFields?: GenericRecord; + hreflangUseOnlyLocale?: boolean; + id?: string; + language?: components['schemas']['Language']; + languageId: string; + salesChannelDefaultHreflang?: components['schemas']['SalesChannel']; + salesChannelId: string; + snippetSetId: string; + /** Format: date-time */ + updatedAt?: string; + url: string; + }; + /** Added since version: 6.0.0.0 */ + SalesChannelType: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Salutation: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + displayName: string; + id?: string; + letterName: string; + salutationKey: string; + translated?: { + displayName?: string; + letterName?: string; + salutationKey?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + SalutationJsonApi: components['schemas']['resource'] & { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + displayName: string; + id?: string; + letterName: string; + salutationKey: string; + translated?: { + displayName?: string; + letterName?: string; + salutationKey?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ScheduledTask: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.7.0 */ + Script: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + SeoUrl: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + foreignKey: string; + id?: string; + isCanonical?: boolean; + isDeleted?: boolean; + isModified?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + isValid?: boolean; + languageId: string; + pathInfo: string; + routeName: string; + salesChannelId?: string; + seoPathInfo: string; + /** Format: date-time */ + updatedAt?: string; + /** Runtime field, cannot be used as part of the criteria. */ + url?: string; + }; + /** Added since version: 6.0.0.0 */ + SeoUrlJsonApi: components['schemas']['resource'] & { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + foreignKey: string; + id?: string; + isCanonical?: boolean; + isDeleted?: boolean; + isModified?: boolean; + /** Runtime field, cannot be used as part of the criteria. */ + isValid?: boolean; + languageId: string; + pathInfo: string; + routeName: string; + salesChannelId?: string; + seoPathInfo: string; + /** Format: date-time */ + updatedAt?: string; + /** Runtime field, cannot be used as part of the criteria. */ + url?: string; + }; + /** Added since version: 6.0.0.0 */ + SeoUrlTemplate: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + isValid?: boolean; + salesChannelId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ShippingMethod: { + active?: boolean; + availabilityRule?: components['schemas']['Rule']; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + deliveryTime?: components['schemas']['DeliveryTime']; + deliveryTimeId: string; + description?: string; + id?: string; + media?: components['schemas']['Media']; + mediaId?: string; + name: string; + /** Format: int64 */ + position?: number; + prices?: components['schemas']['ShippingMethodPrice']; + tags?: components['schemas']['Tag']; + tax?: components['schemas']['Tax']; + taxType: string; + trackingUrl?: string; + translated?: { + deliveryTimeId?: string; + description?: string; + mediaId?: string; + name?: string; + taxType?: string; + trackingUrl?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + ShippingMethodJsonApi: components['schemas']['resource'] & { + active?: boolean; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + deliveryTimeId: string; + description?: string; + id?: string; + mediaId?: string; + name: string; + /** Format: int64 */ + position?: number; + relationships?: { + availabilityRule?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce4ed9f9ee */ + id?: string; + /** @example rule */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/availabilityRule + */ + related?: string; + }; + }; + deliveryTime?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce4e8bf6ea */ + id?: string; + /** @example delivery_time */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/deliveryTime + */ + related?: string; + }; + }; + media?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce4f745547 */ + id?: string; + /** @example media */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/media + */ + related?: string; + }; + }; + prices?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce4f520b9d */ + id?: string; + /** @example shipping_method_price */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/prices + */ + related?: string; + }; + }; + tags?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce500bf752 */ + id?: string; + /** @example tag */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/tags + */ + related?: string; + }; + }; + tax?: { + data?: { + /** @example 0188f8334a4973b68b11e7ce506a4c6d */ + id?: string; + /** @example tax */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /shipping-method/0188f8334a4973b68b11e7ce4e6ade1e/tax + */ + related?: string; + }; + }; + }; + taxType: string; + trackingUrl?: string; + translated?: { + deliveryTimeId?: string; + description?: string; + mediaId?: string; + name?: string; + taxType?: string; + trackingUrl?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + ShippingMethodPageRouteResponse: { + active?: boolean; + availabilityRule?: { + description?: string; + invalid?: boolean; + name?: string; + /** Format: int32 */ + priority?: number; + }; + availabilityRuleId?: string; + deliveryTime?: { + /** Format: int32 */ + max?: number; + /** Format: int32 */ + min?: number; + name?: string; + unit?: string; + }; + deliveryTimeId?: string; + description?: string; + media?: { + alt?: string; + fileExtension?: string; + fileName?: string; + /** Format: int32 */ + fileSize?: number; + mediaFolderId?: string; + mediaTypeRaw?: string; + metaDataRaw?: string; + mimeType?: string; + private?: boolean; + thumbnailsRo?: string; + title?: string; + /** Format: date-time */ + uploadedAt?: string; + url?: string; + userId?: string; + }; + mediaId?: string; + name?: string; + orderDeliveries?: { + orderId?: string; + /** Format: date-time */ + shippingDateEarliest?: string; + /** Format: date-time */ + shippingDateLatest?: string; + shippingMethodId?: string; + shippingOrderAddressId?: string; + stateId?: string; + }[]; + prices?: { + /** Format: int32 */ + calculation?: number; + calculationRuleId?: string; + currencyId?: string; + /** Format: float */ + price?: number; + /** Format: float */ + quantityEnd?: number; + /** Format: float */ + quantityStart?: number; + ruleId?: string; + shippingMethodId?: string; + }[]; + salesChannelDefaultAssignments?: { + accessKey?: string; + active?: boolean; + countryId?: string; + currencyId?: string; + customerGroupId?: string; + footerCategoryId?: string; + hreflangActive?: boolean; + hreflangDefaultDomainId?: string; + languageId?: string; + mailHeaderFooterId?: string; + maintenance?: boolean; + maintenanceIpWhitelist?: string; + name?: string; + /** Format: int32 */ + navigationCategoryDepth?: number; + navigationCategoryId?: string; + paymentMethodId?: string; + serviceCategoryId?: string; + shippingMethodId?: string; + shortName?: string; + typeId?: string; + }[]; + salesChannels?: { + accessKey?: string; + active?: boolean; + countryId?: string; + currencyId?: string; + customerGroupId?: string; + footerCategoryId?: string; + hreflangActive?: boolean; + hreflangDefaultDomainId?: string; + languageId?: string; + mailHeaderFooterId?: string; + maintenance?: boolean; + maintenanceIpWhitelist?: string; + name?: string; + /** Format: int32 */ + navigationCategoryDepth?: number; + navigationCategoryId?: string; + paymentMethodId?: string; + serviceCategoryId?: string; + shippingMethodId?: string; + shortName?: string; + typeId?: string; + }[]; + tags?: { + name?: string; + }[]; + translations?: { + description?: string; + name?: string; + shippingMethodId?: string; + }[]; + }[]; + /** Added since version: 6.0.0.0 */ + ShippingMethodPrice: { + /** Format: int64 */ + calculation?: number; + calculationRuleId?: string; + /** Format: date-time */ + createdAt: string; + currencyPrice?: GenericRecord; + customFields?: GenericRecord; + id?: string; + /** Format: float */ + quantityEnd?: number; + /** Format: float */ + quantityStart?: number; + ruleId?: string; + shippingMethodId: string; + /** Format: date-time */ + updatedAt?: string; + }; + Sitemap: components['schemas']['ArrayStruct'] & { + /** Format: date-time */ + created?: string; + filename?: string; + }; + /** Added since version: 6.0.0.0 */ + Snippet: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + setId: string; + translationKey: string; + /** Format: date-time */ + updatedAt?: string; + value: string; + }; + /** Added since version: 6.0.0.0 */ + SnippetSet: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + iso: string; + name: string; + snippets?: components['schemas']['Snippet']; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + StateMachine: { + /** Format: date-time */ + createdAt: string; + id?: string; + states?: components['schemas']['StateMachineState']; + transitions?: components['schemas']['StateMachineTransition']; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + StateMachineHistory: { + /** Format: date-time */ + createdAt: string; + fromStateMachineState?: components['schemas']['StateMachineState']; + id?: string; + toStateMachineState?: components['schemas']['StateMachineState']; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + StateMachineState: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + technicalName: string; + translated?: { + name?: string; + technicalName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + StateMachineTransition: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + Struct: { + /** Alias which can be used to restrict response fields. For more information see [includes](https://shopware.stoplight.io/docs/store-api/docs/concepts/search-queries.md#includes-apialias). */ + apiAlias?: string; + }; + success: { + data: components['schemas']['data']; + /** To reduce the number of HTTP requests, servers **MAY** allow responses that include related resources along with the requested primary resources. Such responses are called "compound documents". */ + included?: components['schemas']['resource'][]; + /** Link members related to the primary data. */ + links?: components['schemas']['links'] & components['schemas']['pagination']; + meta?: components['schemas']['meta']; + }; + SuccessResponse: { + success?: boolean; + }; + /** Added since version: */ + SwagCmsExtensionsBlockRule: { + cmsBlock?: components['schemas']['CmsBlock']; + cmsBlockId: string; + cmsBlockVersionId?: string; + /** Format: date-time */ + createdAt: string; + id?: string; + inverted?: boolean; + /** Format: date-time */ + updatedAt?: string; + visibilityRule?: components['schemas']['Rule']; + visibilityRuleId?: string; + }; + /** Added since version: */ + SwagCmsExtensionsForm: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCmsExtensionsFormGroup: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCmsExtensionsFormGroupField: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCmsExtensionsQuickview: { + active?: boolean; + cmsBlock?: components['schemas']['CmsBlock']; + cmsBlockId?: string; + cmsBlockVersionId?: string; + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCmsExtensionsScrollNavigation: { + active?: boolean; + cmsSection?: components['schemas']['CmsSection']; + cmsSectionId?: string; + cmsSectionVersionId?: string; + /** Format: date-time */ + createdAt: string; + displayName?: string; + id?: string; + translated?: { + cmsSectionId?: string; + cmsSectionVersionId?: string; + displayName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCmsExtensionsScrollNavigationPageSettings: { + active: boolean; + bouncy: boolean; + cmsPage?: components['schemas']['CmsPage']; + cmsPageId?: string; + cmsPageVersionId?: string; + /** Format: date-time */ + createdAt: string; + /** Format: int64 */ + duration: number; + easing: string; + /** Format: int64 */ + easingDegree: number; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplate: { + active?: boolean; + configurations?: components['schemas']['SwagCustomizedProductsTemplateConfiguration']; + confirmInput?: boolean; + /** Format: date-time */ + createdAt: string; + decisionTree?: GenericRecord; + description?: string; + displayName: string; + exclusions?: components['schemas']['SwagCustomizedProductsTemplateExclusion']; + id?: string; + internalName: string; + media?: components['schemas']['Media']; + mediaId?: string; + options?: components['schemas']['SwagCustomizedProductsTemplateOption']; + optionsAutoCollapse?: boolean; + parentVersionId?: string; + products?: components['schemas']['Product']; + stepByStep?: boolean; + translated?: { + description?: string; + displayName?: string; + internalName?: string; + mediaId?: string; + parentVersionId?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateConfiguration: { + configuration: GenericRecord; + /** Format: date-time */ + createdAt: string; + hash: string; + id?: string; + template?: components['schemas']['SwagCustomizedProductsTemplate']; + templateConfigurationShares?: components['schemas']['SwagCustomizedProductsTemplateConfigurationShare']; + templateId: string; + templateVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateConfigurationJsonApi: components['schemas']['resource'] & { + configuration: GenericRecord; + /** Format: date-time */ + createdAt: string; + hash: string; + id?: string; + relationships?: { + template?: { + data?: { + /** @example 0188f8334a4b73b8a052702133a9a162 */ + id?: string; + /** @example swag_customized_products_template */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-configuration/0188f8334a4b73b8a052702132e04837/template + */ + related?: string; + }; + }; + templateConfigurationShares?: { + data?: { + /** @example 0188f8334a4b73b8a05270213400704d */ + id?: string; + /** @example swag_customized_products_template_configuration_share */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-configuration/0188f8334a4b73b8a052702132e04837/templateConfigurationShares + */ + related?: string; + }; + }; + }; + templateId: string; + templateVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateConfigurationShare: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateExclusion: { + conditions?: components['schemas']['SwagCustomizedProductsTemplateExclusionCondition']; + /** Format: date-time */ + createdAt: string; + id?: string; + name: string; + template?: components['schemas']['SwagCustomizedProductsTemplate']; + templateId: string; + templateVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateExclusionCondition: { + /** Format: date-time */ + createdAt: string; + id?: string; + templateExclusion?: components['schemas']['SwagCustomizedProductsTemplateExclusion']; + templateExclusionId: string; + templateExclusionOperator?: components['schemas']['SwagCustomizedProductsTemplateExclusionOperator']; + templateExclusionOperatorId: string; + templateExclusionVersionId?: string; + templateOption?: components['schemas']['SwagCustomizedProductsTemplateOption']; + templateOptionId: string; + templateOptionValues?: components['schemas']['SwagCustomizedProductsTemplateOptionValue']; + templateOptionVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateExclusionOperator: { + /** Format: date-time */ + createdAt: string; + id?: string; + label: string; + operator: string; + templateExclusionConditions?: components['schemas']['SwagCustomizedProductsTemplateExclusionCondition']; + templateOptionType: string; + translated?: { + label?: string; + operator?: string; + templateOptionType?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateJsonApi: components['schemas']['resource'] & { + active?: boolean; + confirmInput?: boolean; + /** Format: date-time */ + createdAt: string; + decisionTree?: GenericRecord; + description?: string; + displayName: string; + id?: string; + internalName: string; + mediaId?: string; + optionsAutoCollapse?: boolean; + parentVersionId?: string; + relationships?: { + configurations?: { + data?: { + /** @example 0188f8334a4b73b8a052702132b1488f */ + id?: string; + /** @example swag_customized_products_template_configuration */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template/0188f8334a4b73b8a052702130b55d12/configurations + */ + related?: string; + }; + }; + exclusions?: { + data?: { + /** @example 0188f8334a4b73b8a052702132a974ef */ + id?: string; + /** @example swag_customized_products_template_exclusion */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template/0188f8334a4b73b8a052702130b55d12/exclusions + */ + related?: string; + }; + }; + media?: { + data?: { + /** @example 0188f8334a4b73b8a052702130f74665 */ + id?: string; + /** @example media */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template/0188f8334a4b73b8a052702130b55d12/media + */ + related?: string; + }; + }; + options?: { + data?: { + /** @example 0188f8334a4b73b8a052702131e12911 */ + id?: string; + /** @example swag_customized_products_template_option */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template/0188f8334a4b73b8a052702130b55d12/options + */ + related?: string; + }; + }; + products?: { + data?: { + /** @example 0188f8334a4b73b8a052702131ef8519 */ + id?: string; + /** @example product */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template/0188f8334a4b73b8a052702130b55d12/products + */ + related?: string; + }; + }; + }; + stepByStep?: boolean; + translated?: { + description?: string; + displayName?: string; + internalName?: string; + mediaId?: string; + parentVersionId?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOption: { + advancedSurcharge?: boolean; + calculatedPrice?: GenericRecord; + /** Format: date-time */ + createdAt: string; + description?: string; + displayName: string; + id?: string; + itemNumber?: string; + oneTimeSurcharge?: boolean; + /** Format: float */ + percentageSurcharge?: number; + placeholder?: string; + /** Format: int64 */ + position?: number; + price?: GenericRecord; + prices?: components['schemas']['SwagCustomizedProductsTemplateOptionPrice']; + relativeSurcharge?: boolean; + required?: boolean; + tax?: components['schemas']['Tax']; + taxId?: string; + template?: components['schemas']['SwagCustomizedProductsTemplate']; + templateExclusionConditions?: components['schemas']['SwagCustomizedProductsTemplateExclusionCondition']; + templateId: string; + templateVersionId?: string; + translated?: { + description?: string; + displayName?: string; + itemNumber?: string; + placeholder?: string; + taxId?: string; + templateId?: string; + templateVersionId?: string; + type?: string; + }; + type: string; + typeProperties?: GenericRecord; + /** Format: date-time */ + updatedAt?: string; + values?: components['schemas']['SwagCustomizedProductsTemplateOptionValue']; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOptionJsonApi: components['schemas']['resource'] & { + advancedSurcharge?: boolean; + calculatedPrice?: GenericRecord; + /** Format: date-time */ + createdAt: string; + description?: string; + displayName: string; + id?: string; + itemNumber?: string; + oneTimeSurcharge?: boolean; + /** Format: float */ + percentageSurcharge?: number; + placeholder?: string; + /** Format: int64 */ + position?: number; + price?: GenericRecord; + relationships?: { + prices?: { + data?: { + /** @example 0188f8334a4c7391b3c2465a968e2341 */ + id?: string; + /** @example swag_customized_products_template_option_price */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option/0188f8334a4c7391b3c2465a9651c8e9/prices + */ + related?: string; + }; + }; + tax?: { + data?: { + /** @example 0188f8334a4d701badec9fc5347f84d1 */ + id?: string; + /** @example tax */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option/0188f8334a4c7391b3c2465a9651c8e9/tax + */ + related?: string; + }; + }; + template?: { + data?: { + /** @example 0188f8334a4d701badec9fc533c5f8dc */ + id?: string; + /** @example swag_customized_products_template */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option/0188f8334a4c7391b3c2465a9651c8e9/template + */ + related?: string; + }; + }; + templateExclusionConditions?: { + data?: { + /** @example 0188f8334a4d701badec9fc5334d96ab */ + id?: string; + /** @example swag_customized_products_template_exclusion_condition */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option/0188f8334a4c7391b3c2465a9651c8e9/templateExclusionConditions + */ + related?: string; + }; + }; + values?: { + data?: { + /** @example 0188f8334a4d701badec9fc533327b23 */ + id?: string; + /** @example swag_customized_products_template_option_value */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option/0188f8334a4c7391b3c2465a9651c8e9/values + */ + related?: string; + }; + }; + }; + relativeSurcharge?: boolean; + required?: boolean; + taxId?: string; + templateId: string; + templateVersionId?: string; + translated?: { + description?: string; + displayName?: string; + itemNumber?: string; + placeholder?: string; + taxId?: string; + templateId?: string; + templateVersionId?: string; + type?: string; + }; + type: string; + typeProperties?: GenericRecord; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOptionPrice: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: float */ + percentageSurcharge?: number; + price?: GenericRecord; + rule?: components['schemas']['Rule']; + ruleId?: string; + templateOption?: components['schemas']['SwagCustomizedProductsTemplateOption']; + templateOptionId: string; + templateOptionVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOptionValue: { + advancedSurcharge?: boolean; + /** Format: date-time */ + createdAt: string; + default?: boolean; + displayName: string; + id?: string; + itemNumber?: string; + oneTimeSurcharge?: boolean; + /** Format: float */ + percentageSurcharge?: number; + /** Format: int64 */ + position: number; + price?: GenericRecord; + prices?: components['schemas']['SwagCustomizedProductsTemplateOptionValuePrice']; + relativeSurcharge?: boolean; + tax?: components['schemas']['Tax']; + taxId?: string; + templateExclusionConditions?: components['schemas']['SwagCustomizedProductsTemplateExclusionCondition']; + templateOption?: components['schemas']['SwagCustomizedProductsTemplateOption']; + templateOptionId: string; + templateOptionVersionId?: string; + translated?: { + displayName?: string; + itemNumber?: string; + taxId?: string; + templateOptionId?: string; + templateOptionVersionId?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + value?: GenericRecord; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOptionValueJsonApi: components['schemas']['resource'] & { + advancedSurcharge?: boolean; + /** Format: date-time */ + createdAt: string; + default?: boolean; + displayName: string; + id?: string; + itemNumber?: string; + oneTimeSurcharge?: boolean; + /** Format: float */ + percentageSurcharge?: number; + /** Format: int64 */ + position: number; + price?: GenericRecord; + relationships?: { + prices?: { + data?: { + /** @example 0188f8334a4d701badec9fc53843050a */ + id?: string; + /** @example swag_customized_products_template_option_value_price */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option-value/0188f8334a4d701badec9fc5375ebce7/prices + */ + related?: string; + }; + }; + tax?: { + data?: { + /** @example 0188f8334a4d701badec9fc538b6a4b7 */ + id?: string; + /** @example tax */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option-value/0188f8334a4d701badec9fc5375ebce7/tax + */ + related?: string; + }; + }; + templateExclusionConditions?: { + data?: { + /** @example 0188f8334a4d701badec9fc5390730a1 */ + id?: string; + /** @example swag_customized_products_template_exclusion_condition */ + type?: string; + }[]; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option-value/0188f8334a4d701badec9fc5375ebce7/templateExclusionConditions + */ + related?: string; + }; + }; + templateOption?: { + data?: { + /** @example 0188f8334a4d701badec9fc538670459 */ + id?: string; + /** @example swag_customized_products_template_option */ + type?: string; + }; + links?: { + /** + * Format: uri-reference + * @example /swag-customized-products-template-option-value/0188f8334a4d701badec9fc5375ebce7/templateOption + */ + related?: string; + }; + }; + }; + relativeSurcharge?: boolean; + taxId?: string; + templateOptionId: string; + templateOptionVersionId?: string; + translated?: { + displayName?: string; + itemNumber?: string; + taxId?: string; + templateOptionId?: string; + templateOptionVersionId?: string; + versionId?: string; + }; + /** Format: date-time */ + updatedAt?: string; + value?: GenericRecord; + versionId?: string; + }; + /** Added since version: */ + SwagCustomizedProductsTemplateOptionValuePrice: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: float */ + percentageSurcharge?: number; + price?: GenericRecord; + rule?: components['schemas']['Rule']; + ruleId?: string; + templateOptionValue?: components['schemas']['SwagCustomizedProductsTemplateOptionValue']; + templateOptionValueId: string; + templateOptionValueVersionId?: string; + /** Format: date-time */ + updatedAt?: string; + versionId?: string; + }; + /** Added since version: */ + SwagDelayAction: { + /** Format: date-time */ + createdAt: string; + customerId?: string; + id?: string; + orderId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagDynamicAccessLandingPageRule: { + id?: string; + landingPage?: components['schemas']['LandingPage']; + landingPageId: string; + landingPageVersionId?: string; + rule?: components['schemas']['Rule']; + ruleId: string; + }; + /** Added since version: */ + SwagDynamicAccessProductRule: { + id?: string; + product?: components['schemas']['Product']; + productId: string; + productVersionId?: string; + rule?: components['schemas']['Rule']; + ruleId: string; + }; + /** Added since version: */ + SwagLanguagePackLanguage: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationConnection: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationData: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationGeneralSetting: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationLogging: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationMapping: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationMediaFile: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagMigrationRun: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagPaypalPosSalesChannel: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagPaypalPosSalesChannelRun: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagPaypalPosSalesChannelRunLog: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagSocialShoppingCustomer: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagSocialShoppingOrder: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagSocialShoppingProductError: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + SwagSocialShoppingSalesChannel: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + SystemConfig: { + configurationKey: string; + configurationValue: { + _value?: GenericRecord; + }; + /** Format: date-time */ + createdAt: string; + id?: string; + salesChannel?: components['schemas']['SalesChannel']; + salesChannelId?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Tag: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Tax: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + /** + * Format: int64 + * Added since version: 6.4.0.0. + */ + position: number; + /** Format: float */ + taxRate: number; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.5.0.0 */ + TaxProvider: { + active?: boolean; + appId?: string; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + /** Format: int64 */ + priority: number; + processUrl?: string; + translated?: { + appId?: string; + name?: string; + processUrl?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.1.0.0 */ + TaxRule: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.1.0.0 */ + TaxRuleType: { + /** Format: date-time */ + createdAt: string; + id?: string; + translated?: Record<string, never>; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Theme: { + active: boolean; + author: string; + baseConfig?: GenericRecord; + configValues?: GenericRecord; + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + description?: string; + helpTexts?: GenericRecord; + id?: string; + labels?: GenericRecord; + media?: components['schemas']['Media']; + name: string; + parentThemeId?: string; + previewMediaId?: string; + technicalName?: string; + translated?: { + author?: string; + description?: string; + name?: string; + parentThemeId?: string; + previewMediaId?: string; + technicalName?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + Unit: { + /** Format: date-time */ + createdAt: string; + customFields?: GenericRecord; + id?: string; + name: string; + shortCode: string; + translated?: { + name?: string; + shortCode?: string; + }; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + User: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + UserAccessKey: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.5.0 */ + UserConfig: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.0.0.0 */ + UserRecovery: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + Warehouse: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: */ + WarehouseGroup: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.3.1.0 */ + Webhook: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + /** Added since version: 6.4.1.0 */ + WebhookEventLog: { + /** Format: date-time */ + createdAt: string; + id?: string; + /** Format: date-time */ + updatedAt?: string; + }; + WishlistLoadRouteResponse: { + products?: components['schemas']['ProductListingResult'][]; + wishlist?: { + customerId?: string; + salesChannelId?: string; + }; + }; + }; + responses: { + /** No Content */ + 204: never; + /** Bad Request */ + 400: { + content: { + 'application/json': components['schemas']['failure']; + 'application/vnd.api+json': components['schemas']['failure']; + }; + }; + /** Unauthorized */ + 401: { + content: { + 'application/json': components['schemas']['failure']; + 'application/vnd.api+json': components['schemas']['failure']; + }; + }; + /** Forbidden */ + 403: { + content: { + 'application/json': components['schemas']['failure']; + 'application/vnd.api+json': components['schemas']['failure']; + }; + }; + /** Not Found */ + 404: { + content: { + 'application/json': components['schemas']['failure']; + 'application/vnd.api+json': components['schemas']['failure']; + }; + }; + }; + parameters: { + /** Accepted response content types */ + accept: string; + /** Content type of the request */ + contentType: string; + }; + requestBodies: never; + headers: never; + pathItems: never; +}; + +export type external = Record<string, never>; + +export type operations = { + /** + * Create a new address for a customer + * Creates a new address for a customer. + */ + createCustomerAddress: { + requestBody?: { + content: { + 'application/json': components['schemas']['CustomerAddress']; + }; + }; + responses: { + 200: { + content: { + 'application/json': components['schemas']['CustomerAddress']; + }; + }; + }; + }; + /** + * Delete an address of a customer + * Delete an address of customer. + * + * Only addresses which are not set as default addresses for shipping or billing can be deleted. You can check the current default addresses of your customer using the profile information endpoint and change them using the default address endpoint. + * + * **A customer must have at least one address (which can be used for shipping and billing).** + * + * An automatic fallback is not applied. + */ + deleteCustomerAddress: { + parameters: { + path: { + /** ID of the address to be deleted. */ + addressId: string; + }; + }; + responses: { + /** No Content response, when the address has been deleted */ + 204: never; + /** Response containing a list of errors, most likely due to the address being in use */ + 400: never; + }; + }; + /** + * Modify an address of a customer + * Modifies an existing address of a customer. + */ + updateCustomerAddress: { + parameters: { + path: { + /** Address ID */ + addressId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['CustomerAddress']; + }; + }; + responses: { + 200: { + content: { + 'application/json': components['schemas']['CustomerAddress']; + }; + }; + }; + }; + /** + * Change a customer's default billing address + * Updates the default (preselected) billing addresses of a customer. + */ + defaultBillingAddress: { + parameters: { + path: { + /** Address ID */ + addressId: string; + }; + }; + responses: { + 200: never; + }; + }; + /** + * Change a customer's default shipping address + * Updates the default (preselected) shipping addresses of a customer. + */ + defaultShippingAddress: { + parameters: { + path: { + /** Address ID */ + addressId: string; + }; + }; + responses: { + 200: never; + }; + }; + /** + * Change the customer's email address + * Changes a customer's email address to a new email address, using their current password as a validation. + */ + changeEmail: { + requestBody: { + content: { + 'application/json': { + /** New email address. Has to be unique amongst all customers */ + email: string; + /** Confirmation of the new email address. */ + emailConfirmation: string; + /** Customer's current password */ + password: string; + }; + }; + }; + responses: { + /** Returns a success response indicating a successful update */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Change the customer's language. + * Changes the language of the logged in customer + */ + changeLanguage: { + requestBody: { + content: { + 'application/json': { + /** New languageId */ + language?: string; + }; + }; + }; + responses: { + /** Returns a success response indicating a successful update */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Change the customer's password + * Changes a customer's password using their current password as a validation. + */ + changePassword: { + requestBody: { + content: { + 'application/json': { + /** New Password for the customer */ + newPassword: string; + /** Confirmation of the new password */ + newPasswordConfirm: string; + /** Current password of the customer */ + password: string; + }; + }; + }; + responses: { + /** Returns a success response indicating a successful update. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Change the customer's default payment method + * Changes a customer's default (preselected) payment method. + */ + changePaymentMethod: { + parameters: { + path: { + /** Identifier of the desired default payment method */ + paymentMethodId: string; + }; + }; + responses: { + /** Returns a success response indicating a successful update. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Change the customer's information + * Make changes to a customer's account, like changing their name, salutation or title. + */ + changeProfile: { + requestBody: { + content: { + 'application/json': { + /** Birthday day */ + birthdayDay?: number; + /** Birthday month */ + birthdayMonth?: number; + /** Birthday year */ + birthdayYear?: number; + /** Company of the customer. Only required when `accountType` is `business`. */ + company?: string; + /** Customer first name. Value will be reused for shipping and billing address if not provided explicitly. */ + firstName: string; + /** Customer last name. Value will be reused for shipping and billing address if not provided explicitly. */ + lastName: string; + /** Id of the salutation for the customer account. Fetch options using `salutation` endpoint. */ + salutationId: string; + /** (Academic) title of the customer */ + title?: string; + }; + }; + }; + responses: { + /** Returns a success response indicating a successful update */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Get information about current customer + * Returns information about the current customer. + */ + readCustomer: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Returns the logged in customer, also for guest sessions. Check for the value of `guest` field to see whether the customer is a guest. */ + 200: { + content: { + 'application/json': components['schemas']['Customer']; + }; + }; + }; + }; + /** + * Delete the customer's profile + * Deletes a customer profile along with their addresses, wishlists and associated data. Created orders and their payment/shipping information (addresses) and reviews are not deleted. + */ + deleteCustomer: { + responses: { + /** Returns a no content response indicating a successful removal of the customer profile */ + 204: never; + }; + }; + /** + * Checks if the customer recovery entry for a given hash is expired. + * This can be used to validate a provided hash has a valid and not expired customer recovery hash. + */ + getCustomerRecoveryIsExpired: { + requestBody: { + content: { + 'application/json': { + /** Parameter from the link in the confirmation mail sent in Step 1 */ + hash: string; + }; + }; + }; + responses: { + /** Returns a CustomerRecoveryIsExpiredResponse that indicates if the hash is expired or not. */ + 200: { + content: { + 'application/json': components['schemas']['ArrayStruct']; + }; + }; + }; + }; + /** + * Fetch addresses of a customer + * Lists all addresses of the current customer and allows filtering them based on a criteria. + */ + listAddress: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + 200: { + content: { + 'application/json': components['schemas']['CustomerAddress'][]; + }; + }; + }; + }; + /** + * Log in a customer + * Logs in customers given their credentials. + */ + loginCustomer: { + requestBody: { + content: { + 'application/json': { + /** Password */ + password: string; + /** Email */ + username: string; + }; + }; + }; + responses: { + /** A successful login returns a context token which is associated with the logged in user. Use that as your `sw-context-token` header for subsequent requests. */ + 200: { + content: { + 'application/json': components['schemas']['ContextTokenResponse']; + }; + }; + /** If credentials are incorrect an error is returned */ + 401: { + content: { + 'application/json': components['schemas']['failure']; + }; + }; + }; + }; + /** + * Log out a customer + * Logs out a customer. + */ + logoutCustomer: { + responses: { + /** A successful logout returns a context token for the anonymous user. Use that as your `sw-context-token` header for subsequent requests. */ + 200: { + content: { + 'application/json': components['schemas']['ContextTokenResponse']; + }; + }; + 403: components['responses']['403']; + }; + }; + /** + * Fetch newsletter recipients + * Perform a filtered search for newsletter recipients. + */ + readNewsletterRecipient: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + 200: { + content: { + 'application/json': unknown; + }; + }; + }; + }; + /** + * Send a password recovery mail + * This operation is Step 1 of the password reset flow. Make sure to implement Step 2 "Reset password with recovery credentials" in order to allow for the complete flow in your application. Sends a recovery mail containing a link with credentials that allows a customer to reset their password. + */ + sendRecoveryMail: { + requestBody: { + content: { + 'application/json': { + /** E-Mail address to identify the customer */ + email: string; + /** URL of the storefront to use for the generated reset link. It has to be a domain that is configured in the sales channel domain settings. */ + storefrontUrl: string; + }; + }; + }; + responses: { + /** + * If email corresponds to an existing customer, a mail will be sent out to that customer containing a link assembled using the following schema: + * + * Returns a success indicating a successful initialisation of the reset flow. + */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Reset a password with recovery credentials + * This operation is Step 2 of the password reset flow. It is required to conduct Step 1 "Send a password recovery mail" in order to obtain the required credentials for this step.Resets a customer's password using credentials from a password recovery mail as a validation. + */ + recoveryPassword: { + requestBody: { + content: { + 'application/json': { + /** Parameter from the link in the confirmation mail sent in Step 1 */ + hash: string; + /** New password for the customer */ + newPassword: string; + /** Confirmation of the new password */ + newPasswordConfirm: string; + }; + }; + }; + responses: { + /** Returns a success response indicating a successful update. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Register a customer + * Registers a customer. Used both for normal customers and guest customers.See the Guide "Register a customer" for more information on customer registration. + */ + register: { + requestBody: { + content: { + 'application/json': { + /** Flag indicating accepted data protection */ + acceptedDataProtection: boolean; + /** + * Account type of the customer which can be either `private` or `business`. + * @default private + */ + accountType?: string; + /** Field can be used to store an affiliate tracking code */ + affiliateCode?: string; + billingAddress: components['schemas']['CustomerAddress']; + /** Birthday day */ + birthdayDay?: number; + /** Birthday month */ + birthdayMonth?: number; + /** Birthday year */ + birthdayYear?: number; + /** Field can be used to store a campaign tracking code */ + campaignCode?: string; + /** Email of the customer. Has to be unique, unless `guest` is `true` */ + email: string; + /** Customer first name. Value will be reused for shipping and billing address if not provided explicitly. */ + firstName: string; + /** + * If set, will create a guest customer. Guest customers can re-use an email address and don't need a password. + * @default false + */ + guest?: boolean; + /** Customer last name. Value will be reused for shipping and billing address if not provided explicitly. */ + lastName: string; + /** Password for the customer. Required, unless `guest` is `true` */ + password: string; + /** Id of the salutation for the customer account. Fetch options using `salutation` endpoint. */ + salutationId: string; + shippingAddress?: components['schemas']['CustomerAddress']; + /** URL of the storefront for that registration. Used in confirmation emails. Has to be one of the configured domains of the sales channel. */ + storefrontUrl: string; + /** (Academic) title of the customer */ + title?: string; + }; + }; + }; + responses: { + /** Success */ + 200: { + content: { + 'application/json': components['schemas']['Customer']; + }; + }; + }; + }; + /** + * Confirm a customer registration + * Confirms a customer registration when double opt-in is activated. + * + * Learn more about double opt-in registration in our guide "Register a customer". + */ + registerConfirm: { + requestBody: { + content: { + 'application/json': { + /** Email hash from the email received */ + em: string; + /** Hash from the email received */ + hash: string; + }; + }; + }; + responses: { + /** Returns the logged in customer. The customer is automatically logged in with the `sw-context-token` header provided, which can be reused for subsequent requests. */ + 200: never; + /** No hash provided */ + 404: never; + /** The customer has already been confirmed */ + 412: never; + }; + }; + /** + * Fetch a list of categories + * Perform a filtered search for categories. + */ + readCategoryList: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing categories. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Category'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** + * Fetch a single category + * This endpoint returns information about the category, as well as a fully resolved (hydrated with mapping values) CMS page, if one is assigned to the category. You can pass slots which should be resolved exclusively. + */ + readCategory: { + parameters: { + query?: { + /** Resolves only the given slot identifiers. The identifiers have to be seperated by a '|' character */ + slots?: string; + }; + path: { + /** Identifier of the category to be fetched */ + navigationId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria'] & + components['schemas']['ProductListingCriteria']; + }; + }; + responses: { + /** The loaded category with cms page */ + 200: { + content: { + 'application/json': components['schemas']['Category']; + }; + }; + }; + }; + /** + * Fetch or create a cart + * Used to fetch the current cart or for creating a new one. + */ + readCart: { + parameters: { + query?: { + /** The name of the new cart. This parameter will only be used when creating a new cart. */ + name?: string; + }; + }; + responses: { + /** Cart */ + 200: { + content: { + 'application/json': components['schemas']['Cart']; + }; + }; + }; + }; + /** + * Delete a cart + * This route deletes the cart of the customer. + */ + deleteCart: { + responses: { + /** Successfully deleted the cart */ + 204: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Add items to the cart + * This route adds items to the cart. An item can be a product or promotion for example. They are referenced by the `referencedId`-parameter. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#adding-new-items-to-the-cart) + */ + addLineItem: { + requestBody?: { + content: { + 'application/json': components['schemas']['CartItems']; + }; + }; + responses: { + /** The updated cart. */ + 200: { + content: { + 'application/json': components['schemas']['Cart']; + }; + }; + }; + }; + /** + * Remove items from the cart + * This route removes items from the cart and recalculates it. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#deleting-items-in-the-cart) + */ + removeLineItem: { + parameters: { + query: { + /** A list of product identifiers. */ + ids: string[]; + }; + }; + responses: { + /** The updated cart. */ + 200: { + content: { + 'application/json': components['schemas']['Cart']; + }; + }; + }; + }; + /** + * Update items in the cart + * This route updates items in the cart. A typical example is updating the quantity of an item. + * + * Example: [Working with the cart - Guide](https://developer.shopware.com/docs/guides/integrations-api/store-api-guide/work-with-the-cart#updating-items-in-the-cart) + */ + updateLineItem: { + requestBody?: { + content: { + 'application/json': components['schemas']['CartItems']; + }; + }; + responses: { + /** The updated cart. */ + 200: { + content: { + 'application/json': components['schemas']['Cart']; + }; + }; + }; + }; + /** + * Create an order from a cart + * Creates a new order from the current cart and deletes the cart. + * + * If you are using the [prepared payment flow](https://developer.shopware.com/docs/concepts/commerce/checkout-concept/payments#2.1-prepare-payment-optional), this endpoint also receives additional transaction details. The exact name of the parameters depends on the implementation of the corresponding *payment handler*. + */ + createOrder: { + /** Contains additional metadata which is stored together with the order. It can also contain payment transaction details. */ + requestBody?: { + content: { + 'application/json': { + /** The affiliate code can be used to track which referrer the customer came through. An example could be `Price-comparison-company-XY`. */ + affiliateCode?: string; + /** The campaign code is used to track which action the customer came from. An example could be `Summer-Deals` */ + campaignCode?: string; + /** Adds a comment from the customer to the order. */ + customerComment?: string; + }; + }; + }; + responses: { + /** Order */ + 200: { + content: { + 'application/json': components['schemas']['Order']; + }; + }; + }; + }; + /** + * Fetch and resolve a CMS page + * Loads a content management page by its identifier and resolve the slot data. This could be media files, product listing and so on. + * + * **Important notice** + * + * The criteria passed with this route also affects the listing, if there is one within the cms page. + */ + readCms: { + parameters: { + path: { + /** Identifier of the CMS page to be resolved */ + id: string; + }; + }; + requestBody?: { + content: { + 'application/json': { + /** Resolves only the given slot identifiers. The identifiers have to be seperated by a `|` character. */ + slots?: string; + } & components['schemas']['ProductListingCriteria']; + }; + }; + responses: { + /** The loaded cms page */ + 200: { + content: { + 'application/json': components['schemas']['CmsPage']; + }; + }; + 404: components['responses']['404']; + }; + }; + /** + * Submit a contact form message + * Used for submitting contact forms. Be aware that there can be more required fields, depending on the system settings. + */ + sendContactMail: { + requestBody: { + content: { + 'application/json': { + /** Type of the content management page */ + cmsPageType?: string; + /** The message of the contact form */ + comment: string; + /** Email address */ + email: string; + /** Entity name for slot config */ + entityName?: string; + /** Firstname. This field may be required depending on the system settings. */ + firstName?: string; + /** Lastname. This field may be required depending on the system settings. */ + lastName?: string; + /** + * Identifier of the navigation page. Can be used to override the configuration. + * Take a look at the settings of a category containing a concact form in the administration. + */ + navigationId?: string; + /** Phone. This field may be required depending on the system settings. */ + phone?: string; + /** Identifier of the salutation. Use `/api/salutation` endpoint to fetch possible values. */ + salutationId: string; + /** Identifier of the cms element */ + slotId?: string; + /** The subject of the contact form. */ + subject: string; + }; + }; + }; + responses: { + /** Message sent successful. */ + 200: never; + }; + }; + /** + * Fetch the current context + * Fetches the current context. This includes for example the `customerGroup`, `currency`, `taxRules` and many more. + */ + readContext: { + responses: { + /** Returns the current context. */ + 200: { + content: { + 'application/json': components['schemas']['SalesChannelContext']; + }; + }; + }; + }; + /** + * Modify the current context + * Used for switching the context. A typical example would be changing the language or changing the currency. + */ + updateContext: { + requestBody: { + content: { + 'application/json': { + /** Billing Address */ + billingAddressId?: string; + /** Country */ + countryId?: string; + /** Country State */ + countryStateId?: string; + /** Currency */ + currencyId?: string; + /** Language */ + languageId?: string; + /** Payment Method */ + paymentMethodId?: string; + /** Shipping Address */ + shippingAddressId?: string; + /** Shipping Method */ + shippingMethodId?: string; + }; + }; + }; + responses: { + /** Returns the context token. Use that as your `sw-context-token` header for subsequent requests. Redirect if getRedirectUrl is set. */ + 200: { + content: { + 'application/json': components['schemas']['ContextTokenResponse']; + }; + }; + }; + }; + /** + * Fetch countries + * Perform a filtered search for countries + */ + readCountry: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing countries. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Country'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** + * Fetch the states of a country + * Perform a filtered search the states for a country + */ + readCountryState: { + parameters: { + path: { + countryId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing countries. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['CountryState'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** + * Fetch currencies + * Perform a filtered search for currencies. + */ + readCurrency: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing currencies. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Currency'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** Fetch registration settings for customer group */ + getCustomerGroupRegistrationInfo: { + parameters: { + path: { + /** Customer group id */ + customerGroupId: string; + }; + }; + responses: { + /** Returns the customer group including registration settings. */ + 200: { + content: { + 'application/json': components['schemas']['CustomerGroup']; + }; + }; + }; + }; + /** + * Fetch a wishlist + * Fetch a customer's wishlist. Products on the wishlist can be filtered using a criteria object. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + readCustomerWishlist: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + 200: { + content: { + 'application/json': components['schemas']['WishlistLoadRouteResponse']; + }; + }; + }; + }; + /** + * Add a product to a wishlist + * Adds a product to a customers wishlist. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + addProductOnWishlist: { + parameters: { + path: { + /** Identifier of the product to be added. */ + productId: string; + }; + }; + responses: { + /** Returns a success response. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Remove a product from a wishlist + * Removes a product from a customer's wishlist. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * The wishlist feature has to be activated. + */ + deleteProductOnWishlist: { + parameters: { + path: { + /** The identifier of the product to be removed from the wishlist. */ + productId: string; + }; + }; + responses: { + /** Returns a success response indicating a successful removal. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + /** The removal of the product failed. Probably because the product could not be found on the wishlist. */ + 404: { + content: { + 'application/json': components['schemas']['failure']; + }; + }; + }; + }; + /** + * Create a wishlist for a customer + * Create a new wishlist for a logged in customer or extend the existing wishlist given a set of products. + * + * **Important constraints** + * + * * Anonymous (not logged-in) customers can not have wishlists. + * * A customer can only have a single wishlist. + * * The wishlist feature has to be activated. + */ + mergeProductOnWishlist: { + requestBody: { + content: { + 'application/json': { + /** List product id */ + productIds?: string[]; + }; + }; + }; + responses: { + /** Returns a success response. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Download generated document + * Returns blob file of a generated document to download. + */ + download: { + parameters: { + path: { + documentId: string; + deepLinkCode: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Returns the document information and blob to download. */ + 200: { + content: { + 'application/json': components['schemas']['Document']; + }; + }; + }; + }; + /** + * Initiate a payment for an order + * This generic endpoint is should be called to initiate a payment flow after an order has been created. The details of the payment flow can differ depending on the payment integration and might require calling additional operations or the setup of webhooks. + * + * The endpoint internally calls the payment handler of the payment method currently set for the order. + */ + handlePaymentMethod: { + requestBody: { + content: { + 'application/json': { + /** URL to which the client should be redirected after erroneous payment */ + errorUrl?: string; + /** URL to which the client should be redirected after successful payment */ + finishUrl?: string; + /** Identifier of an order */ + orderId: string; + }; + }; + }; + responses: { + /** Redirect to external payment provider */ + 200: never; + }; + }; + /** + * Fetch a landing page with the resolved CMS page + * Loads a landing page by its identifier and resolves the CMS page. + * + * **Important notice** + * + * The criteria passed with this route also affects the listing, if there is one within the cms page. + */ + readLandingPage: { + parameters: { + path: { + /** Identifier of the landing page. */ + landingPageId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria'] & + ({ + /** Resolves only the given slot identifiers. The identifiers have to be seperated by a `|` character. */ + slots?: string; + } & components['schemas']['ProductListingCriteria']); + }; + }; + responses: { + /** The loaded landing page with cms page */ + 200: { + content: { + 'application/json': components['schemas']['LandingPage']; + }; + }; + 404: components['responses']['404']; + }; + }; + /** + * Fetch languages + * Perform a filtered search for languages. + */ + readLanguages: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing languages. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Language'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** + * Fetch a navigation menu + * This endpoint returns categories that can be used as a page navigation. You can either return them as a tree or as a flat list. You can also control the depth of the tree. + * + * Instead of passing uuids, you can also use one of the following aliases for the activeId and rootId parameters to get the respective navigations of your sales channel. + * + * * main-navigation + * * service-navigation + * * footer-navigation + */ + readNavigation: { + parameters: { + header?: { + /** Instructs Shopware to try and resolve SEO URLs for the given navigation item */ + 'sw-include-seo-urls'?: boolean; + }; + path: { + /** Identifier of the active category in the navigation tree (if not used, just set to the same as rootId). */ + activeId: string; + /** Identifier of the root category for your desired navigation tree. You can use it to fetch sub-trees of your navigation tree. */ + rootId: string; + }; + }; + requestBody: { + content: { + 'application/json': components['schemas']['Criteria'] & { + /** Return the categories as a tree or as a flat list. */ + buildTree?: unknown; + /** Determines the depth of fetched navigation levels. */ + depth?: unknown; + }; + }; + }; + responses: { + /** All available navigations */ + 200: { + content: { + 'application/json': components['schemas']['NavigationRouteResponse']; + }; + }; + }; + }; + /** + * Confirm a newsletter registration + * You have to use the hash from the link sent out via email to confirm the user registration. + */ + confirmNewsletter: { + requestBody: { + content: { + 'application/json': { + /** Email hash parameter from the link in the confirmation mail */ + em: string; + /** Hash parameter from link the in the confirmation mail */ + hash: string; + }; + }; + }; + responses: { + /** The newsletter confirmation was successful. */ + 200: never; + }; + }; + /** + * Create or remove a newsletter subscription + * This route is used to create/remove/confirm a newsletter subscription. + * + * The `option` property controls what should happen: + * * `direct`: The subscription is directly active and does not need a confirmation. + * * `subscribe`: An email will be send to the provided email addrees containing a link to the /newsletter/confirm route. + * The subscription is only successful, if the /newsletter/confirm route is called with the generated hashes. + * * `unsubscribe`: The email address will be removed from the newsletter subscriptions. + * * `confirmSubscribe`: Confirmes the newsletter subscription for the provided email address. + */ + subscribeToNewsletter: { + requestBody: { + content: { + 'application/json': { + /** City */ + city?: string; + /** Custom field data that should be added to the subscription. */ + customFields?: string; + /** Email address that will receive the confirmation and the newsletter. */ + email: string; + /** First name */ + firstName?: string; + /** Identifier of the language. */ + languageId?: unknown; + /** Last name */ + lastName?: string; + /** Defines what should be done. */ + option: unknown; + /** Identifier of the salutation. */ + salutationId?: unknown; + /** Url of the storefront of the shop. This will be used for generating the link to the /newsletter/confirm inside the confirm email. */ + storefrontUrl: string; + /** Street */ + street?: string; + /** Zip code */ + tags?: string; + /** Zip code */ + zipCode?: string; + }; + }; + }; + responses: { + /** Success */ + 200: never; + }; + }; + /** + * Remove a newsletter subscription + * Removes a newsletter recipient from the mailing lists. + */ + unsubscribeToNewsletter: { + requestBody: { + content: { + 'application/json': { + /** Email address that should be removed from the mailing lists. */ + email: string; + }; + }; + }; + responses: { + /** Unsubscribing was successful. */ + 200: never; + }; + }; + /** + * Fetch a list of orders + * List orders of a customer. + */ + readOrder: { + requestBody: { + content: { + 'application/json': components['schemas']['Criteria'] & { + /** Check if the payment method of the order is still changeable. */ + checkPromotion?: boolean; + }; + }; + }; + responses: { + /** An array of orders and an indicator if the payment of the order can be changed. */ + 200: { + content: { + 'application/json': components['schemas']['OrderRouteResponse']; + }; + }; + }; + }; + /** + * Download a purchased file + * Download a file included in the given order and with the given id. Access must be granted. + */ + orderDownloadFile: { + parameters: { + path: { + orderId: string; + downloadId: string; + }; + }; + responses: { + /** An arbitrary binary file. */ + 200: { + content: { + 'application/octet-stream': string; + }; + }; + }; + }; + /** + * Update the payment method of an order + * Changes the payment method of a specific order. You can use the /order route to find out if the payment method of an order can be changed - take a look at the `paymentChangeable`- array in the response. + */ + orderSetPayment: { + requestBody: { + content: { + 'application/json': { + /** The identifier of the order. */ + orderId: string; + /** The identifier of the paymentMethod to be set */ + paymentMethodId: string; + }; + }; + }; + responses: { + /** Successfully updated the payment method of the order. */ + 200: { + content: { + 'application/json': components['schemas']['SuccessResponse']; + }; + }; + }; + }; + /** + * Cancel an order + * Cancels an order. The order state will be set to 'cancelled'. + */ + cancelOrder: { + requestBody: { + content: { + 'application/json': { + /** The identifier of the order to be canceled. */ + orderId?: string; + }; + }; + }; + responses: { + /** + * Returns the state of the state machine + * + * example: More information about the state machine can be found in the corresponding guide: [Using the state machine](https://developer.shopware.com/docs/guides/plugins/plugins/checkout/order/using-the-state-machine) + */ + 200: { + content: { + 'application/json': components['schemas']['StateMachineState']; + }; + }; + }; + }; + /** Loads all available payment methods */ + readPaymentMethod: { + requestBody: { + content: { + 'application/json': components['schemas']['Criteria'] & { + /** List only available */ + onlyAvailable?: boolean; + }; + }; + }; + responses: { + 200: { + content: { + 'application/json': { + /** aggregation result */ + aggregations?: GenericRecord; + elements?: components['schemas']['PaymentMethod'][]; + /** Total amount */ + total?: number; + }; + }; + }; + }; + }; + /** + * Fetch a list of products + * List products that match the given criteria. For performance ressons a limit should always be set. + */ + readProduct: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing products */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Product'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** Export product export */ + readProductExport: { + parameters: { + path: { + /** Access Key */ + accessKey: string; + /** File Name */ + fileName: string; + }; + }; + responses: { + 200: never; + }; + }; + /** + * Fetch a product listing by category + * Fetches a product listing for a specific category. It also provides filters, sortings and property aggregations, analogous to the /search endpoint. + */ + readProductListing: { + parameters: { + path: { + /** Identifier of a category. */ + categoryId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['ProductListingCriteria'] & + components['schemas']['ProductListingFlags']; + }; + }; + responses: { + /** Returns a product listing containing all products and additional fields to display a listing. */ + 200: { + content: { + 'application/json': components['schemas']['ProductListingResult']; + }; + }; + }; + }; + /** + * Fetch a single product + * This route is used to load a single product with the corresponding details. In addition to loading the data, the best variant of the product is determined when a parent id is passed. + */ + readProductDetail: { + parameters: { + path: { + /** Product ID */ + productId: string; + }; + }; + responses: { + /** Product information along with variant groups and options */ + 200: { + content: { + 'application/json': components['schemas']['ProductDetailResponse']; + }; + }; + }; + }; + /** + * Fetch cross-selling groups of a product + * This route is used to load the cross sellings for a product. A product has several cross selling definitions in which several products are linked. The route returns the cross sellings together with the linked products + */ + readProductCrossSellings: { + parameters: { + path: { + /** Product ID */ + productId: string; + }; + }; + responses: { + /** Found cross sellings */ + 200: { + content: { + 'application/json': components['schemas']['CrossSellingElementCollection']; + }; + }; + }; + }; + /** + * Search for a matching variant by product options. + * Performs a search for product variants and returns the best matching variant. + */ + searchProductVariantIds: { + parameters: { + path: { + /** Product ID */ + productId: string; + }; + }; + requestBody?: { + content: { + 'application/json': { + /** The options parameter for the variant to find. */ + options: string[]; + /** The id of the option group that has been switched. */ + switchedGroup?: string; + }; + }; + }; + responses: { + /** Returns an FoundCombination struct containing the ids matching the search. */ + 200: { + content: { + 'application/json': components['schemas']['FindProductVariantRouteResponse']; + }; + }; + }; + }; + /** + * Save a product review + * Saves a review for a product. Reviews have to be activated in the settings. + */ + saveProductReview: { + parameters: { + path: { + /** Identifier of the product which is reviewed. */ + productId: string; + }; + }; + requestBody?: { + content: { + 'application/json': { + /** The content of review. */ + content: unknown; + /** The email address of the review author. If not set, the email of the customer is chosen. */ + email?: string; + /** The name of the review author. If not set, the first name of the customer is chosen. */ + name?: string; + /** The review rating for the product. */ + points: unknown; + /** The title of the review. */ + title: unknown; + }; + }; + }; + responses: { + /** Success response indicating the review was saved successfuly. */ + 200: never; + }; + }; + /** + * Fetch product reviews + * Perform a filtered search for product reviews. + */ + readProductReviews: { + parameters: { + path: { + /** Identifier of the product. */ + productId: string; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing product reviews */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['ProductReview'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** + * Fetch salutations + * Perform a filtered search for salutations. + */ + readSalutation: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing salutations. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['Salutation'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + }; + }; + /** Access point for different api logics which are provided by apps over script hooks */ + postScriptStoreApiRoute: { + parameters: { + path: { + /** Dynamic hook which used to build the hook name */ + hook: string; + }; + }; + responses: { + /** Returns different structures of results based on the called script. */ + 200: never; + }; + }; + /** + * Search for products + * Performs a search for products which can be used to display a product listing. + */ + searchPage: { + requestBody?: { + content: { + 'application/json': { + /** Using the search parameter, the server performs a text search on all records based on their data model and weighting as defined in the entity definition using the SearchRanking flag. */ + search: string; + } & components['schemas']['ProductListingCriteria'] & + components['schemas']['ProductListingFlags']; + }; + }; + responses: { + /** Returns a product listing containing all products and additional fields to display a listing. */ + 200: { + content: { + 'application/json': components['schemas']['ProductListingResult']; + }; + }; + }; + }; + /** + * Search for products (suggest) + * Can be used to implement search previews or suggestion listings, that don’t require any interaction. + */ + searchSuggest: { + requestBody: { + content: { + 'application/json': { + /** Using the search parameter, the server performs a text search on all records based on their data model and weighting as defined in the entity definition using the SearchRanking flag. */ + search: string; + } & components['schemas']['ProductListingFlags']; + }; + }; + responses: { + /** + * Returns a product listing containing all products and additional fields. + * + * Note: Aggregations, currentFilters and availableSortings are empty in this response. If you need them to display a listing, use the /search route instead. + */ + 200: { + content: { + 'application/json': components['schemas']['ProductListingResult']; + }; + }; + }; + }; + /** + * Fetch SEO routes + * Perform a filtered search for seo urls. + */ + readSeoUrl: { + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + /** Entity search result containing seo urls. */ + 200: { + content: { + 'application/json': { + elements?: components['schemas']['SeoUrl'][]; + } & components['schemas']['EntitySearchResult']; + }; + }; + 404: components['responses']['404']; + }; + }; + /** + * Fetch shipping methods + * Perform a filtered search for shipping methods. + */ + readShippingMethod: { + parameters: { + query?: { + /** List only available shipping methods. This filters shipping methods methods which can not be used in the actual context because of their availability rule. */ + onlyAvailable?: boolean; + }; + }; + requestBody?: { + content: { + 'application/json': components['schemas']['Criteria']; + }; + }; + responses: { + 200: { + content: { + 'application/json': { + /** aggregation result */ + aggregations?: GenericRecord; + elements?: components['schemas']['ShippingMethod'][]; + /** Total amount */ + total?: number; + }; + }; + }; + }; + }; + /** + * Fetch sitemaps + * Fetches a list of compressed sitemap files, which are often used by search engines. + */ + readSitemap: { + responses: { + /** Returns a list of available sitemaps. */ + 200: { + content: { + 'application/json': components['schemas']['Sitemap'][]; + }; + }; + }; + }; +}; + +export type operationPaths = + | 'readCategoryList post /category' + | 'readCategory post /category/{navigationId}?slots' + | 'readSeoUrl post /seo-url' + | 'readContext get /context' + | 'updateContext patch /context' + | 'readCurrency post /currency' + | 'handlePaymentMethod post /handle-payment' + | 'readLanguages post /language' + | 'readNavigation post /navigation/{activeId}/{rootId} sw-include-seo-urls' + | 'readPaymentMethod post /payment-method' + | 'confirmNewsletter post /newsletter/confirm' + | 'subscribeToNewsletter post /newsletter/subscribe' + | 'unsubscribeToNewsletter post /newsletter/unsubscribe' + | 'readCountry post /country' + | 'sendContactMail post /contact-form' + | 'readProductExport get /product-export/{accessKey}/{fileName}' + | 'getCustomerGroupRegistrationInfo get /customer-group-registration/config/{customerGroupId}' + | 'readCms post /cms/{id}' + | 'readSalutation post /salutation' + | 'readCountryState post /country-state/{countryId}' + | 'postScriptStoreApiRoute post /script/{hook}' + | 'download post /document/download/{documentId}/{deepLinkCode}' + | 'readNewsletterRecipient post /account/newsletter-recipient' + | 'changeProfile post /account/change-profile' + | 'changeEmail post /account/change-email' + | 'changeLanguage post /account/change-language' + | 'changePassword post /account/change-password' + | 'changePaymentMethod post /account/change-payment-method/{paymentMethodId}' + | 'getCustomerRecoveryIsExpired post /account/customer-recovery-is-expired' + | 'readCustomer post /account/customer' + | 'deleteCustomer delete /account/customer' + | 'deleteCustomerAddress delete /account/address/{addressId}' + | 'updateCustomerAddress patch /account/address/{addressId}' + | 'listAddress post /account/list-address' + | 'loginCustomer post /account/login' + | 'logoutCustomer post /account/logout' + | 'registerConfirm post /account/register-confirm' + | 'register post /account/register' + | 'recoveryPassword post /account/recovery-password-confirm' + | 'sendRecoveryMail post /account/recovery-password' + | 'defaultShippingAddress patch /account/address/default-shipping/{addressId}' + | 'defaultBillingAddress patch /account/address/default-billing/{addressId}' + | 'createCustomerAddress post /account/address' + | 'readProductCrossSellings post /product/{productId}/cross-selling' + | 'readProductDetail post /product/{productId}' + | 'readProduct post /product' + | 'readProductReviews post /product/{productId}/reviews' + | 'saveProductReview post /product/{productId}/review' + | 'searchProductVariantIds post /product/{productId}/find-variant' + | 'readSitemap get /sitemap' + | 'searchPage post /search' + | 'readProductListing post /product-listing/{categoryId}' + | 'readShippingMethod post /shipping-method?onlyAvailable' + | 'addProductOnWishlist post /customer/wishlist/add/{productId}' + | 'readCustomerWishlist post /customer/wishlist' + | 'mergeProductOnWishlist post /customer/wishlist/merge' + | 'deleteProductOnWishlist delete /customer/wishlist/delete/{productId}' + | 'readCart get /checkout/cart?name' + | 'deleteCart delete /checkout/cart' + | 'addLineItem post /checkout/cart/line-item' + | 'removeLineItem delete /checkout/cart/line-item?ids' + | 'updateLineItem patch /checkout/cart/line-item' + | 'createOrder post /checkout/order' + | 'cancelOrder post /order/state/cancel' + | 'readOrder post /order' + | 'orderSetPayment post /order/payment' + | 'orderDownloadFile get /order/download/{orderId}/{downloadId}' + | 'readLandingPage post /landing-page/{landingPageId}' + | 'searchSuggest post /search-suggest'; diff --git a/lib/shopware/api.ts b/lib/shopware/api.ts new file mode 100644 index 000000000..ac376a72f --- /dev/null +++ b/lib/shopware/api.ts @@ -0,0 +1,111 @@ +import { createAPIClient } from '@shopware/api-client'; +import { operations, operationPaths } from './api-types/apiTypes-6.5.2.0'; +import { + ApiSchemas, + CategoryListingResultSW, + ProductListingCriteria, + SeoURLResultSW, + StoreNavigationTypeSW +} from './types'; + +const domainSW = `https://${process.env.SHOPWARE_STORE_DOMAIN!}/${process.env.SHOPWARE_API_TYPE!}`; +const accessTokenSW = `${process.env.SHOPWARE_ACCESS_TOKEN}`; + +const apiInstance = createAPIClient<operations, operationPaths>({ + baseURL: domainSW, + accessToken: accessTokenSW, + apiType: 'store-api' +}); + +export async function requestNavigation( + type: StoreNavigationTypeSW +): Promise<ApiSchemas['NavigationRouteResponse']> { + return await apiInstance.invoke( + 'readNavigation post /navigation/{activeId}/{rootId} sw-include-seo-urls', + { + activeId: type, + rootId: type, + depth: 1 + } + ); +} + +export async function requestCategory( + categoryId: string, + criteria?: Partial<ProductListingCriteria> +): Promise<ApiSchemas['Category']> { + return await apiInstance.invoke('readCategory post /category/{navigationId}?slots', { + navigationId: categoryId, + criteria + }); +} + +export async function requestCategoryList( + criteria: Partial<ApiSchemas['Criteria']> +): Promise<CategoryListingResultSW> { + return await apiInstance.invoke('readCategoryList post /category', criteria); +} + +export async function requestProductsCollection( + criteria: Partial<ProductListingCriteria> +): Promise<ApiSchemas['ProductListingResult']> { + return await apiInstance.invoke('readProduct post /product', criteria); +} + +export async function requestCategoryProductsCollection( + categoryId: string, + criteria: Partial<ProductListingCriteria> +): Promise<ApiSchemas['ProductListingResult']> { + return await apiInstance.invoke('readProductListing post /product-listing/{categoryId}', { + ...criteria, + categoryId: categoryId + }); +} + +export async function requestSearchCollectionProducts( + criteria?: Partial<ProductListingCriteria> +): Promise<ApiSchemas['ProductListingResult']> { + return await apiInstance.invoke('searchPage post /search', { + search: encodeURIComponent(criteria?.query || ''), + ...criteria + }); +} + +export async function requestSeoUrl(handle: string): Promise<SeoURLResultSW> { + return await apiInstance.invoke('readSeoUrl post /seo-url', { + page: 1, + limit: 1, + filter: [ + { + type: 'multi', + // @ts-ignore + operator: 'or', + queries: [ + { + type: 'equals', + field: 'seoPathInfo', + value: handle + '/' + }, + { + type: 'equals', + field: 'seoPathInfo', + value: handle + } + ] + } + ] + }); +} + +export async function requestCrossSell( + productId: string, + criteria?: Partial<ProductListingCriteria> +): Promise<ApiSchemas['CrossSellingElementCollection']> { + return await apiInstance.invoke( + 'readProductCrossSellings post /product/{productId}/cross-selling', + { + productId: productId, + ...criteria + } + ); +} diff --git a/lib/shopware/criteria.ts b/lib/shopware/criteria.ts new file mode 100644 index 000000000..52b41e929 --- /dev/null +++ b/lib/shopware/criteria.ts @@ -0,0 +1,245 @@ +export function getDefaultProductsCriteria(page: number = 1, limit: number = 15) { + return { + page: page, + limit: limit, + associations: getDefaultProductAssociations(), + filter: [ + { + type: 'equals', + field: 'parentId', + value: null + } + ] + }; +} + +export function getDefaultProductCriteria(productId: string, page: number = 1, limit: number = 1) { + return { + page: page, + limit: limit, + associations: getDefaultProductAssociations(), + filter: [ + { + type: 'equals', + field: 'id', + value: productId + } + ] + }; +} + +export function getDefaultSearchProductsCriteria( + query: string, + page: number = 1, + limit: number = 100 +) { + return { + page: page, + limit: limit, + query: query, + associations: { + options: {}, + media: {}, + seoUrls: {}, + children: { + associations: { + options: {}, + media: {}, + seoUrls: {} + } + } + } + }; +} + +function getDefaultProductAssociations() { + return { + options: { + associations: { + group: {} + } + }, + media: {}, + seoUrls: {}, + children: { + associations: { + options: { + associations: { + group: {} + } + }, + media: {}, + seoUrls: {} + } + } + }; +} + +export function getDefaultCategoryCriteria(page: number = 1, limit: number = 1) { + return { + page: page, + limit: limit, + associations: { + cmsPage: {} + } + }; +} + +export function getStaticCollectionCriteria(page: number = 1, limit: number = 20) { + return { + page: page, + limit: limit, + associations: { + cmsPage: {}, + seoUrls: {} + }, + filter: [ + { + type: 'not', + operator: 'or', + queries: [ + { + type: 'equals', + field: 'level', + value: 1 + }, + { + type: 'equals', + field: 'active', + value: false + }, + { + type: 'equals', + field: 'cmsPage.type', + value: 'landingpage' + }, + { + type: 'equals', + field: 'cmsPage.type', + value: 'page' + }, + { + type: 'equals', + field: 'type', + value: 'link' + }, + { + type: 'equals', + field: 'childCount', + value: 0 + }, + { + type: 'contains', + field: 'breadcrumb', + value: 'Footer' + } + ] + } + ] + }; +} + +// ToDo: Can be used later for dynamic collections depending on parent collection (only show next level of categories, next to products) +export function getDefaultSubCategoriesCriteria( + categoryId: string, + page: number = 1, + limit: number = 10 +) { + return { + page: page, + limit: limit, + associations: { + cmsPage: {}, + children: { + associations: { + seoUrls: {} + }, + filter: [ + { + type: 'equals', + field: 'active', + value: true + } + ] + } + }, + filter: [ + { + type: 'equals', + field: 'id', + value: categoryId + } + ] + }; +} + +export function getDefaultCrossSellingCriteria(page: number = 1, limit: number = 1) { + return { + page: page, + limit: limit, + associations: { + options: {}, + media: {}, + seoUrls: {} + }, + filter: [ + { + type: 'equals', + field: 'active', + value: true + } + ] + }; +} + +export function getSortingCriteria(sortKey?: string, reverse?: boolean) { + switch (true) { + case sortKey === 'CREATED_AT' && reverse === true: + return { + sort: [ + { + field: 'createdAt', + order: 'DESC' + } + ] + }; + case sortKey === 'PRICE' && reverse === true: + return { + sort: [ + { + field: 'price', + order: 'DESC' + } + ] + }; + case sortKey === 'PRICE' && reverse === false: + return { + sort: [ + { + field: 'price', + order: 'ASC' + } + ] + }; + case sortKey === 'BEST_SELLING' && reverse === false: + return { + sort: [ + { + field: 'sales', + order: 'DESC' + } + ] + }; + + // sortKey === 'RELEVANCE' && reverse === false + default: + return { + sort: [ + { + field: 'availableStock', + order: 'DESC' + } + ] + }; + } +} diff --git a/lib/shopware/index.ts b/lib/shopware/index.ts new file mode 100644 index 000000000..4865a1008 --- /dev/null +++ b/lib/shopware/index.ts @@ -0,0 +1,199 @@ +import { + ApiSchemas, + Menu, + Page, + Product, + ProductListingCriteria, + StoreNavigationTypeSW +} from './types'; +import { + getDefaultCategoryCriteria, + getDefaultCrossSellingCriteria, + getDefaultProductCriteria, + getDefaultProductsCriteria, + getDefaultSearchProductsCriteria, + getSortingCriteria, + getStaticCollectionCriteria +} from './criteria'; +import { + requestCategory, + requestCategoryList, + requestCategoryProductsCollection, + requestCrossSell, + requestNavigation, + requestProductsCollection, + requestSearchCollectionProducts, + requestSeoUrl +} from './api'; +import { + transformMenu, + transformPage, + transformProduct, + transformProducts, + transformCollection, + transformStaticCollection +} from './transform'; + +export async function getMenu(params?: { type?: StoreNavigationTypeSW }): Promise<Menu[]> { + const type = params?.type || 'main-navigation'; + const res = await requestNavigation(type); + + return res ? transformMenu(res) : []; +} + +export async function getPage(handle: string): Promise<Page | undefined> { + const seoUrlElement = await getFirstSeoUrlElement(handle); + if (seoUrlElement) { + const resCategory = await requestCategory( + seoUrlElement.foreignKey, + getDefaultCategoryCriteria() + ); + + return resCategory ? transformPage(seoUrlElement, resCategory) : undefined; + } +} + +export async function getFirstSeoUrlElement( + handle: string +): Promise<ApiSchemas['SeoUrl'] | undefined> { + const resSeoUrl = await requestSeoUrl(handle); + if (resSeoUrl.elements && resSeoUrl.elements.length > 0 && resSeoUrl.elements[0]) { + return resSeoUrl.elements[0]; + } +} + +export async function getFirstProduct( + productId: string +): Promise<ApiSchemas['Product'] | undefined> { + const productCriteria = getDefaultProductCriteria(productId); + const res: ApiSchemas['ProductListingResult'] = await requestProductsCollection(productCriteria); + if (res.elements && res.elements.length > 0 && res.elements[0]) { + return res.elements[0]; + } +} + +// ToDo: should be more dynamic (depending on handle), should work with server and not client see generateStaticParams from next.js +export async function getStaticCollections() { + // @ToDo: This is an example about multi-filter with new store API client + // @ts-ignore + const resCategory = await requestCategoryList(getStaticCollectionCriteria()); + + return resCategory ? transformStaticCollection(resCategory) : []; +} + +export async function getSearchCollectionProducts(params?: { + query?: string; + reverse?: boolean; + sortKey?: string; + categoryId?: string; + defaultSearchCriteria?: Partial<ProductListingCriteria>; +}) { + const searchQuery = params?.query ?? ''; + const criteria = getDefaultSearchProductsCriteria(searchQuery); + const sorting = getSortingCriteria(params?.sortKey, params?.reverse); + const searchCriteria = { ...criteria, ...sorting }; + + const res = await requestSearchCollectionProducts(searchCriteria); + + return res ? transformProducts(res) : []; +} + +export async function getCollectionProducts(params?: { + collection: string; + reverse?: boolean; + sortKey?: string; + categoryId?: string; + defaultSearchCriteria?: Partial<ProductListingCriteria>; +}): Promise<Product[]> { + let res; + let collectionName: string | [] | undefined = params?.collection; + let category = params?.categoryId; + const sorting = getSortingCriteria(params?.sortKey, params?.reverse); + + if (!category && collectionName) { + // this part is important for the catch all collection handle/slug + if (Array.isArray(collectionName)) { + collectionName = collectionName.join('/'); + } + const seoUrlElement = await getFirstSeoUrlElement(collectionName); + if (seoUrlElement) { + category = seoUrlElement.foreignKey; + } + if (!category) { + console.log( + '[useListing][search] Did not found any category with collection name:', + collectionName + ); + } + } + + if (category) { + const criteria = !params?.defaultSearchCriteria + ? getDefaultProductsCriteria() + : params?.defaultSearchCriteria; + const productsCriteria = { ...criteria, ...sorting }; + res = await requestCategoryProductsCollection(category, productsCriteria); + } + + return res ? transformProducts(res) : []; +} + +// This function is only used for generateMetadata at app/search/(collection)/[...collection]/page.tsx +export async function getCollection(handle: string | []) { + let collectionName: string | [] | undefined = handle; + if (Array.isArray(collectionName)) { + collectionName = collectionName.join('/'); + } + const seoUrlElement = await getFirstSeoUrlElement(collectionName); + if (seoUrlElement) { + const resCategory = await requestCategory( + seoUrlElement.foreignKey, + getDefaultCategoryCriteria() + ); + const path = seoUrlElement.seoPathInfo ?? ''; + const collection = transformCollection(seoUrlElement, resCategory); + + return { + ...collection, + path: `/search/${path}` + }; + } +} + +export async function getProduct(handle: string | []): Promise<Product | undefined> { + let productSW: ApiSchemas['Product'] | undefined; + let productId: string | undefined; + let productHandle: string | [] | undefined = handle; + if (Array.isArray(productHandle)) { + productHandle = productHandle.join('/'); + } + + const seoUrlElement = await getFirstSeoUrlElement(productHandle); + if (seoUrlElement) { + productId = seoUrlElement.foreignKey; + } + + if (!productId) { + console.log('[getProduct][search] Did not found any product with handle:', productHandle); + } + if (productId) { + const firstProduct = await getFirstProduct(productId); + if (firstProduct) { + productSW = firstProduct; + } + } + + return productSW ? transformProduct(productSW) : undefined; +} + +export async function getProductRecommendations(productId: string): Promise<Product[]> { + let products: ApiSchemas['ProductListingResult'] = {}; + + const res = await requestCrossSell(productId, getDefaultCrossSellingCriteria()); + // @ToDo: Make this more dynamic to merge multiple Cross-Sellings, at the moment we only get the first one + if (res && res[0] && res[0].products) { + products.elements = res[0].products; + } + + return products ? transformProducts(products) : []; +} diff --git a/lib/shopware/transform.ts b/lib/shopware/transform.ts new file mode 100644 index 000000000..d0496803f --- /dev/null +++ b/lib/shopware/transform.ts @@ -0,0 +1,203 @@ +import { + ApiSchemas, + CategoryListingResultSW, + Collection, + Menu, + Product, + ProductOption, + ProductVariant +} from './types'; +import { ListItem } from 'components/layout/search/filter'; + +export function transformMenu(res: ApiSchemas['NavigationRouteResponse']) { + let menu: Menu[] = []; + + res.map((item) => + menu.push({ + id: item.id ?? '', + title: item.name, + path: + item.seoUrls && item.seoUrls.length > 0 && item.seoUrls[0] && item.seoUrls[0].seoPathInfo + ? '/search/' + item.seoUrls[0].seoPathInfo + : '' + }) + ); + + return menu; +} + +export function transformPage( + seoUrlElement: ApiSchemas['SeoUrl'], + resCategory: ApiSchemas['Category'] +) { + return { + id: seoUrlElement.id ?? '', + title: resCategory.translated?.metaTitle ?? resCategory.name ?? '', + handle: seoUrlElement.seoPathInfo, + body: resCategory.description ?? '', + bodySummary: resCategory.translated?.metaDescription ?? resCategory.description ?? '', + seo: { + title: resCategory.translated?.metaTitle ?? resCategory.name ?? '', + description: resCategory.translated?.metaDescription ?? resCategory.description ?? '' + }, + createdAt: seoUrlElement.createdAt ?? '', + updatedAt: seoUrlElement.updatedAt ?? '', + routeName: seoUrlElement.routeName, + foreignKey: seoUrlElement.foreignKey + }; +} + +export function transformCollection( + seoUrlElement: ApiSchemas['SeoUrl'], + resCategory: ApiSchemas['Category'] +) { + return { + handle: seoUrlElement.seoPathInfo, + title: resCategory.translated?.metaTitle ?? resCategory.name ?? '', + description: resCategory.description ?? '', + seo: { + title: resCategory.translated?.metaTitle ?? resCategory.name ?? '', + description: resCategory.translated?.metaDescription ?? resCategory.description ?? '' + }, + updatedAt: seoUrlElement.updatedAt ?? seoUrlElement.createdAt ?? '' + }; +} + +export function transformStaticCollection(resCategory: CategoryListingResultSW): Collection[] { + let collection: Collection[] = []; + + if (resCategory.elements && resCategory.elements.length > 0) { + resCategory.elements.map((item) => + collection.push({ + handle: + item.seoUrls && item.seoUrls.length > 0 && item.seoUrls[0] && item.seoUrls[0].seoPathInfo + ? item.seoUrls[0].seoPathInfo + : '', + title: item.translated?.metaTitle ?? item.name ?? '', + description: item.description ?? '', + seo: { + title: item.translated?.metaTitle ?? item.name ?? '', + description: item.translated?.metaDescription ?? item.description ?? '' + }, + updatedAt: item.updatedAt ?? item.createdAt ?? '' + }) + ); + } + + return collection; +} + +export function transformStaticCollectionToList(collection: Collection[]): ListItem[] { + let listItem: ListItem[] = []; + + if (collection && collection.length > 0) { + collection.map((item) => + listItem.push({ + title: item.title, + path: `/search/${item.handle}` + }) + ); + } + + return listItem; +} + +export function transformProducts(res: ApiSchemas['ProductListingResult']): Product[] { + let products: Product[] = []; + + if (res.elements && res.elements.length > 0) { + res.elements.map((item) => products.push(transformProduct(item))); + } + + return products; +} + +export function transformProduct(item: ApiSchemas['Product']): Product { + const productOptions = transformOptions(item); + const productVariants = transformVariants(item); + + return { + id: item.id ?? '', + path: + item.seoUrls && item.seoUrls.length > 0 && item.seoUrls[0] && item.seoUrls[0].seoPathInfo + ? item.seoUrls[0].seoPathInfo + : '', + availableForSale: item.available ?? false, + title: item.translated ? item.translated.name ?? '' : item.name, + description: item.translated?.metaDescription + ? item.translated.metaDescription ?? '' + : item.metaDescription ?? '', + descriptionHtml: item.translated?.description + ? item.translated.description ?? '' + : item.description ?? '', + options: productOptions, + priceRange: { + maxVariantPrice: { + amount: item.calculatedPrice?.totalPrice ? String(item.calculatedPrice?.totalPrice) : '0', + currencyCode: 'EUR' + }, + minVariantPrice: { + amount: item.calculatedCheapestPrice?.totalPrice + ? String(item.calculatedPrice?.totalPrice) + : '0', + currencyCode: 'EUR' + } + }, + variants: [], + featuredImage: { + url: item.cover?.media?.url ?? '', + altText: item.cover?.media?.translated?.alt ?? '', + width: item.cover?.media?.metaData?.width ? Number(item.cover?.media?.metaData?.width) : 0, + height: item.cover?.media?.metaData?.width ? Number(item.cover?.media?.metaData?.height) : 0 + }, + images: item.media + ? item.media.map((img) => ({ + url: img.media?.url ?? '', + altText: img.media?.translated?.alt ?? '', + width: img.media?.metaData?.width ? Number(img.media?.metaData?.width) : 0, + height: img.media?.metaData?.width ? Number(img.media?.metaData?.height) : 0 + })) + : [], + seo: { + title: item.translated?.metaTitle ?? item.translated?.name ?? item.name ?? '', + description: item.translated?.metaDescription ?? '' + }, + tags: [''], // @ToDo: Add keywords or do we have tags? + updatedAt: item.updatedAt ?? '' + }; +} + +function transformOptions(parent: ApiSchemas['Product']): ProductOption[] { + // we only transform options for parents with children, ignore child products with options + let productOptions: ProductOption[] = []; + if (parent.children && parent.parentId === null && parent.children.length > 0) { + let group: { [key: string]: string[] } = {}; + parent.children.map((child) => { + child.options?.map((option) => { + if (option && option.group) { + group[option.group.name] = group[option.group.name] + ? [...new Set([...(group[option.group.name] as []), ...[option.name]])] + : [option.name]; + } + }); + }); + + if (parent.id) { + for (const [key, value] of Object.entries(group)) { + productOptions.push({ + id: parent.id, + name: key, + values: value + }); + } + } + } + + return productOptions; +} + +function transformVariants(parent: ApiSchemas['Product']): ProductVariant[] { + let productVariants: ProductVariant[] = []; + + return productVariants; +} diff --git a/lib/shopware/types.ts b/lib/shopware/types.ts new file mode 100644 index 000000000..2c168cb15 --- /dev/null +++ b/lib/shopware/types.ts @@ -0,0 +1,96 @@ +import { components } from './api-types/apiTypes-6.5.2.0'; + +/** Shopware Types */ + +/** Schemas */ +export type ApiSchemas = components['schemas']; +export type StoreNavigationTypeSW = 'main-navigation' | 'footer-navigation' | 'service-navigation'; +export type ProductListingCriteria = ApiSchemas['ProductListingCriteria'] & { + query: string; +}; + +/** Return Types */ +export type CategoryListingResultSW = { + elements?: ApiSchemas['Category'][]; +} & ApiSchemas['EntitySearchResult']; +export type SeoURLResultSW = { + elements?: ApiSchemas['SeoUrl'][]; +} & ApiSchemas['EntitySearchResult']; + +/** Vercel Commerce Types */ +export type Menu = { id: string; title: string; path: string }; + +export type Page = { + id: string; + title: string; + handle: string; + body: string; + bodySummary: string; + seo?: SEO; + createdAt: string; + updatedAt: string; + routeName?: string; + foreignKey?: string; +}; + +export type ProductOption = { + id: string; + name: string; + values: string[]; +}; + +export type SEO = { + title: string; + description: string; +}; + +export type Money = { + amount: string; + currencyCode: string; +}; + +export type ProductVariant = { + id: string; + title: string; + availableForSale: boolean; + selectedOptions: { + name: string; + value: string; + }[]; + price: Money; +}; + +export type Image = { + url: string; + altText: string; + width: number; + height: number; +}; + +export type Product = { + id: string; + path: string; + availableForSale: boolean; + title: string; + description: string; + descriptionHtml: string; + options: ProductOption[]; + priceRange: { + maxVariantPrice: Money; + minVariantPrice: Money; + }; + variants: ProductVariant[]; + featuredImage: Image; + images: Image[]; + seo: SEO; + tags: string[]; + updatedAt: string; +}; + +export type Collection = { + handle: string; + title: string; + description: string; + seo: SEO; + updatedAt: string; +}; diff --git a/next.config.js b/next.config.js index 7a65540b1..0b0db063b 100644 --- a/next.config.js +++ b/next.config.js @@ -8,12 +8,12 @@ module.exports = { serverActions: true }, images: { + // also other fromats like jpg, jpeg, png are working without adding them here formats: ['image/avif', 'image/webp'], remotePatterns: [ { protocol: 'https', - hostname: 'cdn.shopify.com', - pathname: '/s/files/**' + hostname: 'cdn.shopware.store' } ] } diff --git a/package.json b/package.json index 15c72eb5e..b965d5317 100644 --- a/package.json +++ b/package.json @@ -23,31 +23,32 @@ }, "dependencies": { "@headlessui/react": "^1.7.15", - "@vercel/og": "^0.5.6", + "@shopware/api-client": "^0.0.3", + "@vercel/og": "^0.5.8", "clsx": "^1.2.1", "is-empty-iterable": "^3.0.0", - "next": "13.4.6", + "next": "13.4.8", "react": "18.2.0", "react-cookie": "^4.1.1", "react-dom": "18.2.0" }, "devDependencies": { - "@playwright/test": "^1.34.3", + "@playwright/test": "^1.35.1", "@tailwindcss/typography": "^0.5.9", - "@types/node": "20.2.5", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", + "@types/node": "20.4.0", + "@types/react": "18.2.14", + "@types/react-dom": "18.2.6", "@vercel/git-hooks": "^1.0.0", "autoprefixer": "^10.4.14", - "eslint": "^8.42.0", - "eslint-config-next": "^13.4.4", + "eslint": "^8.44.0", + "eslint-config-next": "^13.4.8", "eslint-config-prettier": "^8.8.0", "eslint-plugin-unicorn": "^47.0.0", - "lint-staged": "^13.2.2", + "lint-staged": "^13.2.3", "postcss": "^8.4.24", "prettier": "^2.8.8", "prettier-plugin-tailwindcss": "^0.3.0", "tailwindcss": "^3.3.2", - "typescript": "5.1.3" + "typescript": "5.1.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83b8acec7..90958f824 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,12 @@ dependencies: '@headlessui/react': specifier: ^1.7.15 version: 1.7.15(react-dom@18.2.0)(react@18.2.0) + '@shopware/api-client': + specifier: ^0.0.3 + version: 0.0.3 '@vercel/og': - specifier: ^0.5.6 - version: 0.5.6 + specifier: ^0.5.8 + version: 0.5.8 clsx: specifier: ^1.2.1 version: 1.2.1 @@ -14,8 +17,8 @@ dependencies: specifier: ^3.0.0 version: 3.0.0 next: - specifier: 13.4.6 - version: 13.4.6(react-dom@18.2.0)(react@18.2.0) + specifier: 13.4.8 + version: 13.4.8(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -28,20 +31,20 @@ dependencies: devDependencies: '@playwright/test': - specifier: ^1.34.3 - version: 1.34.3 + specifier: ^1.35.1 + version: 1.35.1 '@tailwindcss/typography': specifier: ^0.5.9 version: 0.5.9(tailwindcss@3.3.2) '@types/node': - specifier: 20.2.5 - version: 20.2.5 + specifier: 20.4.0 + version: 20.4.0 '@types/react': - specifier: 18.2.8 - version: 18.2.8 + specifier: 18.2.14 + version: 18.2.14 '@types/react-dom': - specifier: 18.2.4 - version: 18.2.4 + specifier: 18.2.6 + version: 18.2.6 '@vercel/git-hooks': specifier: ^1.0.0 version: 1.0.0 @@ -49,20 +52,20 @@ devDependencies: specifier: ^10.4.14 version: 10.4.14(postcss@8.4.24) eslint: - specifier: ^8.42.0 - version: 8.42.0 + specifier: ^8.44.0 + version: 8.44.0 eslint-config-next: - specifier: ^13.4.4 - version: 13.4.4(eslint@8.42.0)(typescript@5.1.3) + specifier: ^13.4.8 + version: 13.4.8(eslint@8.44.0)(typescript@5.1.6) eslint-config-prettier: specifier: ^8.8.0 - version: 8.8.0(eslint@8.42.0) + version: 8.8.0(eslint@8.44.0) eslint-plugin-unicorn: specifier: ^47.0.0 - version: 47.0.0(eslint@8.42.0) + version: 47.0.0(eslint@8.44.0) lint-staged: - specifier: ^13.2.2 - version: 13.2.2 + specifier: ^13.2.3 + version: 13.2.3 postcss: specifier: ^8.4.24 version: 8.4.24 @@ -76,51 +79,56 @@ devDependencies: specifier: ^3.3.2 version: 3.3.2 typescript: - specifier: 5.1.3 - version: 5.1.3 + specifier: 5.1.6 + version: 5.1.6 packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} dev: true - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 dev: true - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/runtime@7.22.3: - resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==} + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.42.0 + eslint: 8.44.0 eslint-visitor-keys: 3.4.1 dev: true @@ -129,13 +137,13 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.5.2 + espree: 9.6.0 globals: 13.20.0 ignore: 5.2.4 import-fresh: 3.3.0 @@ -146,8 +154,8 @@ packages: - supports-color dev: true - /@eslint/js@8.42.0: - resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -217,18 +225,18 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@next/env@13.4.6: - resolution: {integrity: sha512-nqUxEtvDqFhmV1/awSg0K2XHNwkftNaiUqCYO9e6+MYmqNObpKVl7OgMkGaQ2SZnFx5YqF0t60ZJTlyJIDAijg==} + /@next/env@13.4.8: + resolution: {integrity: sha512-twuSf1klb3k9wXI7IZhbZGtFCWvGD4wXTY2rmvzIgVhXhs7ISThrbNyutBx3jWIL8Y/Hk9+woytFz5QsgtcRKQ==} dev: false - /@next/eslint-plugin-next@13.4.4: - resolution: {integrity: sha512-5jnh7q6I15efnjR/rR+/TGTc9hn53g3JTbEjAMjmeQiExKqEUgIXqrHI5zlTNlNyzCPkBB860/ctxXheZaF2Vw==} + /@next/eslint-plugin-next@13.4.8: + resolution: {integrity: sha512-cmfVHpxWjjcETFt2WHnoFU6EmY69QcPJRlRNAooQlNe53Ke90vg1Ci/dkPffryJZaxxiRziP9bQrV8lDVCn3Fw==} dependencies: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@13.4.6: - resolution: {integrity: sha512-ahi6VP98o4HV19rkOXPSUu+ovfHfUxbJQ7VVJ7gL2FnZRr7onEFC1oGQ6NQHpm8CxpIzSSBW79kumlFMOmZVjg==} + /@next/swc-darwin-arm64@13.4.8: + resolution: {integrity: sha512-MSFplVM4dTWOuKAUv0XR9gY7AWtMSBu9os9f+kp+s5rWhM1I2CdR3obFttd6366nS/W/VZxbPM5oEIdlIa46zA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -236,8 +244,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.6: - resolution: {integrity: sha512-13cXxKFsPJIJKzUqrU5XB1mc0xbUgYsRcdH6/rB8c4NMEbWGdtD4QoK9ShN31TZdePpD4k416Ur7p+deMIxnnA==} + /@next/swc-darwin-x64@13.4.8: + resolution: {integrity: sha512-Reox+UXgonon9P0WNDE6w85DGtyBqGitl/ryznOvn6TvfxEaZIpTgeu3ZrJLU9dHSMhiK7YAM793mE/Zii2/Qw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -245,8 +253,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.6: - resolution: {integrity: sha512-Ti+NMHEjTNktCVxNjeWbYgmZvA2AqMMI2AMlzkXsU7W4pXCMhrryAmAIoo+7YdJbsx01JQWYVxGe62G6DoCLaA==} + /@next/swc-linux-arm64-gnu@13.4.8: + resolution: {integrity: sha512-kdyzYvAYtqQVgzIKNN7e1rLU8aZv86FDSRqPlOkKZlvqudvTO0iohuTPmnEEDlECeBM6qRPShNffotDcU/R2KA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -254,8 +262,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.6: - resolution: {integrity: sha512-OHoC6gO7XfjstgwR+z6UHKlvhqJfyMtNaJidjx3sEcfaDwS7R2lqR5AABi8PuilGgi0BO0O0sCXqLlpp3a0emQ==} + /@next/swc-linux-arm64-musl@13.4.8: + resolution: {integrity: sha512-oWxx4yRkUGcR81XwbI+T0zhZ3bDF6V1aVLpG+C7hSG50ULpV8gC39UxVO22/bv93ZlcfMY4zl8xkz9Klct6dpQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -263,8 +271,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.6: - resolution: {integrity: sha512-zHZxPGkUlpfNJCboUrFqwlwEX5vI9LSN70b8XEb0DYzzlrZyCyOi7hwDp/+3Urm9AB7YCAJkgR5Sp1XBVjHdfQ==} + /@next/swc-linux-x64-gnu@13.4.8: + resolution: {integrity: sha512-anhtvuO6eE9YRhYnaEGTfbpH3L5gT/9qPFcNoi6xS432r/4DAtpJY8kNktqkTVevVIC/pVumqO8tV59PR3zbNg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -272,8 +280,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.6: - resolution: {integrity: sha512-K/Y8lYGTwTpv5ME8PSJxwxLolaDRdVy+lOd9yMRMiQE0BLUhtxtCWC9ypV42uh9WpLjoaD0joOsB9Q6mbrSGJg==} + /@next/swc-linux-x64-musl@13.4.8: + resolution: {integrity: sha512-aR+J4wWfNgH1DwCCBNjan7Iumx0lLtn+2/rEYuhIrYLY4vnxqSVGz9u3fXcgUwo6Q9LT8NFkaqK1vPprdq+BXg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -281,8 +289,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.6: - resolution: {integrity: sha512-U6LtxEUrjBL2tpW+Kr1nHCSJWNeIed7U7l5o7FiKGGwGgIlFi4UHDiLI6TQ2lxi20fAU33CsruV3U0GuzMlXIw==} + /@next/swc-win32-arm64-msvc@13.4.8: + resolution: {integrity: sha512-OWBKIrJwQBTqrat0xhxEB/jcsjJR3+diD9nc/Y8F1mRdQzsn4bPsomgJyuqPVZs6Lz3K18qdIkvywmfSq75SsQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -290,8 +298,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.6: - resolution: {integrity: sha512-eEBeAqpCfhdPSlCZCayjCiyIllVqy4tcqvm1xmg3BgJG0G5ITiMM4Cw2WVeRSgWDJqQGRyyb+q8Y2ltzhXOWsQ==} + /@next/swc-win32-ia32-msvc@13.4.8: + resolution: {integrity: sha512-agiPWGjUndXGTOn4ChbKipQXRA6/UPkywAWIkx7BhgGv48TiJfHTK6MGfBoL9tS6B4mtW39++uy0wFPnfD0JWg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -299,8 +307,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.6: - resolution: {integrity: sha512-OrZs94AuO3ZS5tnqlyPRNgfWvboXaDQCi5aXGve3o3C+Sj0ctMUV9+Do+0zMvvLRumR8E0PTWKvtz9n5vzIsWw==} + /@next/swc-win32-x64-msvc@13.4.8: + resolution: {integrity: sha512-UIRKoByVKbuR6SnFG4JM8EMFlJrfEGuUQ1ihxzEleWcNwRMMiVaCj1KyqfTOW8VTQhJ0u8P1Ngg6q1RwnIBTtw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -334,20 +342,20 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: cross-spawn: 7.0.3 - fast-glob: 3.2.12 + fast-glob: 3.3.0 is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 - tslib: 2.5.3 + tslib: 2.6.0 dev: true - /@playwright/test@1.34.3: - resolution: {integrity: sha512-zPLef6w9P6T/iT6XDYG3mvGOqOyb6eHaV9XtkunYs0+OzxBtrPAAaHotc0X+PJ00WPPnLfFBTl7mf45Mn8DBmw==} - engines: {node: '>=14'} + /@playwright/test@1.35.1: + resolution: {integrity: sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA==} + engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.2.5 - playwright-core: 1.34.3 + '@types/node': 20.4.0 + playwright-core: 1.35.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -357,10 +365,16 @@ packages: engines: {node: '>= 10'} dev: false - /@rushstack/eslint-patch@1.3.0: - resolution: {integrity: sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==} + /@rushstack/eslint-patch@1.3.2: + resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} dev: true + /@shopware/api-client@0.0.3: + resolution: {integrity: sha512-lz8xxDAZ32JjILXMfhmv5xOc+yUMBTw/+Br1iwnEUbXUY0QCQ12coNA0P0vA675wXL09JIfSLg27A61cOud70Q==} + dependencies: + ofetch: 1.1.1 + dev: false + /@shuding/opentype.js@1.4.0-beta.0: resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} engines: {node: '>= 8.0.0'} @@ -373,7 +387,7 @@ packages: /@swc/helpers@0.5.1: resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: false /@tailwindcss/typography@0.5.9(tailwindcss@3.3.2): @@ -395,7 +409,7 @@ packages: /@types/hoist-non-react-statics@3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: - '@types/react': 18.2.8 + '@types/react': 18.2.14 hoist-non-react-statics: 3.3.2 dev: false @@ -403,8 +417,8 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/node@20.2.5: - resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} + /@types/node@20.4.0: + resolution: {integrity: sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==} dev: true /@types/normalize-package-data@2.4.1: @@ -414,14 +428,14 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/react-dom@18.2.4: - resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==} + /@types/react-dom@18.2.6: + resolution: {integrity: sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==} dependencies: - '@types/react': 18.2.8 + '@types/react': 18.2.14 dev: true - /@types/react@18.2.8: - resolution: {integrity: sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==} + /@types/react@18.2.14: + resolution: {integrity: sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -430,8 +444,8 @@ packages: /@types/scheduler@0.16.3: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - /@typescript-eslint/parser@5.59.9(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==} + /@typescript-eslint/parser@5.61.0(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -440,31 +454,31 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.59.9 - '@typescript-eslint/types': 5.59.9 - '@typescript-eslint/typescript-estree': 5.59.9(typescript@5.1.3) + '@typescript-eslint/scope-manager': 5.61.0 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.1.6) debug: 4.3.4 - eslint: 8.42.0 - typescript: 5.1.3 + eslint: 8.44.0 + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@5.59.9: - resolution: {integrity: sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==} + /@typescript-eslint/scope-manager@5.61.0: + resolution: {integrity: sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.9 - '@typescript-eslint/visitor-keys': 5.59.9 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 dev: true - /@typescript-eslint/types@5.59.9: - resolution: {integrity: sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==} + /@typescript-eslint/types@5.61.0: + resolution: {integrity: sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree@5.59.9(typescript@5.1.3): - resolution: {integrity: sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==} + /@typescript-eslint/typescript-estree@5.61.0(typescript@5.1.6): + resolution: {integrity: sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -472,23 +486,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.59.9 - '@typescript-eslint/visitor-keys': 5.59.9 + '@typescript-eslint/types': 5.61.0 + '@typescript-eslint/visitor-keys': 5.61.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.1 - tsutils: 3.21.0(typescript@5.1.3) - typescript: 5.1.3 + semver: 7.5.3 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys@5.59.9: - resolution: {integrity: sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==} + /@typescript-eslint/visitor-keys@5.61.0: + resolution: {integrity: sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.59.9 + '@typescript-eslint/types': 5.61.0 eslint-visitor-keys: 3.4.1 dev: true @@ -497,25 +511,25 @@ packages: requiresBuild: true dev: true - /@vercel/og@0.5.6: - resolution: {integrity: sha512-C7loD/Ryt+cXgZ93KVNOIa/r/WcPVPk1JflUODGUdngFwxOJab0eCdugMrwGR2Oq85g4TXXHMBZIC2Z0C9P1NQ==} + /@vercel/og@0.5.8: + resolution: {integrity: sha512-WlY5q96e2OmQEUsgqKZrCljNHiD05aErsa7u2z2+pkxyoVSWPHXLYFwHPtp7+IubU4gt4JYfgSbzGQg7n6xeAQ==} engines: {node: '>=16'} dependencies: '@resvg/resvg-wasm': 2.4.1 - satori: 0.9.1 + satori: 0.10.1 yoga-wasm-web: 0.3.3 dev: false - /acorn-jsx@5.3.2(acorn@8.8.2): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.2 + acorn: 8.10.0 dev: true - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -593,10 +607,10 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: - deep-equal: 2.2.1 + dequal: 2.0.3 dev: true /array-buffer-byte-length@1.0.0: @@ -668,8 +682,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.21.7 - caniuse-lite: 1.0.30001495 + browserslist: 4.21.9 + caniuse-lite: 1.0.30001512 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -687,10 +701,10 @@ packages: engines: {node: '>=4'} dev: true - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: - deep-equal: 2.2.1 + dequal: 2.0.3 dev: true /balanced-match@1.0.2: @@ -733,15 +747,15 @@ packages: fill-range: 7.0.1 dev: true - /browserslist@4.21.7: - resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==} + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001495 - electron-to-chromium: 1.4.422 + caniuse-lite: 1.0.30001512 + electron-to-chromium: 1.4.451 node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.7) + update-browserslist-db: 1.0.11(browserslist@4.21.9) dev: true /builtin-modules@3.3.0: @@ -784,8 +798,8 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: false - /caniuse-lite@1.0.30001495: - resolution: {integrity: sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==} + /caniuse-lite@1.0.30001512: + resolution: {integrity: sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==} /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -908,7 +922,7 @@ packages: dev: true /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true /cookie@0.4.2: @@ -982,29 +996,6 @@ packages: ms: 2.1.2 dev: true - /deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.9 - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -1040,6 +1031,15 @@ packages: object-keys: 1.1.1 dev: true + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /destr@2.0.0: + resolution: {integrity: sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg==} + dev: false + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true @@ -1073,8 +1073,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.422: - resolution: {integrity: sha512-OQMid0IRbJv27BhlPiBK8CfGzjeq4ZCBSmpwNi1abyS8w17/BajOUu7hBI49ptDTBCz9NRFbORhWvt41dF7dwg==} + /electron-to-chromium@1.4.451: + resolution: {integrity: sha512-YYbXHIBxAHe3KWvGOJOuWa6f3tgow44rBW+QAuwVp2DvGqNZeE//K2MowNdWS7XE8li5cgQDrX1LdBr41LufkA==} dev: true /emoji-regex@10.2.1: @@ -1089,8 +1089,8 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 @@ -1143,20 +1143,6 @@ packages: which-typed-array: 1.1.9 dev: true - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} @@ -1186,6 +1172,10 @@ packages: engines: {node: '>=6'} dev: true + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1196,8 +1186,8 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-next@13.4.4(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-z/PMbm6L0iC/fwISULxe8IVy4DtNqZk2wQY711o35klenq70O6ns82A8yuMVCFjHC0DIyB2lyugesRtuk9u8dQ==} + /eslint-config-next@13.4.8(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-2hE0b6lHuhtHBX8VgEXi8v4G8PVrPUBMOSLCTq8qtcQ2qQOX7+uBOLK2kU4FD2qDZzyXNlhmuH+WLT5ptY4XLA==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -1205,29 +1195,29 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.4.4 - '@rushstack/eslint-patch': 1.3.0 - '@typescript-eslint/parser': 5.59.9(eslint@8.42.0)(typescript@5.1.3) - eslint: 8.42.0 + '@next/eslint-plugin-next': 13.4.8 + '@rushstack/eslint-patch': 1.3.2 + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.42.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.42.0) - eslint-plugin-react: 7.32.2(eslint@8.42.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.42.0) - typescript: 5.1.3 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.44.0) + eslint-plugin-react: 7.32.2(eslint@8.44.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.44.0) + typescript: 5.1.6 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: true - /eslint-config-prettier@8.8.0(eslint@8.42.0): + /eslint-config-prettier@8.8.0(eslint@8.44.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.42.0 + eslint: 8.44.0 dev: true /eslint-import-resolver-node@0.3.7: @@ -1240,7 +1230,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.42.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -1248,12 +1238,12 @@ packages: eslint-plugin-import: '*' dependencies: debug: 4.3.4 - enhanced-resolve: 5.14.1 - eslint: 8.42.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0) - get-tsconfig: 4.6.0 - globby: 13.1.4 + enhanced-resolve: 5.15.0 + eslint: 8.44.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) + get-tsconfig: 4.6.2 + globby: 13.2.2 is-core-module: 2.12.1 is-glob: 4.0.3 synckit: 0.8.5 @@ -1264,7 +1254,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -1285,16 +1275,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.59.9(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) debug: 3.2.7 - eslint: 8.42.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.42.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.44.0) transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -1304,15 +1294,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.59.9(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/parser': 5.61.0(eslint@8.44.0)(typescript@5.1.6) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.42.0 + eslint: 8.44.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.9)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.61.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.44.0) has: 1.0.3 is-core-module: 2.12.1 is-glob: 4.0.3 @@ -1327,24 +1317,24 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.42.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.44.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.22.3 - aria-query: 5.1.3 + '@babel/runtime': 7.22.6 + aria-query: 5.3.0 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 ast-types-flow: 0.0.7 axe-core: 4.7.2 - axobject-query: 3.1.1 + axobject-query: 3.2.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.42.0 + eslint: 8.44.0 has: 1.0.3 - jsx-ast-utils: 3.3.3 + jsx-ast-utils: 3.3.4 language-tags: 1.0.5 minimatch: 3.1.2 object.entries: 1.1.6 @@ -1352,16 +1342,16 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-react-hooks@4.6.0(eslint@8.42.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.44.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.42.0 + eslint: 8.44.0 dev: true - /eslint-plugin-react@7.32.2(eslint@8.42.0): + /eslint-plugin-react@7.32.2(eslint@8.44.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -1371,9 +1361,9 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.42.0 + eslint: 8.44.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 + jsx-ast-utils: 3.3.4 minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 @@ -1385,17 +1375,17 @@ packages: string.prototype.matchall: 4.0.8 dev: true - /eslint-plugin-unicorn@47.0.0(eslint@8.42.0): + /eslint-plugin-unicorn@47.0.0(eslint@8.44.0): resolution: {integrity: sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.38.0' dependencies: - '@babel/helper-validator-identifier': 7.19.1 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) + '@babel/helper-validator-identifier': 7.22.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.42.0 + eslint: 8.44.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -1406,7 +1396,7 @@ packages: regexp-tree: 0.1.27 regjsparser: 0.10.0 safe-regex: 2.1.1 - semver: 7.5.1 + semver: 7.5.3 strip-indent: 3.0.0 dev: true @@ -1423,15 +1413,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.42.0: - resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} + /eslint@8.44.0: + resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.42.0 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 '@humanwhocodes/config-array': 0.11.10 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -1443,7 +1433,7 @@ packages: escape-string-regexp: 4.0.0 eslint-scope: 7.2.0 eslint-visitor-keys: 3.4.1 - espree: 9.5.2 + espree: 9.6.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -1463,7 +1453,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 text-table: 0.2.0 @@ -1471,12 +1461,12 @@ packages: - supports-color dev: true - /espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + /espree@9.6.0: + resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.1 dev: true @@ -1538,8 +1528,8 @@ packages: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1671,8 +1661,8 @@ packages: get-intrinsic: 1.2.1 dev: true - /get-tsconfig@4.6.0: - resolution: {integrity: sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==} + /get-tsconfig@4.6.2: + resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} dependencies: resolve-pkg-maps: 1.0.0 dev: true @@ -1748,18 +1738,18 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 dev: true - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -1890,14 +1880,6 @@ packages: side-channel: 1.0.4 dev: true - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -2003,10 +1985,6 @@ packages: is-docker: 3.0.0 dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -2037,10 +2015,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: @@ -2082,23 +2056,12 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -2106,16 +2069,12 @@ packages: is-docker: 2.2.1 dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} hasBin: true dev: true @@ -2159,12 +2118,14 @@ packages: minimist: 1.2.8 dev: true - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + /jsx-ast-utils@3.3.4: + resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} engines: {node: '>=4.0'} dependencies: array-includes: 3.1.6 + array.prototype.flat: 1.3.1 object.assign: 4.1.4 + object.values: 1.1.6 dev: true /language-subtag-registry@0.3.22: @@ -2201,8 +2162,8 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /lint-staged@13.2.2: - resolution: {integrity: sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==} + /lint-staged@13.2.3: + resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true dependencies: @@ -2363,8 +2324,8 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /next@13.4.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-sjVqjxU+U2aXZnYt4Ud6CTLNNwWjdSfMgemGpIQJcN3Z7Jni9xRWbR0ie5fQzCg87aLqQVhKA2ud2gPoqJ9lGw==} + /next@13.4.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-lxUjndYKjZHGK3CWeN2RI+/6ni6EUvjiqGWXAYPxUfGIdFGQ5XoisrqAJ/dF74aP27buAfs8MKIbIMMdxjqSBg==} engines: {node: '>=16.8.0'} hasBin: true peerDependencies: @@ -2381,10 +2342,10 @@ packages: sass: optional: true dependencies: - '@next/env': 13.4.6 + '@next/env': 13.4.8 '@swc/helpers': 0.5.1 busboy: 1.6.0 - caniuse-lite: 1.0.30001495 + caniuse-lite: 1.0.30001512 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2392,20 +2353,24 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.6 - '@next/swc-darwin-x64': 13.4.6 - '@next/swc-linux-arm64-gnu': 13.4.6 - '@next/swc-linux-arm64-musl': 13.4.6 - '@next/swc-linux-x64-gnu': 13.4.6 - '@next/swc-linux-x64-musl': 13.4.6 - '@next/swc-win32-arm64-msvc': 13.4.6 - '@next/swc-win32-ia32-msvc': 13.4.6 - '@next/swc-win32-x64-msvc': 13.4.6 + '@next/swc-darwin-arm64': 13.4.8 + '@next/swc-darwin-x64': 13.4.8 + '@next/swc-linux-arm64-gnu': 13.4.8 + '@next/swc-linux-arm64-musl': 13.4.8 + '@next/swc-linux-x64-gnu': 13.4.8 + '@next/swc-linux-x64-musl': 13.4.8 + '@next/swc-win32-arm64-msvc': 13.4.8 + '@next/swc-win32-ia32-msvc': 13.4.8 + '@next/swc-win32-x64-msvc': 13.4.8 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false + /node-fetch-native@1.2.0: + resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} + dev: false + /node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} dev: true @@ -2457,14 +2422,6 @@ packages: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -2514,6 +2471,14 @@ packages: es-abstract: 1.21.2 dev: true + /ofetch@1.1.1: + resolution: {integrity: sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==} + dependencies: + destr: 2.0.0 + node-fetch-native: 1.2.0 + ufo: 1.1.2 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -2544,16 +2509,16 @@ packages: is-wsl: 2.2.0 dev: true - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - word-wrap: 1.2.3 dev: true /p-limit@2.3.0: @@ -2618,7 +2583,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -2672,14 +2637,14 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} dev: true - /playwright-core@1.34.3: - resolution: {integrity: sha512-2pWd6G7OHKemc5x1r1rp8aQcpvDh7goMBZlJv6Co5vCNLVcQJdhxRL09SGaY6HcyHH9aT4tiynZabMofVasBYw==} - engines: {node: '>=14'} + /playwright-core@1.35.1: + resolution: {integrity: sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg==} + engines: {node: '>=16'} hasBin: true dev: true @@ -3012,7 +2977,7 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.5.3 + tslib: 2.6.0 dev: true /safe-regex-test@1.0.0: @@ -3029,8 +2994,8 @@ packages: regexp-tree: 0.1.27 dev: true - /satori@0.9.1: - resolution: {integrity: sha512-2ggMOiY8O8rIxQ6vywiw3LlBheWHbsOzu5hZdMXTDFKzE9sDHUOtJegGmGE+e9aRSO1ttttgXrcHVsHPKYU2GQ==} + /satori@0.10.1: + resolution: {integrity: sha512-F4bTCkDp931tLb7+UCNPBuSQwXhikrUkI4fBQo6fA8lF0Evqqgg3nDyUpRktQpR5Ry1DIiIVqLyEwkAms87ykg==} engines: {node: '>=16'} dependencies: '@shuding/opentype.js': 1.4.0-beta.0 @@ -3038,6 +3003,7 @@ packages: css-box-shadow: 1.0.0-3 css-to-react-native: 3.2.0 emoji-regex: 10.2.1 + escape-html: 1.0.3 linebreak: 1.1.0 parse-css-color: 0.2.1 postcss-value-parser: 4.2.0 @@ -3060,8 +3026,8 @@ packages: hasBin: true dev: true - /semver@7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} engines: {node: '>=10'} hasBin: true dependencies: @@ -3154,13 +3120,6 @@ packages: resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} dev: true - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.5 - dev: true - /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -3299,7 +3258,7 @@ packages: glob: 7.1.6 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 dev: true @@ -3327,7 +3286,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.4.1 - tslib: 2.5.3 + tslib: 2.6.0 dev: true /tailwindcss@3.3.2: @@ -3340,10 +3299,10 @@ packages: chokidar: 3.5.3 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.2.12 + fast-glob: 3.3.0 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.18.2 + jiti: 1.19.1 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 @@ -3421,17 +3380,17 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - /tsutils@3.21.0(typescript@5.1.3): + /tsutils@3.21.0(typescript@5.1.6): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.1.3 + typescript: 5.1.6 dev: true /type-check@0.4.0: @@ -3469,12 +3428,16 @@ packages: is-typed-array: 1.1.10 dev: true - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true dev: true + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: false + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -3503,13 +3466,13 @@ packages: engines: {node: '>=8'} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.7): + /update-browserslist-db@1.0.11(browserslist@4.21.9): resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.7 + browserslist: 4.21.9 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -3549,15 +3512,6 @@ packages: is-symbol: 1.0.4 dev: true - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} @@ -3578,11 +3532,6 @@ packages: isexe: 2.0.0 dev: true - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} diff --git a/tsconfig.json b/tsconfig.json index 6cd05f98a..4e93cf11a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es6", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true,