diff --git a/composable-ui/.env.local.example b/composable-ui/.env.local.example index b206203..f8672f6 100644 --- a/composable-ui/.env.local.example +++ b/composable-ui/.env.local.example @@ -25,3 +25,8 @@ NEXTAUTH_SECRET=LOREM_IPSUM_CHANGE_ME #NEXT_PUBLIC_PORT=${PORT} #NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID=YOUR_GOOGLE_TAG_MANAGER_ID + +#Klevu settings. +#NEXT_PUBLIC_KLEVU_SEARCH_URL=YOUR_KLEVU_SEARCH_URL +#NEXT_PUBLIC_KLEVU_SEARCH_API_KEY=YOUR_KLEVU_SEARCH_API_KEY +#NEXT_PUBLIC_KLEVU_ASSETS_PATH=http://localhost:3000 \ No newline at end of file diff --git a/docs/docs/integrations/search/klevu.md b/docs/docs/integrations/search/klevu.md new file mode 100644 index 0000000..c47efee --- /dev/null +++ b/docs/docs/integrations/search/klevu.md @@ -0,0 +1,145 @@ +--- +sidebar_position: 5 +--- + +# Integrating Klevu + +Klevu is a powerful AI-driven search solution designed to enhance e-commerce +platforms. It offers advanced search capabilities, including autocomplete, +natural language processing, and machine learning insights to improve the user +experience. This guide outlines how to integrate Klevu components into the +Composable-UI project, enhancing your site with Klevu's robust search +functionalities. + +# Data Indexing in Klevu + +## Overview + +Klevu provides a robust solution for indexing data to enhance the search +functionality in e-commerce platforms. This process involves the categorization +and organization of your site's content, making it searchable and improving +overall user experience. + +## Account + +Before starting you need a Klevu account. [You can create a trial account +that is free for 14 days.](https://box.klevu.com/merchant/signup) + +Please select API as integration method when welcome wizard asks you. + +Find API and REST key from **Store settings** -> **Shop info** + + +## Indexing Script +Located in the scripts folder, Klevu offers an alternative method for indexing +data. This script is tailored to interact with your site's data structure and +Klevu's search API. It's important to note that the attributes in the script +should be modified according to your specific data requirements and structure. + +## Environment Variables +To securely interact with Klevu's API, you'll need to set up environment +variables in a .env file. This file should include your unique Klevu API and +REST keys, which can be found in the Klevu Merchant Center. Add these lines to +your .env file: + +```env +# Klevu API key that is found in the Klevu Merchant Center +KLEVU_API_KEY= + +# Klevu REST key that is found in the Klevu Merchant Center +KLEVU_REST_KEY= +``` + +## Modifying the Indexing Script +Before running the script, ensure that it is tailored to your site's specific +data structure. The script provided requires customization to match the +attributes and data types you wish to index. This step is crucial for accurate +and efficient search functionality. + +## Running the Script +Once the script is customized and the environment variables are set, you can +execute the indexing process with the following command: + +```bash +pnpm run klevu-setup +``` + +This command will initiate the script, which interacts with Klevu's API to index +your site's data, preparing it for an enhanced search experience. + +## Getting the `display` key to work + +`display` is a special property in the indexing. It can be used to pass any data +from to the frontend. But for it to work you need contact `support@klevu.com` and +request `additionalDataToReturn` to be enabled. + +# Installation and Setup + +1. **Navigating to the Project Directory:** Open your terminal and navigate to + your local `composable-ui` project directory and then move to `composable-ui` subfolder. + ```bash + cd path/to/composable-ui/composable-ui + ``` + +2. **Installing Required Packages:** Use `pnpm` to install the necessary Klevu + packages: + ```bash + pnpm install @klevu/ui @klevu/ui-react @klevu/core + ``` + +3. **Copy files from Klevu project to composable ui:** Move to Klevu package folder and copy files with automatic script + ```bash + cd ../packages/klevu + pnpm run copyfiles + ``` + +4. **Go back to composable-ui frontend project:** + ```bash + cd ../../composable-ui + ``` + +4. **Set the env variables:** Set the `.env` variables from the Klevu project you created. + + ```shell + NEXT_PUBLIC_KLEVU_SEARCH_URL=YOUR_KLEVU_SEARCH_URL + NEXT_PUBLIC_KLEVU_SEARCH_API_KEY=YOUR_KLEVU_SEARCH_API_KEY + NEXT_PUBLIC_KLEVU_ASSETS_PATH=http://localhost:3000 + ``` + + `SEARCH_URL` format is following `https://[your Klevu API v2 search url]/cs/v2/search` + + `ASSETS_PATH` is full url to your installation. It is required for icons to load properly. + + You can find the Search URL in the same Store settings as the `API key` and `REST key`. + It is the last item in the page with title `APIv2 Cloud Search URL` + + +5. **Adding styles:** Add following two imports to `composable-ui/pages/_app.tsx` + + ```typescript + import '@klevu/ui/dist/klevu-ui/klevu-ui.css' + import 'klevustyle.css' + ``` + + You can modify the look and feel of the Klevu Components with `src/klevustyle.css` + + +6. **Adding QuickSearch Component:** Integrate the `QuickSearch` component into + the header: + - First, open `composable-ui/src/components/layout/header.tsx`. + - Import the `QuickSearch` component: + ```javascript + import { QuickSearch } from 'components/klevu/klevu'; + ``` + - Add the `` component to the desired location within the + `header.tsx` file. + + Detailed code can be found from `packages/klevu/docimages/quicksearch_example.png` + + +## Running the Project +After completing the above steps, you can start the project to see the Klevu +components in action: +```bash +pnpm run dev +``` diff --git a/packages/klevu/README.md b/packages/klevu/README.md new file mode 100644 index 0000000..32df62b --- /dev/null +++ b/packages/klevu/README.md @@ -0,0 +1,145 @@ +# Integrating Klevu Components into Composable-UI + +## Introduction +Klevu is a powerful AI-driven search solution designed to enhance e-commerce +platforms. It offers advanced search capabilities, including autocomplete, +natural language processing, and machine learning insights to improve the user +experience. This guide outlines how to integrate Klevu components into the +Composable-UI project, enhancing your site with Klevu's robust search +functionalities. + +# Data Indexing in Klevu + +## Overview + +Klevu provides a robust solution for indexing data to enhance the search +functionality in e-commerce platforms. This process involves the categorization +and organization of your site's content, making it searchable and improving +overall user experience. + +## Account + +Before starting you need a Klevu account. [You can create a trial account +that is free for 14 days.](https://box.klevu.com/merchant/signup) + +Please select API as integration method when welcome wizard asks you. + +Find API and REST key from following place: + +![Klevu Merchant Center keys](./docimages/kmcinfo.png) + +## Indexing Script +Located in the scripts folder, Klevu offers an alternative method for indexing +data. This script is tailored to interact with your site's data structure and +Klevu's search API. It's important to note that the attributes in the script +should be modified according to your specific data requirements and structure. + +## Environment Variables +To securely interact with Klevu's API, you'll need to set up environment +variables in a .env file. This file should include your unique Klevu API and +REST keys, which can be found in the Klevu Merchant Center. Add these lines to +your .env file: + +```env +# Klevu API key that is found in the Klevu Merchant Center +KLEVU_API_KEY= + +# Klevu REST key that is found in the Klevu Merchant Center +KLEVU_REST_KEY= +``` + +## Modifying the Indexing Script +Before running the script, ensure that it is tailored to your site's specific +data structure. The script provided requires customization to match the +attributes and data types you wish to index. This step is crucial for accurate +and efficient search functionality. + +## Running the Script +Once the script is customized and the environment variables are set, you can +execute the indexing process with the following command: + +```bash +pnpm run klevu-setup +``` + +This command will initiate the script, which interacts with Klevu's API to index +your site's data, preparing it for an enhanced search experience. + +## Getting the `display` key to work + +`display` is a special property in the indexing. It can be used to pass any data +from to the frontend. But for it to work you need contact `support@klevu.com` and +request `additionalDataToReturn` to be enabled. + +# Installation and Setup + +1. **Navigating to the Project Directory:** Open your terminal and navigate to + your local `composable-ui` project directory and then move to `composable-ui` subfolder. + ```bash + cd path/to/composable-ui/composable-ui + ``` + +2. **Installing Required Packages:** Use `pnpm` to install the necessary Klevu + packages: + ```bash + pnpm install @klevu/ui @klevu/ui-react @klevu/core + ``` + +3. **Copy files from Klevu project to composable ui:** Move to Klevu package folder and copy files with automatic script + ```bash + cd ../packages/klevu + pnpm run copyfiles + ``` + +4. **Go back to composable-ui frontend project:** + ```bash + cd ../../composable-ui + ``` + +4. **Set the env variables:** Set the `.env` variables from the Klevu project you created. + + ```shell + NEXT_PUBLIC_KLEVU_SEARCH_URL=YOUR_KLEVU_SEARCH_URL + NEXT_PUBLIC_KLEVU_SEARCH_API_KEY=YOUR_KLEVU_SEARCH_API_KEY + NEXT_PUBLIC_KLEVU_ASSETS_PATH=http://localhost:3000 + ``` + + `SEARCH_URL` format is following `https://[your Klevu API v2 search url]/cs/v2/search` + + `ASSETS_PATH` is full url to your installation. It is required for icons to load properly. + + You can find the Search URL in the same Store settings as the `API key` and `REST key` + + ![API URL example image](./docimages/searchurl_example.png) + + + +5. **Adding styles:** Add following two imports to `composable-ui/pages/_app.tsx` + + ```typescript + import '@klevu/ui/dist/klevu-ui/klevu-ui.css' + import 'klevustyle.css' + ``` + + You can modify the look and feel of the Klevu Components with `src/klevustyle.css` + + +6. **Adding QuickSearch Component:** Integrate the `QuickSearch` component into + the header: + - First, open `composable-ui/src/components/layout/header.tsx`. + - Import the `QuickSearch` component: + ```javascript + import { QuickSearch } from 'components/klevu/klevu'; + ``` + - Add the `` component to the desired location within the + `header.tsx` file. + + Here is a example of placement code: ![Example of QuickSearch code](./docimages/quicksearch_example.png) + + +## Running the Project +After completing the above steps, you can start the project to see the Klevu +components in action: +```bash +pnpm run dev +``` diff --git a/packages/klevu/copythese/[slug].tsx b/packages/klevu/copythese/[slug].tsx new file mode 100644 index 0000000..8447062 --- /dev/null +++ b/packages/klevu/copythese/[slug].tsx @@ -0,0 +1,17 @@ +import { GetServerSideProps } from 'next' +import { createServerApp } from 'server/isr/server-app' +import { KlevuCategoryPage } from '../../components/klevu/klevu' + +export const getServerSideProps: GetServerSideProps = async (context) => { + const { ssg } = await createServerApp({ context }) + const slug = `${context?.params?.slug?.toString()}` + + return { + props: { + trpcState: ssg.dehydrate(), + category: slug, + }, + } +} + +export default KlevuCategoryPage diff --git a/packages/klevu/copythese/klevu.tsx b/packages/klevu/copythese/klevu.tsx new file mode 100644 index 0000000..05e88ad --- /dev/null +++ b/packages/klevu/copythese/klevu.tsx @@ -0,0 +1,136 @@ +import React, { useState } from 'react' +import { + KlevuInit, + KlevuMerchandising, + KlevuProduct, + KlevuProductGrid, + KlevuQuicksearch, + KlevuSearchLandingPage, +} from '@klevu/ui-react' +import { KlevuRecord } from '@klevu/core' +import { useRouter } from 'next/router' +import { Box, Container } from '@chakra-ui/react' +import { CategoryProductCard } from '../product-listing-page' + +// Change these values to your own +const apiKey = process.env.NEXT_PUBLIC_KLEVU_SEARCH_API_KEY +const url = process.env.NEXT_PUBLIC_KLEVU_SEARCH_URL +const assetsPath = process.env.NEXT_PUBLIC_KLEVU_ASSETS_PATH + +if (!apiKey || !url || !assetsPath) { + throw new Error('Klevu API key, URL or assets path is not defined in .env') +} + +const Init = (props: { children: any }) => { + let router: any = null + router = useRouter() + + return ( + + {props.children} + + ) +} + +export const QuickSearch = () => { + const router = useRouter() + + return ( + + + { + router.push(`/search?term=${e.detail}`) + }} + searchCategories + /> + + + ) +} + +export const KlevuCategoryPage = (props: { + category: string + serverState?: string +}) => { + const [products, setProducts] = useState([]) + + return ( + + + { + setProducts(e.detail.records) + }} + > +
+ +
+
+
+
+ ) +} + +function CustomGridRenderer(props: { products: KlevuRecord[] }) { + return ( + + {props.products.map((product) => { + // additionalDataToReturn is JSON have been indexed to display key on the product. + const originalProductJSON = JSON.parse( + product.additionalDataToReturn + ).default + return ( + + {/* Above: Components should be put inside KlevuProduct that has `isWrapper` prop defined. It means that it's empty shell. */} + {/* Below: Here you can use your own components */} + + + ) + })} + + ) +} + +export const KlevuSearchPage = (props: { term: string }) => { + const [products, setProducts] = useState([]) + + return ( + + + + { + setProducts(e.detail.records) + }} + > +
+ +
+
+
+
+
+ ) +} diff --git a/packages/klevu/copythese/klevustyle.css b/packages/klevu/copythese/klevustyle.css new file mode 100644 index 0000000..449f6f3 --- /dev/null +++ b/packages/klevu/copythese/klevustyle.css @@ -0,0 +1,12 @@ +klevu-init { + --klevu-color-primary: var(--chakra-colors-primary); +} + +klevu-merchandising { + --grid-spacing: var(--chakra-space-4); +} + +klevu-merchandising::part(dropdown-base) { + border: 1px solid var(--klevu-color-neutral-4); + border-radius: 5px; +} diff --git a/packages/klevu/copythese/search.tsx b/packages/klevu/copythese/search.tsx new file mode 100644 index 0000000..30110a7 --- /dev/null +++ b/packages/klevu/copythese/search.tsx @@ -0,0 +1,14 @@ +import { GetServerSideProps } from 'next' +import { KlevuSearchPage } from '../components/klevu/klevu' + +export const getServerSideProps: GetServerSideProps = async (context) => { + const term = `${context.query.term}` + + return { + props: { + term, + }, + } +} + +export default KlevuSearchPage diff --git a/packages/klevu/docimages/kmcinfo.png b/packages/klevu/docimages/kmcinfo.png new file mode 100644 index 0000000..4ee2f3b Binary files /dev/null and b/packages/klevu/docimages/kmcinfo.png differ diff --git a/packages/klevu/docimages/quicksearch_example.png b/packages/klevu/docimages/quicksearch_example.png new file mode 100644 index 0000000..ad578b2 Binary files /dev/null and b/packages/klevu/docimages/quicksearch_example.png differ diff --git a/packages/klevu/docimages/searchurl_example.png b/packages/klevu/docimages/searchurl_example.png new file mode 100644 index 0000000..3669d24 Binary files /dev/null and b/packages/klevu/docimages/searchurl_example.png differ diff --git a/packages/klevu/index.ts b/packages/klevu/index.ts new file mode 100644 index 0000000..9189c09 --- /dev/null +++ b/packages/klevu/index.ts @@ -0,0 +1,3 @@ +export function noop() { + console.log('klevu is not exporting anything') +} diff --git a/packages/klevu/package.json b/packages/klevu/package.json new file mode 100644 index 0000000..b800220 --- /dev/null +++ b/packages/klevu/package.json @@ -0,0 +1,30 @@ +{ + "name": "@composable/klevu", + "version": "0.0.0", + "main": "./index.ts", + "types": "./index.ts", + "sideEffects": "false", + "scripts": { + "build": "echo \"Build script for @composable/stripe ...\"", + "lint": "eslint \"**/*.{js,ts,tsx}\" --max-warnings 0", + "ts": "tsc --noEmit --incremental", + "copyfiles": "cd ../../composable-ui/ && cp -R node_modules/@klevu/ui/dist/klevu-ui/assets/ public/assets/ && mkdir -p src/components/klevu && cp ../packages/klevu/copythese/klevu.tsx src/components/klevu/klevu.tsx && cp ../packages/klevu/copythese/\\[slug\\].tsx src/pages/category/\\[slug\\].tsx && cp ../packages/klevu/copythese/search.tsx src/pages/search.tsx && cp ../packages/klevu/copythese/klevustyle.css src" + }, + "dependencies": { + "@composable/types": "workspace:*", + "@chakra-ui/react": "^2.8.0", + "@klevu/core": "^5.0.0", + "@klevu/ui": "^2.0.0", + "@klevu/ui-react": "^2.0.0", + "react": "^18.2.0", + "next": "^13.3.1" + }, + "devDependencies": { + "@types/node": "^18.18.9", + "@types/qs": "^6.9.10", + "@types/react": "^18.2.37", + "eslint-config-custom": "workspace:*", + "tsconfig": "workspace:*", + "typescript": "^4.9.5" + } +} diff --git a/packages/klevu/tsconfig.json b/packages/klevu/tsconfig.json new file mode 100644 index 0000000..13bf0cc --- /dev/null +++ b/packages/klevu/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "tsconfig/react-library.json", + "include": ["."], + "exclude": [".turbo", "dist", "tmp", "node_modules", "tsconfig.tsbuildinfo"], + "compilerOptions": { + "resolveJsonModule": true, + "jsx": "react" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c75f66..2171190 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -243,6 +243,49 @@ importers: specifier: 7.28.0 version: 7.28.0(eslint@7.32.0) + packages/klevu: + dependencies: + '@chakra-ui/react': + specifier: ^2.8.0 + version: 2.8.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.2.60)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0) + '@composable/types': + specifier: workspace:* + version: link:../types + '@klevu/core': + specifier: ^5.0.0 + version: 5.0.0 + '@klevu/ui': + specifier: ^2.0.0 + version: 2.0.0 + '@klevu/ui-react': + specifier: ^2.0.0 + version: 2.0.0 + next: + specifier: ^13.3.1 + version: 13.3.1(@babel/core@7.21.3)(react-dom@18.2.0)(react@18.2.0) + react: + specifier: ^18.2.0 + version: 18.2.0 + devDependencies: + '@types/node': + specifier: ^18.18.9 + version: 18.19.20 + '@types/qs': + specifier: ^6.9.10 + version: 6.9.12 + '@types/react': + specifier: ^18.2.37 + version: 18.2.60 + eslint-config-custom: + specifier: workspace:* + version: link:../eslint-config-custom + tsconfig: + specifier: workspace:* + version: link:../tsconfig + typescript: + specifier: ^4.9.5 + version: 4.9.5 + packages/stripe: dependencies: '@composable/types': @@ -326,7 +369,7 @@ importers: version: 2.1.1 '@chakra-ui/cli': specifier: ^2.3.0 - version: 2.3.0(@types/node@18.15.11)(typescript@4.9.5) + version: 2.3.0(@types/node@18.19.20)(typescript@4.9.5) '@chakra-ui/react': specifier: ^2.8.0 version: 2.8.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.0.31)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0) @@ -360,7 +403,7 @@ importers: version: link:../eslint-config-custom ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.42)(@types/node@18.15.11)(typescript@4.9.5) + version: 10.9.1(@types/node@18.15.11)(typescript@4.9.5) tsconfig: specifier: workspace:* version: link:../tsconfig @@ -370,6 +413,9 @@ importers: scripts: dependencies: + '@klevu/indexing': + specifier: ^0.0.2 + version: 0.0.2 algoliasearch: specifier: ^4.14.3 version: 4.16.0 @@ -385,7 +431,7 @@ importers: version: 2.6.0 ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.3.42)(@types/node@18.15.11)(typescript@4.9.5) + version: 10.9.1(@types/node@18.15.11)(typescript@4.9.5) typescript: specifier: ^4.9.5 version: 4.9.5 @@ -2157,7 +2203,7 @@ packages: '@zag-js/focus-visible': 0.10.5 react: 18.2.0 - /@chakra-ui/cli@2.3.0(@types/node@18.15.11)(typescript@4.9.5): + /@chakra-ui/cli@2.3.0(@types/node@18.19.20)(typescript@4.9.5): resolution: {integrity: sha512-63Xs4aMYxc17U8GfyPuQnAv8qRg/z2oCd8lgAdn6m755lvQ0e5RZ+mNecfJN1uNXRs3BmKXWnmGh1NvfQ6q1UQ==} hasBin: true dependencies: @@ -2171,7 +2217,7 @@ packages: ora: 5.4.1 prettier: 2.8.7 regenerator-runtime: 0.13.11 - ts-node: 10.9.1(@swc/core@1.3.42)(@types/node@18.15.11)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.3.42)(@types/node@18.19.20)(typescript@4.9.5) tsconfig-paths: 4.2.0 update-notifier: 5.1.0 transitivePeerDependencies: @@ -2279,6 +2325,18 @@ packages: transitivePeerDependencies: - '@types/react' + /@chakra-ui/focus-lock@2.1.0(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==} + peerDependencies: + react: '>=18' + dependencies: + '@chakra-ui/dom-utils': 2.1.0 + react: 18.2.0 + react-focus-lock: 2.9.4(@types/react@18.2.60)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/form-control@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): resolution: {integrity: sha512-3QmWG9v6Rx+JOwJP3Wt89+AWZxK0F1NkVAgXP3WVfE9VDXOKFRV/faLT0GEe2V+l7WZHF5PLdEBvKG8Cgw2mkA==} peerDependencies: @@ -2449,6 +2507,32 @@ packages: transitivePeerDependencies: - '@types/react' + /@chakra-ui/modal@2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.60)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-S1sITrIeLSf21LJ0Vz8xZhj5fWEud5z5Dl2dmvOEv1ezypgOrCCBdOEnnqCkoEKZDbKvzZWZXWR5791ikLP6+g==} + peerDependencies: + '@chakra-ui/system': '>=2.0.0' + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.60)(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/react-context': 2.1.0(react@18.2.0) + '@chakra-ui/react-types': 2.0.7(react@18.2.0) + '@chakra-ui/react-use-merge-refs': 2.1.0(react@18.2.0) + '@chakra-ui/shared-utils': 2.0.5 + '@chakra-ui/system': 2.6.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@7.10.3)(react@18.2.0) + aria-hidden: 1.2.3 + framer-motion: 7.10.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.60)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/number-input@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): resolution: {integrity: sha512-/gEAzQHhrMA+1rzyCMaN8OkKtUPuER6iA+nloYEYBoT7dH/EoNlRtBkiIQhDp+E4VpgZJ0SK3OVrm9/eBbtHHg==} peerDependencies: @@ -2820,6 +2904,77 @@ packages: transitivePeerDependencies: - '@types/react' + /@chakra-ui/react@2.8.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(@types/react@18.2.60)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-tV82DaqE4fMbLIWq58BYh4Ol3gAlNEn+qYOzx8bPrZudboEDnboq8aVfSBwWOY++MLWz2Nn7CkT69YRm91e5sg==} + peerDependencies: + '@emotion/react': ^11.0.0 + '@emotion/styled': ^11.0.0 + framer-motion: '>=4.0.0' + react: '>=18' + react-dom: '>=18' + dependencies: + '@chakra-ui/accordion': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react@18.2.0) + '@chakra-ui/alert': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/avatar': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/breadcrumb': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/card': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/checkbox': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/close-button': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/control-box': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/counter': 2.1.0(react@18.2.0) + '@chakra-ui/css-reset': 2.2.0(@emotion/react@11.10.6)(react@18.2.0) + '@chakra-ui/editable': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/focus-lock': 2.1.0(@types/react@18.2.60)(react@18.2.0) + '@chakra-ui/form-control': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/hooks': 2.2.0(react@18.2.0) + '@chakra-ui/icon': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/image': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/layout': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/live-region': 2.1.0(react@18.2.0) + '@chakra-ui/media-query': 3.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/menu': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react@18.2.0) + '@chakra-ui/modal': 2.3.0(@chakra-ui/system@2.6.0)(@types/react@18.2.60)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/number-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/pin-input': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/popover': 2.2.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react@18.2.0) + '@chakra-ui/popper': 3.1.0(react@18.2.0) + '@chakra-ui/portal': 2.1.0(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/progress': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/provider': 2.4.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/radio': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/react-env': 3.1.0(react@18.2.0) + '@chakra-ui/select': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/skeleton': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/skip-nav': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/slider': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/spinner': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/stat': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/stepper': 2.3.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/styled-system': 2.9.1 + '@chakra-ui/switch': 2.1.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react@18.2.0) + '@chakra-ui/system': 2.6.0(@emotion/react@11.10.6)(@emotion/styled@11.10.6)(react@18.2.0) + '@chakra-ui/table': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/tabs': 2.2.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/tag': 3.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/textarea': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@chakra-ui/theme': 3.2.0(@chakra-ui/styled-system@2.9.1) + '@chakra-ui/theme-utils': 2.0.19 + '@chakra-ui/toast': 7.0.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/tooltip': 2.3.0(@chakra-ui/system@2.6.0)(framer-motion@7.10.3)(react-dom@18.2.0)(react@18.2.0) + '@chakra-ui/transition': 2.1.0(framer-motion@7.10.3)(react@18.2.0) + '@chakra-ui/utils': 2.0.15 + '@chakra-ui/visually-hidden': 2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0) + '@emotion/react': 11.10.6(@types/react@18.2.60)(react@18.2.0) + '@emotion/styled': 11.10.6(@emotion/react@11.10.6)(@types/react@18.2.60)(react@18.2.0) + framer-motion: 7.10.3(react-dom@18.2.0)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + /@chakra-ui/select@2.1.0(@chakra-ui/system@2.6.0)(react@18.2.0): resolution: {integrity: sha512-6GEjCJNOm1pS9E7XRvodoVOuSFl82Jio3MGWgmcQrLznjJAhIZVMq85vCQqzGpjjfbHys/UctfdJY75Ctas/Jg==} peerDependencies: @@ -3316,6 +3471,27 @@ packages: hoist-non-react-statics: 3.3.2 react: 18.2.0 + /@emotion/react@11.10.6(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.6 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + '@types/react': 18.2.60 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + /@emotion/serialize@1.1.1: resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} dependencies: @@ -3348,6 +3524,27 @@ packages: '@types/react': 18.0.31 react: 18.2.0 + /@emotion/styled@11.10.6(@emotion/react@11.10.6)(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@emotion/babel-plugin': 11.10.6 + '@emotion/is-prop-valid': 1.2.0 + '@emotion/react': 11.10.6(@types/react@18.2.60)(react@18.2.0) + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0(react@18.2.0) + '@emotion/utils': 1.2.0 + '@types/react': 18.2.60 + react: 18.2.0 + dev: false + /@emotion/unitless@0.8.0: resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} @@ -3381,6 +3578,23 @@ packages: - supports-color dev: false + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + /@formatjs/ecma402-abstract@1.11.4: resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==} dependencies: @@ -3499,7 +3713,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 jest-message-util: 29.5.0 jest-util: 29.5.0 @@ -3520,14 +3734,14 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.5.0 - jest-config: 29.5.0(@types/node@18.15.11) + jest-config: 29.5.0(@types/node@18.19.20) jest-haste-map: 29.5.0 jest-message-util: 29.5.0 jest-regex-util: 29.4.3 @@ -3554,7 +3768,7 @@ packages: dependencies: '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 jest-mock: 29.5.0 dev: true @@ -3581,7 +3795,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.0.2 - '@types/node': 18.15.11 + '@types/node': 18.19.20 jest-message-util: 29.5.0 jest-mock: 29.5.0 jest-util: 29.5.0 @@ -3614,7 +3828,7 @@ packages: '@jest/transform': 29.5.0 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -3724,7 +3938,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/yargs': 15.0.15 chalk: 4.1.2 dev: false @@ -3735,7 +3949,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: false @@ -3747,7 +3961,7 @@ packages: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -3798,6 +4012,39 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@klevu/core@5.0.0: + resolution: {integrity: sha512-dZy8s8WAD6q+saZbGn7WRe/Hr1tMOB19GYHmOX029u39fltizPPepxBIGq0nUqTL3kglAypwaSdqnNkaMy7sdw==} + dev: false + + /@klevu/indexing@0.0.2: + resolution: {integrity: sha512-8vYwQIQw8OUAHYRmX+2nlUek0uIlcTe4Q0hl2XkBOQrTVO0BtF+sf/bVokb3kBgXEVFaKnI2QnMKKUcwpgUyDw==} + dependencies: + crypto-js: 4.2.0 + dev: false + + /@klevu/ui-react@2.0.0: + resolution: {integrity: sha512-qT/ma4gH6vTzXHGWQYgWYGhnPsq3BYfT9ao6VE+8ur9B361Tkv7bSXGxRLbf1OyKNNOHhVSDXwcVC7hyA+Ggag==} + dependencies: + '@klevu/ui': 2.0.0 + transitivePeerDependencies: + - debug + dev: false + + /@klevu/ui@2.0.0: + resolution: {integrity: sha512-iA5Mj50jC+DFOxhhjX240HpW0kw+5ecDI/Nuvl285Yq1MJKcd+rJ8Bpo/OCbY0p0w5nM/e9sX2ehoZMB9o+I2w==} + dependencies: + '@floating-ui/dom': 1.6.3 + '@klevu/core': 5.0.0 + '@stencil/core': 4.12.4 + axios: 1.6.7 + lit-html: 2.8.0 + markdown-it: 13.0.2 + nouislider: 15.7.1 + overlayscrollbars: 2.5.0 + transitivePeerDependencies: + - debug + dev: false + /@mdx-js/mdx@1.6.22: resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} dependencies: @@ -4269,6 +4516,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -4278,6 +4526,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -4287,6 +4536,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -4296,6 +4546,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -4305,6 +4556,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -4314,6 +4566,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -4323,6 +4576,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -4332,6 +4586,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -4504,6 +4759,12 @@ packages: '@sinonjs/commons': 2.0.0 dev: true + /@stencil/core@4.12.4: + resolution: {integrity: sha512-KrwoXu9J1loWSvQQReilGPkt6/dCH/x5eTBDecCBPclz7vxUM13Iw9almBIffEpurk/kaMAglH0G7sAF/A2y1A==} + engines: {node: '>=16.0.0', npm: '>=7.10.0'} + hasBin: true + dev: false + /@storybook/addon-actions@6.5.16(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aADjilFmuD6TNGz2CRPSupnyiA/IGkPJHDBTqMpsDXTUr8xnuD122xkIhg6UxmCM2y1c+ncwYXy3WPK2xXK57g==} peerDependencies: @@ -4796,7 +5057,7 @@ packages: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/router': 6.5.16(react-dom@18.2.0)(react@18.2.0) - '@types/qs': 6.9.7 + '@types/qs': 6.9.12 core-js: 3.29.1 global: 4.4.0 prop-types: 15.8.1 @@ -5125,7 +5386,7 @@ packages: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0)(react@18.2.0) - '@types/qs': 6.9.7 + '@types/qs': 6.9.12 '@types/webpack-env': 1.18.0 core-js: 3.29.1 fast-deep-equal: 3.1.3 @@ -5979,6 +6240,7 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true @@ -5988,6 +6250,7 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true @@ -5997,6 +6260,7 @@ packages: engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true @@ -6006,6 +6270,7 @@ packages: engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true @@ -6329,14 +6594,14 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 + '@types/node': 18.19.20 dev: false /@types/glob@8.1.0: resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.11 + '@types/node': 18.19.20 dev: false /@types/google.maps@3.52.4: @@ -6346,7 +6611,7 @@ packages: /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 /@types/hast@2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} @@ -6361,7 +6626,7 @@ packages: /@types/hoist-non-react-statics@3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: - '@types/react': 18.0.31 + '@types/react': 18.2.60 hoist-non-react-statics: 3.3.2 dev: false @@ -6400,7 +6665,7 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true @@ -6416,7 +6681,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 dev: true /@types/lodash.mergewith@4.6.7: @@ -6440,7 +6705,7 @@ packages: /@types/node-fetch@2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 form-data: 3.0.1 dev: false @@ -6457,6 +6722,11 @@ packages: /@types/node@18.15.11: resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + /@types/node@18.19.20: + resolution: {integrity: sha512-SKXZvI375jkpvAj8o+5U2518XQv76mAsixqfXiVyWyXZbVWQK25RurFovYpVIxVzul0rZoH58V/3SkEnm7s3qA==} + dependencies: + undici-types: 5.26.5 + /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: false @@ -6483,8 +6753,12 @@ packages: /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + /@types/qs@6.9.12: + resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} + /@types/qs@6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true /@types/react-dom@18.0.11: resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} @@ -6499,10 +6773,17 @@ packages: '@types/scheduler': 0.16.3 csstype: 3.1.1 + /@types/react@18.2.60: + resolution: {integrity: sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.1 + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 dev: true /@types/scheduler@0.16.3: @@ -6530,6 +6811,10 @@ packages: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false + /@types/uglify-js@3.17.1: resolution: {integrity: sha512-GkewRA4i5oXacU/n4MA9+bLgt5/L3F1mKrYvFGm7r2ouLXhRKjuWwo9XHNnbx6WF3vlGW21S3fCvgqxvxXXc5g==} dependencies: @@ -6547,7 +6832,7 @@ packages: /@types/webpack-sources@3.2.0: resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/source-list-map': 0.1.2 source-map: 0.7.4 dev: false @@ -6555,7 +6840,7 @@ packages: /@types/webpack@4.41.33: resolution: {integrity: sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g==} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 '@types/tapable': 1.0.8 '@types/uglify-js': 3.17.1 '@types/webpack-sources': 3.2.0 @@ -7441,6 +7726,16 @@ packages: transitivePeerDependencies: - debug + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.1.1: resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} dependencies: @@ -8737,6 +9032,10 @@ packages: randomfill: 1.0.4 dev: false + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + dev: false + /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -8960,7 +9259,7 @@ packages: engines: {node: '>=0.10.0'} /default-browser-id@1.0.4: - resolution: {integrity: sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==} + resolution: {integrity: sha1-5Z0JpdFXuCi4dsJoFuYcPSosIDo=} engines: {node: '>=0.10.0'} hasBin: true requiresBuild: true @@ -9315,6 +9614,11 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: false + /entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: false + /entities@4.4.0: resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} engines: {node: '>=0.12'} @@ -10209,6 +10513,16 @@ packages: debug: optional: true + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -10437,7 +10751,7 @@ packages: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. requiresBuild: true dependencies: bindings: 1.5.0 @@ -11229,7 +11543,7 @@ packages: '@types/dom-speech-recognition': 0.0.1 '@types/google.maps': 3.52.4 '@types/hogan.js': 3.0.1 - '@types/qs': 6.9.7 + '@types/qs': 6.9.12 algoliasearch: 4.16.0 algoliasearch-helper: 3.12.0(algoliasearch@4.16.0) hogan.js: 3.0.2 @@ -11830,7 +12144,7 @@ packages: '@jest/expect': 29.5.0 '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -11917,6 +12231,45 @@ packages: - supports-color dev: true + /jest-config@29.5.0(@types/node@18.19.20): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 18.19.20 + babel-jest: 29.5.0(@babel/core@7.21.3) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /jest-diff@29.5.0: resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -11975,7 +12328,7 @@ packages: '@jest/environment': 29.5.0 '@jest/fake-timers': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 jest-mock: 29.5.0 jest-util: 29.5.0 dev: true @@ -11991,7 +12344,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 18.19.20 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12014,7 +12367,7 @@ packages: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.6 - '@types/node': 18.15.11 + '@types/node': 18.19.20 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12065,7 +12418,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 18.15.11 + '@types/node': 18.19.20 dev: false /jest-mock@29.5.0: @@ -12073,7 +12426,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 jest-util: 29.5.0 dev: true @@ -12133,7 +12486,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12164,7 +12517,7 @@ packages: '@jest/test-result': 29.5.0 '@jest/transform': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -12187,7 +12540,7 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 graceful-fs: 4.2.11 dev: false @@ -12227,7 +12580,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 graceful-fs: 4.2.11 is-ci: 2.0.0 @@ -12239,7 +12592,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -12264,7 +12617,7 @@ packages: dependencies: '@jest/test-result': 29.5.0 '@jest/types': 29.5.0 - '@types/node': 18.15.11 + '@types/node': 18.19.20 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12276,7 +12629,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -12285,7 +12638,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -12294,7 +12647,7 @@ packages: resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.15.11 + '@types/node': 18.19.20 jest-util: 29.5.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12551,6 +12904,12 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: false + /lint-staged@12.5.0: resolution: {integrity: sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12618,6 +12977,12 @@ packages: wrap-ansi: 7.0.0 dev: true + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + dependencies: + '@types/trusted-types': 2.0.7 + dev: false + /load-json-file@1.1.0: resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} engines: {node: '>=0.10.0'} @@ -12857,6 +13222,17 @@ packages: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} dev: false + /markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: false + /md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: @@ -13543,6 +13919,10 @@ packages: engines: {node: '>=8'} dev: true + /nouislider@15.7.1: + resolution: {integrity: sha512-5N7C1ru/i8y3dg9+Z6ilj6+m1EfabvOoaRa7ztpxBSKKRZso4vA52DGSbBJjw5XLtFr/LZ9SgGAXqyVtlVHO5w==} + dev: false + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -13815,6 +14195,10 @@ packages: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} dev: true + /overlayscrollbars@2.5.0: + resolution: {integrity: sha512-CWVC2dwS07XZfLHDm5GmZN1iYggiJ8Vufnvzwt0gwR9Yz1hVckKeTxg7VILZeYVGhDYJHZ1Xc8Xfys5dWZ1qiA==} + dev: false + /p-all@2.1.0: resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} engines: {node: '>=6'} @@ -14527,6 +14911,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: false @@ -14776,6 +15164,25 @@ packages: use-callback-ref: 1.3.0(@types/react@18.0.31)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.0.31)(react@18.2.0) + /react-focus-lock@2.9.4(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.21.0 + '@types/react': 18.2.60 + focus-lock: 0.11.6 + prop-types: 15.8.1 + react: 18.2.0 + react-clientside-effect: 1.2.6(react@18.2.0) + use-callback-ref: 1.3.0(@types/react@18.2.60)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.60)(react@18.2.0) + dev: false + /react-hook-form@7.43.8(react@18.2.0): resolution: {integrity: sha512-BQm+Ge5KjTk1EchDBRhdP8Pkb7MArO2jFF+UWYr3rtvh6197khi22uloLqlWeuY02ItlCzPunPsFt1/q9wQKnw==} engines: {node: '>=12.22.0'} @@ -14905,6 +15312,22 @@ packages: react-style-singleton: 2.2.1(@types/react@18.0.31)(react@18.2.0) tslib: 2.5.0 + /react-remove-scroll-bar@2.3.4(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.60 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.60)(react@18.2.0) + tslib: 2.5.0 + dev: false + /react-remove-scroll@2.5.5(@types/react@18.0.31)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} @@ -14923,6 +15346,25 @@ packages: use-callback-ref: 1.3.0(@types/react@18.0.31)(react@18.2.0) use-sidecar: 1.1.2(@types/react@18.0.31)(react@18.2.0) + /react-remove-scroll@2.5.5(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.60 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.60)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.60)(react@18.2.0) + tslib: 2.5.0 + use-callback-ref: 1.3.0(@types/react@18.2.60)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.60)(react@18.2.0) + dev: false + /react-ssr-prepass@1.5.0(react@18.2.0): resolution: {integrity: sha512-yFNHrlVEReVYKsLI5lF05tZoHveA5pGzjFbFJY/3pOqqjGOmMmqx83N4hIjN2n6E1AOa+eQEUxs3CgRnPmT0RQ==} peerDependencies: @@ -14947,6 +15389,23 @@ packages: react: 18.2.0 tslib: 2.5.0 + /react-style-singleton@2.2.1(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.60 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.5.0 + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -16588,7 +17047,7 @@ packages: engines: {node: '>=6.10'} dev: false - /ts-node@10.9.1(@swc/core@1.3.42)(@types/node@18.15.11)(typescript@4.9.5): + /ts-node@10.9.1(@swc/core@1.3.42)(@types/node@18.19.20)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -16608,6 +17067,37 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 + '@types/node': 18.19.20 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /ts-node@10.9.1(@types/node@18.15.11)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 '@types/node': 18.15.11 acorn: 8.8.2 acorn-walk: 8.2.0 @@ -16815,6 +17305,10 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + /uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: false + /ufo@0.8.6: resolution: {integrity: sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==} dev: true @@ -16844,6 +17338,9 @@ packages: resolution: {integrity: sha512-kuZwRKV615lEw/Xx3Iz56FKk3nOeOVGaVmw0eg+x4Mne28lCotNFbBhDW7dEBCBKyKbRQiCadEZeNAFPVC5cgw==} dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + /undici@5.21.0: resolution: {integrity: sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==} engines: {node: '>=12.18'} @@ -17147,6 +17644,21 @@ packages: react: 18.2.0 tslib: 2.5.0 + /use-callback-ref@1.3.0(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.60 + react: 18.2.0 + tslib: 2.5.0 + dev: false + /use-sidecar@1.1.2(@types/react@18.0.31)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} @@ -17162,6 +17674,22 @@ packages: react: 18.2.0 tslib: 2.5.0 + /use-sidecar@1.1.2(@types/react@18.2.60)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.60 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.5.0 + dev: false + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: diff --git a/scripts/.env.example b/scripts/.env.example index 8fea423..278b9b7 100644 --- a/scripts/.env.example +++ b/scripts/.env.example @@ -4,4 +4,8 @@ ALGOLIA_INDEX_NAME=products VOUCHERIFY_API_URL= VOUCHERIFY_APPLICATION_ID= -VOUCHERIFY_SECRET_KEY= \ No newline at end of file +VOUCHERIFY_SECRET_KEY= +# Klevu API key that is found in the Klevu Merchant Center +KLEVU_API_KEY= +# Klevu REST key that is found in the Klevu Merchant Center +KLEVU_REST_KEY= diff --git a/scripts/package.json b/scripts/package.json index ac638b9..9388f2a 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -6,7 +6,8 @@ "algolia-setup": "ts-node src/algolia-setup/index.ts", "voucherify-preconfigure": "ts-node src/voucherify-setup/index.ts", "voucherify-activate": "ts-node src/voucherify-setup/activate.ts", - "voucherify-deactivate": "ts-node src/voucherify-setup/deactivate.ts" + "voucherify-deactivate": "ts-node src/voucherify-setup/deactivate.ts", + "klevu-setup": "ts-node src/klevu-setup/index.ts" }, "devDependencies": { "@types/node": "^18.6.3", @@ -15,6 +16,7 @@ "@voucherify/sdk": "^2.5.0" }, "dependencies": { + "@klevu/indexing": "^0.0.2", "algoliasearch": "^4.14.3", "dotenv": "^16.0.3" } diff --git a/scripts/src/klevu-setup/index.ts b/scripts/src/klevu-setup/index.ts new file mode 100644 index 0000000..1b8c1bc --- /dev/null +++ b/scripts/src/klevu-setup/index.ts @@ -0,0 +1,172 @@ +import { config } from 'dotenv' +import { createKlevuClient } from '@klevu/indexing' +import products from '../../../packages/commerce-generic/src/data/products.json' +import categories from '../../../packages/commerce-generic/src/data/categories.json' + +config() + +const KLEVU_API_KEY = process.env.KLEVU_API_KEY +const KLEVU_REST_KEY = process.env.KLEVU_REST_KEY +const BATCH_SIZE = 250 + +const klevuKeysMissing = [KLEVU_API_KEY, KLEVU_REST_KEY].some((key) => !key) +const cagegoryNameMap = categories.reduce((acc, category) => { + acc[category.name] = category + return acc +}, {}) + +const klevuSetup = async () => { + console.log('Starting setting up Klevu!') + try { + if (klevuKeysMissing) { + console.error( + 'You are missing some Klevu keys in your .env file.', + `You must set the following: KLEVU_API_KEY, KLEVU_REST_KEY.` + ) + throw new Error('KLEVU_MISSING_KEYS') + } + + const client = createKlevuClient(KLEVU_API_KEY, KLEVU_REST_KEY, { + logger: true, + }) + + console.log('=== Indexing attributes ===') + + // Create few new attributes that do not exists on the default Klevu index + const slugResponse = await client.newAttribute({ + parameter: { + attributeName: 'slug', + }, + requestBody: { + datatype: 'STRING', + filterable: false, + label: { + default: 'Slug', + }, + returnable: true, + searchable: true, + }, + }) + + console.log(slugResponse.message) + + const brandResponse = await client.newAttribute({ + parameter: { + attributeName: 'brand', + }, + requestBody: { + datatype: 'STRING', + filterable: true, + label: { + default: 'Brand', + }, + returnable: true, + searchable: true, + }, + }) + + console.log(brandResponse.message) + + const materialResponse = await client.newAttribute({ + parameter: { + attributeName: 'materialAndCare', + }, + requestBody: { + datatype: 'STRING', + filterable: false, + label: { + default: 'Material & Care', + }, + returnable: true, + searchable: true, + }, + }) + + console.log(materialResponse.message) + + console.log('=== Indexing categories ===') + + // index categories + const categoryResponse = await client.addOrReplaceBatch({ + requestBody: categories.map((category) => ({ + id: category.id, + type: 'KLEVU_CATEGORY', + attributes: { + name: { + default: category.name, + }, + categoryPath: category.slug, + slug: category.slug, + url: category.slug, + prices: [], + }, + })), + }) + + console.log(categoryResponse.message) + + console.log('=== Indexing products ===') + + for (let i = 0; i < products.length; i += BATCH_SIZE) { + // Create a batch + const batch = products.slice(i, i + BATCH_SIZE) + + const productResponse = await client.addOrReplaceBatch({ + requestBody: batch.map((product) => ({ + id: product.id, + type: 'KLEVU_PRODUCT', + relations: { + categories: { + values: [cagegoryNameMap[product.category].id], + }, + }, + attributes: { + name: { + default: product.name, + }, + prices: [ + { + amount: product.price, + currency: 'USD', + type: 'defaultPrice', + }, + { + amount: product.price, + currency: 'USD', + type: 'salePrice', + }, + ], + slug: product.slug, + url: product.slug, + brand: product.brand, + categoryPath: cagegoryNameMap[product.category].slug, + images: product.images.map((image) => ({ + url: image.url, + type: 'default', + })), + sku: product.sku, + description: { + default: product.description, + }, + materialAndCare: product.materialAndCare, + inStock: true, + }, + display: { + default: product, + }, + })), + }) + + console.log(productResponse.message) + } + + console.log('Finished setting up Klevu!') + } catch (err) { + console.error(err.message) + throw err + } +} + +;(async () => { + await klevuSetup() +})()