diff --git a/.gitignore b/.gitignore index 2f01a3534..c74d4ba9e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,9 @@ # Jan inference models/** error.log +app/electron/core/*/node_modules +app/electron/core/*/dist +app/electron/core/*/package-lock.json +*.tgz +app/yarn.lock +app/dist diff --git a/web-client/.eslintrc.json b/app/.eslintrc.json similarity index 100% rename from web-client/.eslintrc.json rename to app/.eslintrc.json diff --git a/web-client/.gitignore b/app/.gitignore similarity index 100% rename from web-client/.gitignore rename to app/.gitignore diff --git a/web-client/Dockerfile b/app/Dockerfile similarity index 100% rename from web-client/Dockerfile rename to app/Dockerfile diff --git a/app/README.md b/app/README.md new file mode 100644 index 000000000..1d0245dae --- /dev/null +++ b/app/README.md @@ -0,0 +1,96 @@ +# App + +Jan Desktop is an Electron application designed to allow users to interact with the Language Model (LLM) through chat or create art using Stable Diffusion. + +## Features + +- Chat with the Language Model: Engage in interactive conversations with the Language Model. Ask questions, seek information, or simply have a chat. + +- Generate Art with Stable Diffusion: Utilize the power of Stable Diffusion to generate unique and captivating pieces of art. Experiment with various parameters to achieve desired results. + +## Installation and Usage + +### Pre-requisites +- node >= 20.0.0 +- yarn >= 1.22.0 + +### Use as complete suite (in progress) + +### For interactive development + +Note: This instruction is tested on MacOS only. + +1. **Clone the Repository:** + + ``` + git clone https://github.com/janhq/jan + git checkout feature/hackathon-refactor-jan-into-electron-app + cd jan/app + ``` + +2. **Install dependencies:** + + ``` + yarn install + ``` + +3. **Download Model and copy to userdata directory** (this is a hacky step, will be remove in future versions) + + ``` + # Determining the path to save model with /Users//Library/Application Support/jan-web/ + mkdir /Users//Library/Application Support/jan-web + + # Now download the model to correct location by running command + wget -O /Users//Library/Application Support/jan-web/llama-2-7b-chat.gguf.q4_0.bin https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_0.gguf + ``` + +4. **Run development and Using Jan Desktop** + + ``` + yarn electron:start + ``` + This will start the development server and open the desktop app. + In this step, there are a few notification about installing base plugin, just click `OK` and `Next` to continue. + ![](./images/jan-desktop-dev-instruction-1.png) + ![](./images/jan-desktop-dev-instruction-2.png) + ![](./images/jan-desktop-dev-instruction-3.png) + + After that, you can use Jan Desktop as normal. + ![](./images/jan-desktop-dev-instruction-4.png) + ![](./images/jan-desktop-dev-instruction-5.png) + ![](./images/jan-desktop-dev-instruction-6.png) + +### For production build + + ```bash + # Do step 1 and 2 in previous section + git clone https://github.com/janhq/jan + git checkout feature/hackathon-refactor-jan-into-electron-app + cd jan/app + yarn install + + # Build the app + yarn electron:build:all + ``` + + This will build the app MacOS m1/m2 for production (with code signing already done) and put the result in `dist` folder. + +## Configuration + +TO DO + +## Dependencies + +TO DO + +## Contributing + +Contributions are welcome! If you find a bug or have suggestions for improvements, feel free to open an issue or submit a pull request on the [GitHub repository](https://github.com/janhq/jan). + +## License + +This project is licensed under the Fair-code License - see the [License](https://faircode.io/#licenses) for more details. + +--- + +Feel free to reach out [Discord](https://jan.ai/discord) if you have any questions or need further assistance. Happy coding with Jan Web and exploring the capabilities of the Language Model and Stable Diffusion! 🚀🎨🤖 \ No newline at end of file diff --git a/web-client/app/_components/AdvancedPrompt/index.tsx b/app/app/_components/AdvancedPrompt/index.tsx similarity index 100% rename from web-client/app/_components/AdvancedPrompt/index.tsx rename to app/app/_components/AdvancedPrompt/index.tsx diff --git a/web-client/app/_components/AdvancedPromptGenerationParams/index.tsx b/app/app/_components/AdvancedPromptGenerationParams/index.tsx similarity index 89% rename from web-client/app/_components/AdvancedPromptGenerationParams/index.tsx rename to app/app/_components/AdvancedPromptGenerationParams/index.tsx index 1636361db..f6695c440 100644 --- a/web-client/app/_components/AdvancedPromptGenerationParams/index.tsx +++ b/app/app/_components/AdvancedPromptGenerationParams/index.tsx @@ -6,7 +6,7 @@ const AdvancedPromptGenerationParams = () => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptImageUpload/index.tsx b/app/app/_components/AdvancedPromptImageUpload/index.tsx similarity index 96% rename from web-client/app/_components/AdvancedPromptImageUpload/index.tsx rename to app/app/_components/AdvancedPromptImageUpload/index.tsx index 26e780fba..9db97a42e 100644 --- a/web-client/app/_components/AdvancedPromptImageUpload/index.tsx +++ b/app/app/_components/AdvancedPromptImageUpload/index.tsx @@ -15,7 +15,7 @@ const AdvancedPromptImageUpload: React.FC = ({ register }) => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptResolution/index.tsx b/app/app/_components/AdvancedPromptResolution/index.tsx similarity index 94% rename from web-client/app/_components/AdvancedPromptResolution/index.tsx rename to app/app/_components/AdvancedPromptResolution/index.tsx index 6bfe9218d..92c00e0d7 100644 --- a/web-client/app/_components/AdvancedPromptResolution/index.tsx +++ b/app/app/_components/AdvancedPromptResolution/index.tsx @@ -10,7 +10,7 @@ const AdvancedPromptResolution = () => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedPromptText/index.tsx b/app/app/_components/AdvancedPromptText/index.tsx similarity index 96% rename from web-client/app/_components/AdvancedPromptText/index.tsx rename to app/app/_components/AdvancedPromptText/index.tsx index b5ec36477..8a0669725 100644 --- a/web-client/app/_components/AdvancedPromptText/index.tsx +++ b/app/app/_components/AdvancedPromptText/index.tsx @@ -13,7 +13,7 @@ const AdvancedPromptText: React.FC = ({ register }) => { return ( <> setExpand(!expand)} diff --git a/web-client/app/_components/AdvancedTextArea/index.tsx b/app/app/_components/AdvancedTextArea/index.tsx similarity index 100% rename from web-client/app/_components/AdvancedTextArea/index.tsx rename to app/app/_components/AdvancedTextArea/index.tsx diff --git a/web-client/app/_components/AiSearch/index.tsx b/app/app/_components/AiSearch/index.tsx similarity index 90% rename from web-client/app/_components/AiSearch/index.tsx rename to app/app/_components/AiSearch/index.tsx index a8bbc8071..46c00b916 100644 --- a/web-client/app/_components/AiSearch/index.tsx +++ b/app/app/_components/AiSearch/index.tsx @@ -4,7 +4,7 @@ const Search: React.FC = () => { return (
{ const setShowingAdvancedPrompt = useSetAtom(showingAdvancedPromptAtom); const currentConversation = useAtomValue(currentConversationAtom); - const shouldShowAdvancedPrompt = - currentConversation?.product.type === ProductType.ControlNet; + const shouldShowAdvancedPrompt = false; + // currentConversation?.product.type === ProductType.ControlNet; return (
{ const messages = useAtomValue(currentChatMessagesAtom); + const isTyping = useAtomValue(showingTyping); const [offset, setOffset] = useState(0); const { loading, hasMore } = useChatMessages(offset); const intersectObs = useRef(null); @@ -32,6 +37,7 @@ const ChatBody: React.FC = () => { const content = messages.map((message, index) => { if (messages.length === index + 1) { + // @ts-ignore return ; } return ; @@ -39,6 +45,11 @@ const ChatBody: React.FC = () => { return (
+ {isTyping && ( +
+ +
+ )} {content}
); diff --git a/web-client/app/_components/ChatBody/renderChatMessage.tsx b/app/app/_components/ChatBody/renderChatMessage.tsx similarity index 100% rename from web-client/app/_components/ChatBody/renderChatMessage.tsx rename to app/app/_components/ChatBody/renderChatMessage.tsx diff --git a/web-client/app/_components/ChatContainer/index.tsx b/app/app/_components/ChatContainer/index.tsx similarity index 69% rename from web-client/app/_components/ChatContainer/index.tsx rename to app/app/_components/ChatContainer/index.tsx index 391ad60c2..84fa8f5c2 100644 --- a/web-client/app/_components/ChatContainer/index.tsx +++ b/app/app/_components/ChatContainer/index.tsx @@ -8,6 +8,7 @@ import { showingProductDetailAtom, } from "@/_helpers/JotaiWrapper"; import { ReactNode } from "react"; +import ModelManagement from "../ModelManagement"; type Props = { children: ReactNode; @@ -15,16 +16,17 @@ type Props = { export default function ChatContainer({ children }: Props) { const activeConvoId = useAtomValue(getActiveConvoIdAtom); - const showingProductDetail = useAtomValue(showingProductDetailAtom); + // const showingProductDetail = useAtomValue(showingProductDetailAtom); if (!activeConvoId) { - return ; + // return ; + return ; } return (
{children} - {showingProductDetail ? : null} + {/* {showingProductDetail ? : null} */}
); } diff --git a/web-client/app/_components/ChatItem/index.tsx b/app/app/_components/ChatItem/index.tsx similarity index 91% rename from web-client/app/_components/ChatItem/index.tsx rename to app/app/_components/ChatItem/index.tsx index 73d7f1721..a8590cf01 100644 --- a/web-client/app/_components/ChatItem/index.tsx +++ b/app/app/_components/ChatItem/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/display-name */ import React, { forwardRef } from "react"; import renderChatMessage from "../ChatBody/renderChatMessage"; import { ChatMessage } from "@/_models/ChatMessage"; diff --git a/web-client/app/_components/CompactHistoryItem/index.tsx b/app/app/_components/CompactHistoryItem/index.tsx similarity index 100% rename from web-client/app/_components/CompactHistoryItem/index.tsx rename to app/app/_components/CompactHistoryItem/index.tsx diff --git a/web-client/app/_components/CompactHistoryList/index.tsx b/app/app/_components/CompactHistoryList/index.tsx similarity index 78% rename from web-client/app/_components/CompactHistoryList/index.tsx rename to app/app/_components/CompactHistoryList/index.tsx index 0d022d2dc..108b732c7 100644 --- a/web-client/app/_components/CompactHistoryList/index.tsx +++ b/app/app/_components/CompactHistoryList/index.tsx @@ -7,11 +7,11 @@ const CompactHistoryList: React.FC = () => { return (
- {conversations.map(({ id, product }) => ( + {conversations.map(({ id, image }) => ( ))}
diff --git a/web-client/app/_components/CompactLogo/index.tsx b/app/app/_components/CompactLogo/index.tsx similarity index 84% rename from web-client/app/_components/CompactLogo/index.tsx rename to app/app/_components/CompactLogo/index.tsx index bb0fb6a00..5c20183d0 100644 --- a/web-client/app/_components/CompactLogo/index.tsx +++ b/app/app/_components/CompactLogo/index.tsx @@ -8,7 +8,7 @@ const CompactLogo: React.FC = () => { return ( ); }; diff --git a/web-client/app/_components/CompactSideBar/index.tsx b/app/app/_components/CompactSideBar/index.tsx similarity index 100% rename from web-client/app/_components/CompactSideBar/index.tsx rename to app/app/_components/CompactSideBar/index.tsx diff --git a/web-client/app/_components/ConfirmDeleteConversationModal/index.tsx b/app/app/_components/ConfirmDeleteConversationModal/index.tsx similarity index 100% rename from web-client/app/_components/ConfirmDeleteConversationModal/index.tsx rename to app/app/_components/ConfirmDeleteConversationModal/index.tsx diff --git a/app/app/_components/ConfirmDeleteModelModal/index.tsx b/app/app/_components/ConfirmDeleteModelModal/index.tsx new file mode 100644 index 000000000..76c862b0f --- /dev/null +++ b/app/app/_components/ConfirmDeleteModelModal/index.tsx @@ -0,0 +1,89 @@ +import React, { Fragment } from "react"; +import { Dialog, Transition } from "@headlessui/react"; +import { QuestionMarkCircleIcon } from "@heroicons/react/24/outline"; +import { showConfirmDeleteModalAtom } from "@/_helpers/JotaiWrapper"; +import { useAtom } from "jotai"; +import useSignOut from "@/_hooks/useSignOut"; + +const ConfirmDeleteModelModal: React.FC = () => { + const [show, setShow] = useAtom(showConfirmDeleteModalAtom); + const { signOut } = useSignOut(); + + const onLogOutClick = () => { + signOut().then(() => setShow(false)); + }; + + return ( + + + +
+ + +
+
+ + +
+
+
+
+ + Log out + +
+

+ Are you sure you want to delete this model? +

+
+
+
+
+ + +
+
+
+
+
+
+
+ ); +}; + +export default React.memo(ConfirmDeleteModelModal); diff --git a/web-client/app/_components/ConfirmSignOutModal/index.tsx b/app/app/_components/ConfirmSignOutModal/index.tsx similarity index 100% rename from web-client/app/_components/ConfirmSignOutModal/index.tsx rename to app/app/_components/ConfirmSignOutModal/index.tsx diff --git a/web-client/app/_components/ConversationalCard/index.tsx b/app/app/_components/ConversationalCard/index.tsx similarity index 91% rename from web-client/app/_components/ConversationalCard/index.tsx rename to app/app/_components/ConversationalCard/index.tsx index d1c0c080f..7a93b2057 100644 --- a/web-client/app/_components/ConversationalCard/index.tsx +++ b/app/app/_components/ConversationalCard/index.tsx @@ -15,7 +15,7 @@ const ConversationalCard: React.FC = ({ product }) => { return (
- + 32.2k runs diff --git a/web-client/app/_components/ConversationalList/index.tsx b/app/app/_components/ConversationalList/index.tsx similarity index 100% rename from web-client/app/_components/ConversationalList/index.tsx rename to app/app/_components/ConversationalList/index.tsx diff --git a/web-client/app/_components/DescriptionPane/index.tsx b/app/app/_components/DescriptionPane/index.tsx similarity index 100% rename from web-client/app/_components/DescriptionPane/index.tsx rename to app/app/_components/DescriptionPane/index.tsx diff --git a/web-client/app/_components/DiscordContainer/index.tsx b/app/app/_components/DiscordContainer/index.tsx similarity index 57% rename from web-client/app/_components/DiscordContainer/index.tsx rename to app/app/_components/DiscordContainer/index.tsx index 1b31ce9e2..1bf062956 100644 --- a/web-client/app/_components/DiscordContainer/index.tsx +++ b/app/app/_components/DiscordContainer/index.tsx @@ -4,25 +4,12 @@ import Image from "next/image"; const DiscordContainer = () => (
- - - Get the app - - + Discord
diff --git a/app/app/_components/DownloadModelCard/index.tsx b/app/app/_components/DownloadModelCard/index.tsx new file mode 100644 index 000000000..dd8f2e594 --- /dev/null +++ b/app/app/_components/DownloadModelCard/index.tsx @@ -0,0 +1,81 @@ +"use client"; + +import DownloadModelContent from "../DownloadModelContent"; +import ModelDownloadButton from "../ModelDownloadButton"; +import ModelDownloadingButton from "../ModelDownloadingButton"; +import ViewModelDetailButton from "../ViewModelDetailButton"; + +type Props = { + name: string; + type: string; + author: string; + description: string; + isRecommend: boolean; + storage: number; + installed?: boolean; + required?: string; + downloading?: boolean; + total?: number; + transferred?: number; + onInitClick?: () => void; + onDeleteClick?: () => void; + onDownloadClick?: () => void; +}; + +const DownloadModelCard: React.FC = ({ + author, + description, + isRecommend, + name, + storage, + type, + installed = false, + required, + downloading = false, + total = 0, + transferred = 0, + onInitClick, + onDeleteClick, + onDownloadClick, +}) => { + const handleViewDetails = () => {}; + + let downloadButton = null; + if (!installed) { + downloadButton = downloading ? ( +
+ onDownloadClick?.()} /> +
+ ) : ( +
+ +
+ ); + } else { + downloadButton = ( +
+ + +
+ ); + } + + return ( +
+
+ + {downloadButton} +
+ +
+ ); +}; + +export default DownloadModelCard; diff --git a/app/app/_components/DownloadModelContent/index.tsx b/app/app/_components/DownloadModelContent/index.tsx new file mode 100644 index 000000000..8707c8232 --- /dev/null +++ b/app/app/_components/DownloadModelContent/index.tsx @@ -0,0 +1,58 @@ +import DownloadModelTitle from "../DownloadModelTitle"; + +type Props = { + author: string; + description: string; + isRecommend: boolean; + name: string; + type: string; + required?: string; +}; + +const DownloadModelContent: React.FC = ({ + author, + description, + isRecommend, + name, + required, + type, +}) => { + return ( +
+
+

+ {name} +

+ +
+ + {author} + +
+ {required && ( +
+ + Required{" "} + + + {required} + +
+ )} +
+

{description}

+
+
+ + Recommend + +
+
+ ); +}; + +export default DownloadModelContent; diff --git a/app/app/_components/DownloadModelTitle/index.tsx b/app/app/_components/DownloadModelTitle/index.tsx new file mode 100644 index 000000000..1fd45b302 --- /dev/null +++ b/app/app/_components/DownloadModelTitle/index.tsx @@ -0,0 +1,13 @@ +type Props = { + title: string; +}; + +export const DownloadModelTitle: React.FC = ({ title }) => ( +
+ + {title} + +
+); + +export default DownloadModelTitle; diff --git a/web-client/app/_components/DropdownList/index.tsx b/app/app/_components/DropdownList/index.tsx similarity index 94% rename from web-client/app/_components/DropdownList/index.tsx rename to app/app/_components/DropdownList/index.tsx index f103f82f3..b2db63c9e 100644 --- a/web-client/app/_components/DropdownList/index.tsx +++ b/app/app/_components/DropdownList/index.tsx @@ -21,7 +21,7 @@ export const DropdownsList: React.FC = ({ data, title }) => { {checked}
- + Jan
diff --git a/web-client/app/_components/GenerateImageCard/index.tsx b/app/app/_components/GenerateImageCard/index.tsx similarity index 94% rename from web-client/app/_components/GenerateImageCard/index.tsx rename to app/app/_components/GenerateImageCard/index.tsx index 601a15d7e..75eb0dbbe 100644 --- a/web-client/app/_components/GenerateImageCard/index.tsx +++ b/app/app/_components/GenerateImageCard/index.tsx @@ -11,7 +11,7 @@ const GenerateImageCard: React.FC = ({ product }) => { return ( + ); +}; + +export default React.memo(HeaderBackButton); diff --git a/app/app/_components/HeaderTitle/index.tsx b/app/app/_components/HeaderTitle/index.tsx new file mode 100644 index 000000000..c61859791 --- /dev/null +++ b/app/app/_components/HeaderTitle/index.tsx @@ -0,0 +1,13 @@ +import React from 'react'; + +type Props = { + title: string; +}; + +const HeaderTitle: React.FC = ({ title }) => ( +

+ {title} +

+); + +export default React.memo(HeaderTitle); diff --git a/app/app/_components/HistoryEmpty/index.tsx b/app/app/_components/HistoryEmpty/index.tsx new file mode 100644 index 000000000..de99e5243 --- /dev/null +++ b/app/app/_components/HistoryEmpty/index.tsx @@ -0,0 +1,42 @@ +import useCreateConversation from "@/_hooks/useCreateConversation"; +import { executeSerial } from "@/_services/pluginService"; +import Image from "next/image"; +import React from "react"; +import { ModelManagementService } from "../../../shared/coreService"; + +const HistoryEmpty: React.FC = () => { + const { requestCreateConvo } = useCreateConversation(); + const startChat = async () => { + const downloadedModels = await executeSerial( + ModelManagementService.GET_DOWNLOADED_MODELS + ); + if (!downloadedModels || downloadedModels.length === 0) { + alert( + "Seems like there is no model downloaded yet. Please download a model first." + ); + } else { + requestCreateConvo(1); + } + }; + return ( +
+ +

+ Its empty here +

+ +
+ ); +}; + +export default React.memo(HistoryEmpty); diff --git a/web-client/app/_components/HistoryItem/index.tsx b/app/app/_components/HistoryItem/index.tsx similarity index 78% rename from web-client/app/_components/HistoryItem/index.tsx rename to app/app/_components/HistoryItem/index.tsx index 66ad88782..c92da83eb 100644 --- a/web-client/app/_components/HistoryItem/index.tsx +++ b/app/app/_components/HistoryItem/index.tsx @@ -7,15 +7,14 @@ import { setActiveConvoIdAtom, } from "@/_helpers/JotaiWrapper"; import { useAtomValue, useSetAtom } from "jotai"; -import { ProductType } from "@/_models/Product"; import Image from "next/image"; import { Conversation } from "@/_models/Conversation"; type Props = { conversation: Conversation; - avatarUrl: string; + avatarUrl?: string; name: string; - updatedAt?: number; + updatedAt?: string; }; const HistoryItem: React.FC = ({ @@ -40,15 +39,8 @@ const HistoryItem: React.FC = ({ : "bg-white dark:bg-gray-500"; let rightImageUrl: string | undefined; - if (conversationStates[conversation.id]?.waitingForResponse === true) { - rightImageUrl = "/icons/loading.svg"; - } else if ( - conversation && - conversation.product.type === ProductType.GenerativeArt && - conversation.lastImageUrl && - conversation.lastImageUrl.trim().startsWith("https://") - ) { - rightImageUrl = conversation.lastImageUrl; + if (conversationStates[conversation.id ?? ""]?.waitingForResponse === true) { + rightImageUrl = "icons/loading.svg"; } return ( @@ -59,7 +51,7 @@ const HistoryItem: React.FC = ({ @@ -67,13 +59,18 @@ const HistoryItem: React.FC = ({
{name} - {updatedAt && displayDate(updatedAt)} + {updatedAt && updatedAt}
- {conversation?.lastTextMessage ||
} + {conversation?.message ?? ( + + No new message +
+
+ )}
<> diff --git a/web-client/app/_components/HistoryItemDate/index.tsx b/app/app/_components/HistoryItemDate/index.tsx similarity index 100% rename from web-client/app/_components/HistoryItemDate/index.tsx rename to app/app/_components/HistoryItemDate/index.tsx diff --git a/web-client/app/_components/HistoryList/index.tsx b/app/app/_components/HistoryList/index.tsx similarity index 52% rename from web-client/app/_components/HistoryList/index.tsx rename to app/app/_components/HistoryList/index.tsx index da3b7b60c..bc4805729 100644 --- a/web-client/app/_components/HistoryList/index.tsx +++ b/app/app/_components/HistoryList/index.tsx @@ -2,11 +2,13 @@ import HistoryItem from "../HistoryItem"; import { useEffect, useState } from "react"; import ExpandableHeader from "../ExpandableHeader"; import { useAtomValue } from "jotai"; -import { userConversationsAtom } from "@/_helpers/JotaiWrapper"; +import { searchAtom, userConversationsAtom } from "@/_helpers/JotaiWrapper"; import useGetUserConversations from "@/_hooks/useGetUserConversations"; +import HistoryEmpty from "../HistoryEmpty"; const HistoryList: React.FC = () => { const conversations = useAtomValue(userConversationsAtom); + const searchText = useAtomValue(searchAtom); const [expand, setExpand] = useState(true); const { getUserConversations } = useGetUserConversations(); @@ -24,15 +26,25 @@ const HistoryList: React.FC = () => {
- {conversations.map((convo) => ( - - ))} + {conversations.length > 0 ? ( + conversations + .filter( + (e) => + searchText.trim() === "" || + e.name?.toLowerCase().includes(searchText.toLowerCase().trim()) + ) + .map((convo) => ( + + )) + ) : ( + + )}
); diff --git a/web-client/app/_components/InputToolbar/index.tsx b/app/app/_components/InputToolbar/index.tsx similarity index 100% rename from web-client/app/_components/InputToolbar/index.tsx rename to app/app/_components/InputToolbar/index.tsx diff --git a/web-client/app/_components/JanImage/index.tsx b/app/app/_components/JanImage/index.tsx similarity index 100% rename from web-client/app/_components/JanImage/index.tsx rename to app/app/_components/JanImage/index.tsx diff --git a/web-client/app/_components/JanLogo/index.tsx b/app/app/_components/JanLogo/index.tsx similarity index 75% rename from web-client/app/_components/JanLogo/index.tsx rename to app/app/_components/JanLogo/index.tsx index a52543d82..93f68bfa9 100644 --- a/web-client/app/_components/JanLogo/index.tsx +++ b/app/app/_components/JanLogo/index.tsx @@ -10,8 +10,8 @@ const JanLogo: React.FC = () => { className="p-3 flex gap-[2px] items-center" onClick={() => setActiveConvoId(undefined)} > - - + + ); }; diff --git a/web-client/app/_components/JanWelcomeTitle/index.tsx b/app/app/_components/JanWelcomeTitle/index.tsx similarity index 85% rename from web-client/app/_components/JanWelcomeTitle/index.tsx rename to app/app/_components/JanWelcomeTitle/index.tsx index 1d634fe47..71f51f50a 100644 --- a/web-client/app/_components/JanWelcomeTitle/index.tsx +++ b/app/app/_components/JanWelcomeTitle/index.tsx @@ -11,7 +11,7 @@ const JanWelcomeTitle: React.FC = ({ title, description }) => (

{title}

Operated by - + {description}
diff --git a/web-client/app/_components/LeftContainer/index.tsx b/app/app/_components/LeftContainer/index.tsx similarity index 100% rename from web-client/app/_components/LeftContainer/index.tsx rename to app/app/_components/LeftContainer/index.tsx diff --git a/app/app/_components/LeftContainer2/index.tsx b/app/app/_components/LeftContainer2/index.tsx new file mode 100644 index 000000000..035373679 --- /dev/null +++ b/app/app/_components/LeftContainer2/index.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import SidebarFooter from "../SidebarFooter"; +import SidebarHeader from "../SidebarHeader"; +import SidebarMenu from "../SidebarMenu"; +import SidebarEmptyHistory from "../SidebarEmptyHistory"; + +const LeftContainer2: React.FC = () => ( +
+ + + + +
+); + +export default React.memo(LeftContainer2); diff --git a/web-client/app/_components/LeftSidebar/index.tsx b/app/app/_components/LeftSidebar/index.tsx similarity index 85% rename from web-client/app/_components/LeftSidebar/index.tsx rename to app/app/_components/LeftSidebar/index.tsx index b54c8260f..04bc47420 100644 --- a/web-client/app/_components/LeftSidebar/index.tsx +++ b/app/app/_components/LeftSidebar/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import SearchBar from "../SearchBar"; -import ShortcutList from "../ShortcutList"; +// import ShortcutList from "../ShortcutList"; import HistoryList from "../HistoryList"; import DiscordContainer from "../DiscordContainer"; import JanLogo from "../JanLogo"; @@ -10,7 +10,7 @@ const LeftSidebar: React.FC = () => (
- + {/* */}
diff --git a/app/app/_components/LoadingIndicator.tsx b/app/app/_components/LoadingIndicator.tsx new file mode 100644 index 000000000..871190279 --- /dev/null +++ b/app/app/_components/LoadingIndicator.tsx @@ -0,0 +1,20 @@ +const LoadingIndicator = () => { + let circleCommonClasses = "h-1.5 w-1.5 bg-current rounded-full"; + + return ( + //
+ //
+ //
+ //
+ //
+
+
+
+
+
+
+
+ ); +}; + +export default LoadingIndicator; diff --git a/app/app/_components/LoginButton/index.tsx b/app/app/_components/LoginButton/index.tsx new file mode 100644 index 000000000..c6f09ef70 --- /dev/null +++ b/app/app/_components/LoginButton/index.tsx @@ -0,0 +1,24 @@ +"use client"; + +const LoginButton: React.FC = () => { + // const { signInWithKeyCloak } = useSignIn(); + // const { user, loading } = useGetCurrentUser(); + + // if (loading || user) { + // return
; + // } + // return ( + //
+ // + //
+ // ); + return
; +}; + +export default LoginButton; diff --git a/web-client/app/_components/MainChat/index.tsx b/app/app/_components/MainChat/index.tsx similarity index 100% rename from web-client/app/_components/MainChat/index.tsx rename to app/app/_components/MainChat/index.tsx diff --git a/web-client/app/_components/MainChatHeader/index.tsx b/app/app/_components/MainChatHeader/index.tsx similarity index 100% rename from web-client/app/_components/MainChatHeader/index.tsx rename to app/app/_components/MainChatHeader/index.tsx diff --git a/web-client/app/_components/MenuAdvancedPrompt/index.tsx b/app/app/_components/MenuAdvancedPrompt/index.tsx similarity index 100% rename from web-client/app/_components/MenuAdvancedPrompt/index.tsx rename to app/app/_components/MenuAdvancedPrompt/index.tsx diff --git a/app/app/_components/MenuHeader/index.tsx b/app/app/_components/MenuHeader/index.tsx new file mode 100644 index 000000000..95e0be017 --- /dev/null +++ b/app/app/_components/MenuHeader/index.tsx @@ -0,0 +1,53 @@ +import Link from "next/link"; +import { Popover, Transition } from "@headlessui/react"; +import { Fragment } from "react"; +// import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; +import { useSetAtom } from "jotai"; +import { showConfirmSignOutModalAtom } from "@/_helpers/JotaiWrapper"; + +export const MenuHeader: React.FC = () => { + const setShowConfirmSignOutModal = useSetAtom(showConfirmSignOutModalAtom); + // const { user } = useGetCurrentUser(); + + return
; + + // return ( + // + // + //
+ //

+ // {user.displayName} + //

+ // + // {user.email} + // + //
+ //
+ // + //
+ //
+ // + // Privacy + // + //
+ // + // Support + // + //
+ // + // + // ); +}; diff --git a/web-client/app/_components/MobileDownload/index.tsx b/app/app/_components/MobileDownload/index.tsx similarity index 93% rename from web-client/app/_components/MobileDownload/index.tsx rename to app/app/_components/MobileDownload/index.tsx index 9219389b6..710039e0b 100644 --- a/web-client/app/_components/MobileDownload/index.tsx +++ b/app/app/_components/MobileDownload/index.tsx @@ -6,7 +6,7 @@ const MobileDownload = () => {
{/** Jan logo */} {""} { >
{""} { >
{""} {
- +

Jan Mobie

Stay up to date and move work forward with Jan on iOS & Android. @@ -15,7 +15,7 @@ const MobileInstallPane: React.FC = () => {

- +
Download on the

AppStore

@@ -23,7 +23,7 @@ const MobileInstallPane: React.FC = () => {
{ className="h-8 w-auto" width={32} height={32} - src="/icons/app_icon.svg" + src="icons/app_icon.svg" alt="" /> diff --git a/web-client/app/_components/MobileShowcase/index.tsx b/app/app/_components/MobileShowcase/index.tsx similarity index 94% rename from web-client/app/_components/MobileShowcase/index.tsx rename to app/app/_components/MobileShowcase/index.tsx index 78bbc8c63..6e49768e6 100644 --- a/web-client/app/_components/MobileShowcase/index.tsx +++ b/app/app/_components/MobileShowcase/index.tsx @@ -6,7 +6,7 @@ const MobileShowcase = () => { return (
mobile { />
{ >
{""} { >
{""} void; +}; + +const ModelDownloadButton: React.FC = ({ callback }) => { + return ( + + ); +}; + +export default ModelDownloadButton; diff --git a/app/app/_components/ModelDownloadingButton/index.tsx b/app/app/_components/ModelDownloadingButton/index.tsx new file mode 100644 index 000000000..ff30e6642 --- /dev/null +++ b/app/app/_components/ModelDownloadingButton/index.tsx @@ -0,0 +1,33 @@ +type Props = { + total: number; + value: number; +}; + +const ModelDownloadingButton: React.FC = ({ total, value }) => { + return ( +
+ +
+ + {toGigabytes(value)} / {toGigabytes(total)} + +
+
+ ); +}; + +const toGigabytes = (input: number) => { + if (input > 1024 ** 3) { + return (input / 1000 ** 3).toFixed(2) + "GB"; + } else if (input > 1024 ** 2) { + return (input / 1000 ** 2).toFixed(2) + "MB"; + } else if (input > 1024) { + return (input / 1000).toFixed(2) + "KB"; + } else { + return input + "B"; + } +}; + +export default ModelDownloadingButton; diff --git a/web-client/app/_components/ModelInfo/index.tsx b/app/app/_components/ModelInfo/index.tsx similarity index 91% rename from web-client/app/_components/ModelInfo/index.tsx rename to app/app/_components/ModelInfo/index.tsx index 3c9130e1f..ceb867204 100644 --- a/web-client/app/_components/ModelInfo/index.tsx +++ b/app/app/_components/ModelInfo/index.tsx @@ -32,7 +32,7 @@ const ModelInfo: React.FC = ({
diff --git a/web-client/app/_components/ModelInfoItem/index.tsx b/app/app/_components/ModelInfoItem/index.tsx similarity index 100% rename from web-client/app/_components/ModelInfoItem/index.tsx rename to app/app/_components/ModelInfoItem/index.tsx diff --git a/app/app/_components/ModelListContainer/index.tsx b/app/app/_components/ModelListContainer/index.tsx new file mode 100644 index 000000000..a681a765c --- /dev/null +++ b/app/app/_components/ModelListContainer/index.tsx @@ -0,0 +1,136 @@ +"use client"; + +import { useEffect, useState } from "react"; +import DownloadModelCard from "../DownloadModelCard"; +import { executeSerial } from "@/_services/pluginService"; +import { ModelManagementService } from "../../../shared/coreService"; +import { useAtomValue } from "jotai"; +import { modelDownloadStateAtom } from "@/_helpers/JotaiWrapper"; + +const ModelListContainer: React.FC = () => { + const [downloadedModels, setDownloadedModels] = useState([]); + const downloadState = useAtomValue(modelDownloadStateAtom); + const DownloadedModel = { + title: "Downloaded Model", + data: [ + { + name: "Llama 2 7B Chat - GGML", + type: "7B", + author: "The Bloke", + description: + "Primary intended uses The primary use of LLaMA is research on large language models, including: exploring potential applications such as question answering, natural language understanding or reading comprehension, understanding capabilities and limitations of current language models, and developing techniques to improve those, evaluating and mitigating biases, risks, toxic and harmful content generations, hallucinations.", + isRecommend: true, + storage: 3780, + default: true, + }, + ], + }; + + const BrowseAvailableModels = { + title: "Browse Available Models", + data: [ + { + name: "Llama 2 7B Chat - GGML", + type: "7B", + author: "The Bloke", + description: + "Primary intended uses The primary use of LLaMA is research on large language models, including: exploring potential applications such as question answering, natural language understanding or reading comprehension, understanding capabilities and limitations of current language models, and developing techniques to improve those, evaluating and mitigating biases, risks, toxic and harmful content generations, hallucinations.", + isRecommend: true, + storage: 3780, + default: true, + }, + ], + }; + + useEffect(() => { + const getDownloadedModels = async () => { + const modelNames = await executeSerial( + ModelManagementService.GET_DOWNLOADED_MODELS, + ); + setDownloadedModels(modelNames); + }; + getDownloadedModels(); + }, []); + + const onDeleteClick = async () => { + // TODO: for now we only support 1 model + if (downloadedModels?.length < 1) { + return; + } + console.log(downloadedModels[0]); + const pathArray = downloadedModels[0].split("/"); + const modelName = pathArray[pathArray.length - 1]; + console.log(`Prepare to delete ${modelName}`); + // setShow(true); // TODO: later + await executeSerial(ModelManagementService.DELETE_MODEL, modelName); + + setDownloadedModels([]); + }; + + const initModel = async () => { + const product = { + name: "LLama 2 7B Chat", + fileName: "llama-2-7b-chat.gguf.q4_0.bin", + downloadUrl: + "https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_0.gguf", + }; + await executeSerial(ModelManagementService.INIT_MODEL, product); + }; + + const onDownloadClick = async () => { + const url = + "https://huggingface.co/TheBloke/Llama-2-7b-Chat-GGUF/resolve/main/llama-2-7b-chat.Q4_0.gguf"; + await executeSerial(ModelManagementService.DOWNLOAD_MODEL, url); + }; + + return ( +
+
+ + {downloadedModels?.length > 0 && + DownloadedModel.data.map((item, index) => ( + <DownloadModelCard + key={index} + {...item} + installed={true} + onInitClick={initModel} + onDeleteClick={onDeleteClick} + /> + ))} + </div> + <div className="pb-5 flex flex-col gap-2"> + {downloadedModels.length === 0 && ( + <> + <Title title={BrowseAvailableModels.title} /> + {BrowseAvailableModels.data.map((item, index) => ( + <DownloadModelCard + key={index} + {...item} + downloading={downloadState == null} + total={downloadState?.size.total ?? 0} + transferred={downloadState?.size.transferred ?? 0} + onDownloadClick={onDownloadClick} + /> + ))} + </> + )} + </div> + </div> + ); +}; + +type Props = { + title: string; +}; + +const Title: React.FC<Props> = ({ title }) => { + return ( + <div className="flex gap-[10px]"> + <span className="font-semibold text-xl leading-[25px] tracking-[-0.4px]"> + {title} + </span> + </div> + ); +}; + +export default ModelListContainer; diff --git a/app/app/_components/ModelManagement/index.tsx b/app/app/_components/ModelManagement/index.tsx new file mode 100644 index 000000000..de75d8caf --- /dev/null +++ b/app/app/_components/ModelManagement/index.tsx @@ -0,0 +1,15 @@ +import HeaderBackButton from "../HeaderBackButton"; +import HeaderTitle from "../HeaderTitle"; +import ModelListContainer from "../ModelListContainer"; +import ModelSearchBar from "../ModelSearchBar"; + +export default function ModelManagement() { + return ( + <main className="pt-[30px] pr-[89px] pl-[60px] pb-[70px] flex-1"> + {/* <HeaderBackButton /> */} + <HeaderTitle title="Explore Models" /> + <ModelSearchBar /> + <ModelListContainer /> + </main> + ); +} diff --git a/web-client/app/_components/ModelMenu/index.tsx b/app/app/_components/ModelMenu/index.tsx similarity index 73% rename from web-client/app/_components/ModelMenu/index.tsx rename to app/app/_components/ModelMenu/index.tsx index 0737affbc..5c9c90a70 100644 --- a/web-client/app/_components/ModelMenu/index.tsx +++ b/app/app/_components/ModelMenu/index.tsx @@ -11,16 +11,15 @@ import { PlusIcon, TrashIcon } from "@heroicons/react/24/outline"; import useCreateConversation from "@/_hooks/useCreateConversation"; const ModelMenu: React.FC = () => { - const currentProduct = useAtomValue(currentProductAtom); - const [active, setActive] = useAtom(showingProductDetailAtom); + // const currentProduct = useAtomValue(currentProductAtom); + // const [active, setActive] = useAtom(showingProductDetailAtom); const { requestCreateConvo } = useCreateConversation(); const setShowConfirmDeleteConversationModal = useSetAtom( showConfirmDeleteConversationModalAtom ); const onCreateConvoClick = () => { - if (!currentProduct) return; - requestCreateConvo(currentProduct, true); + requestCreateConvo(1); }; return ( @@ -31,14 +30,14 @@ const ModelMenu: React.FC = () => { <button onClick={() => setShowConfirmDeleteConversationModal(true)}> <TrashIcon width={24} height={24} color="#9CA3AF" /> </button> - <button onClick={() => setActive(!active)}> + {/* <button onClick={() => setActive(!active)}> <Image - src={active ? "/icons/ic_sidebar_fill.svg" : "/icons/ic_sidebar.svg"} + src={active ? "icons/ic_sidebar_fill.svg" : "icons/ic_sidebar.svg"} width={24} height={24} alt="" /> - </button> + </button> */} </div> ); }; diff --git a/app/app/_components/ModelSearchBar/index.tsx b/app/app/_components/ModelSearchBar/index.tsx new file mode 100644 index 000000000..bd9507c9e --- /dev/null +++ b/app/app/_components/ModelSearchBar/index.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { MagnifyingGlassIcon } from "@heroicons/react/24/outline"; +import { useState } from "react"; + +const ModelSearchBar: React.FC = () => { + const [text, setText] = useState(""); + return ( + <div className="py-[27px] flex items-center justify-center"> + <div className="w-[520px] h-[42px] flex items-center"> + <input + className="outline-none bg-gray-300 text-sm h-full rounded-tl-lg rounded-bl-lg leading-[17.5px] border border-gray-300 py-3 px-4 flex-1" + placeholder="Search model" + value={text} + onChange={(text) => setText(text.currentTarget.value)} + /> + <button className="flex items-center justify-center bg-gray-800 border border-gray-800 p-2 w-[42px] rounded-tr-lg rounded-br-lg h-[42px]"> + <MagnifyingGlassIcon width={20} height={20} color="#FFFFFF" /> + </button> + </div> + </div> + ); +}; + +export default ModelSearchBar; diff --git a/web-client/app/_components/OverviewPane.tsx b/app/app/_components/OverviewPane.tsx similarity index 95% rename from web-client/app/_components/OverviewPane.tsx rename to app/app/_components/OverviewPane.tsx index ec6c555a8..7e7185fe6 100644 --- a/web-client/app/_components/OverviewPane.tsx +++ b/app/app/_components/OverviewPane.tsx @@ -1,7 +1,6 @@ "use client"; import { useAtomValue } from "jotai"; -import TryItYourself from "./TryItYourself"; import React from "react"; import { currentProductAtom } from "@/_helpers/JotaiWrapper"; @@ -26,7 +25,6 @@ const OverviewPane: React.FC = () => { {product?.modelUrl} </a> </div> - <TryItYourself /> </div> </div> ); diff --git a/app/app/_components/Preferences.tsx b/app/app/_components/Preferences.tsx new file mode 100644 index 000000000..46938a916 --- /dev/null +++ b/app/app/_components/Preferences.tsx @@ -0,0 +1,286 @@ +"use client"; +import { useEffect, useRef, useState } from "react"; +import { + setup, + plugins, + extensionPoints, + activationPoints, +} from "../../electron/core/plugin-manager/execution/index"; + +import { + ChartPieIcon, + CommandLineIcon, + HomeIcon, + PlayIcon, +} from "@heroicons/react/24/outline"; + +import { MagnifyingGlassIcon } from "@heroicons/react/20/solid"; +import classNames from "classnames"; +import Link from "next/link"; +const navigation = [ + { name: "Plugin Manager", href: "#", icon: ChartPieIcon, current: true }, +]; + +/* eslint-disable @next/next/no-sync-scripts */ +export const Preferences = () => { + const [search, setSearch] = useState<string>(""); + const [activePlugins, setActivePlugins] = useState<any[]>([]); + + const preferenceRef = useRef(null); + useEffect(() => { + async function setupPE() { + // Enable activation point management + setup({ + //@ts-ignore + importer: (plugin) => + import(/* webpackIgnore: true */ plugin).catch((err) => { + console.log(err); + }), + }); + + // Register all active plugins with their activation points + await plugins.registerActive(); + } + + const activePlugins = async () => { + const plgs = await plugins.getActive(); + setActivePlugins(plgs); + // Activate alls + setTimeout(async () => { + await activationPoints.trigger("init"); + if (extensionPoints.get("experimentComponent")) { + const components = await Promise.all( + extensionPoints.execute("experimentComponent") + ); + components.forEach((e) => { + if (preferenceRef.current) { + // @ts-ignore + preferenceRef.current.appendChild(e); + } + }); + } + }, 500); + }; + setupPE().then(() => activePlugins()); + }, []); + + // Install a new plugin on clicking the install button + const install = async (e: any) => { + e.preventDefault(); + //@ts-ignore + const pluginFile = new FormData(e.target).get("plugin-file").path; + + // Send the filename of the to be installed plugin + // to the main process for installation + const installed = await plugins.install([pluginFile]); + if (typeof window !== "undefined") { + window.location.reload(); + } + }; + + // Uninstall a plugin on clicking uninstall + const uninstall = async (name: string) => { + //@ts-ignore + + // Send the filename of the to be uninstalled plugin + // to the main process for removal + //@ts-ignore + const res = await plugins.uninstall([name]); + console.log( + res + ? "Plugin successfully uninstalled" + : "Plugin could not be uninstalled" + ); + }; + + // Update all plugins on clicking update plugins + const update = async (plugin: string) => { + if (typeof window !== "undefined") { + // @ts-ignore + await window.pluggableElectronIpc.update([plugin], true); + } + // plugins.update(active.map((plg) => plg.name)); + }; + + return ( + <div className="w-full h-screen overflow-scroll"> + {/* Static sidebar for desktop */} + <div className="fixed inset-y-0 z-50 flex w-72 flex-col"> + {/* Sidebar component, swap this element with another sidebar if you like */} + <div className="flex grow flex-col gap-y-5 overflow-y-auto bg-gray-900 px-6 pb-4"> + <div className="flex h-16 shrink-0 items-center"> + <Link href="/"> + <img + className="h-8 w-auto" + src="icons/app_icon.svg" + alt="Your Company" + /> + </Link> + </div> + <nav className="flex flex-1 flex-col"> + <ul role="list" className="flex flex-1 flex-col gap-y-7"> + <li> + <ul role="list" className="-mx-2 space-y-1"> + {navigation.map((item) => ( + <li key={item.name}> + <a + href={item.href} + className={classNames( + item.current + ? "bg-gray-800 text-white" + : "text-gray-400 hover:text-white hover:bg-gray-800", + "group flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold" + )} + > + <item.icon + className="h-6 w-6 shrink-0" + aria-hidden="true" + /> + {item.name} + </a> + </li> + ))} + </ul> + </li> + + <li className="mt-auto"> + <a + href="/" + className="group -mx-2 flex gap-x-3 rounded-md p-2 text-sm font-semibold leading-6 text-gray-400 hover:bg-gray-800 hover:text-white" + > + <HomeIcon className="h-6 w-6 shrink-0" aria-hidden="true" /> + Home + </a> + </li> + </ul> + </nav> + </div> + </div> + + <div className="pl-72 w-full"> + <div className="sticky top-0 z-40 flex h-16 shrink-0 items-center gap-x-4 border-b border-gray-200 bg-white shadow-sm sm:gap-x-6 sm:px-6 px-8"> + {/* Separator */} + <div className="h-6 w-px bg-gray-900/10 hidden" aria-hidden="true" /> + + <div className="flex flex-1 self-stretch gap-x-6"> + <form className="relative flex flex-1" action="#" method="GET"> + <label htmlFor="search-field" className="sr-only"> + Search + </label> + <MagnifyingGlassIcon + className="pointer-events-none absolute inset-y-0 left-0 h-full w-5 text-gray-400" + aria-hidden="true" + /> + <input + defaultValue={search} + onChange={(e) => setSearch(e.target.value)} + id="search-field" + className="block h-full w-full border-0 py-0 pl-8 pr-0 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm" + placeholder="Search..." + type="search" + name="search" + /> + </form> + </div> + </div> + + <main className="py-5"> + <div className="sm:px-6 px-8"> + {/* Content */} + <div className="flex flex-row items-center my-4"> + <ChartPieIcon width={30} /> + Install Plugin + </div> + <form id="plugin-file" onSubmit={install}> + <div className="flex flex-row items-center space-x-10"> + <div className="flex items-center justify-center w-[300px]"> + <label className="flex flex-col items-center justify-center w-full border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:hover:bg-bray-800 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600"> + <div className="flex flex-col items-center justify-center pt-5 pb-6"> + <p className="mb-2 text-sm text-gray-500 dark:text-gray-400"> + <span className="font-semibold">Click to upload</span>{" "} + or drag and drop + </p> + <p className="text-xs text-gray-500 dark:text-gray-400"> + TGZ (MAX 50MB) + </p> + </div> + <input + id="dropzone-file" + name="plugin-file" + type="file" + className="hidden" + required + /> + </label> + </div> + <button + type="submit" + className="rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" + > + Install Plugin + </button> + </div> + </form> + + <div className="flex flex-row items-center my-4"> + <CommandLineIcon width={30} /> + Installed Plugins + </div> + <div className="flex flex-wrap"> + {activePlugins + .filter( + (e) => + search.trim() === "" || + e.name.toLowerCase().includes(search.toLowerCase()) + ) + .map((e) => ( + <div key={e.name} className="m-2"> + <a + href="#" + className="block max-w-sm p-6 bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700" + > + <h5 className="mb-2 text-2xl font-bold tracking-tight text-gray-900 dark:text-white"> + {e.name} + </h5> + <p className="font-normal text-gray-700 dark:text-gray-400"> + Activation: {e.activationPoints} + </p> + <p className="font-normal text-gray-700 dark:text-gray-400"> + Url: {e.url} + </p> + <div className="flex flex-row space-x-5"> + <button + type="submit" + onClick={() => { + uninstall(e.name); + }} + className="mt-5 rounded-md bg-red-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-red-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-red-600" + > + Uninstall + </button> + <button + type="submit" + onClick={() => { + update(e.name); + }} + className="mt-5 rounded-md bg-indigo-600 px-3.5 py-2.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" + > + Update + </button> + </div> + </a> + </div> + ))} + </div> + <div className="flex flex-row items-center my-4"> + <PlayIcon width={30} /> + Test Plugins + </div> + <div className="h-full w-full" ref={preferenceRef}></div> + {/* Content */} + </div> + </main> + </div> + </div> + ); +}; diff --git a/web-client/app/_components/PrimaryButton/index.tsx b/app/app/_components/PrimaryButton/index.tsx similarity index 100% rename from web-client/app/_components/PrimaryButton/index.tsx rename to app/app/_components/PrimaryButton/index.tsx diff --git a/app/app/_components/ProductOverview/index.tsx b/app/app/_components/ProductOverview/index.tsx new file mode 100644 index 000000000..2ea691b96 --- /dev/null +++ b/app/app/_components/ProductOverview/index.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import useGetModels from "@/_hooks/useGetModels"; + +const ProductOverview: React.FC = () => { + const { models } = useGetModels(); + + return <div className="bg-gray-100 overflow-y-auto flex-grow scroll"></div>; +}; + +export default ProductOverview; diff --git a/web-client/app/_components/RightContainer/index.tsx b/app/app/_components/RightContainer/index.tsx similarity index 100% rename from web-client/app/_components/RightContainer/index.tsx rename to app/app/_components/RightContainer/index.tsx diff --git a/web-client/app/_components/SampleLlmContainer/index.tsx b/app/app/_components/SampleLlmContainer/index.tsx similarity index 76% rename from web-client/app/_components/SampleLlmContainer/index.tsx rename to app/app/_components/SampleLlmContainer/index.tsx index 66d0c198b..07ade2a43 100644 --- a/web-client/app/_components/SampleLlmContainer/index.tsx +++ b/app/app/_components/SampleLlmContainer/index.tsx @@ -1,6 +1,4 @@ import JanWelcomeTitle from "../JanWelcomeTitle"; -import { useQuery } from "@apollo/client"; -import { GetProductPromptsDocument, GetProductPromptsQuery } from "@/graphql"; import { Product } from "@/_models/Product"; import { useSetAtom } from "jotai"; import { currentPromptAtom } from "@/_helpers/JotaiWrapper"; @@ -11,9 +9,7 @@ type Props = { const SampleLlmContainer: React.FC<Props> = ({ product }) => { const setCurrentPrompt = useSetAtom(currentPromptAtom); - const { data } = useQuery<GetProductPromptsQuery>(GetProductPromptsDocument, { - variables: { productSlug: product.slug }, - }); + const { data } = { data: { prompts: [] } }; return ( <div className="flex flex-col max-w-sm flex-shrink-0 gap-9 items-center pt-6 mx-auto"> @@ -25,7 +21,7 @@ const SampleLlmContainer: React.FC<Props> = ({ product }) => { <h2 className="font-semibold text-xl leading-6 tracking-[-0.4px] mb-5"> Try now </h2> - <div className="flex flex-col"> + {/* <div className="flex flex-col"> {data?.prompts.map((item) => ( <button onClick={() => setCurrentPrompt(item.content ?? "")} @@ -35,7 +31,7 @@ const SampleLlmContainer: React.FC<Props> = ({ product }) => { <span className="line-clamp-3">{item.content}</span> </button> ))} - </div> + </div> */} </div> </div> ); diff --git a/web-client/app/_components/SearchBar/index.tsx b/app/app/_components/SearchBar/index.tsx similarity index 100% rename from web-client/app/_components/SearchBar/index.tsx rename to app/app/_components/SearchBar/index.tsx diff --git a/web-client/app/_components/SecondaryButton/index.tsx b/app/app/_components/SecondaryButton/index.tsx similarity index 100% rename from web-client/app/_components/SecondaryButton/index.tsx rename to app/app/_components/SecondaryButton/index.tsx diff --git a/web-client/app/_components/SendButton/index.tsx b/app/app/_components/SendButton/index.tsx similarity index 85% rename from web-client/app/_components/SendButton/index.tsx rename to app/app/_components/SendButton/index.tsx index f95e4d08d..07c41fdf0 100644 --- a/web-client/app/_components/SendButton/index.tsx +++ b/app/app/_components/SendButton/index.tsx @@ -3,14 +3,14 @@ import { currentPromptAtom, } from "@/_helpers/JotaiWrapper"; import useSendChatMessage from "@/_hooks/useSendChatMessage"; -import { useAtomValue } from "jotai"; +import { useAtom, useAtomValue } from "jotai"; import Image from "next/image"; const SendButton: React.FC = () => { - const currentPrompt = useAtomValue(currentPromptAtom); + const [currentPrompt] = useAtom(currentPromptAtom); const currentConvoState = useAtomValue(currentConvoStateAtom); - const { sendChatMessage } = useSendChatMessage(); + const { sendChatMessage } = useSendChatMessage(); const isWaitingForResponse = currentConvoState?.waitingForResponse ?? false; const disabled = currentPrompt.trim().length === 0 || isWaitingForResponse; @@ -29,7 +29,7 @@ const SendButton: React.FC = () => { type="submit" className="p-2 gap-[10px] inline-flex items-center rounded-[12px] text-sm font-semibold shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" > - <Image src={"/icons/ic_arrowright.svg"} width={24} height={24} alt="" /> + <Image src={"icons/ic_arrowright.svg"} width={24} height={24} alt="" /> </button> ); }; diff --git a/web-client/app/_components/SessionProviderWrapper.tsx b/app/app/_components/SessionProviderWrapper.tsx similarity index 100% rename from web-client/app/_components/SessionProviderWrapper.tsx rename to app/app/_components/SessionProviderWrapper.tsx diff --git a/web-client/app/_components/ShortcutItem/index.tsx b/app/app/_components/ShortcutItem/index.tsx similarity index 96% rename from web-client/app/_components/ShortcutItem/index.tsx rename to app/app/_components/ShortcutItem/index.tsx index 5fdbf0797..78ca88086 100644 --- a/web-client/app/_components/ShortcutItem/index.tsx +++ b/app/app/_components/ShortcutItem/index.tsx @@ -11,7 +11,7 @@ const ShortcutItem: React.FC<Props> = ({ product }) => { const { requestCreateConvo } = useCreateConversation(); const onClickHandler = () => { - requestCreateConvo(product); + requestCreateConvo(1); }; return ( diff --git a/web-client/app/_components/ShowMoreButton/index.tsx b/app/app/_components/ShowMoreButton/index.tsx similarity index 90% rename from web-client/app/_components/ShowMoreButton/index.tsx rename to app/app/_components/ShowMoreButton/index.tsx index 58b8e4d06..b800eaf51 100644 --- a/web-client/app/_components/ShowMoreButton/index.tsx +++ b/app/app/_components/ShowMoreButton/index.tsx @@ -12,7 +12,7 @@ const ShowMoreButton: React.FC<Props> = ({ onClick }) => ( > Show more <Image - src={"/icons/unicorn_angle-down.svg"} + src={"icons/unicorn_angle-down.svg"} width={16} height={16} alt="" diff --git a/app/app/_components/SidebarButton/index.tsx b/app/app/_components/SidebarButton/index.tsx new file mode 100644 index 000000000..8db7a386b --- /dev/null +++ b/app/app/_components/SidebarButton/index.tsx @@ -0,0 +1,24 @@ +import Image from "next/image"; + +type Props = { + callback?: () => void; + className?: string; + icon: string; + width: number; + height: number; + title: string; +}; + +export const SidebarButton: React.FC<Props> = ({ + callback, + height, + icon, + className, + width, + title, +}) => ( + <button onClick={callback} className={className}> + <Image src={icon} width={width} height={height} alt="" /> + <span>{title}</span> + </button> +); diff --git a/app/app/_components/SidebarEmptyHistory/index.tsx b/app/app/_components/SidebarEmptyHistory/index.tsx new file mode 100644 index 000000000..e472789d6 --- /dev/null +++ b/app/app/_components/SidebarEmptyHistory/index.tsx @@ -0,0 +1,51 @@ +import Image from "next/image"; +import { SidebarButton } from "../SidebarButton"; +import { executeSerial } from "../../../electron/core/plugin-manager/execution/extension-manager"; +import { ModelManagementService } from "../../../shared/coreService"; +import useCreateConversation from "@/_hooks/useCreateConversation"; + +const SidebarEmptyHistory: React.FC = () => { + const { requestCreateConvo } = useCreateConversation(); + const startChat = async () => { + const downloadedModels = await executeSerial( + ModelManagementService.GET_DOWNLOADED_MODELS + ); + if (!downloadedModels || downloadedModels.length === 0) { + alert( + "Seems like there is no model downloaded yet. Please download a model first." + ); + } else { + requestCreateConvo(1); + } + }; + return ( + <div className="flex flex-col items-center py-10 gap-3"> + <Image + src={"icons/chat-bubble-oval-left.svg"} + width={32} + height={32} + alt="" + /> + <div className="flex flex-col items-center gap-6"> + <div> + <div className="text-center text-gray-900 text-sm"> + No Chat History + </div> + <div className="text-center text-gray-500 text-sm"> + Get started by creating a new chat. + </div> + </div> + <SidebarButton + callback={startChat} + className="flex items-center border bg-blue-600 rounded-lg py-[9px] pl-[15px] pr-[17px] gap-2 text-white font-medium text-sm" + height={14} + icon="icons/Icon_plus.svg" + title="New chat" + width={14} + /> + </div> + </div> + ); +}; + +export default SidebarEmptyHistory; diff --git a/app/app/_components/SidebarFooter/index.tsx b/app/app/_components/SidebarFooter/index.tsx new file mode 100644 index 000000000..9a2cc3f68 --- /dev/null +++ b/app/app/_components/SidebarFooter/index.tsx @@ -0,0 +1,23 @@ +import React from "react"; +import { SidebarButton } from "../SidebarButton"; + +const SidebarFooter: React.FC = () => ( + <div className="flex justify-between items-center gap-2"> + <SidebarButton + className="flex items-center border border-gray-200 rounded-lg p-2 gap-3 flex-1 justify-center text-gray-900 font-medium text-sm" + height={24} + icon="icons/discord.svg" + title="Discord" + width={24} + /> + <SidebarButton + className="flex items-center border border-gray-200 rounded-lg p-2 gap-3 flex-1 justify-center text-gray-900 font-medium text-sm" + height={24} + icon="icons/unicorn_twitter.svg" + title="Twitter" + width={24} + /> + </div> +); + +export default React.memo(SidebarFooter); diff --git a/app/app/_components/SidebarHeader/index.tsx b/app/app/_components/SidebarHeader/index.tsx new file mode 100644 index 000000000..ec2777356 --- /dev/null +++ b/app/app/_components/SidebarHeader/index.tsx @@ -0,0 +1,13 @@ +import Image from "next/image"; + +const SidebarHeader: React.FC = () => { + return ( + <div className="flex flex-col gap-[10px]"> + <div className="flex items-center justify-between"> + <Image src={"icons/Jan_AppIcon.svg"} width={68} height={28} alt="" /> + </div> + </div> + ); +}; + +export default SidebarHeader; diff --git a/app/app/_components/SidebarMenu/index.tsx b/app/app/_components/SidebarMenu/index.tsx new file mode 100644 index 000000000..a852596f3 --- /dev/null +++ b/app/app/_components/SidebarMenu/index.tsx @@ -0,0 +1,53 @@ +import Image from "next/image"; +import Link from "next/link"; + +const SidebarMenu: React.FC = () => { + const menu = [ + { + name: "Chat History", + icon: "ClipboardList", + url: "#", + }, + { + name: "Explore Models", + icon: "Search_gray", + url: "#", + }, + { + name: "My Models", + icon: "ViewGrid", + url: "#", + }, + { + name: "Settings", + icon: "Cog", + url: "/settings", + }, + ]; + + return ( + <div className="flex-1 flex flex-col justify-end"> + <div className="text-gray-500 text-xs font-semibold py-2 pl-2 pr-3"> + Your Configurations + </div> + {menu.map((item, index) => ( + <div key={index} className="py-2 pl-2 pr-3"> + <Link + href={item.url} + className="flex items-center gap-3 text-base text-gray-600" + > + <Image + src={`icons/${item.icon}.svg`} + width={24} + height={24} + alt="" + /> + {item.name} + </Link> + </div> + ))} + </div> + ); +}; + +export default SidebarMenu; diff --git a/web-client/app/_components/SimpleControlNetMessage.tsx b/app/app/_components/SimpleControlNetMessage.tsx similarity index 95% rename from web-client/app/_components/SimpleControlNetMessage.tsx rename to app/app/_components/SimpleControlNetMessage.tsx index 7e9e5c426..28a175b4f 100644 --- a/web-client/app/_components/SimpleControlNetMessage.tsx +++ b/app/app/_components/SimpleControlNetMessage.tsx @@ -51,7 +51,7 @@ const SimpleControlNetMessage: React.FC<Props> = ({ target="_blank_" className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" > - <Image src="/icons/download.svg" width={16} height={16} alt="" /> + <Image src="icons/download.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Download </span> diff --git a/web-client/app/_components/SimpleImageMessage/index.tsx b/app/app/_components/SimpleImageMessage/index.tsx similarity index 90% rename from web-client/app/_components/SimpleImageMessage/index.tsx rename to app/app/_components/SimpleImageMessage/index.tsx index bb9500a9b..bfa2eab89 100644 --- a/web-client/app/_components/SimpleImageMessage/index.tsx +++ b/app/app/_components/SimpleImageMessage/index.tsx @@ -48,7 +48,7 @@ const SimpleImageMessage: React.FC<Props> = ({ target="_blank_" className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" > - <Image src="/icons/download.svg" width={16} height={16} alt="" /> + <Image src="icons/download.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Download </span> @@ -57,7 +57,7 @@ const SimpleImageMessage: React.FC<Props> = ({ className="flex gap-1 items-center px-2 py-1 bg-[#F3F4F6] rounded-[12px]" // onClick={() => sendChatMessage()} > - <Image src="/icons/refresh.svg" width={16} height={16} alt="" /> + <Image src="icons/refresh.svg" width={16} height={16} alt="" /> <span className="leading-[20px] text-[14px] text-[#111928]"> Re-generate </span> diff --git a/web-client/app/_components/SimpleTextMessage/index.tsx b/app/app/_components/SimpleTextMessage/index.tsx similarity index 100% rename from web-client/app/_components/SimpleTextMessage/index.tsx rename to app/app/_components/SimpleTextMessage/index.tsx diff --git a/web-client/app/_components/Slide/index.tsx b/app/app/_components/Slide/index.tsx similarity index 97% rename from web-client/app/_components/Slide/index.tsx rename to app/app/_components/Slide/index.tsx index 9ecc3fdf3..adf7a68d0 100644 --- a/web-client/app/_components/Slide/index.tsx +++ b/app/app/_components/Slide/index.tsx @@ -11,7 +11,7 @@ const Slide: React.FC<Props> = ({ product }) => { const { requestCreateConvo } = useCreateConversation(); const onClick = () => { - requestCreateConvo(product); + requestCreateConvo(1); }; return ( diff --git a/web-client/app/_components/Slider/index.tsx b/app/app/_components/Slider/index.tsx similarity index 100% rename from web-client/app/_components/Slider/index.tsx rename to app/app/_components/Slider/index.tsx diff --git a/web-client/app/_components/StreamTextMessage/index.tsx b/app/app/_components/StreamTextMessage/index.tsx similarity index 100% rename from web-client/app/_components/StreamTextMessage/index.tsx rename to app/app/_components/StreamTextMessage/index.tsx diff --git a/app/app/_components/SystemStatus/index.tsx b/app/app/_components/SystemStatus/index.tsx new file mode 100644 index 000000000..7b6f371f4 --- /dev/null +++ b/app/app/_components/SystemStatus/index.tsx @@ -0,0 +1,25 @@ +type Props = { + name: string; + total: number; + value: number; +}; + +const SystemItem: React.FC<Props> = ({ name, total, value }) => { + return ( + <div className="border-l border-gray-200 flex gap-2 pl-4"> + <div className="flex gap-[10px] p-1 bg-gray-100 text-gray-600 text-[11px] leading-[13px]"> + {name} + </div> + <span className="text-gray-500 text-sm"> + {toGigabytes(value)} / {toGigabytes(total)}{" "} + {((value / total) * 100).toFixed(2)} % + </span> + </div> + ); +}; + +const toGigabytes = (input: number) => { + return input > 1000 ? input / 1000 + "GB" : input + "MB"; +}; + +export default SystemItem; diff --git a/web-client/app/_components/TabModelDetail/index.tsx b/app/app/_components/TabModelDetail/index.tsx similarity index 87% rename from web-client/app/_components/TabModelDetail/index.tsx rename to app/app/_components/TabModelDetail/index.tsx index 557e3c885..6652dc258 100644 --- a/web-client/app/_components/TabModelDetail/index.tsx +++ b/app/app/_components/TabModelDetail/index.tsx @@ -8,11 +8,11 @@ export const TabModelDetail: React.FC<Props> = ({ onTabClick, tab }) => { const btns = [ { name: "api", - icon: "/icons/unicorn_arrow.svg", + icon: "icons/unicorn_arrow.svg", }, { name: "description", - icon: "/icons/unicorn_exclamation-circle.svg", + icon: "icons/unicorn_exclamation-circle.svg", }, ]; diff --git a/web-client/app/_components/TextCode/index.tsx b/app/app/_components/TextCode/index.tsx similarity index 87% rename from web-client/app/_components/TextCode/index.tsx rename to app/app/_components/TextCode/index.tsx index 9add02861..392b254b9 100644 --- a/web-client/app/_components/TextCode/index.tsx +++ b/app/app/_components/TextCode/index.tsx @@ -1,3 +1,4 @@ +"use client"; import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs"; import Image from "next/image"; @@ -11,13 +12,15 @@ export const TextCode: React.FC<Props> = ({ text }) => ( <div className="text-gray-200 bg-gray-800 flex items-center justify-between px-4 py-2 text-xs capitalize"> <button onClick={() => navigator.clipboard.writeText(text)}> <Image - src={"/icons/unicorn_clipboard-alt.svg"} + src={"icons/unicorn_clipboard-alt.svg"} width={24} height={24} alt="" /> </button> </div> + {/* + // @ts-ignore */} <SyntaxHighlighter className="w-full overflow-x-hidden resize-none" language="jsx" diff --git a/web-client/app/_components/TitleBlankState/index.tsx b/app/app/_components/TitleBlankState/index.tsx similarity index 100% rename from web-client/app/_components/TitleBlankState/index.tsx rename to app/app/_components/TitleBlankState/index.tsx diff --git a/web-client/app/_components/TogglableHeader/index.tsx b/app/app/_components/TogglableHeader/index.tsx similarity index 94% rename from web-client/app/_components/TogglableHeader/index.tsx rename to app/app/_components/TogglableHeader/index.tsx index 23ba6b651..fed06e5e5 100644 --- a/web-client/app/_components/TogglableHeader/index.tsx +++ b/app/app/_components/TogglableHeader/index.tsx @@ -23,7 +23,7 @@ const TogglableHeader: React.FC<Props> = ({ </div> <Image className={`${!expand ? "rotate-180" : "rotate-0"}`} - src={"/icons/unicorn_angle-up.svg"} + src={"icons/unicorn_angle-up.svg"} width={24} height={24} alt="" diff --git a/web-client/app/_components/UploadFileImage/index.tsx b/app/app/_components/UploadFileImage/index.tsx similarity index 94% rename from web-client/app/_components/UploadFileImage/index.tsx rename to app/app/_components/UploadFileImage/index.tsx index a7b74663e..f1f89b22b 100644 --- a/web-client/app/_components/UploadFileImage/index.tsx +++ b/app/app/_components/UploadFileImage/index.tsx @@ -70,7 +70,7 @@ export const UploadFileImage: React.FC<Props> = ({ register }) => { onClick={handleClick} className="flex flex-col justify-center items-center py-5 px-2 gap-2 round-[2px] border border-dashed border-[#C8D0E0] rounded-sm" > - {/* <Image src={"/icons/ic_plus.svg"} width={14} height={14} alt="" /> + {/* <Image src={"icons/ic_plus.svg"} width={14} height={14} alt="" /> <span className="text-gray-700 font-normal text-sm"> Drag an image here, or click to select </span> */} diff --git a/app/app/_components/UserProfileDropDown/index.tsx b/app/app/_components/UserProfileDropDown/index.tsx new file mode 100644 index 000000000..a87053fe6 --- /dev/null +++ b/app/app/_components/UserProfileDropDown/index.tsx @@ -0,0 +1,36 @@ +"use client"; + +import React from "react"; +import { Popover } from "@headlessui/react"; +import { MenuHeader } from "../MenuHeader"; +// import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; + +const UserProfileDropDown: React.FC = () => { + // const { loading, user } = useGetCurrentUser(); + return <div></div>; + // if (loading || !user) { + // return <div></div>; + // } + + // return ( + // <Popover.Group className="hidden lg:flex lg:gap-x-12"> + // <Popover className="relative"> + // <Popover.Button className="flex items-center gap-2 outline-none"> + // <img + // className="rounded-sm w-8 aspect-square" + // src={user.avatarUrl ?? "icons/app_icon.svg"} + // alt="" + // /> + // <div className="flex flex-col justify-start"> + // <h2 className="text-sm leading-5 text-[#111928] dark:text-gray-400"> + // {user.displayName} + // </h2> + // </div> + // </Popover.Button> + // <MenuHeader /> + // </Popover> + // </Popover.Group> + // ); +}; + +export default UserProfileDropDown; diff --git a/web-client/app/_components/UserToolbar/index.tsx b/app/app/_components/UserToolbar/index.tsx similarity index 78% rename from web-client/app/_components/UserToolbar/index.tsx rename to app/app/_components/UserToolbar/index.tsx index 6f2598a2b..7cbf3430d 100644 --- a/web-client/app/_components/UserToolbar/index.tsx +++ b/app/app/_components/UserToolbar/index.tsx @@ -7,14 +7,14 @@ import Image from "next/image"; const UserToolbar: React.FC = () => { const currentConvo = useAtomValue(currentConversationAtom); - const avatarUrl = currentConvo?.product.avatarUrl ?? ""; - const title = currentConvo?.product.name ?? ""; + const avatarUrl = currentConvo?.image; + const title = currentConvo?.name ?? ""; return ( <div className="flex items-center gap-3 p-1"> <Image className="rounded-full aspect-square w-8 h-8" - src={avatarUrl} + src={avatarUrl ?? "icons/app_icon.svg"} alt="" width={36} height={36} diff --git a/app/app/_components/ViewModelDetailButton/index.tsx b/app/app/_components/ViewModelDetailButton/index.tsx new file mode 100644 index 000000000..3314e5778 --- /dev/null +++ b/app/app/_components/ViewModelDetailButton/index.tsx @@ -0,0 +1,21 @@ +import { ChevronDownIcon } from "@heroicons/react/24/outline"; + +type Props = { + callback: () => void; +}; + +const ViewModelDetailButton: React.FC<Props> = ({ callback }) => { + return ( + <div className="px-4 pb-4"> + <button + onClick={callback} + className="bg-gray-100 py-1 px-[10px] w-full flex items-center justify-center gap-1 rounded-lg" + > + <span className="text-xs leading-[18px]">View Details</span> + <ChevronDownIcon width={18} height={18} /> + </button> + </div> + ); +}; + +export default ViewModelDetailButton; diff --git a/app/app/_components/WelcomeContainer/index.tsx b/app/app/_components/WelcomeContainer/index.tsx new file mode 100644 index 000000000..f8e043dcc --- /dev/null +++ b/app/app/_components/WelcomeContainer/index.tsx @@ -0,0 +1,60 @@ +import Image from "next/image"; +import SystemStatus from "../SystemStatus"; +import { SidebarButton } from "../SidebarButton"; + +const Welcome: React.FC = () => { + const data = { + name: "LlaMa 2 - Hermes 7B (Q4_K_M)", + type: "7B", + author: "Architecture Llama", + description: + "Primary intended uses The primary use of LLaMA is research on large language models, including: exploring potential applications such as question answering, natural language understanding or reading comprehension, understanding capabilities and limitations of current language models, and developing techniques to improve those, evaluating and mitigating biases, risks, toxic and harmful content generations, hallucinations.", + isRecommend: true, + storage: 3780, + required: "8GB+ RAM", + }; + const system = [ + { + name: "GPU", + value: 782.2, + total: 14000, + }, + { + name: "RAM", + value: 5100, + total: 14000, + }, + { + name: "STORAGE", + value: 500000, + total: 1000000, + }, + ]; + return ( + <div className="flex flex-col h-full"> + <div className="px-[200px] flex-1 flex flex-col gap-5 justify-center items-start"> + <Image src={"icons/App_ico.svg"} width={44} height={45} alt="" /> + <span className="font-semibold text-gray-500 text-5xl"> + Welcome, + <br /> + let’s download your first model + </span> + <SidebarButton + className="flex flex-row-reverse items-center rounded-lg gap-2 px-3 py-2 text-xs font-medium border border-gray-200" + icon="icons/arrow-right.svg" + title="Explore models" + height={16} + width={16} + /> + </div> + <div className="px-3 py-2 gap-4 flex items-center justify-center"> + <span className="text-gray-500 text-sm">System status</span> + {system.map((item, index) => ( + <SystemStatus key={index} {...item} /> + ))} + </div> + </div> + ); +}; + +export default Welcome; diff --git a/app/app/_helpers/EventListenerWrapper.tsx b/app/app/_helpers/EventListenerWrapper.tsx new file mode 100644 index 000000000..7efe04b23 --- /dev/null +++ b/app/app/_helpers/EventListenerWrapper.tsx @@ -0,0 +1,25 @@ +// @ts-nocheck +"use client"; + +import { useSetAtom } from "jotai"; +import { ReactNode, useEffect } from "react"; +import { modelDownloadStateAtom } from "./JotaiWrapper"; + +type Props = { + children: ReactNode; +}; + +export default function EventListenerWrapper({ children }: Props) { + const setDownloadState = useSetAtom(modelDownloadStateAtom); + useEffect(() => { + window.electronAPI.onModelDownloadUpdate((event, state) => { + setDownloadState(state); + }); + + window.electronAPI.onModelDownloadError(() => { + // TODO: Show error message + }); + }, []); + + return <div id="eventlistener">{children}</div>; +} diff --git a/web-client/app/_helpers/JotaiWrapper.tsx b/app/app/_helpers/JotaiWrapper.tsx similarity index 91% rename from web-client/app/_helpers/JotaiWrapper.tsx rename to app/app/_helpers/JotaiWrapper.tsx index 76b603c96..c3ade0cee 100644 --- a/web-client/app/_helpers/JotaiWrapper.tsx +++ b/app/app/_helpers/JotaiWrapper.tsx @@ -2,6 +2,7 @@ import { ChatMessage, MessageStatus } from "@/_models/ChatMessage"; import { Conversation, ConversationState } from "@/_models/Conversation"; +import { DownloadState } from "@/_models/DownloadState"; import { Product } from "@/_models/Product"; import { Provider, atom } from "jotai"; import { ReactNode } from "react"; @@ -30,6 +31,7 @@ export const currentPromptAtom = atom<string>(""); export const showingAdvancedPromptAtom = atom<boolean>(false); export const showingProductDetailAtom = atom<boolean>(false); export const showingMobilePaneAtom = atom<boolean>(false); +export const showingTyping = atom<boolean>(false); /** * Stores all conversations for the current user @@ -41,7 +43,10 @@ export const currentConversationAtom = atom<Conversation | undefined>((get) => export const setConvoUpdatedAtAtom = atom(null, (get, set, convoId: string) => { const convo = get(userConversationsAtom).find((c) => c.id === convoId); if (!convo) return; - const newConvo: Conversation = { ...convo, updatedAt: Date.now() }; + const newConvo: Conversation = { + ...convo, + updated_at: new Date().toISOString(), + }; const newConversations: Conversation[] = get(userConversationsAtom).map((c) => c.id === convoId ? newConvo : c ); @@ -49,14 +54,16 @@ export const setConvoUpdatedAtAtom = atom(null, (get, set, convoId: string) => { set(userConversationsAtom, newConversations); }); -export const currentStreamingMessageAtom = atom<ChatMessage | undefined>(undefined); +export const currentStreamingMessageAtom = atom<ChatMessage | undefined>( + undefined +); export const setConvoLastImageAtom = atom( null, (get, set, convoId: string, lastImageUrl: string) => { const convo = get(userConversationsAtom).find((c) => c.id === convoId); if (!convo) return; - const newConvo: Conversation = { ...convo, lastImageUrl }; + const newConvo: Conversation = { ...convo }; const newConversations: Conversation[] = get(userConversationsAtom).map( (c) => (c.id === convoId ? newConvo : c) ); @@ -202,10 +209,10 @@ export const updateLastMessageAsReadyAtom = atom( ); export const currentProductAtom = atom<Product | undefined>( - (get) => - get(userConversationsAtom).find( - (c) => c.id === get(activeConversationIdAtom) - )?.product + (get) => undefined + // get(userConversationsAtom).find( + // (c) => c.id === get(activeConversationIdAtom) + // )?.product ); export const searchAtom = atom<string>(""); @@ -213,3 +220,9 @@ export const searchAtom = atom<string>(""); // modal atoms export const showConfirmDeleteConversationModalAtom = atom(false); export const showConfirmSignOutModalAtom = atom(false); +export const showConfirmDeleteModalAtom = atom(false); + +// download states +export const modelDownloadStateAtom = atom<DownloadState | undefined>( + undefined +); diff --git a/web-client/app/_helpers/ModalWrapper.tsx b/app/app/_helpers/ModalWrapper.tsx similarity index 81% rename from web-client/app/_helpers/ModalWrapper.tsx rename to app/app/_helpers/ModalWrapper.tsx index c5633b6fe..44800bb1f 100644 --- a/web-client/app/_helpers/ModalWrapper.tsx +++ b/app/app/_helpers/ModalWrapper.tsx @@ -1,6 +1,7 @@ "use client"; import ConfirmDeleteConversationModal from "@/_components/ConfirmDeleteConversationModal"; +import ConfirmDeleteModelModal from "@/_components/ConfirmDeleteModelModal"; import ConfirmSignOutModal from "@/_components/ConfirmSignOutModal"; import MobileMenuPane from "@/_components/MobileMenuPane"; import { ReactNode } from "react"; @@ -14,6 +15,7 @@ export const ModalWrapper: React.FC<Props> = ({ children }) => ( <MobileMenuPane /> <ConfirmDeleteConversationModal /> <ConfirmSignOutModal /> + <ConfirmDeleteModelModal /> {children} </> ); diff --git a/web-client/app/_helpers/ThemeWrapper.tsx b/app/app/_helpers/ThemeWrapper.tsx similarity index 100% rename from web-client/app/_helpers/ThemeWrapper.tsx rename to app/app/_helpers/ThemeWrapper.tsx diff --git a/web-client/app/_helpers/withAnalytics.tsx b/app/app/_helpers/withAnalytics.tsx similarity index 100% rename from web-client/app/_helpers/withAnalytics.tsx rename to app/app/_helpers/withAnalytics.tsx diff --git a/app/app/_hooks/useChatMessages.ts b/app/app/_hooks/useChatMessages.ts new file mode 100644 index 000000000..506af29de --- /dev/null +++ b/app/app/_hooks/useChatMessages.ts @@ -0,0 +1,73 @@ +import { + addOldMessagesAtom, + conversationStatesAtom, + currentConversationAtom, + updateConversationHasMoreAtom, +} from "@/_helpers/JotaiWrapper"; +import { ChatMessage, RawMessage, toChatMessage } from "@/_models/ChatMessage"; +import { executeSerial } from "@/_services/pluginService"; +import { useAtomValue, useSetAtom } from "jotai"; +import { useEffect, useState } from "react"; +import { DataService } from "../../shared/coreService"; + +/** + * Custom hooks to get chat messages for current(active) conversation + * + * @param offset for pagination purpose + * @returns + */ +const useChatMessages = (offset = 0) => { + const [loading, setLoading] = useState(true); + const addOldChatMessages = useSetAtom(addOldMessagesAtom); + const currentConvo = useAtomValue(currentConversationAtom); + if (!currentConvo) { + throw new Error("activeConversation is null"); + } + const convoStates = useAtomValue(conversationStatesAtom); + const updateConvoHasMore = useSetAtom(updateConversationHasMoreAtom); + + useEffect(() => { + const hasMore = convoStates[currentConvo.id ?? ""]?.hasMore ?? true; + if (!hasMore) return; + + const getMessages = async () => { + executeSerial( + DataService.GET_CONVERSATION_MESSAGES, + currentConvo.id + ).then((data: any) => { + if (!data) { + return; + } + parseMessages(data ?? []).then((newMessages) => { + addOldChatMessages(newMessages); + updateConvoHasMore(currentConvo.id ?? "", false); + setLoading(false); + }); + }); + }; + getMessages(); + }, [ + offset, + currentConvo.id, + convoStates, + addOldChatMessages, + updateConvoHasMore, + ]); + + return { + loading: loading, + error: undefined, + hasMore: convoStates[currentConvo.id ?? ""]?.hasMore ?? true, + }; +}; + +async function parseMessages(messages: RawMessage[]): Promise<ChatMessage[]> { + const newMessages: ChatMessage[] = []; + for (const m of messages) { + const chatMessage = await toChatMessage(m); + newMessages.push(chatMessage); + } + return newMessages; +} + +export default useChatMessages; diff --git a/app/app/_hooks/useCreateConversation.ts b/app/app/_hooks/useCreateConversation.ts new file mode 100644 index 000000000..b48f1e82b --- /dev/null +++ b/app/app/_hooks/useCreateConversation.ts @@ -0,0 +1,50 @@ +// import useGetCurrentUser from "./useGetCurrentUser"; +import { useAtom, useSetAtom } from "jotai"; +import { + addNewConversationStateAtom, + setActiveConvoIdAtom, + userConversationsAtom, +} from "@/_helpers/JotaiWrapper"; +import { Conversation } from "@/_models/Conversation"; +import { executeSerial } from "@/_services/pluginService"; +import { DataService } from "../../shared/coreService"; + +const useCreateConversation = () => { + const [userConversations, setUserConversations] = useAtom( + userConversationsAtom + ); + const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); + const addNewConvoState = useSetAtom(addNewConversationStateAtom); + + const requestCreateConvo = async (model_id: number = 0) => { + const conv: Conversation = { + image: undefined, + model_id, + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + name: "Conversation", + }; + const id = await executeSerial(DataService.CREATE_CONVERSATION, conv); + + const mappedConvo: Conversation = { + id, + model_id, + name: "Conversation", + created_at: new Date().toISOString(), + updated_at: new Date().toISOString(), + }; + + addNewConvoState(id ?? "", { + hasMore: true, + waitingForResponse: false, + }); + setUserConversations([mappedConvo, ...userConversations]); + setActiveConvoId(id); + }; + + return { + requestCreateConvo, + }; +}; + +export default useCreateConversation; diff --git a/web-client/app/_hooks/useDeleteConversation.ts b/app/app/_hooks/useDeleteConversation.ts similarity index 78% rename from web-client/app/_hooks/useDeleteConversation.ts rename to app/app/_hooks/useDeleteConversation.ts index 04f540040..d771f29ed 100644 --- a/web-client/app/_hooks/useDeleteConversation.ts +++ b/app/app/_hooks/useDeleteConversation.ts @@ -6,12 +6,9 @@ import { showingProductDetailAtom, userConversationsAtom, } from "@/_helpers/JotaiWrapper"; -import { - DeleteConversationDocument, - DeleteConversationMutation, -} from "@/graphql"; -import { useMutation } from "@apollo/client"; +import { execute } from "@/_services/pluginService"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; +import { DataService } from "../../shared/coreService"; export default function useDeleteConversation() { const [userConversations, setUserConversations] = useAtom( @@ -23,14 +20,10 @@ export default function useDeleteConversation() { const activeConvoId = useAtomValue(getActiveConvoIdAtom); const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); - const [deleteConversation] = useMutation<DeleteConversationMutation>( - DeleteConversationDocument - ); - const deleteConvo = async () => { if (activeConvoId) { try { - await deleteConversation({ variables: { id: activeConvoId } }); + await execute(DataService.DELETE_CONVERSATION, activeConvoId); setUserConversations( userConversations.filter((c) => c.id !== activeConvoId) ); diff --git a/web-client/app/_hooks/useGetCurrentUser.ts b/app/app/_hooks/useGetCurrentUser.ts similarity index 100% rename from web-client/app/_hooks/useGetCurrentUser.ts rename to app/app/_hooks/useGetCurrentUser.ts diff --git a/web-client/app/_hooks/useGetModelApiInfo.ts b/app/app/_hooks/useGetModelApiInfo.ts similarity index 100% rename from web-client/app/_hooks/useGetModelApiInfo.ts rename to app/app/_hooks/useGetModelApiInfo.ts diff --git a/app/app/_hooks/useGetModels.ts b/app/app/_hooks/useGetModels.ts new file mode 100644 index 000000000..9aa6b0181 --- /dev/null +++ b/app/app/_hooks/useGetModels.ts @@ -0,0 +1,9 @@ +import React, { useState } from "react"; + +export default function useGetModels() { + const [models, setModels] = useState<any[]>() + + return { + models + }; +} diff --git a/app/app/_hooks/useGetUserConversations.ts b/app/app/_hooks/useGetUserConversations.ts new file mode 100644 index 000000000..f315e197a --- /dev/null +++ b/app/app/_hooks/useGetUserConversations.ts @@ -0,0 +1,38 @@ +import { Conversation, ConversationState } from "@/_models/Conversation"; +import { useSetAtom } from "jotai"; +import { + conversationStatesAtom, + userConversationsAtom, +} from "@/_helpers/JotaiWrapper"; +import { executeSerial } from "@/_services/pluginService"; +import { DataService } from "../../shared/coreService"; + +const useGetUserConversations = () => { + const setConversationStates = useSetAtom(conversationStatesAtom); + const setConversations = useSetAtom(userConversationsAtom); + + const getUserConversations = async () => { + try { + const convos: Conversation[] | undefined = await executeSerial( + DataService.GET_CONVERSATIONS + ); + const convoStates: Record<string, ConversationState> = {}; + convos?.forEach((convo) => { + convoStates[convo.id ?? ""] = { + hasMore: true, + waitingForResponse: false, + }; + }); + setConversationStates(convoStates); + setConversations(convos ?? []); + } catch (ex) { + console.log(ex); + } + }; + + return { + getUserConversations, + }; +}; + +export default useGetUserConversations; diff --git a/app/app/_hooks/useSendChatMessage.ts b/app/app/_hooks/useSendChatMessage.ts new file mode 100644 index 000000000..665d257d9 --- /dev/null +++ b/app/app/_hooks/useSendChatMessage.ts @@ -0,0 +1,50 @@ +import { + addNewMessageAtom, + currentConversationAtom, + currentPromptAtom, + showingTyping, +} from "@/_helpers/JotaiWrapper"; + +import { useAtom, useAtomValue, useSetAtom } from "jotai"; + +import { DataService, InfereceService } from "../../shared/coreService"; +import { RawMessage, toChatMessage } from "@/_models/ChatMessage"; +import { executeSerial } from "@/_services/pluginService"; + +export default function useSendChatMessage() { + const currentConvo = useAtomValue(currentConversationAtom); + + const addNewMessage = useSetAtom(addNewMessageAtom); + const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom); + const [, setIsTyping] = useAtom(showingTyping); + const sendChatMessage = async () => { + setIsTyping(true); + setCurrentPrompt(""); + const prompt = currentPrompt.trim(); + const newMessage: RawMessage = { + conversation_id: parseInt(currentConvo?.id ?? "0") ?? 0, + message: prompt, + user: "user", + created_at: new Date().toISOString(), + }; + const id = await executeSerial(DataService.CREATE_MESSAGE, newMessage); + newMessage.id = id; + + addNewMessage(await toChatMessage(newMessage)); + const resp = await executeSerial(InfereceService.INFERENCE, prompt); + + const newResponse: RawMessage = { + conversation_id: parseInt(currentConvo?.id ?? "0") ?? 0, + message: resp, + user: "assistant", + created_at: new Date().toISOString(), + }; + const respId = await executeSerial(DataService.CREATE_MESSAGE, newResponse); + newResponse.id = respId; + addNewMessage(await toChatMessage(newResponse)); + setIsTyping(false); + }; + return { + sendChatMessage, + }; +} diff --git a/web-client/app/_hooks/useSignIn.ts b/app/app/_hooks/useSignIn.ts similarity index 100% rename from web-client/app/_hooks/useSignIn.ts rename to app/app/_hooks/useSignIn.ts diff --git a/web-client/app/_hooks/useSignOut.ts b/app/app/_hooks/useSignOut.ts similarity index 100% rename from web-client/app/_hooks/useSignOut.ts rename to app/app/_hooks/useSignOut.ts diff --git a/app/app/_models/ChatMessage.ts b/app/app/_models/ChatMessage.ts new file mode 100644 index 000000000..40bbbb6ec --- /dev/null +++ b/app/app/_models/ChatMessage.ts @@ -0,0 +1,82 @@ +import { remark } from "remark"; +import html from "remark-html"; + +export enum MessageType { + Text = "Text", + Image = "Image", + ImageWithText = "ImageWithText", + Error = "Error", +} + +export enum MessageSenderType { + Ai = "Ai", + User = "User", +} + +export enum MessageStatus { + Ready = "ready", + Pending = "pending", +} + +export interface ChatMessage { + id: string; + conversationId: string; + messageType: MessageType; + messageSenderType: MessageSenderType; + senderUid: string; + senderName: string; + senderAvatarUrl: string; + text: string | undefined; + imageUrls?: string[] | undefined; + createdAt: number; + status: MessageStatus; +} + +export interface RawMessage { + id?: number; + conversation_id: number; + user?: string; + message?: string; + created_at?: string; + updated_at?: string; +} + +export const toChatMessage = async (m: RawMessage): Promise<ChatMessage> => { + const createdAt = new Date(m.created_at ?? "").getTime(); + const imageUrls: string[] = []; + const imageUrl = undefined; + // m.message_medias.length > 0 ? m.message_medias[0].media_url : null; + if (imageUrl) { + imageUrls.push(imageUrl); + } + + const messageType = MessageType.Text; + // m.message_type ? MessageType[m.message_type as keyof typeof MessageType] : MessageType.Text; + const messageSenderType = + m.user === "user" ? MessageSenderType.User : MessageSenderType.Ai; + // m.message_sender_type + // ? MessageSenderType[m.message_sender_type as keyof typeof MessageSenderType] + // : MessageSenderType.Ai; + + const content = m.message ?? ""; + const processedContent = await remark().use(html).process(content); + const contentHtml = processedContent.toString(); + + return { + id: (m.id ?? 0).toString(), + conversationId: (m.conversation_id ?? 0).toString(), + messageType: messageType, + messageSenderType: messageSenderType, + senderUid: m.user?.toString() || "0", + senderName: m.user === "user" ? "You" : "LLaMA", // m.sender_name ?? "", + senderAvatarUrl: + m.user === "user" + ? "icons/avatar.svg" + : "https://huggingface.co/front/assets/huggingface_logo-noborder.svg", // m.sender_avatar_url ?? "icons/app_icon.svg", + text: contentHtml, + imageUrls: imageUrls, + createdAt: createdAt, + status: MessageStatus.Ready, + // status: m.status as MessageStatus, + }; +}; diff --git a/app/app/_models/Conversation.ts b/app/app/_models/Conversation.ts new file mode 100644 index 000000000..46c7fe572 --- /dev/null +++ b/app/app/_models/Conversation.ts @@ -0,0 +1,17 @@ +export interface Conversation { + id?: string; + model_id?: number; + name?: string; + image?: string; + message?: string; + created_at?: string; + updated_at?: string; +} + +/** + * Store the state of conversation like fetching, waiting for response, etc. + */ +export type ConversationState = { + hasMore: boolean; + waitingForResponse: boolean; +}; diff --git a/app/app/_models/DownloadState.ts b/app/app/_models/DownloadState.ts new file mode 100644 index 000000000..2ccb643ec --- /dev/null +++ b/app/app/_models/DownloadState.ts @@ -0,0 +1,20 @@ +/** + * Represent the state of a download + */ +export type DownloadState = { + modelId: string; + time: DownloadTime; + speed: number; + percent: number; + size: DownloadSize; +}; + +export type DownloadTime = { + elapsed: number; + remaining: number; +}; + +export type DownloadSize = { + total: number; + transferred: number; +}; diff --git a/app/app/_models/Product.ts b/app/app/_models/Product.ts new file mode 100644 index 000000000..1845b6e36 --- /dev/null +++ b/app/app/_models/Product.ts @@ -0,0 +1,30 @@ +import { ProductInput } from "./ProductInput"; +import { ProductOutput } from "./ProductOutput"; + +export enum ProductType { + LLM = "LLM", + GenerativeArt = "GenerativeArt", + ControlNet = "ControlNet", +} + +export interface Product { + id: string; + slug: string; + name: string; + description: string; + avatarUrl: string; + longDescription: string; + technicalDescription: string; + author: string; + version: string; + modelUrl: string; + nsfw: boolean; + greeting: string; + type: ProductType; + inputs?: ProductInput; + outputs?: ProductOutput; + createdAt: number; + updatedAt?: number; + fileName?: string; + downloadUrl?: string; +} diff --git a/web-client/app/_models/ProductInput.ts b/app/app/_models/ProductInput.ts similarity index 100% rename from web-client/app/_models/ProductInput.ts rename to app/app/_models/ProductInput.ts diff --git a/web-client/app/_models/ProductOutput.ts b/app/app/_models/ProductOutput.ts similarity index 100% rename from web-client/app/_models/ProductOutput.ts rename to app/app/_models/ProductOutput.ts diff --git a/web-client/app/_models/User.ts b/app/app/_models/User.ts similarity index 87% rename from web-client/app/_models/User.ts rename to app/app/_models/User.ts index 9f7d0ffd4..b3d9583d5 100644 --- a/web-client/app/_models/User.ts +++ b/app/app/_models/User.ts @@ -8,7 +8,7 @@ export interface User { export const DefaultUser = { id: "0", displayName: "Anonymous", - avatarUrl: "/icons/app_icon.svg", + avatarUrl: "icons/app_icon.svg", email: "", }; diff --git a/app/app/_services/pluginService.ts b/app/app/_services/pluginService.ts new file mode 100644 index 000000000..6b98cbc70 --- /dev/null +++ b/app/app/_services/pluginService.ts @@ -0,0 +1,71 @@ +"use client"; +import { + extensionPoints, + plugins, +} from "../../electron/core/plugin-manager/execution/index"; +import { + CoreService, + DataService, + InfereceService, + ModelManagementService, +} from "../../shared/coreService"; + +export const isCorePluginInstalled = () => { + if (!extensionPoints.get(DataService.GET_CONVERSATIONS)) { + return false; + } + if (!extensionPoints.get(InfereceService.INFERENCE)) { + return false; + } + if (!extensionPoints.get(ModelManagementService.GET_DOWNLOADED_MODELS)) { + return false; + } + return true; +}; +export const setupBasePlugins = async () => { + if ( + typeof window === "undefined" || + // @ts-ignore + typeof window.electronAPI === "undefined" + ) { + return; + } + // @ts-ignore + const userDataPath = await window.electronAPI.userData(); + const basePlugin = + userDataPath + "/electron/core/pre-install/base-plugin.tgz"; + const dataPlugin = + userDataPath + "/electron/core/pre-install/data-plugin.tgz"; + const modelManagementPlugin = + userDataPath + "/electron/core/pre-install/model-management-plugin.tgz"; + const toInstall = []; + if (!extensionPoints.get(DataService.GET_CONVERSATIONS)) { + toInstall.push(dataPlugin); + } + if (!extensionPoints.get(InfereceService.INFERENCE)) { + toInstall.push(basePlugin); + } + if (!extensionPoints.get(ModelManagementService.GET_DOWNLOADED_MODELS)) { + toInstall.push(modelManagementPlugin); + } + const installed = await plugins.install(toInstall); + if (installed) { + window.location.reload(); + } +}; + +export const execute = (name: CoreService, args?: any) => { + if (!extensionPoints.get(name)) { + alert("Missing extension for function: " + name); + return undefined; + } + return extensionPoints.execute(name, args); +}; + +export const executeSerial = (name: CoreService, args?: any) => { + if (!extensionPoints.get(name)) { + alert("Missing extension for function: " + name); + return Promise.resolve(undefined); + } + return extensionPoints.executeSerial(name, args); +}; diff --git a/web-client/app/_utils/const.ts b/app/app/_utils/const.ts similarity index 100% rename from web-client/app/_utils/const.ts rename to app/app/_utils/const.ts diff --git a/web-client/app/_utils/datetime.ts b/app/app/_utils/datetime.ts similarity index 100% rename from web-client/app/_utils/datetime.ts rename to app/app/_utils/datetime.ts diff --git a/web-client/app/_utils/message.ts b/app/app/_utils/message.ts similarity index 100% rename from web-client/app/_utils/message.ts rename to app/app/_utils/message.ts diff --git a/web-client/app/favicon.ico b/app/app/favicon.ico similarity index 100% rename from web-client/app/favicon.ico rename to app/app/favicon.ico diff --git a/web-client/app/globals.css b/app/app/globals.css similarity index 89% rename from web-client/app/globals.css rename to app/app/globals.css index 88a545677..d66627f8e 100644 --- a/web-client/app/globals.css +++ b/app/app/globals.css @@ -372,3 +372,57 @@ body { line-height: 40px; /* 111.111% */ } } + +/* Typing indicator */ +.typingIndicatorContainer { + display: flex; + flex: none; + align-items: flex-end; + margin: 4 0; +} + +.typingIndicatorBubble { + display: flex; + align-items: center; + justify-content: center; + width: 52px; + height: 34px; + margin: 0px 8px; + background-color: #f0f1f1; + border-radius: 12px; +} + +.typingIndicatorBubbleDot { + width: 4px; + height: 4px; + margin-right: 4px; + background-color: #57585a; + border-radius: 50%; + animation-name: bounce; + animation-duration: 1.3s; + animation-timing-function: linear; + animation-iteration-count: infinite; +} + +.typingIndicatorBubbleDot:first-of-type { + margin: 0px 4px; +} + +.typingIndicatorBubbleDot:nth-of-type(2) { + animation-delay: 0.15s; +} + +.typingIndicatorBubbleDot:nth-of-type(3) { + animation-delay: 0.3s; +} + +@keyframes bounce { + 0%, + 60%, + 100% { + transform: translateY(0); + } + 30% { + transform: translateY(-4px); + } +} diff --git a/app/app/layout.tsx b/app/app/layout.tsx new file mode 100644 index 000000000..1855cd0bc --- /dev/null +++ b/app/app/layout.tsx @@ -0,0 +1,26 @@ +import "./globals.css"; +import { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Jan", + description: + "Self-hosted, local, AI Inference Platform that scales from personal use to production deployments for a team.", + metadataBase: new URL( + process.env.NEXT_PUBLIC_WEB_URL ?? "https://cloud.jan.ai" + ), + openGraph: { + images: "images/preview.jpg", + }, +}; + +type Props = { + children: React.ReactNode; +}; + +export default function RootLayout({ children }: Props) { + return ( + <html lang="en" suppressHydrationWarning> + <body>{children}</body> + </html> + ); +} diff --git a/app/app/page.tsx b/app/app/page.tsx new file mode 100644 index 000000000..55519fa47 --- /dev/null +++ b/app/app/page.tsx @@ -0,0 +1,79 @@ +"use client"; + +import { ThemeWrapper } from "./_helpers/ThemeWrapper"; +import JotaiWrapper from "./_helpers/JotaiWrapper"; +import RightContainer from "./_components/RightContainer"; +import { ModalWrapper } from "./_helpers/ModalWrapper"; +import { useEffect, useState } from "react"; + +import { + setup, + plugins, + activationPoints, +} from "../electron/core/plugin-manager/execution/index"; +import { + isCorePluginInstalled, + setupBasePlugins, +} from "./_services/pluginService"; +import LeftContainer2 from "./_components/LeftContainer2"; +import EventListenerWrapper from "./_helpers/EventListenerWrapper"; + +const Page: React.FC = () => { + const [activated, setActivated] = useState(false); + useEffect(() => { + async function setupPE() { + // Enable activation point management + setup({ + //@ts-ignore + importer: (plugin) => + import(/* webpackIgnore: true */ plugin).catch((err) => { + console.log(err); + }), + }); + + // Register all active plugins with their activation points + await plugins.registerActive(); + setTimeout(async () => { + // Trigger activation points + await activationPoints.trigger("init"); + if (!isCorePluginInstalled()) { + alert( + "It seems like you don't have all required plugins installed. To use this app, please install all required plugins." + ); + setupBasePlugins(); + return; + } + setActivated(true); + }, 500); + } + setupPE(); + }, []); + + return ( + <JotaiWrapper> + <EventListenerWrapper> + <ThemeWrapper> + <ModalWrapper> + {activated && ( + <div className="flex"> + <LeftContainer2 /> + <RightContainer /> + </div> + )} + {!activated && ( + <> + <img + className="w-full h-full object-cover" + alt="" + src="images/banner.jpg" + ></img> + </> + )} + </ModalWrapper> + </ThemeWrapper> + </EventListenerWrapper> + </JotaiWrapper> + ); +}; + +export default Page; diff --git a/web-client/app/privacy/page.tsx b/app/app/privacy/page.tsx similarity index 94% rename from web-client/app/privacy/page.tsx rename to app/app/privacy/page.tsx index 6d7c66337..b43eb88a9 100644 --- a/web-client/app/privacy/page.tsx +++ b/app/app/privacy/page.tsx @@ -14,8 +14,8 @@ const Page: React.FC = () => { <div className="absolute top-3 left-5"> <Link href="/" className="flex flex-row gap-2"> <div className="flex gap-[2px] items-center"> - <Image src={"/icons/app_icon.svg"} width={28} height={28} alt="" /> - <Image src={"/icons/Jan.svg"} width={27} height={12} alt="" /> + <Image src={"icons/app_icon.svg"} width={28} height={28} alt="" /> + <Image src={"icons/Jan.svg"} width={27} height={12} alt="" /> </div> </Link> </div> diff --git a/app/app/settings/page.tsx b/app/app/settings/page.tsx new file mode 100644 index 000000000..859c174d3 --- /dev/null +++ b/app/app/settings/page.tsx @@ -0,0 +1,11 @@ +import { Preferences } from "@/_components/Preferences"; + +const Settings = () => { + return ( + <div className="flex"> + <Preferences /> + </div> + ); +}; + +export default Settings; diff --git a/web-client/app/support/page.tsx b/app/app/support/page.tsx similarity index 83% rename from web-client/app/support/page.tsx rename to app/app/support/page.tsx index 3279148d6..2ec127221 100644 --- a/web-client/app/support/page.tsx +++ b/app/app/support/page.tsx @@ -14,8 +14,8 @@ const Page: React.FC = () => { <div className="absolute top-3 left-5"> <Link href="/" className="flex flex-row gap-2"> <div className="flex gap-[2px] items-center"> - <Image src={"/icons/app_icon.svg"} width={28} height={28} alt="" /> - <Image src={"/icons/Jan.svg"} width={27} height={12} alt="" /> + <Image src={"icons/app_icon.svg"} width={28} height={28} alt="" /> + <Image src={"icons/Jan.svg"} width={27} height={12} alt="" /> </div> </Link> </div> @@ -27,7 +27,7 @@ const Page: React.FC = () => { href={process.env.NEXT_PUBLIC_DISCORD_INVITATION_URL ?? "#"} target="_blank_" > - <Image src={"/icons/discord.svg"} width={70} height={70} alt="" /> + <Image src={"icons/discord.svg"} width={70} height={70} alt="" /> </Link> <p> If you have any questions or concerns about our privacy policy or diff --git a/web-client/dev.Dockerfile b/app/dev.Dockerfile similarity index 100% rename from web-client/dev.Dockerfile rename to app/dev.Dockerfile diff --git a/web-client/docker-compose.yml b/app/docker-compose.yml similarity index 100% rename from web-client/docker-compose.yml rename to app/docker-compose.yml diff --git a/app/electron/core/base-plugin/index.js b/app/electron/core/base-plugin/index.js new file mode 100644 index 000000000..a4a9e8345 --- /dev/null +++ b/app/electron/core/base-plugin/index.js @@ -0,0 +1,72 @@ +const inference = async (prompt) => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.sendInquiry(prompt); + resolve(response); + } + }); + +async function testInference(e) { + e.preventDefault(); + const message = new FormData(e.target).get("message"); + const resp = await inference(message); + alert(resp); +} + +const getButton = (text, func) => { + var element = document.createElement("button"); + element.innerText = text; + // Add styles to the button element + element.style.marginTop = "5px"; + element.style.marginRight = "5px"; + element.style.borderRadius = "0.375rem"; // Rounded-md + element.style.backgroundColor = "rgb(79, 70, 229)"; // bg-indigo-600 + element.style.paddingLeft = "0.875rem"; // + element.style.paddingRight = "0.875rem"; // + element.style.fontSize = "0.875rem"; // text-sm + element.style.fontWeight = "600"; // font-semibold + element.style.color = "white"; // text-white + element.style.height = "40px"; + element.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)"; // shadow-sm + element.addEventListener("click", func); + return element; +}; + +const experimentComponent = () => { + var parent = document.createElement("div"); + const label = document.createElement("p"); + label.style.marginTop = "5px"; + label.innerText = "Inference Plugin"; + parent.appendChild(label); + + const form = document.createElement("form"); + form.id = "test"; + form.style.display = "flex"; // Enable Flexbox + form.style.alignItems = "center"; // Center items horizontally + form.addEventListener("submit", testInference); + const input = document.createElement("input"); + input.style.borderRadius = "5px"; + input.style.borderColor = "#E5E7EB"; + input.style.marginTop = "5px"; + input.style.marginRight = "5px"; + input.name = "message"; + form.appendChild(input); + const button = getButton("Test Inference", null); + button.type = "submit"; + button.innerText = "Test Inference"; + form.appendChild(button); + + parent.appendChild(form); + return parent; +}; + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + register("inference", "inference", inference); + // Experiment UI - for Preferences + register( + "experimentComponent", + "base-plugin-experiment-component", + experimentComponent + ); +} diff --git a/app/electron/core/base-plugin/package-lock.json b/app/electron/core/base-plugin/package-lock.json new file mode 100644 index 000000000..5f22d4947 --- /dev/null +++ b/app/electron/core/base-plugin/package-lock.json @@ -0,0 +1,1455 @@ +{ + "name": "base-plugin", + "version": "2.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "base-plugin", + "version": "2.1.0", + "license": "MIT", + "devDependencies": { + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", + "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001535", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001535.tgz", + "integrity": "sha512-48jLyUkiWFfhm/afF7cQPqPjaUmSraEhK4j+FCTJpgnGGEZHqyLe3hmWH7lIooZdSzXL0ReMvHz0vKDoTBsrwg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.523", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz", + "integrity": "sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + } + } +} diff --git a/app/electron/core/base-plugin/package.json b/app/electron/core/base-plugin/package.json new file mode 100644 index 000000000..6b8346e5f --- /dev/null +++ b/app/electron/core/base-plugin/package.json @@ -0,0 +1,26 @@ +{ + "name": "base-plugin", + "version": "2.1.0", + "description": "", + "main": "dist/bundle.js", + "author": "Igor Honhoff", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "prepare": "webpack --config webpack.config.js", + "package": "rimraf ./base-plugin*.tgz && npm pack" + }, + "devDependencies": { + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "dependencies": {}, + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/app/electron/core/base-plugin/webpack.config.js b/app/electron/core/base-plugin/webpack.config.js new file mode 100644 index 000000000..7248a0990 --- /dev/null +++ b/app/electron/core/base-plugin/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + output: { + filename: "bundle.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/app/electron/core/data-plugin/index.js b/app/electron/core/data-plugin/index.js new file mode 100644 index 000000000..c3f23f756 --- /dev/null +++ b/app/electron/core/data-plugin/index.js @@ -0,0 +1,137 @@ +// Provide an async method to manipulate the price provided by the extension point +const PLUGIN_NAME = "data-plugin"; + +const getConversations = () => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "getConversations") + .then((res) => resolve(res)); + } else { + resolve([]); + } + }); +const getConversationMessages = (id) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "getConversationMessages", id) + .then((res) => resolve(res)); + } else { + resolve([]); + } + }); + +const createConversation = (conversation) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "storeConversation", conversation) + .then((res) => { + resolve(res); + }); + } else { + resolve("-"); + } + }); +const createMessage = (message) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "storeMessage", message) + .then((res) => resolve(res)); + } else { + resolve("-"); + } + }); + +const deleteConversation = (id) => + new Promise((resolve) => { + if (window && window.electronAPI) { + window.electronAPI + .invokePluginFunc(PLUGIN_NAME, "deleteConversation", id) + .then((res) => { + resolve(res); + }); + } else { + resolve("-"); + } + }); + +const setupDb = () => { + window.electronAPI.invokePluginFunc(PLUGIN_NAME, "init"); +}; + +const getButton = (text, func) => { + var element = document.createElement("button"); + element.innerText = text; + // Add styles to the button element + element.style.marginTop = "5px"; + element.style.marginRight = "5px"; + element.style.borderRadius = "0.375rem"; // Rounded-md + element.style.backgroundColor = "rgb(79, 70, 229)"; // bg-indigo-600 + element.style.padding = "0.875rem 1rem"; // px-3.5 py-2.5 + element.style.fontSize = "0.875rem"; // text-sm + element.style.fontWeight = "600"; // font-semibold + element.style.color = "white"; // text-white + element.style.boxShadow = "0 2px 4px rgba(0, 0, 0, 0.1)"; // shadow-sm + element.addEventListener("click", func); + return element; +}; +const experimentComponent = () => { + var parent = document.createElement("div"); + const label = document.createElement("p"); + label.style.marginTop = "5px"; + label.innerText = "Data Plugin"; + parent.appendChild(label); + const getConvs = getButton("Get Conversation", async () => { + // Define the action you want to perform when the button is clicked + alert(JSON.stringify(await getConversations())); + }); + const spawnConv = getButton("Spawn Conversation", async () => { + // Define the action you want to perform when the button is clicked + const id = await createConversation({ + name: "test", + model_id: "yolo", + }); + alert("A new conversation is created: " + id); + }); + const deleteLastConv = getButton("Delete Last Conversation", async () => { + // Define the action you want to perform when the button is clicked + const convs = await getConversations(); + await deleteConversation(convs[convs.length - 1].id); + alert("Last conversation is deleted"); + }); + const spawnMessage = getButton("Spawn Message", async () => { + const convs = await getConversations(); + await createMessage({ + name: "", + conversation_id: convs[0].id, + message: "yoo", + user: "user", + }); + alert("Message is created"); + }); + parent.appendChild(getConvs); + parent.appendChild(spawnConv); + parent.appendChild(deleteLastConv); + parent.appendChild(spawnMessage); + return parent; +}; + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + setupDb(); + register("getConversations", "getConv", getConversations, 1); + register("createConversation", "insertConv", createConversation); + register("deleteConversation", "deleteConv", deleteConversation); + register("createMessage", "insertMessage", createMessage); + register("getConversationMessages", "getMessages", getConversationMessages); + + // Experiment UI - for Preferences + register( + "experimentComponent", + "data-plugin-experiment-component", + experimentComponent + ); +} diff --git a/app/electron/core/data-plugin/module.js b/app/electron/core/data-plugin/module.js new file mode 100644 index 000000000..528be0548 --- /dev/null +++ b/app/electron/core/data-plugin/module.js @@ -0,0 +1,152 @@ +const sqlite3 = require("sqlite3").verbose(); +const path = require("path"); +const { app } = require("electron"); + +function init() { + const db = new sqlite3.Database(path.join(app.getPath("userData"), "jan.db")); + + db.serialize(() => { + db.run( + "CREATE TABLE IF NOT EXISTS models ( id INTEGER PRIMARY KEY, name TEXT, image TEXT, url TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);" + ); + db.run( + "CREATE TABLE IF NOT EXISTS conversations ( id INTEGER PRIMARY KEY, name TEXT, model_id INTEGER, image TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);" + ); + db.run( + "CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY, name TEXT, conversation_id INTEGER, user TEXT, message TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP);" + ); + }); + + const stmt = db.prepare( + "INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)" + ); + stmt.finalize(); + db.close(); +} +function getConversations() { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.all( + "SELECT * FROM conversations ORDER BY created_at DESC", + (err, row) => { + res(row); + } + ); + db.close(); + }); +} +function storeConversation(conversation) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const stmt = db.prepare( + "INSERT INTO conversations (name, model_id, image, message) VALUES (?, ?, ?, ?)" + ); + stmt.run( + conversation.name, + conversation.model_id, + conversation.image, + conversation.message, + function (err) { + if (err) { + // Handle the insertion error here + console.error(err.message); + res(undefined); + return; + } + const id = this.lastID; + console.log(`Record inserted successfully with ID ${id}`); + res(id); + return; + } + ); + stmt.finalize(); + }); + + db.close(); + }); +} +function storeMessage(message) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const stmt = db.prepare( + "INSERT INTO messages (name, conversation_id, user, message) VALUES (?, ?, ?, ?)" + ); + stmt.run( + message.name, + message.conversation_id, + message.user, + message.message, + function (err) { + if (err) { + // Handle the insertion error here + console.error(err.message); + res(undefined); + return; + } + const id = this.lastID; + console.log(`Record inserted successfully with ID ${id}`); + res(id); + return; + } + ); + stmt.finalize(); + }); + + db.close(); + }); +} +function deleteConversation(id) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + db.serialize(() => { + const deleteConv = db.prepare("DELETE FROM conversations WHERE id = ?"); + deleteConv.run(id); + deleteConv.finalize(); + const deleteMessages = db.prepare( + "DELETE FROM messages WHERE conversation_id = ?" + ); + deleteMessages.run(id); + deleteMessages.finalize(); + res([]); + }); + + db.close(); + }); +} + +function getConversationMessages(conversation_id) { + return new Promise((res) => { + const db = new sqlite3.Database( + path.join(app.getPath("userData"), "jan.db") + ); + + const query = `SELECT * FROM messages WHERE conversation_id = ${conversation_id} ORDER BY created_at DESC`; + db.all(query, (err, row) => { + res(row); + }); + db.close(); + }); +} + +module.exports = { + init, + getConversations, + deleteConversation, + storeConversation, + storeMessage, + getConversationMessages, +}; diff --git a/app/electron/core/data-plugin/package.json b/app/electron/core/data-plugin/package.json new file mode 100644 index 000000000..2e0fd352f --- /dev/null +++ b/app/electron/core/data-plugin/package.json @@ -0,0 +1,32 @@ +{ + "name": "data-plugin", + "version": "2.1.0", + "description": "", + "main": "dist/bundle.js", + "author": "Igor Honhoff", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "prepare": "webpack --config webpack.config.js", + "package": "rimraf ./data-plugin*.tgz && cp -f module.js ./dist/module.js && npm pack" + }, + "devDependencies": { + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "bundledDependencies": [ + "sql.js", + "sqlite3" + ], + "files": [ + "dist/*", + "package.json", + "README.md" + ], + "dependencies": { + "sqlite3": "^5.1.6" + } +} diff --git a/app/electron/core/data-plugin/webpack.config.js b/app/electron/core/data-plugin/webpack.config.js new file mode 100644 index 000000000..7248a0990 --- /dev/null +++ b/app/electron/core/data-plugin/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + output: { + filename: "bundle.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/app/electron/core/model-management-plugin/index.js b/app/electron/core/model-management-plugin/index.js new file mode 100644 index 000000000..1f934924f --- /dev/null +++ b/app/electron/core/model-management-plugin/index.js @@ -0,0 +1,48 @@ +const getDownloadedModels = async () => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.getDownloadedModels(); + resolve(response); + } + }); + +const getAvailableModels = async () => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.getAvailableModels(); + resolve(response); + } + }); + +const downloadModel = async (url) => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.downloadModel(url); + resolve(response); + } + }); + +const deleteModel = async (path) => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.deleteModel(path); + resolve(response); + } + }); + +const initModel = async (product) => + new Promise(async (resolve) => { + if (window.electronAPI) { + const response = await window.electronAPI.initModel(product); + resolve(response); + } + }); + +// Register all the above functions and objects with the relevant extension points +export function init({ register }) { + register("getDownloadedModels", "getDownloadedModels", getDownloadedModels); + register("getAvailableModels", "getAvailableModels", getAvailableModels); + register("downloadModel", "downloadModel", downloadModel); + register("deleteModel", "deleteModel", deleteModel); + register("initModel", "initModel", initModel); +} diff --git a/app/electron/core/model-management-plugin/package.json b/app/electron/core/model-management-plugin/package.json new file mode 100644 index 000000000..cba07a937 --- /dev/null +++ b/app/electron/core/model-management-plugin/package.json @@ -0,0 +1,26 @@ +{ + "name": "model-management-plugin", + "version": "0.0.1", + "description": "", + "main": "dist/bundle.js", + "author": "James", + "license": "MIT", + "activationPoints": [ + "init" + ], + "scripts": { + "prepare": "webpack --config webpack.config.js", + "package": "rimraf ./*.tgz && npm pack" + }, + "devDependencies": { + "rimraf": "^3.0.2", + "webpack": "^5.88.2", + "webpack-cli": "^5.1.4" + }, + "dependencies": {}, + "files": [ + "dist/*", + "package.json", + "README.md" + ] +} diff --git a/app/electron/core/model-management-plugin/webpack.config.js b/app/electron/core/model-management-plugin/webpack.config.js new file mode 100644 index 000000000..7248a0990 --- /dev/null +++ b/app/electron/core/model-management-plugin/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +module.exports = { + experiments: { outputModule: true }, + entry: "./index.js", // Adjust the entry point to match your project's main file + output: { + filename: "bundle.js", // Adjust the output file name as needed + path: path.resolve(__dirname, "dist"), + library: { type: "module" }, // Specify ESM output format + }, + resolve: { + extensions: [".js"], + }, + // Add loaders and other configuration as needed for your project +}; diff --git a/app/electron/core/plugin-manager/execution/Activation.js b/app/electron/core/plugin-manager/execution/Activation.js new file mode 100644 index 000000000..3381e428f --- /dev/null +++ b/app/electron/core/plugin-manager/execution/Activation.js @@ -0,0 +1,37 @@ +import { callExport } from "./import-manager.js" + +class Activation { + /** @type {string} Name of the registered plugin. */ + plugin + + /** @type {string} Name of the activation point that is registered to. */ + activationPoint + + /** @type {string} location of the file containing the activation function. */ + url + + /** @type {boolean} Whether the activation has been activated. */ + activated + + constructor(plugin, activationPoint, url) { + this.plugin = plugin + this.activationPoint = activationPoint + this.url = url + this.activated = false + } + + /** + * Trigger the activation function in the plugin once, + * providing the list of extension points or an object with the extension point's register, execute and executeSerial functions. + * @returns {boolean} Whether the activation has already been activated. + */ + async trigger() { + if (!this.activated) { + await callExport(this.url, this.activationPoint, this.plugin) + this.activated = true + } + return this.activated + } +} + +export default Activation diff --git a/app/electron/core/plugin-manager/execution/ExtensionPoint.js b/app/electron/core/plugin-manager/execution/ExtensionPoint.js new file mode 100644 index 000000000..b3caba012 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/ExtensionPoint.js @@ -0,0 +1,145 @@ +/** + * @typedef {Object} Extension An extension registered to an extension point + * @property {string} name Unique name for the extension. + * @property {Object|Callback} response Object to be returned or function to be called by the extension point. + * @property {number} [priority] Order priority for execution used for executing in serial. + */ + +/** + * Represents a point in the consumer's code that can be extended by a plugin. + * The plugin can register a callback or object to the extension point. + * When the extension point is triggered, the provided function will then be called or object will be returned. + */ +class ExtensionPoint { + /** @type {string} Name of the extension point */ + name + + /** + * @type {Array.<Extension>} The list of all extensions registered with this extension point. + * @private + */ + _extensions = [] + + /** + * @type {Array.<Object>} A list of functions to be executed when the list of extensions changes. + * @private + */ + #changeListeners = [] + + constructor(name) { + this.name = name + } + + /** + * Register new extension with this extension point. + * The registered response will be executed (if callback) or returned (if object) + * when the extension point is executed (see below). + * @param {string} name Unique name for the extension. + * @param {Object|Callback} response Object to be returned or function to be called by the extension point. + * @param {number} [priority] Order priority for execution used for executing in serial. + * @returns {void} + */ + register(name, response, priority = 0) { + const index = this._extensions.findIndex(p => p.priority > priority) + const newExt = { name, response, priority } + if (index > -1) { + this._extensions.splice(index, 0, newExt) + } else { + this._extensions.push(newExt) + } + + this.#emitChange() + } + + /** + * Remove an extension from the registry. It will no longer be part of the extension point execution. + * @param {RegExp } name Matcher for the name of the extension to remove. + * @returns {void} + */ + unregister(name) { + const index = this._extensions.findIndex(ext => ext.name.match(name)) + if (index > -1) this._extensions.splice(index, 1) + + this.#emitChange() + } + + /** + * Empty the registry of all extensions. + * @returns {void} + */ + clear() { + this._extensions = [] + this.#emitChange() + } + + /** + * Get a specific extension registered with the extension point + * @param {string} name Name of the extension to return + * @returns {Object|Callback|undefined} The response of the extension. If this is a function the function is returned, not its response. + */ + get(name) { + const ep = this._extensions.find(ext => ext.name === name) + return ep && ep.response + } + + /** + * Execute (if callback) and return or just return (if object) the response for each extension registered to this extension point. + * Any asynchronous responses will be executed in parallel and the returned array will contain a promise for each of these responses. + * @param {*} input Input to be provided as a parameter to each response if response is a callback. + * @returns {Array} List of responses from the extensions. + */ + execute(input) { + return this._extensions.map(p => { + if (typeof p.response === 'function') { + return p.response(input) + } else { + return p.response + } + }) + } + + /** + * Execute (if callback) and return the response, or push it to the array if the previous response is an array + * for each extension registered to this extension point in serial, + * feeding the result from the last response as input to the next. + * @param {*} input Input to be provided as a parameter to the 1st callback + * @returns {Promise.<*>} Result of the last extension that was called + */ + async executeSerial(input) { + return await this._extensions.reduce(async (throughput, p) => { + let tp = await throughput + if (typeof p.response === 'function') { + tp = await p.response(tp) + } else if (Array.isArray(tp)) { + tp.push(p.response) + } + return tp + }, input) + } + + /** + * Register a callback to be executed if the list of extensions changes. + * @param {string} name Name of the listener needed if it is to be removed. + * @param {Function} callback The callback function to trigger on a change. + */ + onRegister(name, callback) { + if (typeof callback === 'function') this.#changeListeners.push({ name, callback }) + } + + /** + * Unregister a callback from the extension list changes. + * @param {string} name The name of the listener to remove. + */ + offRegister(name) { + const index = this.#changeListeners.findIndex(l => l.name === name) + if (index > -1) this.#changeListeners.splice(index, 1) + } + + #emitChange() { + for (const l of this.#changeListeners) { + l.callback(this) + } + } +} + +export default ExtensionPoint \ No newline at end of file diff --git a/app/electron/core/plugin-manager/execution/ExtensionPoint.test.js b/app/electron/core/plugin-manager/execution/ExtensionPoint.test.js new file mode 100644 index 000000000..54d7b37ec --- /dev/null +++ b/app/electron/core/plugin-manager/execution/ExtensionPoint.test.js @@ -0,0 +1,116 @@ +import Ep from './ExtensionPoint' + +/** @type {Ep} */ +let ep +const changeListener = jest.fn() + +const objectRsp = { foo: 'bar' } +const funcRsp = arr => { + arr || (arr = []) + arr.push({ foo: 'baz' }) + return arr +} + +beforeEach(() => { + ep = new Ep('test-ep') + ep.register('test-ext-obj', objectRsp) + ep.register('test-ext-func', funcRsp, 10) + ep.onRegister('test', changeListener) +}) + + +it('should create a new extension point by providing a name', () => { + expect(ep.name).toEqual('test-ep') +}) + +it('should register extension with extension point', () => { + expect(ep._extensions).toContainEqual({ + name: 'test-ext-func', + response: funcRsp, + priority: 10 + }) +}) + +it('should register extension with a default priority of 0 if not provided', () => { + expect(ep._extensions).toContainEqual({ + name: 'test-ext-obj', + response: objectRsp, + priority: 0 + }) +}) + +it('should execute the change listeners on registering a new extension', () => { + changeListener.mockClear() + ep.register('test-change-listener', true) + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should unregister an extension with the provided name if it exists', () => { + ep.unregister('test-ext-obj') + + expect(ep._extensions).not.toContainEqual( + expect.objectContaining({ + name: 'test-ext-obj' + }) + ) +}) + +it('should not unregister any extensions if the provided name does not exist', () => { + ep.unregister('test-ext-invalid') + + expect(ep._extensions.length).toBe(2) +}) + +it('should execute the change listeners on unregistering an extension', () => { + changeListener.mockClear() + ep.unregister('test-ext-obj') + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should empty the registry of all extensions on clearing', () => { + ep.clear() + + expect(ep._extensions).toEqual([]) +}) + +it('should execute the change listeners on clearing extensions', () => { + changeListener.mockClear() + ep.clear() + expect(changeListener.mock.calls.length).toBeTruthy() +}) + +it('should return the relevant extension using the get method', () => { + const ext = ep.get('test-ext-obj') + + expect(ext).toEqual({ foo: 'bar' }) +}) + +it('should return the false using the get method if the extension does not exist', () => { + const ext = ep.get('test-ext-invalid') + + expect(ext).toBeUndefined() +}) + +it('should provide an array with all responses, including promises where necessary, using the execute method', async () => { + ep.register('test-ext-async', () => new Promise(resolve => setTimeout(resolve, 0, { foo: 'delayed' }))) + const arr = ep.execute([]) + + const res = await Promise.all(arr) + + expect(res).toContainEqual({ foo: 'bar' }) + expect(res).toContainEqual([{ foo: 'baz' }]) + expect(res).toContainEqual({ foo: 'delayed' }) + expect(res.length).toBe(3) +}) + +it('should provide an array including all responses in priority order, using the executeSerial method provided with an array', async () => { + const res = await ep.executeSerial([]) + + expect(res).toEqual([{ "foo": "bar" }, { "foo": "baz" }]) +}) + +it('should provide an array including the last response using the executeSerial method provided with something other than an array', async () => { + const res = await ep.executeSerial() + + expect(res).toEqual([{ "foo": "baz" }]) +}) diff --git a/app/electron/core/plugin-manager/execution/Plugin.js b/app/electron/core/plugin-manager/execution/Plugin.js new file mode 100644 index 000000000..5c6462aee --- /dev/null +++ b/app/electron/core/plugin-manager/execution/Plugin.js @@ -0,0 +1,35 @@ +import { callExport } from "./import-manager" + +/** + * A slimmed down representation of a plugin for the renderer. + */ +class Plugin { + /** @type {string} Name of the package. */ + name + + /** @type {string} The electron url where this plugin is located. */ + url + + /** @type {Array<string>} List of activation points. */ + activationPoints + + /** @type {boolean} Whether this plugin should be activated when its activation points are triggered. */ + active + + constructor(name, url, activationPoints, active) { + this.name = name + this.url = url + this.activationPoints = activationPoints + this.active = active + } + + /** + * Trigger an exported callback on the plugin's main file. + * @param {string} exp exported callback to trigger. + */ + triggerExport(exp) { + callExport(this.url, exp, this.name) + } +} + +export default Plugin \ No newline at end of file diff --git a/app/electron/core/plugin-manager/execution/Plugin.test.js b/app/electron/core/plugin-manager/execution/Plugin.test.js new file mode 100644 index 000000000..7982decdc --- /dev/null +++ b/app/electron/core/plugin-manager/execution/Plugin.test.js @@ -0,0 +1,22 @@ +import { setImporter } from "./import-manager" +import Plugin from './Plugin' + +describe('triggerExport', () => { + it('should call the provided export on the plugin\'s main file', async () => { + // Set up mock importer with mock main plugin file + const mockExport = jest.fn() + const mockImporter = jest.fn(() => ({ + lifeCycleFn: mockExport + })) + setImporter(mockImporter) + + // Call triggerExport on new plugin + const plgUrl = 'main' + const plugin = new Plugin('test', plgUrl, ['ap1'], true) + await plugin.triggerExport('lifeCycleFn') + + // Check results + expect(mockImporter.mock.lastCall).toEqual([plgUrl]) + expect(mockExport.mock.calls.length).toBeTruthy() + }) +}) \ No newline at end of file diff --git a/app/electron/core/plugin-manager/execution/activation-manager.js b/app/electron/core/plugin-manager/execution/activation-manager.js new file mode 100644 index 000000000..01eeed2a2 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/activation-manager.js @@ -0,0 +1,88 @@ +import Activation from "./Activation.js" + +/** + * This object contains a register of plugin registrations to an activation points, and the means to work with them. + * @namespace activationPoints + */ + +/** + * @constant {Array.<Activation>} activationRegister + * @private + * Store of activations used by the consumer + */ +const activationRegister = [] + +/** + * Register a plugin with its activation points (as defined in its manifest). + * @param {Plugin} plugin plugin object as provided by the main process. + * @returns {void} + * @alias activationPoints.register + */ +export function register(plugin) { + if (!Array.isArray(plugin.activationPoints)) throw new Error( + `Plugin ${plugin.name || 'without name'} does not have any activation points set up in its manifest.` + ) + for (const ap of plugin.activationPoints) { + // Ensure plugin is not already registered to activation point + const duplicate = activationRegister.findIndex(act => + act.plugin === plugin.name && act.activationPoint === ap + ) + + // Create new activation and add it to the register + if (duplicate < 0) activationRegister.push(new Activation(plugin.name, ap, plugin.url)) + } +} + +/** + * Trigger all activations registered to the given activation point. See {@link Plugin}. + * This will call the function with the same name as the activation point on the path specified in the plugin. + * @param {string} activationPoint Name of the activation to trigger + * @returns {Promise.<Boolean>} Resolves to true when the activations are complete. + * @alias activationPoints.trigger + */ +export async function trigger(activationPoint) { + // Make sure all triggers are complete before returning + await Promise.all( + // Trigger each relevant activation point from the register and return an array of trigger promises + activationRegister.reduce((triggered, act) => { + if (act.activationPoint === activationPoint) { + triggered.push(act.trigger()) + } + return triggered + }, []) + ) + return true +} + +/** + * Remove a plugin from the activations register. + * @param {string} plugin Name of the plugin to remove. + * @returns {void} + * @alias activationPoints.remove + */ +export function remove(plugin) { + let i = activationRegister.length + while (i--) { + if (activationRegister[i].plugin === plugin) { + activationRegister.splice(i, 1) + } + } +} + +/** + * Remove all activations from the activation register. + * @returns {void} + * @alias activationPoints.clear + */ +export function clear() { + activationRegister.length = 0 +} + +/** + * Fetch all activations. + * @returns {Array.<Activation>} Found extension points + * @alias activationPoints.get + */ +export function get() { + return [...activationRegister] +} \ No newline at end of file diff --git a/app/electron/core/plugin-manager/execution/activation-manager.test.js b/app/electron/core/plugin-manager/execution/activation-manager.test.js new file mode 100644 index 000000000..dd7ff9251 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/activation-manager.test.js @@ -0,0 +1,307 @@ +import { setup } from './index' +import { register, trigger, remove, clear, get } from "./activation-manager"; +import { add } from './extension-manager' + +let mockPlugins = {} +setup({ + importer(plugin) { return mockPlugins[plugin] } +}) + +afterEach(() => { + clear() + mockPlugins = {} +}) + +describe('register', () => { + it('should add a new activation point to the register when a new, valid plugin is registered', + () => { + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + expect(get()).toEqual([ + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap2', + activated: false + } + ]) + } + ) + + it('should not add an activation point to the register when an existing, valid plugin is registered', + () => { + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + register({ + name: 'test', + url: 'testPkg', + activationPoints: ['ap2', 'ap3'], + active: true + }) + + expect(get()).toEqual([ + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'test', + url: 'testPkg', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should throw an error when an invalid plugin is registered', + () => { + const noActivationPoints = () => register({ + name: 'test', + url: 'testPkg', + active: true + }) + + expect(noActivationPoints).toThrow(/does not have any activation points set up in its manifest/) + } + ) +}) + +describe('trigger', () => { + it('should trigger all and only the activations with for the given execution point on triggering an execution, using the defined importer', + async () => { + const triggered = [] + + mockPlugins.plugin1 = { + ap1() { triggered.push('plugin1-ap1') } + } + mockPlugins.plugin2 = { + ap2() { triggered.push('plugin2-ap2') } + } + mockPlugins.plugin3 = { + ap1() { triggered.push('plugin3-ap1') }, + ap2() { triggered.push('plugin3-ap2') } + } + + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'], + active: true + }) + register({ + name: 'plugin2', + url: 'plugin2', + activationPoints: ['ap2'], + active: true + }) + register({ + name: 'plugin3', + url: 'plugin3', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + await trigger('ap1') + + expect(triggered).toEqual(['plugin1-ap1', 'plugin3-ap1']) + } + ) + + it('should return an error if an activation point is triggered on a plugin that does not include it', + async () => { + mockPlugins.plugin1 = { + wrongAp() { } + } + + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await expect(() => trigger('ap1')).rejects.toThrow(/was triggered but does not exist on plugin/) + } + ) + + it('should provide the registered extension points to the triggered activation point if presetEPs is set to true in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + presetEPs: true, + }) + + let ap1Res + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + add('ep1') + add('ep2') + + await trigger('ap1') + + expect(ap1Res.ep1.constructor.name).toEqual('ExtensionPoint') + expect(ap1Res.ep2.constructor.name).toEqual('ExtensionPoint') + } + ) + + it('should allow registration, execution and serial execution of execution points when an activation point is triggered if presetEPs is set to false in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + }) + + let ap1Res + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await trigger('ap1') + + expect(typeof ap1Res.register).toBe('function') + expect(typeof ap1Res.execute).toBe('function') + expect(typeof ap1Res.executeSerial).toBe('function') + } + ) + + it('should not provide any reference to extension points during activation point triggering if presetEPs is set to null in the setup', + async () => { + setup({ + importer(plugin) { return mockPlugins[plugin] }, + presetEPs: null, + }) + + let ap1Res = true + + mockPlugins.plugin1 = { + ap1: eps => ap1Res = eps + } + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1'] + }) + + await trigger('ap1') + + expect(ap1Res).not.toBeDefined() + } + ) +}) + +describe('remove and clear', () => { + + beforeEach(() => { + register({ + name: 'plugin1', + url: 'plugin1', + activationPoints: ['ap1', 'ap2'], + active: true + }) + + register({ + name: 'plugin2', + url: 'plugin2', + activationPoints: ['ap2', 'ap3'], + active: true + }) + }) + it('should remove all and only the activations for the given plugin from the register when removing activations', + () => { + remove('plugin1') + + expect(get()).toEqual([ + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should not remove any activations from the register if no plugin name is provided', + () => { + remove() + + expect(get()).toEqual([ + { + plugin: 'plugin1', + url: 'plugin1', + activationPoint: 'ap1', + activated: false + }, + { + plugin: 'plugin1', + url: 'plugin1', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap2', + activated: false + }, + { + plugin: 'plugin2', + url: 'plugin2', + activationPoint: 'ap3', + activated: false + }, + ]) + } + ) + + it('should remove all activations from the register when clearing the register', + () => { + clear() + + expect(get()).toEqual([]) + } + ) +}) diff --git a/app/electron/core/plugin-manager/execution/extension-manager.js b/app/electron/core/plugin-manager/execution/extension-manager.js new file mode 100644 index 000000000..48b2e893a --- /dev/null +++ b/app/electron/core/plugin-manager/execution/extension-manager.js @@ -0,0 +1,98 @@ +/** + * This object contains a register of {@link ExtensionPoint|extension points} and the means to work with them. + * @namespace extensionPoints + */ + +import ExtensionPoint from "./ExtensionPoint.js" + +/** + * @constant {Object.<string, ExtensionPoint>} extensionPoints + * @private + * Register of extension points created by the consumer + */ +const _extensionPoints = {} + +/** + * Create new extension point and add it to the registry. + * @param {string} name Name of the extension point. + * @returns {void} + * @alias extensionPoints.add + */ +export function add(name) { + _extensionPoints[name] = new ExtensionPoint(name) +} + +/** + * Remove an extension point from the registry. + * @param {string} name Name of the extension point + * @returns {void} + * @alias extensionPoints.remove + */ +export function remove(name) { + delete _extensionPoints[name] +} + +/** + * Create extension point if it does not exist and then register the given extension to it. + * @param {string} ep Name of the extension point. + * @param {string} extension Unique name for the extension. + * @param {Object|Callback} response Object to be returned or function to be called by the extension point. + * @param {number} [priority=0] Order priority for execution used for executing in serial. + * @returns {void} + * @alias extensionPoints.register + */ +export function register(ep, extension, response, priority) { + if (!_extensionPoints[ep]) add(ep) + if (_extensionPoints[ep].register) { + _extensionPoints[ep].register(extension, response, priority) + } +} + +/** + * Remove extensions matching regular expression from all extension points. + * @param {RegExp} name Matcher for the name of the extension to remove. + * @alias extensionPoints.unregisterAll + */ +export function unregisterAll(name) { + for (const ep in _extensionPoints) _extensionPoints[ep].unregister(name) +} + +/** + * Fetch extension point by name. or all extension points if no name is given. + * @param {string} [ep] Extension point to return + * @returns {Object.<ExtensionPoint> | ExtensionPoint} Found extension points + * @alias extensionPoints.get + */ +export function get(ep) { + return (ep ? _extensionPoints[ep] : { ..._extensionPoints }) +} + +/** + * Call all the extensions registered to an extension point synchronously. See execute on {@link ExtensionPoint}. + * Call this at the point in the base code where you want it to be extended. + * @param {string} name Name of the extension point to call + * @param {*} [input] Parameter to provide to the extensions if they are a function + * @returns {Array} Result of Promise.all or Promise.allSettled depending on exitOnError + * @alias extensionPoints.execute + */ +export function execute(name, input) { + if (!_extensionPoints[name] || !_extensionPoints[name].execute) throw new Error( + `The extension point "${name}" is not a valid extension point` + ) + return _extensionPoints[name].execute(input) +} + +/** + * Calls all the extensions registered to the extension point in serial. See executeSerial on {@link ExtensionPoint} + * Call this at the point in the base code where you want it to be extended. + * @param {string} name Name of the extension point to call + * @param {*} [input] Parameter to provide to the extensions if they are a function + * @returns {Promise.<*>} Result of the last extension that was called + * @alias extensionPoints.executeSerial + */ +export function executeSerial(name, input) { + if (!_extensionPoints[name] || !_extensionPoints[name].executeSerial) throw new Error( + `The extension point "${name}" is not a valid extension point` + ) + return _extensionPoints[name].executeSerial(input) +} diff --git a/app/electron/core/plugin-manager/execution/extension-manager.test.js b/app/electron/core/plugin-manager/execution/extension-manager.test.js new file mode 100644 index 000000000..dd934f872 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/extension-manager.test.js @@ -0,0 +1,116 @@ +import { add, remove, register, get, execute, executeSerial, unregisterAll } from './extension-manager' +import ExtensionPoint from './ExtensionPoint' + +beforeEach(() => { + add('ep1') + add('ep2') +}) + +afterEach(() => { + remove('ep1') + remove('ep2') + remove('ep3') +}) + +describe('get', () => { + it('should return the extension point with the given name if it exists', () => { + expect(get('ep1')).toBeInstanceOf(ExtensionPoint) + }) + + it('should return all extension points if no name is provided', () => { + expect(get()).toEqual(expect.objectContaining({ ep1: expect.any(ExtensionPoint) })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) +}) + +describe('Add and remove', () => { + it('should add a new extension point with the given name using the add function', () => { + add('ep1') + + expect(get('ep1')).toBeInstanceOf(ExtensionPoint) + }) + + it('should remove only the extension point with the given name using the remove function', () => { + remove('ep1') + + expect(get()).not.toEqual(expect.objectContaining({ ep1: expect.anything() })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) + + it('should not remove any extension points if no name is provided using the remove function', () => { + remove() + + expect(get()).toEqual(expect.objectContaining({ ep1: expect.any(ExtensionPoint) })) + expect(get()).toEqual(expect.objectContaining({ ep2: expect.any(ExtensionPoint) })) + }) +}) + +describe('register', () => { + it('should register an extension to an existing extension point if the point has already been created', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(get('ep1')._extensions).toContainEqual(expect.objectContaining({ name: 'extension1' })) + }) + + it('should create an extension point and register an extension to it if the point has not yet been created', () => { + register('ep3', 'extension1', { foo: 'bar' }) + + expect(get('ep3')._extensions).toContainEqual(expect.objectContaining({ name: 'extension1' })) + }) +}) + +describe('unregisterAll', () => { + it('should unregister all extension points matching the give name regex', () => { + // Register example extensions + register('ep1', 'remove1', { foo: 'bar' }) + register('ep2', 'remove2', { foo: 'bar' }) + register('ep1', 'keep', { foo: 'bar' }) + + // Remove matching extensions + unregisterAll(/remove/) + + // Extract all registered extensions + const eps = Object.values(get()).map(ep => ep._extensions) + const extensions = eps.flat() + + // Test extracted extensions + expect(extensions).toContainEqual(expect.objectContaining({ name: 'keep' })) + expect(extensions).not.toContainEqual(expect.objectContaining({ name: 'ep1' })) + expect(extensions).not.toContainEqual(expect.objectContaining({ name: 'ep2' })) + }) +}) + +describe('execute', () => { + it('should execute the extensions registered to the named extension point with the provided input', () => { + const result = [] + register('ep1', 'extension1', input => result.push(input + 'bar')) + register('ep1', 'extension2', input => result.push(input + 'baz')) + + execute('ep1', 'foo') + + expect(result).toEqual(['foobar', 'foobaz']) + }) + + it('should throw an error if the named extension point does not exist', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(() => execute('ep3')).toThrow(/not a valid extension point/) + }) +}) + +describe('executeSerial', () => { + it('should execute the extensions in serial registered to the named extension point with the provided input', async () => { + register('ep1', 'extension1', input => input + 'bar') + register('ep1', 'extension2', input => input + 'baz') + + const result = await executeSerial('ep1', 'foo') + + expect(result).toEqual('foobarbaz') + }) + + it('should throw an error if the named extension point does not exist', () => { + register('ep1', 'extension1', { foo: 'bar' }) + + expect(() => executeSerial('ep3')).toThrow(/not a valid extension point/) + }) +}) diff --git a/app/electron/core/plugin-manager/execution/facade.js b/app/electron/core/plugin-manager/execution/facade.js new file mode 100644 index 000000000..d153e283c --- /dev/null +++ b/app/electron/core/plugin-manager/execution/facade.js @@ -0,0 +1,148 @@ +/** + * Helper functions to access the plugin management in the main process. + * Note that the facade needs to be imported separately as "pluggable-electron/facade" as described above. + * It is then available on the global window object as describe in the {@link https://www.electronjs.org/docs/api/context-bridge|Electron documentation} + * @namespace plugins + */ + +import Plugin from "./Plugin"; +import { register } from "./activation-manager"; + +/** + * @typedef {Object.<string, any>} installOptions The {@link https://www.npmjs.com/package/pacote|pacote options} + * used to install the plugin. + * @param {string} specifier the NPM specifier that identifies the package. + * @param {boolean} [activate=true] Whether this plugin should be activated after installation. + */ + +/** + * Install a new plugin. + * @param {Array.<installOptions | string>} plugins A list of NPM specifiers, or installation configuration objects. + * @returns {Promise.<Array.<Plugin> | false>} plugin as defined by the main process. Has property cancelled set to true if installation was cancelled in the main process. + * @alias plugins.install + */ +export async function install(plugins) { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.install(plugins); + if (plgList.cancelled) return false; + return plgList.map((plg) => { + const plugin = new Plugin( + plg.name, + plg.url, + plg.activationPoints, + plg.active + ); + register(plugin); + return plugin; + }); +} + +/** + * Uninstall provided plugins + * @param {Array.<string>} plugins List of names of plugins to uninstall. + * @param {boolean} reload Whether to reload all renderers after updating the plugins. + * @returns {Promise.<boolean>} Whether uninstalling the plugins was successful. + * @alias plugins.uninstall + */ +export function uninstall(plugins, reload = true) { + if (typeof window === "undefined") { + return; + } + return window.pluggableElectronIpc.uninstall(plugins, reload); +} + +/** + * Fetch a list of all the active plugins. + * @returns {Promise.<Array.<Plugin>>} List of plugins as defined by the main process. + * @alias plugins.getActive + */ +export async function getActive() { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.getActive(); + return plgList.map( + (plugin) => + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ); +} + +/** + * Register all the active plugins. + * @returns {Promise.<Array.<Plugin>>} List of plugins as defined by the main process. + * @alias plugins.registerActive + */ +export async function registerActive() { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.getActive(); + plgList.forEach((plugin) => + register( + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ) + ); +} + +/** + * Update provided plugins to its latest version. + * @param {Array.<string>} plugins List of plugins to update by name. + * @param {boolean} reload Whether to reload all renderers after updating the plugins. + * @returns {Promise.<Array.<Plugin>>} Updated plugin as defined by the main process. + * @alias plugins.update + */ +export async function update(plugins, reload = true) { + if (typeof window === "undefined") { + return; + } + const plgList = await window.pluggableElectronIpc.update(plugins, reload); + return plgList.map( + (plugin) => + new Plugin( + plugin.name, + plugin.url, + plugin.activationPoints, + plugin.active + ) + ); +} + +/** + * Check if an update is available for provided plugins. + * @param {Array.<string>} plugin List of plugin names to check for available updates. + * @returns {Object.<string | false>} Object with plugins as keys and new version if update is available or false as values. + * @alias plugins.updatesAvailable + */ +export function updatesAvailable(plugin) { + if (typeof window === "undefined") { + return; + } + return window.pluggableElectronIpc.updatesAvailable(plugin); +} + +/** + * Toggle a plugin's active state. This determines if a plugin should be loaded in initialisation. + * @param {String} plugin Plugin to toggle. + * @param {boolean} active Whether plugin should be activated (true) or deactivated (false). + * @returns {Promise.<Plugin>} Updated plugin as defined by the main process. + * @alias plugins.toggleActive + */ +export async function toggleActive(plugin, active) { + if (typeof window === "undefined") { + return; + } + const plg = await window.pluggableElectronIpc.toggleActive(plugin, active); + return new Plugin(plg.name, plg.url, plg.activationPoints, plg.active); +} diff --git a/app/electron/core/plugin-manager/execution/import-manager.js b/app/electron/core/plugin-manager/execution/import-manager.js new file mode 100644 index 000000000..0d25297a2 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/import-manager.js @@ -0,0 +1,77 @@ +import { + get as getEPs, + register, + execute, + executeSerial, +} from "./extension-manager.js"; +/** + * Used to import a plugin entry point. + * Ensure your bundler does no try to resolve this import as the plugins are not known at build time. + * @callback importer + * @param {string} entryPoint File to be imported. + * @returns {module} The module containing the entry point function. + */ + +/** + * @private + * @type {importer} + */ +export let importer; + +/** + * @private + * Set the plugin importer function. + * @param {importer} callback Callback to import plugins. + */ +export function setImporter(callback) { + importer = callback; +} + +/** + * @private + * @type {Boolean|null} + */ +export let presetEPs; + +/** + * @private + * Define how extension points are accessed. + * @param {Boolean|null} peps Whether extension points are predefined. + */ +export function definePresetEps(peps) { + presetEPs = peps === null || peps === true ? peps : false; +} + +/** + * @private + * Call exported function on imported module. + * @param {string} url @see Activation + * @param {string} exp Export to call + * @param {string} [plugin] @see Activation + */ +export async function callExport(url, exp, plugin) { + if (!importer) throw new Error("Importer callback has not been set"); + + const main = await importer(url); + if (!main || typeof main[exp] !== "function") { + throw new Error( + `Activation point "${exp}" was triggered but does not exist on ${ + plugin ? "plugin " + plugin : "unknown plugin" + }` + ); + } + const activate = main[exp]; + switch (presetEPs) { + case true: + activate(getEPs()); + break; + + case null: + activate(); + break; + + default: + activate({ register, execute, executeSerial }); + break; + } +} diff --git a/app/electron/core/plugin-manager/execution/index.js b/app/electron/core/plugin-manager/execution/index.js new file mode 100644 index 000000000..3e0ce3820 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/index.js @@ -0,0 +1,24 @@ +import { definePresetEps, setImporter } from "./import-manager.js"; + +export * as extensionPoints from "./extension-manager.js"; +export * as activationPoints from "./activation-manager.js"; +export * as plugins from "./facade"; +export { default as ExtensionPoint } from "./ExtensionPoint.js"; + +if (typeof window === "undefined" || !window.pluggableElectronIpc) + console.warn( + "Facade is not registered in preload. Facade functions will throw an error if used." + ); + +/** + * Set the renderer options for Pluggable Electron. Should be called before any other Pluggable Electron function in the renderer + * @param {Object} options + * @param {importer} options.importer The callback function used to import the plugin entry points. + * @param {Boolean|null} [options.presetEPs=false] Whether the Extension Points have been predefined (true), + * can be created on the fly(false) or should not be provided through the input at all (null). + * @returns {void} + */ +export function setup(options) { + setImporter(options.importer); + definePresetEps(options.presetEPs); +} diff --git a/app/electron/core/plugin-manager/execution/index.test.js b/app/electron/core/plugin-manager/execution/index.test.js new file mode 100644 index 000000000..75f8e5933 --- /dev/null +++ b/app/electron/core/plugin-manager/execution/index.test.js @@ -0,0 +1,28 @@ +import { setup } from "." +import { importer, presetEPs } from "./import-manager" + +describe('setup', () => { + const mockImporter = jest.fn() + + it('should store the importer function', () => { + setup({ importer: mockImporter }) + + expect(importer).toBe(mockImporter) + }) + + it('should set presetEPS to false if not provided', () => { + expect(presetEPs).toBe(false) + }) + + it('should set presetEPS to the provided value if it is true', () => { + setup({ presetEPs: true }) + + expect(presetEPs).toBe(true) + }) + + it('should set presetEPS to the provided value if it is null', () => { + setup({ presetEPs: null }) + + expect(presetEPs).toBe(null) + }) +}) \ No newline at end of file diff --git a/app/electron/core/plugin-manager/facade/index.js b/app/electron/core/plugin-manager/facade/index.js new file mode 100644 index 000000000..2257fbd4d --- /dev/null +++ b/app/electron/core/plugin-manager/facade/index.js @@ -0,0 +1,30 @@ +import { ipcRenderer, contextBridge } from "electron" + +export default function useFacade() { + const interfaces = { + install(plugins) { + return ipcRenderer.invoke('pluggable:install', plugins) + }, + uninstall(plugins, reload) { + return ipcRenderer.invoke('pluggable:uninstall', plugins, reload) + }, + getActive() { + return ipcRenderer.invoke('pluggable:getActivePlugins') + }, + update(plugins, reload) { + return ipcRenderer.invoke('pluggable:update', plugins, reload) + }, + updatesAvailable(plugin) { + return ipcRenderer.invoke('pluggable:updatesAvailable', plugin) + }, + toggleActive(plugin, active) { + return ipcRenderer.invoke('pluggable:togglePluginActive', plugin, active) + }, + } + + if (contextBridge) { + contextBridge.exposeInMainWorld('pluggableElectronIpc', interfaces) + } + + return interfaces +} diff --git a/app/electron/core/plugin-manager/facade/index.test.js b/app/electron/core/plugin-manager/facade/index.test.js new file mode 100644 index 000000000..0e4bae62d --- /dev/null +++ b/app/electron/core/plugin-manager/facade/index.test.js @@ -0,0 +1,196 @@ +jest.mock('electron', () => { + const handlers = {} + + return { + ipcMain: { + handle(channel, callback) { + handlers[channel] = callback + } + }, + ipcRenderer: { + invoke(channel, ...args) { + return Promise.resolve(handlers[channel].call(undefined, 'event', ...args)) + } + }, + webContents: { + getAllWebContents: jest.fn(() => []) + }, + contextBridge: { + exposeInMainWorld(key, val) { + global.window = { [key]: val } + } + } + } +}) + +jest.mock('../pluginMgr/store', () => { + const setActive = jest.fn(() => true) + const uninstall = jest.fn() + const update = jest.fn(() => true) + const isUpdateAvailable = jest.fn(() => false) + + class Plugin { + constructor(name) { + this.name = name + this.activationPoints = ['test'] + } + setActive = setActive + uninstall = uninstall + update = update + isUpdateAvailable = isUpdateAvailable + } + + return { + getPlugin: jest.fn(name => new Plugin(name)), + getActivePlugins: jest.fn(() => [new Plugin('test')]), + installPlugins: jest.fn(async plugins => plugins.map(name => new Plugin(name))), + removePlugin: jest.fn() + } +}) + +const { rmSync } = require('fs') +const { webContents } = require('electron') +const useFacade = require('./index') +const { getActive, install, toggleActive, uninstall, update, updatesAvailable, registerActive } = require('../execution/facade') +const { setPluginsPath, setConfirmInstall } = require('../pluginMgr/globals') +const router = require('../pluginMgr/router') +const { getPlugin, getActivePlugins, removePlugin } = require('../pluginMgr/store') +const { get: getActivations } = require('../execution/activation-manager') + +const pluginsPath = './testPlugins' +const confirmInstall = jest.fn(() => true) + +beforeAll(async () => { + setPluginsPath(pluginsPath) + router() + useFacade() +}) + +afterAll(() => { + rmSync(pluginsPath, { recursive: true }) +}) + +describe('install', () => { + it('should return cancelled state if the confirmPlugin callback returns falsy', async () => { + setConfirmInstall(() => false) + const plugins = await install(['test-install']) + expect(plugins).toEqual(false) + }) + + it('should perform a security check of the install using confirmInstall if facade is used', async () => { + setConfirmInstall(confirmInstall) + await install(['test-install']) + expect(confirmInstall.mock.calls.length).toBeTruthy() + }) + + it('should register all installed plugins', async () => { + const pluginName = 'test-install' + await install([pluginName]) + expect(getActivations()).toContainEqual(expect.objectContaining({ + plugin: pluginName + })) + }) + + it('should return a list of plugins', async () => { + setConfirmInstall(confirmInstall) + const pluginName = 'test-install' + const plugins = await install([pluginName]) + expect(plugins).toEqual([expect.objectContaining({ name: pluginName })]) + }) +}) + +describe('uninstall', () => { + it('should uninstall all plugins with the provided name, remove it from the store and refresh all renderers', async () => { + // Reset mock functions + const mockUninstall = getPlugin().uninstall + mockUninstall.mockClear() + removePlugin.mockClear() + webContents.getAllWebContents.mockClear() + getPlugin.mockClear() + + // Uninstall plugins + const specs = ['test-uninstall-1', 'test-uninstall-2'] + await uninstall(specs) + + // Test result + expect(getPlugin.mock.calls).toEqual(specs.map(spec => [spec])) + expect(mockUninstall.mock.calls.length).toBeTruthy() + expect(removePlugin.mock.calls.length).toBeTruthy() + expect(webContents.getAllWebContents.mock.calls.length).toBeTruthy() + }) +}) + +describe('getActive', () => { + it('should return all active plugins', async () => { + getActivePlugins.mockClear() + await getActive() + expect(getActivePlugins.mock.calls.length).toBeTruthy() + }) +}) + +describe('registerActive', () => { + it('should register all active plugins', async () => { + await registerActive() + expect(getActivations()).toContainEqual(expect.objectContaining({ + plugin: 'test' + })) + }) +}) + +describe('update', () => { + const specs = ['test-uninstall-1', 'test-uninstall-2'] + const mockUpdate = getPlugin().update + + beforeAll(async () => { + // Reset mock functions + mockUpdate.mockClear() + webContents.getAllWebContents.mockClear() + getPlugin.mockClear() + + // Update plugins + await update(specs) + }) + + it('should call the update function on all provided plugins', async () => { + // Check result + expect(getPlugin.mock.calls).toEqual(specs.map(spec => [spec])) + expect(mockUpdate.mock.calls.length).toBe(2) + }) + + it('should reload the renderers if reload is true', () => { + expect(webContents.getAllWebContents.mock.calls.length).toBeTruthy() + }) + + it('should not reload the renderer if reload is false', async () => { + webContents.getAllWebContents.mockClear() + await update(['test-uninstall'], false) + expect(webContents.getAllWebContents.mock.calls.length).toBeFalsy() + }) +}) + +describe('toggleActive', () => { + it('call the setActive function on the plugin with the provided name, with the provided active state', async () => { + await toggleActive('test-toggleActive', true) + expect(getPlugin.mock.lastCall).toEqual(['test-toggleActive']) + const mockSetActive = getPlugin().setActive + expect(mockSetActive.mock.lastCall).toEqual([true]) + }) +}) + +describe('updatesAvailable', () => { + it('should return the new versions for the provided plugins if provided', async () => { + // Reset mock functions + const mockIsUpdAvailable = getPlugin().isUpdateAvailable + mockIsUpdAvailable.mockClear() + getPlugin.mockClear() + + // Get available updates + const testPlugin1 = 'test-plugin-1' + const testPlugin2 = 'test-update-2' + const updates = await updatesAvailable([testPlugin1, testPlugin2]) + expect(updates).toEqual({ + [testPlugin1]: false, + [testPlugin2]: false, + }) + }) +}) diff --git a/app/electron/core/plugin-manager/pluginMgr/Plugin.js b/app/electron/core/plugin-manager/pluginMgr/Plugin.js new file mode 100644 index 000000000..3e9ca609f --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/Plugin.js @@ -0,0 +1,189 @@ +import { rmdir } from "fs/promises" +import { resolve, join } from "path" +import { manifest, extract } from "pacote" +import Arborist from '@npmcli/arborist' + +import { pluginsPath } from "./globals" + +/** + * An NPM package that can be used as a Pluggable Electron plugin. + * Used to hold all the information and functions necessary to handle the plugin lifecycle. + */ +class Plugin { + /** + * @property {string} origin Original specification provided to fetch the package. + * @property {Object} installOptions Options provided to pacote when fetching the manifest. + * @property {name} name The name of the plugin as defined in the manifest. + * @property {string} url Electron URL where the package can be accessed. + * @property {string} version Version of the package as defined in the manifest. + * @property {Array<string>} activationPoints List of {@link ./Execution-API#activationPoints|activation points}. + * @property {string} main The entry point as defined in the main entry of the manifest. + */ + + /** @private */ + _active = false + + /** + * @private + * @property {Object.<string, Function>} #listeners A list of callbacks to be executed when the Plugin is updated. + */ + #listeners = {} + + /** + * Set installOptions with defaults for options that have not been provided. + * @param {string} [origin] Original specification provided to fetch the package. + * @param {Object} [options] Options provided to pacote when fetching the manifest. + */ + constructor(origin, options = {}) { + const defaultOpts = { + version: false, + fullMetadata: false, + Arborist + } + + this.origin = origin + this.installOptions = { ...defaultOpts, ...options } + } + + /** + * Package name with version number. + * @type {string} + */ + get specifier() { + return this.origin + (this.installOptions.version ? '@' + this.installOptions.version : '') + } + + /** + * Whether the plugin should be registered with its activation points. + * @type {boolean} + */ + get active() { + return this._active + } + + /** + * Set Package details based on it's manifest + * @returns {Promise.<Boolean>} Resolves to true when the action completed + */ + async #getManifest() { + // Get the package's manifest (package.json object) + try { + const mnf = await manifest(this.specifier, this.installOptions) + + // set the Package properties based on the it's manifest + this.name = mnf.name + this.version = mnf.version + this.activationPoints = mnf.activationPoints || null + this.main = mnf.main + + } catch (error) { + throw new Error(`Package ${this.origin} does not contain a valid manifest: ${error}`) + } + + return true + } + + /** + * Extract plugin to plugins folder. + * @returns {Promise.<Plugin>} This plugin + * @private + */ + async _install() { + try { + // import the manifest details + await this.#getManifest() + + // Install the package in a child folder of the given folder + await extract(this.specifier, join(pluginsPath, this.name), this.installOptions) + + if (!Array.isArray(this.activationPoints)) + throw new Error('The plugin does not contain any activation points') + + // Set the url using the custom plugins protocol + this.url = `plugin://${this.name}/${this.main}` + + this.#emitUpdate() + + } catch (err) { + // Ensure the plugin is not stored and the folder is removed if the installation fails + this.setActive(false) + throw err + } + + return [this] + } + + /** + * Subscribe to updates of this plugin + * @param {string} name name of the callback to register + * @param {callback} cb The function to execute on update + */ + subscribe(name, cb) { + this.#listeners[name] = cb + } + + /** + * Remove subscription + * @param {string} name name of the callback to remove + */ + unsubscribe(name) { + delete this.#listeners[name] + } + + /** + * Execute listeners + */ + #emitUpdate() { + for (const cb in this.#listeners) { + this.#listeners[cb].call(null, this) + } + } + + /** + * Check for updates and install if available. + * @param {string} version The version to update to. + * @returns {boolean} Whether an update was performed. + */ + async update(version = false) { + if (this.isUpdateAvailable()) { + this.installOptions.version = version + await this._install(false) + return true + } + + return false + } + + /** + * Check if a new version of the plugin is available at the origin. + * @returns the latest available version if a new version is available or false if not. + */ + async isUpdateAvailable() { + const mnf = await manifest(this.origin) + return mnf.version !== this.version ? mnf.version : false + } + + /** + * Remove plugin and refresh renderers. + * @returns {Promise} + */ + async uninstall() { + const plgPath = resolve(pluginsPath, this.name) + await rmdir(plgPath, { recursive: true }) + + this.#emitUpdate() + } + + /** + * Set a plugin's active state. This determines if a plugin should be loaded on initialisation. + * @param {boolean} active State to set _active to + * @returns {Plugin} This plugin + */ + setActive(active) { + this._active = active + this.#emitUpdate() + return this + } +} + +export default Plugin diff --git a/app/electron/core/plugin-manager/pluginMgr/Plugin.test.js b/app/electron/core/plugin-manager/pluginMgr/Plugin.test.js new file mode 100644 index 000000000..c0326bd06 --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/Plugin.test.js @@ -0,0 +1,212 @@ +import { init } from "." +import { join } from 'path' +import Plugin from "./Plugin" +import { mkdirSync, writeFileSync, existsSync, readFileSync, rmSync } from "fs" + +const pluginsDir = './testPlugins' +const testPluginDir = './testPluginSrc' +const testPluginName = 'test-plugin' +const manifest = join(testPluginDir, 'package.json') +const main = 'index' + +/** @type Plugin */ +let plugin + +beforeAll(() => { + init({ + confirmInstall: () => true, + pluginsPath: pluginsDir, + }) + + mkdirSync(testPluginDir) + + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + main, + }), 'utf8') + + plugin = new Plugin(testPluginDir) +}) + +afterAll(() => { + rmSync(pluginsDir, { recursive: true }) + rmSync(testPluginDir, { recursive: true }) +}) + + +describe('subscribe', () => { + let res = false + it('should register the provided callback', () => { + plugin.subscribe('test', () => res = true) + plugin.setActive(true) + + expect(res).toBeTruthy() + }) +}) + +describe('unsubscribe', () => { + it(`should remove the provided callback from the register + after which it should not be executed anymore when the plugin is updated`, () => { + let res = false + plugin.subscribe('test', () => res = true) + plugin.unsubscribe('test') + plugin.setActive(true) + + expect(res).toBeFalsy() + }) +}) + +describe('install', () => { + beforeAll(async () => { + await plugin._install() + }) + + it('should store all the relevant manifest values on the plugin', async () => { + expect(plugin).toMatchObject({ + origin: testPluginDir, + installOptions: { + version: false, + fullMetadata: false, + }, + name: testPluginName, + url: `plugin://${testPluginName}/${main}`, + activationPoints: [] + }) + }) + + it('should create a folder for the plugin if it does not yet exist and copy the plugin files to it', () => { + expect(existsSync(join(pluginsDir, testPluginName))).toBeTruthy() + }) + + it('should replace the existing plugin files in the plugin folder if it already exist', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + main: 'updated', + }), 'utf8') + + await plugin._install() + + const savedPkg = JSON.parse(readFileSync(join(pluginsDir, testPluginName, 'package.json'))) + + expect(savedPkg.main).toBe('updated') + }) + + it('should throw an error and the plugin should be set to inactive if no manifest could be found', async () => { + rmSync(join(testPluginDir, 'package.json')) + + await expect(() => plugin._install()).rejects.toThrow(/does not contain a valid manifest/) + }) + + it('should throw an error and the plugin should be set to inactive if plugin does not contain any activation points', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + main, + }), 'utf8') + + await expect(() => plugin._install()).rejects.toThrow('The plugin does not contain any activation points') + expect(plugin.active).toBe(false) + }) +}) + +describe('update', () => { + let updatedPlugin + let subscription = false + let beforeUpd + + beforeAll(async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.1', + main, + }), 'utf8') + + await plugin._install() + + plugin.subscribe('test', () => subscription = true) + beforeUpd = Object.assign({}, plugin) + + await plugin.update() + }) + + it('should not do anything if no version update is available', () => { + expect(beforeUpd).toMatchObject(plugin) + }) + + it('should update the plugin files to the latest version if there is a new version available for the plugin', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.2', + main, + }), 'utf8') + + await plugin.update() + + expect(plugin).toMatchObject({ + origin: testPluginDir, + installOptions: { + version: false, + fullMetadata: false, + }, + name: testPluginName, + version: '0.0.2', + url: `plugin://${testPluginName}/${main}`, + activationPoints: [] + }) + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + expect(subscription).toBeTruthy() + }) +}) + +describe('isUpdateAvailable', () => { + it('should return false if no new version is available', async () => { + await expect(plugin.isUpdateAvailable()).resolves.toBe(false) + }) + + it('should return the latest version number if a new version is available', async () => { + writeFileSync(manifest, JSON.stringify({ + name: testPluginName, + activationPoints: [], + version: '0.0.3', + main, + }), 'utf8') + + await expect(plugin.isUpdateAvailable()).resolves.toBe('0.0.3') + }) +}) + +describe('setActive', () => { + it('should set the plugin to be active', () => { + plugin.setActive(true) + expect(plugin.active).toBeTruthy() + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + let res = false + plugin.subscribe('test', () => res = true) + plugin.setActive(true) + + expect(res).toBeTruthy() + }) +}) + +describe('uninstall', () => { + let subscription = false + beforeAll(async () => { + plugin.subscribe('test', () => subscription = true) + await plugin.uninstall() + }) + + it('should remove the installed plugin from the plugins folder', () => { + expect(existsSync(join(pluginsDir, testPluginName))).toBe(false) + }) + + it('should execute callbacks subscribed to this plugin, providing the plugin as a parameter', () => { + expect(subscription).toBeTruthy() + }) +}) diff --git a/app/electron/core/plugin-manager/pluginMgr/globals.js b/app/electron/core/plugin-manager/pluginMgr/globals.js new file mode 100644 index 000000000..a0fc3718d --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/globals.js @@ -0,0 +1,57 @@ +import { existsSync, mkdirSync, writeFileSync } from "fs" +import { join, resolve } from "path" + +export let pluginsPath = null + +/** + * @private + * Set path to plugins directory and create the directory if it does not exist. + * @param {string} plgPath path to plugins directory + */ +export function setPluginsPath(plgPath) { + // Create folder if it does not exist + let plgDir + try { + plgDir = resolve(plgPath) + if (plgDir.length < 2) throw new Error() + + if (!existsSync(plgDir)) mkdirSync(plgDir) + + const pluginsJson = join(plgDir, 'plugins.json') + if (!existsSync(pluginsJson)) writeFileSync(pluginsJson, '{}', 'utf8') + + pluginsPath = plgDir + + } catch (error) { + throw new Error('Invalid path provided to the plugins folder') + } + +} + +/** +* @private + * Get the path to the plugins.json file. + * @returns location of plugins.json + */ +export function getPluginsFile() { return join(pluginsPath, 'plugins.json') } + + +export let confirmInstall = function () { + return new Error( + 'The facade.confirmInstall callback needs to be set in when initializing Pluggable Electron in the main process.' + ) +} + +/** + * @private + * Set callback to use as confirmInstall. + * @param {confirmInstall} cb Callback + */ +export function setConfirmInstall(cb) { confirmInstall = cb } + +/** + * This function is executed when plugins are installed to verify that the user indeed wants to install the plugin. + * @callback confirmInstall + * @param {Array.<string>} plg The specifiers used to locate the packages (from NPM or local file) + * @returns {Promise<boolean>} Whether to proceed with the plugin installation + */ diff --git a/app/electron/core/plugin-manager/pluginMgr/index.js b/app/electron/core/plugin-manager/pluginMgr/index.js new file mode 100644 index 000000000..ae7bff759 --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/index.js @@ -0,0 +1,123 @@ +import { readFileSync } from "fs" +import { protocol } from 'electron' +import { normalize } from "path" + +import Plugin from "./Plugin" +import { getAllPlugins, removePlugin, persistPlugins, installPlugins, getPlugin, getActivePlugins, addPlugin } from "./store" +import { pluginsPath as storedPluginsPath, setPluginsPath, getPluginsFile, setConfirmInstall } from './globals' +import router from "./router" + +/** + * Sets up the required communication between the main and renderer processes. + * Additionally sets the plugins up using {@link usePlugins} if a pluginsPath is provided. + * @param {Object} options configuration for setting up the renderer facade. + * @param {confirmInstall} [options.confirmInstall] Function to validate that a plugin should be installed. + * @param {Boolean} [options.useFacade=true] Whether to make a facade to the plugins available in the renderer. + * @param {string} [options.pluginsPath] Optional path to the plugins folder. + * @returns {pluginManager|Object} A set of functions used to manage the plugin lifecycle if usePlugins is provided. + * @function + */ +export function init(options) { + if (!Object.prototype.hasOwnProperty.call(options, 'useFacade') || options.useFacade) { + // Store the confirmInstall function + setConfirmInstall(options.confirmInstall) + // Enable IPC to be used by the facade + router() + } + + // Create plugins protocol to serve plugins to renderer + registerPluginProtocol() + + // perform full setup if pluginsPath is provided + if (options.pluginsPath) { + return usePlugins(options.pluginsPath) + } + + return {} + +} + +/** + * Create plugins protocol to provide plugins to renderer + * @private + * @returns {boolean} Whether the protocol registration was successful + */ +function registerPluginProtocol() { + return protocol.registerFileProtocol('plugin', (request, callback) => { + const entry = request.url.substr(8) + const url = normalize(storedPluginsPath + entry) + callback({ path: url }) + }) +} + +/** + * Set Pluggable Electron up to run from the pluginPath folder if it is provided and + * load plugins persisted in that folder. + * @param {string} pluginsPath Path to the plugins folder. Required if not yet set up. + * @returns {pluginManager} A set of functions used to manage the plugin lifecycle. + */ +export function usePlugins(pluginsPath) { + if (!pluginsPath) throw Error('A path to the plugins folder is required to use Pluggable Electron') + // Store the path to the plugins folder + setPluginsPath(pluginsPath) + + // Remove any registered plugins + for (const plugin of getAllPlugins()) { + removePlugin(plugin.name, false) + } + + // Read plugin list from plugins folder + const plugins = JSON.parse(readFileSync(getPluginsFile())) + try { + // Create and store a Plugin instance for each plugin in list + for (const p in plugins) { + loadPlugin(plugins[p]) + } + persistPlugins() + + } catch (error) { + // Throw meaningful error if plugin loading fails + throw new Error('Could not successfully rebuild list of installed plugins.\n' + + error + + '\nPlease check the plugins.json file in the plugins folder.') + } + + // Return the plugin lifecycle functions + return getStore() +} + +/** + * Check the given plugin object. If it is marked for uninstalling, the plugin files are removed. + * Otherwise a Plugin instance for the provided object is created and added to the store. + * @private + * @param {Object} plg Plugin info + */ +function loadPlugin(plg) { + // Create new plugin, populate it with plg details and save it to the store + const plugin = new Plugin() + + for (const key in plg) { + plugin[key] = plg[key] + } + + addPlugin(plugin, false) + plugin.subscribe('pe-persist', persistPlugins) +} + +/** + * Returns the publicly available store functions. + * @returns {pluginManager} A set of functions used to manage the plugin lifecycle. + */ +export function getStore() { + if (!storedPluginsPath) { + throw new Error('The plugin path has not yet been set up. Please run usePlugins before accessing the store') + } + + return { + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + } +} diff --git a/app/electron/core/plugin-manager/pluginMgr/index.test.js b/app/electron/core/plugin-manager/pluginMgr/index.test.js new file mode 100644 index 000000000..37055db62 --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/index.test.js @@ -0,0 +1,150 @@ +import { usePlugins, getStore, init } from './index' +import { installPlugins, getPlugin, getAllPlugins, getActivePlugins, addPlugin, removePlugin } from './store' +import Plugin from './Plugin' +import { existsSync, rmSync, mkdirSync, writeFileSync } from 'fs' +import { join } from 'path' +import { protocol } from 'electron' + +// Set up variables for test folders and test plugins. +const pluginDir = './testPlugins' +const registeredPluginName = 'registered-plugin' +const demoPlugin = { + origin: ".\\demo-plugin\\demo-plugin-1.5.0.tgz", + installOptions: { + version: false, + fullMetadata: false + }, + name: "demoPlugin", + version: "1.5.0", + activationPoints: [ + "init" + ], + main: "index.js", + _active: true, + url: "plugin://demo-plugin/index.js" +} + +describe('before setting a plugin path', () => { + describe('getStore', () => { + it('should throw an error if called without a plugin path set', () => { + expect(() => getStore()).toThrowError('The plugin path has not yet been set up. Please run usePlugins before accessing the store') + }) + }) + + describe('usePlugins', () => { + it('should throw an error if called without a plugin path whilst no plugin path is set', () => { + expect(() => usePlugins()).toThrowError('A path to the plugins folder is required to use Pluggable Electron') + }) + + it('should throw an error if called with an invalid plugin path', () => { + expect(() => usePlugins('http://notsupported')).toThrowError('Invalid path provided to the plugins folder') + }) + + it('should create the plugin path if it does not yet exist', () => { + // Execute usePlugins with a folder that does not exist + const newPluginDir = './test-new-plugins' + usePlugins(newPluginDir) + expect(existsSync(newPluginDir)).toBe(true) + + // Remove created folder to clean up + rmSync(newPluginDir, { recursive: true }) + }) + }) +}) + +describe('after setting a plugin path', () => { + let pm + + beforeAll(() => { + // Create folders to contain plugins + mkdirSync(pluginDir) + + // Create initial + writeFileSync(join(pluginDir, 'plugins.json'), JSON.stringify({ demoPlugin }), 'utf8') + + // Register a plugin before using plugins + const registeredPLugin = new Plugin(registeredPluginName) + registeredPLugin.name = registeredPluginName + addPlugin(registeredPLugin, false) + + // Load plugins + pm = usePlugins(pluginDir) + }) + + afterAll(() => { + rmSync(pluginDir, { recursive: true }) + }) + + describe('getStore', () => { + it('should return the plugin lifecycle functions if no plugin path is provided', () => { + expect(getStore()).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) + }) + + describe('usePlugins', () => { + it('should return the plugin lifecycle functions if a plugin path is provided', () => { + expect(pm).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) + + it('should load the plugins defined in plugins.json in the provided plugins folder if a plugin path is provided', () => { + expect(getPlugin('demoPlugin')).toEqual(demoPlugin) + }) + + it('should unregister any registered plugins before registering the new ones if a plugin path is provided', () => { + expect(() => getPlugin(registeredPluginName)).toThrowError(`Plugin ${registeredPluginName} does not exist`) + }) + }) +}) + +describe('init', () => { + // Enabling the facade and registering the confirm install function is tested with the router. + let pm + + beforeAll(() => { + // Create test plugins folder + mkdirSync(pluginDir) + + // Initialize Pluggable Electron without a plugin folder + pm = init({ confirmInstall: () => true }) + }) + + afterAll(() => { + // Remove test plugins folder + rmSync(pluginDir, { recursive: true }) + }) + + it('should make the plugin files available through the plugin protocol', async () => { + expect(protocol.isProtocolRegistered('plugin')).toBeTruthy() + }) + + it('should return an empty object if no plugin path is provided', () => { + expect(pm).toEqual({}) + }) + + it('should return the plugin lifecycle functions if a plugin path is provided', () => { + pm = init({ + confirmInstall: () => true, + pluginsPath: pluginDir, + }) + + expect(pm).toEqual({ + installPlugins, + getPlugin, + getAllPlugins, + getActivePlugins, + removePlugin, + }) + }) +}) \ No newline at end of file diff --git a/app/electron/core/plugin-manager/pluginMgr/router.js b/app/electron/core/plugin-manager/pluginMgr/router.js new file mode 100644 index 000000000..17e5ba2f5 --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/router.js @@ -0,0 +1,91 @@ +import { ipcMain, webContents } from "electron" + +import { getPlugin, getActivePlugins, installPlugins, removePlugin, getAllPlugins } from "./store" +import { pluginsPath, confirmInstall } from './globals' + +// Throw an error if pluginsPath has not yet been provided by usePlugins. +const checkPluginsPath = () => { + if (!pluginsPath) throw Error('Path to plugins folder has not yet been set up.') +} +let active = false +/** + * Provide the renderer process access to the plugins. + **/ +export default function () { + if (active) return + // Register IPC route to install a plugin + ipcMain.handle('pluggable:install', async (e, plugins) => { + checkPluginsPath() + + // Validate install request from backend for security. + const specs = plugins.map(plg => typeof plg === 'object' ? plg.specifier : plg) + const conf = await confirmInstall(specs) + if (!conf) return { cancelled: true } + + // Install and activate all provided plugins + const installed = await installPlugins(plugins) + return JSON.parse(JSON.stringify(installed)) + }) + + // Register IPC route to uninstall a plugin + ipcMain.handle('pluggable:uninstall', async (e, plugins, reload) => { + checkPluginsPath() + + // Uninstall all provided plugins + for (const plg of plugins) { + const plugin = getPlugin(plg) + await plugin.uninstall() + removePlugin(plugin.name) + } + + // Reload all renderer pages if needed + reload && webContents.getAllWebContents().forEach(wc => wc.reload()) + return true + }) + + // Register IPC route to update a plugin + ipcMain.handle('pluggable:update', (e, plugins, reload) => { + checkPluginsPath() + + // Update all provided plugins + let updated = [] + for (const plg of plugins) { + const plugin = getPlugin(plg) + const res = plugin.update() + if (res) updated.push(plugin) + } + + // Reload all renderer pages if needed + if (updated.length && reload) webContents.getAllWebContents().forEach(wc => wc.reload()) + + return JSON.parse(JSON.stringify(updated)) + }) + + // Register IPC route to check if updates are available for a plugin + ipcMain.handle('pluggable:updatesAvailable', (e, names) => { + checkPluginsPath() + + const plugins = names ? names.map(name => getPlugin(name)) : getAllPlugins() + + const updates = {} + for (const plugin of plugins) { + updates[plugin.name] = plugin.isUpdateAvailable() + } + return updates + }) + + // Register IPC route to get the list of active plugins + ipcMain.handle('pluggable:getActivePlugins', () => { + checkPluginsPath() + return JSON.parse(JSON.stringify(getActivePlugins())) + }) + + // Register IPC route to toggle the active state of a plugin + ipcMain.handle('pluggable:togglePluginActive', (e, plg, active) => { + checkPluginsPath() + const plugin = getPlugin(plg) + return JSON.parse(JSON.stringify(plugin.setActive(active))) + }) + + active = true +} diff --git a/app/electron/core/plugin-manager/pluginMgr/store.js b/app/electron/core/plugin-manager/pluginMgr/store.js new file mode 100644 index 000000000..16a647930 --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/store.js @@ -0,0 +1,129 @@ +/** + * Provides access to the plugins stored by Pluggable Electron + * @typedef {Object} pluginManager + * @prop {getPlugin} getPlugin + * @prop {getAllPlugins} getAllPlugins + * @prop {getActivePlugins} getActivePlugins + * @prop {installPlugins} installPlugins + * @prop {removePlugin} removePlugin + */ + +import { writeFileSync } from "fs" +import Plugin from "./Plugin" +import { getPluginsFile } from './globals' + +/** + * @module store + * @private + */ + +/** + * Register of installed plugins + * @type {Object.<string, Plugin>} plugin - List of installed plugins + */ +const plugins = {} + +/** + * Get a plugin from the stored plugins. + * @param {string} name Name of the plugin to retrieve + * @returns {Plugin} Retrieved plugin + * @alias pluginManager.getPlugin + */ +export function getPlugin(name) { + if (!Object.prototype.hasOwnProperty.call(plugins, name)) { + throw new Error(`Plugin ${name} does not exist`) + } + + return plugins[name] +} + +/** + * Get list of all plugin objects. + * @returns {Array.<Plugin>} All plugin objects + * @alias pluginManager.getAllPlugins + */ +export function getAllPlugins() { return Object.values(plugins) } + +/** + * Get list of active plugin objects. + * @returns {Array.<Plugin>} Active plugin objects + * @alias pluginManager.getActivePlugins + */ +export function getActivePlugins() { + return Object.values(plugins).filter(plugin => plugin.active) +} + +/** + * Remove plugin from store and maybe save stored plugins to file + * @param {string} name Name of the plugin to remove + * @param {boolean} persist Whether to save the changes to plugins to file + * @returns {boolean} Whether the delete was successful + * @alias pluginManager.removePlugin + */ +export function removePlugin(name, persist = true) { + const del = delete plugins[name] + if (persist) persistPlugins() + return del +} + +/** + * Add plugin to store and maybe save stored plugins to file + * @param {Plugin} plugin Plugin to add to store + * @param {boolean} persist Whether to save the changes to plugins to file + * @returns {void} + */ +export function addPlugin(plugin, persist = true) { + plugins[plugin.name] = plugin + if (persist) { + persistPlugins() + plugin.subscribe('pe-persist', persistPlugins) + } +} + +/** + * Save stored plugins to file + * @returns {void} + */ +export function persistPlugins() { + const persistData = {} + for (const name in plugins) { + persistData[name] = plugins[name] + } + writeFileSync(getPluginsFile(), JSON.stringify(persistData), 'utf8') +} + +/** + * Create and install a new plugin for the given specifier. + * @param {Array.<installOptions | string>} plugins A list of NPM specifiers, or installation configuration objects. + * @param {boolean} [store=true] Whether to store the installed plugins in the store + * @returns {Promise.<Array.<Plugin>>} New plugin + * @alias pluginManager.installPlugins + */ +export async function installPlugins(plugins, store = true) { + const installed = [] + for (const plg of plugins) { + // Set install options and activation based on input type + const isObject = typeof plg === 'object' + const spec = isObject ? [plg.specifier, plg] : [plg] + const activate = isObject ? plg.activate !== false : true + + // Install and possibly activate plugin + const plugin = new Plugin(...spec) + await plugin._install() + if (activate) plugin.setActive(true) + + // Add plugin to store if needed + if (store) addPlugin(plugin) + installed.push(plugin) + } + + // Return list of all installed plugins + return installed +} + +/** + * @typedef {Object.<string, any>} installOptions The {@link https://www.npmjs.com/package/pacote|pacote} + * options used to install the plugin with some extra options. + * @param {string} specifier the NPM specifier that identifies the package. + * @param {boolean} [activate] Whether this plugin should be activated after installation. Defaults to true. + */ \ No newline at end of file diff --git a/app/electron/core/plugin-manager/pluginMgr/store.test.js b/app/electron/core/plugin-manager/pluginMgr/store.test.js new file mode 100644 index 000000000..e99cb7c7d --- /dev/null +++ b/app/electron/core/plugin-manager/pluginMgr/store.test.js @@ -0,0 +1,108 @@ +import { getActivePlugins, getAllPlugins, getPlugin, installPlugins } from './store' +import { init } from "." +import { join } from 'path' +import Plugin from "./Plugin" +import { mkdirSync, writeFileSync, rmSync } from "fs" + +// Temporary directory to install plugins to +const pluginsDir = './testPlugins' + +// Temporary directory containing the active plugin to install +const activePluginDir = './activePluginSrc' +const activePluginName = 'active-plugin' +const activeManifest = join(activePluginDir, 'package.json') + +// Temporary directory containing the inactive plugin to install +const inactivePluginDir = './inactivePluginSrc' +const inactivePluginName = 'inactive-plugin' +const inactiveManifest = join(inactivePluginDir, 'package.json') + +// Mock name for the entry file in the plugins +const main = 'index' + +/** @type Array.<Plugin> */ +let activePlugins +/** @type Array.<Plugin> */ +let inactivePlugins + +beforeAll(async () => { + // Initialize pluggable Electron + init({ + confirmInstall: () => true, + pluginsPath: pluginsDir, + }) + + // Create active plugin + mkdirSync(activePluginDir) + writeFileSync(activeManifest, JSON.stringify({ + name: activePluginName, + activationPoints: [], + main, + }), 'utf8') + + // Create active plugin + mkdirSync(inactivePluginDir) + writeFileSync(inactiveManifest, JSON.stringify({ + name: inactivePluginName, + activationPoints: [], + main, + }), 'utf8') + + // Install plugins + activePlugins = await installPlugins([activePluginDir], true) + activePlugins[0].setActive(true) + inactivePlugins = await installPlugins([{ + specifier: inactivePluginDir, + activate: false + }], true) +}) + +afterAll(() => { + // Remove all test files and folders + rmSync(pluginsDir, { recursive: true }) + rmSync(activePluginDir, { recursive: true }) + rmSync(inactivePluginDir, { recursive: true }) +}) + +describe('installPlugins', () => { + it('should create a new plugin found at the given location and return it if store is false', async () => { + const res = await installPlugins([activePluginDir], false) + + expect(res[0]).toBeInstanceOf(Plugin) + }) + + it('should create a new plugin found at the given location and register it if store is true', () => { + expect(activePlugins[0]).toBeInstanceOf(Plugin) + expect(getPlugin(activePluginName)).toBe(activePlugins[0]) + }) + + it('should activate the installed plugin by default', () => { + expect(getPlugin(activePluginName).active).toBe(true) + }) + + it('should set plugin to inactive if activate is set to false in the install options', async () => { + expect(inactivePlugins[0].active).toBe(false) + }) +}) + +describe('getPlugin', () => { + it('should return the plugin with the given name if it is registered', () => { + expect(getPlugin(activePluginName)).toBeInstanceOf(Plugin) + }) + + it('should return an error if the plugin with the given name is not registered', () => { + expect(() => getPlugin('wrongName')).toThrowError('Plugin wrongName does not exist') + }) +}) + +describe('getAllPlugins', () => { + it('should return a list of all registered plugins', () => { + expect(getAllPlugins()).toEqual([activePlugins[0], inactivePlugins[0]]) + }) +}) + +describe('getActivePlugins', () => { + it('should return a list of all and only the registered plugins that are active', () => { + expect(getActivePlugins()).toEqual(activePlugins) + }) +}) \ No newline at end of file diff --git a/app/electron/core/pre-install/base-plugin.tgz b/app/electron/core/pre-install/base-plugin.tgz new file mode 100644 index 000000000..b53eef030 Binary files /dev/null and b/app/electron/core/pre-install/base-plugin.tgz differ diff --git a/app/electron/core/pre-install/data-plugin.tgz b/app/electron/core/pre-install/data-plugin.tgz new file mode 100644 index 000000000..90364adab Binary files /dev/null and b/app/electron/core/pre-install/data-plugin.tgz differ diff --git a/app/electron/core/pre-install/model-management-plugin.tgz b/app/electron/core/pre-install/model-management-plugin.tgz new file mode 100644 index 000000000..371d9efa5 Binary files /dev/null and b/app/electron/core/pre-install/model-management-plugin.tgz differ diff --git a/app/electron/main.ts b/app/electron/main.ts new file mode 100644 index 000000000..1d53d6359 --- /dev/null +++ b/app/electron/main.ts @@ -0,0 +1,221 @@ +// @ts-nocheck +const { + app, + BrowserWindow, + screen: electronScreen, + dialog, + ipcMain, +} = require("electron"); +const isDev = require("electron-is-dev"); +const path = require("path"); +const pe = require("pluggable-electron/main"); +const fs = require("fs"); +const { mkdir, writeFile } = require("fs/promises"); +const { Readable } = require("stream"); +const { finished } = require("stream/promises"); +const request = require("request"); +const progress = require("request-progress"); + +let modelSession = undefined; +let modelName = "llama-2-7b-chat.gguf.q4_0.bin"; + +let window; + +const createMainWindow = () => { + window = new BrowserWindow({ + width: electronScreen.getPrimaryDisplay().workArea.width, + height: electronScreen.getPrimaryDisplay().workArea.height, + show: false, + backgroundColor: "white", + webPreferences: { + nodeIntegration: true, + enableRemoteModule: true, + preload: path.resolve(app.getAppPath(), "electron/preload.js"), + }, + }); + + ipcMain.handle("invokePluginFunc", async (event, plugin, method, ...args) => { + const plg = pe + .getStore() + .getActivePlugins() + .filter((p) => p.name === plugin)[0]; + const pluginPath = path.join( + app.getPath("userData"), + "plugins", + plg.name, + "dist/module.js", + ); + return await import( + /* webpackIgnore: true */ + pluginPath + ) + .then((plugin) => { + if (typeof plugin[method] === "function") { + return plugin[method](...args); + } else { + console.log(plugin[method]); + console.error(`Function "${method}" does not exist in the module.`); + } + }) + .then((res) => { + return res; + }) + .catch((err) => console.log(err)); + }); + + const startURL = isDev + ? "http://localhost:3000" + : `file://${path.join(__dirname, "../out/index.html")}`; + + window.loadURL(startURL); + + window.once("ready-to-show", () => window.show()); + window.on("closed", () => { + if (process.platform !== "darwin") app.quit(); + }); + + window.webContents.openDevTools(); +}; + +app.whenReady().then(() => { + createMainWindow(); + setupPlugins(); + + ipcMain.handle("userData", async (event) => { + return path.resolve(__dirname, "../"); + }); + + ipcMain.handle("downloadModel", async (event, url) => { + const userDataPath = app.getPath("userData"); + const destination = path.resolve(userDataPath, modelName); + + progress(request(url), {}) + .on("progress", function (state) { + window.webContents.send("model-download-update", { + ...state, + modelId: modelName, + }); + }) + .on("error", function (err) { + window.webContents.send("model-download-error", err); + }) + .on("end", function () { + app.relaunch(); + app.exit(); + // Do something after request finishes + }) + .pipe(fs.createWriteStream(destination)); + }); + + ipcMain.handle("deleteModel", async (event, modelFileName) => { + const userDataPath = app.getPath("userData"); + const fullPath = path.join(userDataPath, modelFileName); + + let result = "NULL"; + fs.unlink(fullPath, function (err) { + if (err && err.code == "ENOENT") { + console.info("File doesn't exist, won't remove it."); + result = "FILE_NOT_EXIST"; + } else if (err) { + console.error("Error occurred while trying to remove file"); + result = "ERROR"; + } else { + console.info(`removed`); + result = "REMOVED"; + } + }); + console.log(result); + return result; + }); + + // TODO: add options for model configuration + ipcMain.handle("initModel", async (event, product) => { + if (!product.fileName) { + await dialog.showMessageBox({ + message: "Selected model does not have file name..", + }); + + return; + } + + console.info(`Initializing model: ${product.name}..`); + import( + isDev + ? "../node_modules/node-llama-cpp/dist/index.js" + : path.resolve( + app.getAppPath(), + "./../../app.asar.unpacked/node_modules/node-llama-cpp/dist/index.js", + ) + ) + .then(({ LlamaContext, LlamaChatSession, LlamaModel }) => { + const modelPath = path.join(app.getPath("userData"), product.fileName); + // TODO: check if file is already there + const model = new LlamaModel({ + modelPath: modelPath, + }); + const context = new LlamaContext({ model }); + modelSession = new LlamaChatSession({ context }); + console.info(`Init model ${product.name} successfully!`); + }) + .catch(async (e) => { + await dialog.showMessageBox({ + message: "Failed to import LLM module", + }); + }); + }); + + ipcMain.handle("getDownloadedModels", async (event) => { + const userDataPath = app.getPath("userData"); + + const allBinariesName = []; + var files = fs.readdirSync(userDataPath); + for (var i = 0; i < files.length; i++) { + var filename = path.join(userDataPath, files[i]); + var stat = fs.lstatSync(filename); + if (stat.isDirectory()) { + // ignore + } else if (filename.endsWith(".bin")) { + allBinariesName.push(filename); + } + } + return allBinariesName; + }); + + ipcMain.handle("sendInquiry", async (event, question) => { + if (!modelSession) { + console.error("Model session has not been initialized!"); + return; + } + return modelSession.prompt(question); + }); + + app.on("activate", () => { + if (!BrowserWindow.getAllWindows().length) { + createMainWindow(); + } + }); +}); + +app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); + } +}); + +function setupPlugins() { + pe.init({ + // Function to check from the main process that user wants to install a plugin + confirmInstall: async (plugins) => { + const answer = await dialog.showMessageBox({ + message: `Are you sure you want to install the plugin ${plugins.join( + ", ", + )}`, + buttons: ["Ok", "Cancel"], + cancelId: 1, + }); + return answer.response == 0; + }, + // Path to install plugin to + pluginsPath: path.join(app.getPath("userData"), "plugins"), + }); +} diff --git a/app/electron/preload.js b/app/electron/preload.js new file mode 100644 index 000000000..574597e9f --- /dev/null +++ b/app/electron/preload.js @@ -0,0 +1,31 @@ +/* eslint-disable react-hooks/rules-of-hooks */ +// Make Pluggable Electron's facade available to the renderer on window.plugins +const useFacade = require("pluggable-electron/facade"); +useFacade(); + +const { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("electronAPI", { + invokePluginFunc: (plugin, method, ...args) => + ipcRenderer.invoke("invokePluginFunc", plugin, method, ...args), + + userData: () => ipcRenderer.invoke("userData"), + + sendInquiry: (question) => ipcRenderer.invoke("sendInquiry", question), + + initModel: (product) => ipcRenderer.invoke("initModel", product), + + getDownloadedModels: () => ipcRenderer.invoke("getDownloadedModels"), + + getAvailableModels: () => ipcRenderer.invoke("getAvailableModels"), + + deleteModel: (path) => ipcRenderer.invoke("deleteModel", path), + + downloadModel: (url) => ipcRenderer.invoke("downloadModel", url), + + onModelDownloadUpdate: (callback) => + ipcRenderer.on("model-download-update", callback), + + onModelDownloadError: (callback) => + ipcRenderer.on("model-download-error", callback), +}); diff --git a/web-client/env-example b/app/env-example similarity index 100% rename from web-client/env-example rename to app/env-example diff --git a/app/images/jan-desktop-dev-instruction-1.png b/app/images/jan-desktop-dev-instruction-1.png new file mode 100644 index 000000000..5f2e60da7 Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-1.png differ diff --git a/app/images/jan-desktop-dev-instruction-2.png b/app/images/jan-desktop-dev-instruction-2.png new file mode 100644 index 000000000..ea6cb9526 Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-2.png differ diff --git a/app/images/jan-desktop-dev-instruction-3.png b/app/images/jan-desktop-dev-instruction-3.png new file mode 100644 index 000000000..29f071985 Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-3.png differ diff --git a/app/images/jan-desktop-dev-instruction-4.png b/app/images/jan-desktop-dev-instruction-4.png new file mode 100644 index 000000000..30524d91a Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-4.png differ diff --git a/app/images/jan-desktop-dev-instruction-5.png b/app/images/jan-desktop-dev-instruction-5.png new file mode 100644 index 000000000..88bcf56f0 Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-5.png differ diff --git a/app/images/jan-desktop-dev-instruction-6.png b/app/images/jan-desktop-dev-instruction-6.png new file mode 100644 index 000000000..ba5c1e383 Binary files /dev/null and b/app/images/jan-desktop-dev-instruction-6.png differ diff --git a/app/next.config.js b/app/next.config.js new file mode 100644 index 000000000..bcca4cd79 --- /dev/null +++ b/app/next.config.js @@ -0,0 +1,25 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + output: "export", + assetPrefix: ".", + experimental: { + serverActions: false, + }, + images: { + unoptimized: true, + remotePatterns: [ + { + protocol: "https", + hostname: "**", + }, + ], + }, + webpack: (config, env) => { + // do some stuff here + config.optimization.minimize = false; + config.optimization.minimizer = []; + return config; + }, +}; + +module.exports = nextConfig; diff --git a/web-client/package.json b/app/package.json similarity index 57% rename from web-client/package.json rename to app/package.json index ff93efa00..d31b38932 100644 --- a/web-client/package.json +++ b/app/package.json @@ -2,17 +2,38 @@ "name": "jan-web", "version": "0.1.0", "private": true, + "main": "./electron/main.ts", + "homepage": "./", "scripts": { "dev": "next dev", "build": "next build", "start": "next start", + "electron:start": "concurrently \"yarn dev\" \"wait-on http://localhost:3000 && electron .\"", + "electron:build:all": "yarn build && electron-builder build --publish never -mwl", "lint": "next lint", "compile": "tsc --noEmit -p . --pretty", - "generate": "graphql-codegen --config codegen.ts", "watch": "graphql-codegen -w" }, + "build": { + "appId": "com.app.id", + "productName": "Jan Desktop App", + "asarUnpack": [ + "node_modules", + "electron/core" + ], + "files": [ + "out/**/*", + "electron/main.ts", + "package.json", + "electron/preload.js", + "electron/core" + ], + "extends": null, + "mac": { + "type": "distribution" + } + }, "dependencies": { - "@apollo/client": "^3.8.1", "@headlessui/react": "^1.7.15", "@heroicons/react": "^2.0.18", "@tailwindcss/typography": "^0.5.9", @@ -22,18 +43,18 @@ "@types/react-syntax-highlighter": "^15.5.7", "autoprefixer": "10.4.14", "classnames": "^2.3.2", + "electron-is-dev": "^2.0.0", "embla-carousel": "^8.0.0-rc11", "embla-carousel-react": "^8.0.0-rc11", "eslint": "8.45.0", "eslint-config-next": "13.4.10", - "graphql": "^16.8.0", - "graphql-ws": "^5.14.0", "jotai": "^2.4.0", "jotai-optics": "^0.3.1", "jwt-decode": "^3.1.2", "next": "13.4.10", "next-auth": "^4.23.1", "next-themes": "^0.2.1", + "node-llama-cpp": "^2.4.1", "optics-ts": "^2.4.1", "postcss": "8.4.26", "react": "18.2.0", @@ -42,14 +63,18 @@ "react-syntax-highlighter": "^15.5.0", "remark": "^14.0.3", "remark-html": "^15.0.2", + "request": "^2.88.2", + "request-progress": "^3.0.0", "tailwindcss": "3.3.3", - "typescript": "5.1.6" + "typescript": "5.1.6", + "pluggable-electron": "^0.6.0" }, "devDependencies": { - "@graphql-codegen/cli": "5.0.0", - "@graphql-codegen/client-preset": "4.1.0", - "@graphql-codegen/introspection": "4.0.0", "@tailwindcss/forms": "^0.5.4", - "encoding": "^0.1.13" + "concurrently": "^8.2.1", + "electron": "^26.2.1", + "electron-builder": "^24.6.4", + "encoding": "^0.1.13", + "wait-on": "^7.0.1" } } diff --git a/web-client/postcss.config.js b/app/postcss.config.js similarity index 100% rename from web-client/postcss.config.js rename to app/postcss.config.js diff --git a/app/public/icons/ClipboardList.svg b/app/public/icons/ClipboardList.svg new file mode 100644 index 000000000..24fad2edc --- /dev/null +++ b/app/public/icons/ClipboardList.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M9 5H7C5.89543 5 5 5.89543 5 7V19C5 20.1046 5.89543 21 7 21H17C18.1046 21 19 20.1046 19 19V7C19 5.89543 18.1046 5 17 5H15M9 5C9 6.10457 9.89543 7 11 7H13C14.1046 7 15 6.10457 15 5M9 5C9 3.89543 9.89543 3 11 3H13C14.1046 3 15 3.89543 15 5M12 12H15M12 16H15M9 12H9.01M9 16H9.01" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round"/> +</svg> diff --git a/app/public/icons/Cog.svg b/app/public/icons/Cog.svg new file mode 100644 index 000000000..0973cf226 --- /dev/null +++ b/app/public/icons/Cog.svg @@ -0,0 +1,4 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M10.3246 4.31731C10.751 2.5609 13.249 2.5609 13.6754 4.31731C13.9508 5.45193 15.2507 5.99038 16.2478 5.38285C17.7913 4.44239 19.5576 6.2087 18.6172 7.75218C18.0096 8.74925 18.5481 10.0492 19.6827 10.3246C21.4391 10.751 21.4391 13.249 19.6827 13.6754C18.5481 13.9508 18.0096 15.2507 18.6172 16.2478C19.5576 17.7913 17.7913 19.5576 16.2478 18.6172C15.2507 18.0096 13.9508 18.5481 13.6754 19.6827C13.249 21.4391 10.751 21.4391 10.3246 19.6827C10.0492 18.5481 8.74926 18.0096 7.75219 18.6172C6.2087 19.5576 4.44239 17.7913 5.38285 16.2478C5.99038 15.2507 5.45193 13.9508 4.31731 13.6754C2.5609 13.249 2.5609 10.751 4.31731 10.3246C5.45193 10.0492 5.99037 8.74926 5.38285 7.75218C4.44239 6.2087 6.2087 4.44239 7.75219 5.38285C8.74926 5.99037 10.0492 5.45193 10.3246 4.31731Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M15 12C15 13.6569 13.6569 15 12 15C10.3431 15 9 13.6569 9 12C9 10.3431 10.3431 9 12 9C13.6569 9 15 10.3431 15 12Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/app/public/icons/Icon_plus.svg b/app/public/icons/Icon_plus.svg new file mode 100644 index 000000000..75d7e2f28 --- /dev/null +++ b/app/public/icons/Icon_plus.svg @@ -0,0 +1,3 @@ +<svg width="15" height="14" viewBox="0 0 15 14" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 0C8.05228 0 8.5 0.447715 8.5 1V6H13.5C14.0523 6 14.5 6.44772 14.5 7C14.5 7.55228 14.0523 8 13.5 8H8.5V13C8.5 13.5523 8.05228 14 7.5 14C6.94772 14 6.5 13.5523 6.5 13V8H1.5C0.947715 8 0.5 7.55228 0.5 7C0.5 6.44771 0.947715 6 1.5 6L6.5 6V1C6.5 0.447715 6.94772 0 7.5 0Z" fill="white"/> +</svg> diff --git a/web-client/public/icons/Jan.svg b/app/public/icons/Jan.svg similarity index 100% rename from web-client/public/icons/Jan.svg rename to app/public/icons/Jan.svg diff --git a/app/public/icons/Jan_AppIcon.svg b/app/public/icons/Jan_AppIcon.svg new file mode 100644 index 000000000..a823ab3ed --- /dev/null +++ b/app/public/icons/Jan_AppIcon.svg @@ -0,0 +1,15 @@ +<svg width="68" height="28" viewBox="0 0 68 28" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M27.0157 6.56975C26.0798 6.41763 25.3942 6.92314 24.8653 7.59949C23.7445 9.02943 23.3865 10.7426 23.1665 12.4978C23.3841 14.0448 22.6143 15.1845 21.6503 16.2657C21.0814 16.87 20.6438 17.5856 20.3651 18.3675C20.0864 19.1493 19.9727 19.9803 20.031 20.8083C20.0677 21.5222 20.1886 22.2292 20.3914 22.9146C20.4345 23.0209 20.4689 23.1304 20.4943 23.2423C20.513 23.3967 20.5973 23.6027 20.4241 23.6916C20.2135 23.7992 20.0802 23.5886 20.0029 23.4576C19.8119 23.133 19.6551 22.7895 19.535 22.4325C18.84 20.1296 18.9359 17.9086 20.4101 15.8936C20.7385 15.4661 21.0916 15.0582 21.4677 14.672C22.1697 13.9277 22.2844 13.3263 21.8024 12.4463C20.5832 10.2253 19.3361 8.01607 18.1006 5.80212C17.2886 4.34409 16.4626 2.89075 15.667 1.4257C15.4029 0.958785 15.0423 0.553496 14.6094 0.236816C13.547 0.637013 13.2873 1.14252 13.6126 2.20503C13.6809 2.44449 13.7653 2.67905 13.8653 2.90713C14.3496 3.98134 14.8457 5.05087 15.3324 6.12508C16.0016 7.60183 16.6849 9.07156 17.2395 10.5951C17.319 10.8151 17.5296 11.0889 17.1623 11.2738C16.7223 11.7629 16.3737 11.7887 15.9221 11.3487C15.2201 10.6677 14.7732 9.80642 14.2678 8.99199C12.9246 6.8108 11.6026 4.62727 10.3016 2.44141C9.988 1.91951 9.50598 1.70186 8.99587 1.49123C8.09967 1.90781 7.861 2.40396 8.11839 3.34243C8.25212 3.78059 8.43502 4.2022 8.6636 4.59919C10.1284 7.32801 11.6845 10.0054 13.2171 12.6944C13.3632 12.8779 13.4373 13.1084 13.4254 13.3427C13.1025 14.1243 12.3584 14.0588 11.9068 13.4971C10.9076 12.245 9.94121 10.9672 8.95375 9.70813C8.14413 8.68072 7.31579 7.66502 6.50384 6.64464C6.1758 6.23383 5.74227 5.91996 5.24963 5.73659C4.49851 6.10636 4.21772 6.71017 4.45171 7.49184C4.57736 7.88129 4.76631 8.24739 5.01096 8.57541C6.55999 10.8689 8.10747 13.1601 9.65339 15.449C9.80081 15.6643 10.0442 15.8772 9.86867 16.1955C9.5247 16.8298 8.87887 16.9561 8.33367 16.4296C7.63169 15.7579 6.99522 15.0464 6.35174 14.3233C5.5819 13.462 4.8378 12.575 4.082 11.6997C3.78483 11.3557 3.38002 11.2059 2.97287 11.0304C2.27089 11.3932 2.09773 11.7723 2.27089 12.4978C2.38042 12.8949 2.56467 13.2674 2.81375 13.5954C3.42682 14.466 4.03754 15.339 4.67166 16.1932C7.0116 19.355 9.35154 22.5121 12.0799 25.3649C13.9355 27.298 16.1701 28.1897 18.8447 27.9627C18.9428 27.9697 19.0413 27.9697 19.1395 27.9627C22.8109 27.628 26.1266 24.7026 26.9292 21.1009C27.223 19.6189 27.3439 18.1079 27.2895 16.5981C27.2684 14.6111 27.2895 12.6195 27.5984 10.6583C27.7796 9.74169 27.9108 8.81589 27.9915 7.88501C28.057 7.12675 27.7622 6.69144 27.0157 6.56975Z" fill="#FEC928"/> +<path d="M23.1712 12.4976C23.3888 14.0446 22.619 15.1843 21.6549 16.2655C21.0852 16.8694 20.6468 17.5849 20.3673 18.3667C20.0878 19.1485 19.9733 19.9798 20.031 20.8081C20.0676 21.522 20.1886 22.229 20.3914 22.9144C20.4345 23.0207 20.4689 23.1302 20.4943 23.242C20.513 23.3965 20.5973 23.6025 20.4241 23.6914C20.2135 23.799 20.0801 23.5884 20.0029 23.4574C19.8119 23.1328 19.6551 22.7892 19.5349 22.4323C18.84 20.1294 18.9359 17.9084 20.4101 15.8934C20.7384 15.4659 21.0916 15.0579 21.4677 14.6718C22.1697 13.9275 22.2844 13.3261 21.8023 12.4461C20.5832 10.2251 19.336 8.01587 18.1029 5.80191C17.2886 4.34389 16.4649 2.89054 15.667 1.4255C15.4029 0.95858 15.0423 0.553291 14.6094 0.236612C15.4962 0.0470449 15.9923 0.573619 16.3854 1.23593C17.2605 2.6963 18.1193 4.16836 18.9874 5.63107C20.2837 7.81538 21.5816 9.99968 22.8811 12.184C22.9583 12.2963 23.0074 12.4461 23.1712 12.4976Z" fill="#EDA703"/> +<path d="M18.8447 27.9625C18.8751 27.6395 19.1652 27.67 19.3618 27.6068C21.0231 27.0849 22.5464 26.3149 23.7749 25.0582C25.3317 23.4844 26.249 21.3886 26.3488 19.1769C26.4448 17.6838 26.3676 16.1953 26.4284 14.7069C26.4927 12.4986 26.9466 10.319 27.7692 8.26864C27.8338 8.1377 27.9081 8.01175 27.9915 7.89185C27.9108 8.82272 27.7796 9.74852 27.5984 10.6651C27.2848 12.6357 27.2684 14.618 27.2895 16.6049C27.3439 18.1147 27.223 19.6257 26.9292 21.1077C26.1266 24.7095 22.8109 27.6349 19.1395 27.9695C19.0412 27.9742 18.9427 27.9719 18.8447 27.9625Z" fill="#EDA807"/> +<path d="M17.1622 11.2502C16.7223 11.7393 16.3737 11.7651 15.9221 11.3251C15.2201 10.6441 14.7732 9.78282 14.2677 8.96838C12.9246 6.8028 11.6026 4.62707 10.3016 2.4412C9.988 1.91931 9.50597 1.70166 8.99586 1.49103C9.51065 1.16806 9.99502 1.29444 10.463 1.59634C10.8488 1.87602 11.1683 2.23716 11.399 2.65417C13.0073 5.19889 14.6133 7.74751 16.2169 10.3C16.4603 10.6745 16.7013 11.0747 17.1622 11.2502Z" fill="#EDA805"/> +<path d="M13.4254 13.3425C13.1025 14.1242 12.3584 14.0587 11.9068 13.497C10.9076 12.2449 9.94121 10.9671 8.95376 9.70801C8.14414 8.68061 7.3158 7.66491 6.50384 6.64452C6.17581 6.23372 5.74228 5.91984 5.24963 5.73647C5.95162 5.46266 6.62552 5.69201 7.25964 6.43857C7.85866 7.15471 8.42961 7.8849 9.03331 8.60572C10.1861 10.0099 11.3413 11.4141 12.4988 12.8183C12.7351 13.1085 12.9667 13.4268 13.4254 13.3425Z" fill="#EDA805"/> +<path d="M5.9984 21.6764C5.33928 21.4779 4.73152 21.1376 4.21771 20.6795C2.87982 19.4981 1.94672 17.9264 1.55018 16.186C1.47998 15.8865 1.57124 15.6875 1.84735 15.6103C2.12347 15.5331 2.21239 15.7437 2.29194 15.9567C3.05476 17.9974 4.28323 19.6731 6.12944 20.8714C6.24436 20.9207 6.33679 21.0111 6.38871 21.1249C6.44062 21.2387 6.44829 21.3677 6.41023 21.4869C6.35174 21.6811 6.18326 21.6881 5.9984 21.6764Z" fill="#B2BFC6"/> +<path d="M0.00582356 17.4405C-0.010556 17.2205 0.0479424 17.0333 0.284276 16.9725C0.586128 16.9069 0.682066 17.1456 0.752264 17.361C1.16328 18.4846 1.7675 19.5277 2.53764 20.4432C3.11893 21.1412 3.80393 21.7458 4.5687 22.2359C4.65483 22.2774 4.73085 22.3373 4.79147 22.4112C4.85209 22.4852 4.89585 22.5715 4.91969 22.6641C4.96415 22.952 4.6857 23.1322 4.33705 23.0058C3.33285 22.6399 2.45156 21.9993 1.79354 21.157C0.985591 20.1689 0.395516 19.0213 0.0619821 17.7892C0.0356685 17.6744 0.0169088 17.5579 0.00582356 17.4405Z" fill="#B2BFC6"/> +<path d="M20.0708 0.00268555C20.4263 0.100761 20.7588 0.268624 21.0489 0.496495C22.6588 1.62219 23.555 3.22298 24.0534 5.0812C24.1165 5.31523 24.154 5.56097 24.1984 5.80202C24.2163 5.85265 24.2232 5.90647 24.2189 5.95998C24.2145 6.01348 24.1989 6.06546 24.173 6.11251C24.1472 6.15956 24.1117 6.20062 24.0689 6.23302C24.0261 6.26542 23.977 6.28842 23.9247 6.30051C23.6579 6.37306 23.5386 6.20924 23.4707 5.97521C23.0923 4.66353 22.4559 3.44061 21.5988 2.37812C21.1094 1.7633 20.536 1.22047 19.8953 0.765633C19.8023 0.711974 19.7292 0.629582 19.687 0.530834C19.6448 0.432085 19.6358 0.32231 19.6613 0.217996C19.7011 0.0190678 19.8649 0.00268555 20.0708 0.00268555Z" fill="#B2BFC6"/> +<path d="M22.5769 7.10317C22.5963 7.20372 22.577 7.30792 22.5227 7.39478C22.4684 7.48163 22.3833 7.54469 22.2844 7.57124C22.0083 7.64613 21.8936 7.45422 21.8304 7.23891C21.5444 6.25071 21.113 5.31055 20.5505 4.44924C19.9752 3.55133 19.239 2.76743 18.379 2.13699C18.3254 2.09942 18.2753 2.05712 18.2293 2.01061C18.0842 1.85849 17.897 1.70169 18.0444 1.46532C18.1918 1.22894 18.4281 1.25469 18.6551 1.35298C19.4671 1.71487 20.1792 2.26815 20.7306 2.96547C21.674 4.12378 22.3041 5.50502 22.5605 6.97679C22.5675 7.0236 22.5745 7.07509 22.5769 7.10317Z" fill="#B2BFC6"/> +<path d="M9.86867 16.1931C9.5247 16.8273 8.87887 16.9537 8.33367 16.4271C7.63169 15.7554 6.99522 15.044 6.35174 14.3208C5.5819 13.4596 4.8378 12.5726 4.082 11.6973C3.78483 11.3533 3.38002 11.2035 2.97287 11.028C3.63039 10.6722 4.1639 10.7588 4.72548 11.3556C5.68252 12.3713 6.62083 13.4034 7.57553 14.4191C8.04104 14.9277 8.54144 15.4031 9.07309 15.842C9.29101 16.0456 9.57144 16.1693 9.86867 16.1931Z" fill="#EDA805"/> +<path d="M42.6705 8.36353H45.1023V16.4772C45.1023 17.2272 44.9337 17.8787 44.5966 18.4317C44.2633 18.9847 43.7992 19.4109 43.2045 19.7101C42.6099 20.0094 41.9186 20.159 41.1307 20.159C40.4299 20.159 39.7936 20.0359 39.2216 19.7897C38.6534 19.5397 38.2027 19.1609 37.8693 18.6533C37.536 18.1419 37.3712 17.4999 37.375 16.7272H39.8239C39.8314 17.034 39.8939 17.2972 40.0114 17.5169C40.1326 17.7328 40.2974 17.8995 40.5057 18.0169C40.7178 18.1306 40.9678 18.1874 41.2557 18.1874C41.5587 18.1874 41.8144 18.123 42.0227 17.9942C42.2349 17.8616 42.3958 17.6685 42.5057 17.4147C42.6155 17.1609 42.6705 16.8484 42.6705 16.4772V8.36353Z" fill="black"/> +<path d="M49.5795 20.1647C49.0227 20.1647 48.5265 20.0681 48.0909 19.8749C47.6553 19.6779 47.3106 19.3881 47.0568 19.0056C46.8068 18.6192 46.6818 18.1381 46.6818 17.5624C46.6818 17.0775 46.7708 16.6703 46.9489 16.3408C47.1269 16.0113 47.3693 15.7461 47.6761 15.5453C47.983 15.3446 48.3314 15.1931 48.7216 15.0908C49.1155 14.9885 49.5284 14.9166 49.9602 14.8749C50.4678 14.8219 50.8769 14.7726 51.1875 14.7272C51.4981 14.6779 51.7235 14.606 51.8636 14.5113C52.0038 14.4166 52.0739 14.2764 52.0739 14.0908V14.0567C52.0739 13.6969 51.9602 13.4184 51.733 13.2215C51.5095 13.0245 51.1913 12.926 50.7784 12.926C50.3428 12.926 49.9962 13.0226 49.7386 13.2158C49.4811 13.4052 49.3106 13.6438 49.2273 13.9317L46.9886 13.7499C47.1023 13.2196 47.3258 12.7613 47.6591 12.3749C47.9924 11.9847 48.4224 11.6855 48.9489 11.4772C49.4792 11.265 50.0928 11.159 50.7898 11.159C51.2746 11.159 51.7386 11.2158 52.1818 11.3294C52.6288 11.4431 53.0246 11.6192 53.3693 11.8578C53.7178 12.0965 53.9924 12.4033 54.1932 12.7783C54.3939 13.1495 54.4943 13.5946 54.4943 14.1135V19.9999H52.1989V18.7897H52.1307C51.9905 19.0624 51.803 19.3029 51.5682 19.5113C51.3333 19.7158 51.0511 19.8768 50.7216 19.9942C50.392 20.1078 50.0114 20.1647 49.5795 20.1647ZM50.2727 18.4942C50.6288 18.4942 50.9432 18.4241 51.2159 18.284C51.4886 18.14 51.7027 17.9469 51.858 17.7044C52.0133 17.462 52.0909 17.1874 52.0909 16.8806V15.9544C52.0152 16.0037 51.911 16.0491 51.7784 16.0908C51.6496 16.1287 51.5038 16.1647 51.3409 16.1988C51.178 16.2291 51.0152 16.2575 50.8523 16.284C50.6894 16.3067 50.5417 16.3275 50.4091 16.3465C50.125 16.3881 49.8769 16.4544 49.6648 16.5453C49.4527 16.6363 49.2879 16.7594 49.1705 16.9147C49.053 17.0662 48.9943 17.2556 48.9943 17.4828C48.9943 17.8124 49.1136 18.0643 49.3523 18.2385C49.5947 18.409 49.9015 18.4942 50.2727 18.4942Z" fill="black"/> +<path d="M58.7926 14.9544V19.9999H56.3722V11.2726H58.679V12.8124H58.7813C58.9744 12.3048 59.2983 11.9033 59.7528 11.6078C60.2074 11.3086 60.7585 11.159 61.4063 11.159C62.0123 11.159 62.5407 11.2916 62.9915 11.5567C63.4422 11.8219 63.7926 12.2006 64.0426 12.6931C64.2926 13.1817 64.4176 13.765 64.4176 14.4431V19.9999H61.9972V14.8749C62.0009 14.3408 61.8646 13.9241 61.5881 13.6249C61.3116 13.3219 60.9309 13.1703 60.446 13.1703C60.1203 13.1703 59.8324 13.2404 59.5824 13.3806C59.3362 13.5207 59.143 13.7253 59.0028 13.9942C58.8665 14.2594 58.7964 14.5794 58.7926 14.9544Z" fill="black"/> +</svg> diff --git a/app/public/icons/Search_gray.svg b/app/public/icons/Search_gray.svg new file mode 100644 index 000000000..6a098b6f2 --- /dev/null +++ b/app/public/icons/Search_gray.svg @@ -0,0 +1,3 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M21 21L15 15M17 10C17 13.866 13.866 17 10 17C6.13401 17 3 13.866 3 10C3 6.13401 6.13401 3 10 3C13.866 3 17 6.13401 17 10Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/app/public/icons/ViewGrid.svg b/app/public/icons/ViewGrid.svg new file mode 100644 index 000000000..2a1fd31b1 --- /dev/null +++ b/app/public/icons/ViewGrid.svg @@ -0,0 +1,6 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M4 6C4 4.89543 4.89543 4 6 4H8C9.10457 4 10 4.89543 10 6V8C10 9.10457 9.10457 10 8 10H6C4.89543 10 4 9.10457 4 8V6Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M14 6C14 4.89543 14.8954 4 16 4H18C19.1046 4 20 4.89543 20 6V8C20 9.10457 19.1046 10 18 10H16C14.8954 10 14 9.10457 14 8V6Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M4 16C4 14.8954 4.89543 14 6 14H8C9.10457 14 10 14.8954 10 16V18C10 19.1046 9.10457 20 8 20H6C4.89543 20 4 19.1046 4 18V16Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +<path d="M14 16C14 14.8954 14.8954 14 16 14H18C19.1046 14 20 14.8954 20 16V18C20 19.1046 19.1046 20 18 20H16C14.8954 20 14 19.1046 14 18V16Z" stroke="#9CA3AF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web-client/public/icons/app_icon.svg b/app/public/icons/app_icon.svg similarity index 100% rename from web-client/public/icons/app_icon.svg rename to app/public/icons/app_icon.svg diff --git a/web-client/public/icons/apple.svg b/app/public/icons/apple.svg similarity index 100% rename from web-client/public/icons/apple.svg rename to app/public/icons/apple.svg diff --git a/web-client/public/icons/arrow-circle-down.svg b/app/public/icons/arrow-circle-down.svg similarity index 100% rename from web-client/public/icons/arrow-circle-down.svg rename to app/public/icons/arrow-circle-down.svg diff --git a/web-client/public/icons/arrow-gray.svg b/app/public/icons/arrow-gray.svg similarity index 100% rename from web-client/public/icons/arrow-gray.svg rename to app/public/icons/arrow-gray.svg diff --git a/app/public/icons/avatar.svg b/app/public/icons/avatar.svg new file mode 100644 index 000000000..30d300289 --- /dev/null +++ b/app/public/icons/avatar.svg @@ -0,0 +1 @@ +<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" viewBox="0, 0, 100, 100" class="la-all letterAvatar2 li-la2-Landon"><circle cx="50" cy="50" r="49" fill="#a12e9d" stroke="#ffffff" stroke-width="1" class="la2-circle"></circle><text x="50" y="71.5" font-family="Arial" font-size="60" font-weight="700" text-anchor="middle" fill="#ffffff" class="la2-text">U</text></svg> \ No newline at end of file diff --git a/web-client/public/icons/brain.svg b/app/public/icons/brain.svg similarity index 100% rename from web-client/public/icons/brain.svg rename to app/public/icons/brain.svg diff --git a/app/public/icons/chat-bubble-oval-left.svg b/app/public/icons/chat-bubble-oval-left.svg new file mode 100644 index 000000000..062de060a --- /dev/null +++ b/app/public/icons/chat-bubble-oval-left.svg @@ -0,0 +1,3 @@ +<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M16 27C22.6274 27 28 22.0751 28 16C28 9.92487 22.6274 5 16 5C9.37258 5 4 9.92487 4 16C4 18.9181 5.2396 21.5709 7.26245 23.5399C7.70761 23.9732 8.00605 24.565 7.88518 25.1744C7.68369 26.1902 7.22576 27.1137 6.58105 27.8746C6.78906 27.9119 7 27.941 7.21289 27.9618C7.47168 27.9871 7.73438 28 8 28C9.70934 28 11.2935 27.4638 12.5936 26.5505C13.6734 26.843 14.8167 27 16 27Z" stroke="#6B7280" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> +</svg> diff --git a/web-client/public/icons/chat.svg b/app/public/icons/chat.svg similarity index 100% rename from web-client/public/icons/chat.svg rename to app/public/icons/chat.svg diff --git a/web-client/public/icons/chats-circle-light.svg b/app/public/icons/chats-circle-light.svg similarity index 100% rename from web-client/public/icons/chats-circle-light.svg rename to app/public/icons/chats-circle-light.svg diff --git a/web-client/public/icons/chevron-left.svg b/app/public/icons/chevron-left.svg similarity index 100% rename from web-client/public/icons/chevron-left.svg rename to app/public/icons/chevron-left.svg diff --git a/web-client/public/icons/chevron-right.svg b/app/public/icons/chevron-right.svg similarity index 100% rename from web-client/public/icons/chevron-right.svg rename to app/public/icons/chevron-right.svg diff --git a/web-client/public/icons/close_modal_btn.png b/app/public/icons/close_modal_btn.png similarity index 100% rename from web-client/public/icons/close_modal_btn.png rename to app/public/icons/close_modal_btn.png diff --git a/web-client/public/icons/code.svg b/app/public/icons/code.svg similarity index 100% rename from web-client/public/icons/code.svg rename to app/public/icons/code.svg diff --git a/web-client/public/icons/copy.svg b/app/public/icons/copy.svg similarity index 100% rename from web-client/public/icons/copy.svg rename to app/public/icons/copy.svg diff --git a/web-client/public/icons/discord-icon.svg b/app/public/icons/discord-icon.svg similarity index 100% rename from web-client/public/icons/discord-icon.svg rename to app/public/icons/discord-icon.svg diff --git a/web-client/public/icons/discord.svg b/app/public/icons/discord.svg similarity index 100% rename from web-client/public/icons/discord.svg rename to app/public/icons/discord.svg diff --git a/web-client/public/icons/download.svg b/app/public/icons/download.svg similarity index 100% rename from web-client/public/icons/download.svg rename to app/public/icons/download.svg diff --git a/web-client/public/icons/edit_text.svg b/app/public/icons/edit_text.svg similarity index 100% rename from web-client/public/icons/edit_text.svg rename to app/public/icons/edit_text.svg diff --git a/web-client/public/icons/google_play_logo.svg b/app/public/icons/google_play_logo.svg similarity index 100% rename from web-client/public/icons/google_play_logo.svg rename to app/public/icons/google_play_logo.svg diff --git a/web-client/public/icons/googleplay.svg b/app/public/icons/googleplay.svg similarity index 100% rename from web-client/public/icons/googleplay.svg rename to app/public/icons/googleplay.svg diff --git a/web-client/public/icons/ic_api.svg b/app/public/icons/ic_api.svg similarity index 100% rename from web-client/public/icons/ic_api.svg rename to app/public/icons/ic_api.svg diff --git a/web-client/public/icons/ic_arrowback.svg b/app/public/icons/ic_arrowback.svg similarity index 100% rename from web-client/public/icons/ic_arrowback.svg rename to app/public/icons/ic_arrowback.svg diff --git a/web-client/public/icons/ic_arrowright.svg b/app/public/icons/ic_arrowright.svg similarity index 100% rename from web-client/public/icons/ic_arrowright.svg rename to app/public/icons/ic_arrowright.svg diff --git a/web-client/public/icons/ic_billing.svg b/app/public/icons/ic_billing.svg similarity index 100% rename from web-client/public/icons/ic_billing.svg rename to app/public/icons/ic_billing.svg diff --git a/web-client/public/icons/ic_conversation_ai.svg b/app/public/icons/ic_conversation_ai.svg similarity index 100% rename from web-client/public/icons/ic_conversation_ai.svg rename to app/public/icons/ic_conversation_ai.svg diff --git a/web-client/public/icons/ic_dashboard.svg b/app/public/icons/ic_dashboard.svg similarity index 100% rename from web-client/public/icons/ic_dashboard.svg rename to app/public/icons/ic_dashboard.svg diff --git a/web-client/public/icons/ic_enhance.svg b/app/public/icons/ic_enhance.svg similarity index 100% rename from web-client/public/icons/ic_enhance.svg rename to app/public/icons/ic_enhance.svg diff --git a/web-client/public/icons/ic_generative_art.svg b/app/public/icons/ic_generative_art.svg similarity index 100% rename from web-client/public/icons/ic_generative_art.svg rename to app/public/icons/ic_generative_art.svg diff --git a/web-client/public/icons/ic_image.svg b/app/public/icons/ic_image.svg similarity index 100% rename from web-client/public/icons/ic_image.svg rename to app/public/icons/ic_image.svg diff --git a/web-client/public/icons/ic_member.svg b/app/public/icons/ic_member.svg similarity index 100% rename from web-client/public/icons/ic_member.svg rename to app/public/icons/ic_member.svg diff --git a/web-client/public/icons/ic_on_device_ai.svg b/app/public/icons/ic_on_device_ai.svg similarity index 100% rename from web-client/public/icons/ic_on_device_ai.svg rename to app/public/icons/ic_on_device_ai.svg diff --git a/web-client/public/icons/ic_plus.svg b/app/public/icons/ic_plus.svg similarity index 100% rename from web-client/public/icons/ic_plus.svg rename to app/public/icons/ic_plus.svg diff --git a/web-client/public/icons/ic_prompt_library.svg b/app/public/icons/ic_prompt_library.svg similarity index 100% rename from web-client/public/icons/ic_prompt_library.svg rename to app/public/icons/ic_prompt_library.svg diff --git a/web-client/public/icons/ic_random.svg b/app/public/icons/ic_random.svg similarity index 100% rename from web-client/public/icons/ic_random.svg rename to app/public/icons/ic_random.svg diff --git a/web-client/public/icons/ic_setting.svg b/app/public/icons/ic_setting.svg similarity index 100% rename from web-client/public/icons/ic_setting.svg rename to app/public/icons/ic_setting.svg diff --git a/web-client/public/icons/ic_sidebar.svg b/app/public/icons/ic_sidebar.svg similarity index 100% rename from web-client/public/icons/ic_sidebar.svg rename to app/public/icons/ic_sidebar.svg diff --git a/web-client/public/icons/ic_sidebar_fill.svg b/app/public/icons/ic_sidebar_fill.svg similarity index 100% rename from web-client/public/icons/ic_sidebar_fill.svg rename to app/public/icons/ic_sidebar_fill.svg diff --git a/web-client/public/icons/ico_Discord.svg b/app/public/icons/ico_Discord.svg similarity index 100% rename from web-client/public/icons/ico_Discord.svg rename to app/public/icons/ico_Discord.svg diff --git a/web-client/public/icons/ico_logo.svg b/app/public/icons/ico_logo.svg similarity index 100% rename from web-client/public/icons/ico_logo.svg rename to app/public/icons/ico_logo.svg diff --git a/web-client/public/icons/ico_mobile-android.svg b/app/public/icons/ico_mobile-android.svg similarity index 100% rename from web-client/public/icons/ico_mobile-android.svg rename to app/public/icons/ico_mobile-android.svg diff --git a/web-client/public/icons/ico_settingblack.svg b/app/public/icons/ico_settingblack.svg similarity index 100% rename from web-client/public/icons/ico_settingblack.svg rename to app/public/icons/ico_settingblack.svg diff --git a/web-client/public/icons/janai_logo.svg b/app/public/icons/janai_logo.svg similarity index 100% rename from web-client/public/icons/janai_logo.svg rename to app/public/icons/janai_logo.svg diff --git a/web-client/public/icons/loading.svg b/app/public/icons/loading.svg similarity index 100% rename from web-client/public/icons/loading.svg rename to app/public/icons/loading.svg diff --git a/web-client/public/icons/magnifyingglass.svg b/app/public/icons/magnifyingglass.svg similarity index 100% rename from web-client/public/icons/magnifyingglass.svg rename to app/public/icons/magnifyingglass.svg diff --git a/web-client/public/icons/messicon.svg b/app/public/icons/messicon.svg similarity index 100% rename from web-client/public/icons/messicon.svg rename to app/public/icons/messicon.svg diff --git a/web-client/public/icons/play.svg b/app/public/icons/play.svg similarity index 100% rename from web-client/public/icons/play.svg rename to app/public/icons/play.svg diff --git a/web-client/public/icons/refresh.svg b/app/public/icons/refresh.svg similarity index 100% rename from web-client/public/icons/refresh.svg rename to app/public/icons/refresh.svg diff --git a/web-client/public/icons/search.svg b/app/public/icons/search.svg similarity index 100% rename from web-client/public/icons/search.svg rename to app/public/icons/search.svg diff --git a/web-client/public/icons/share_with_friend_btn.svg b/app/public/icons/share_with_friend_btn.svg similarity index 100% rename from web-client/public/icons/share_with_friend_btn.svg rename to app/public/icons/share_with_friend_btn.svg diff --git a/web-client/public/icons/social_icon_apple.svg b/app/public/icons/social_icon_apple.svg similarity index 100% rename from web-client/public/icons/social_icon_apple.svg rename to app/public/icons/social_icon_apple.svg diff --git a/web-client/public/icons/social_icon_google.svg b/app/public/icons/social_icon_google.svg similarity index 100% rename from web-client/public/icons/social_icon_google.svg rename to app/public/icons/social_icon_google.svg diff --git a/web-client/public/icons/telegram-icon.svg b/app/public/icons/telegram-icon.svg similarity index 100% rename from web-client/public/icons/telegram-icon.svg rename to app/public/icons/telegram-icon.svg diff --git a/web-client/public/icons/trash_bin.svg b/app/public/icons/trash_bin.svg similarity index 100% rename from web-client/public/icons/trash_bin.svg rename to app/public/icons/trash_bin.svg diff --git a/web-client/public/icons/unicorn_angle-down.svg b/app/public/icons/unicorn_angle-down.svg similarity index 100% rename from web-client/public/icons/unicorn_angle-down.svg rename to app/public/icons/unicorn_angle-down.svg diff --git a/web-client/public/icons/unicorn_angle-up.svg b/app/public/icons/unicorn_angle-up.svg similarity index 100% rename from web-client/public/icons/unicorn_angle-up.svg rename to app/public/icons/unicorn_angle-up.svg diff --git a/web-client/public/icons/unicorn_arrow-random.svg b/app/public/icons/unicorn_arrow-random.svg similarity index 100% rename from web-client/public/icons/unicorn_arrow-random.svg rename to app/public/icons/unicorn_arrow-random.svg diff --git a/web-client/public/icons/unicorn_arrow.svg b/app/public/icons/unicorn_arrow.svg similarity index 100% rename from web-client/public/icons/unicorn_arrow.svg rename to app/public/icons/unicorn_arrow.svg diff --git a/web-client/public/icons/unicorn_chat.svg b/app/public/icons/unicorn_chat.svg similarity index 100% rename from web-client/public/icons/unicorn_chat.svg rename to app/public/icons/unicorn_chat.svg diff --git a/web-client/public/icons/unicorn_clipboard-alt.svg b/app/public/icons/unicorn_clipboard-alt.svg similarity index 100% rename from web-client/public/icons/unicorn_clipboard-alt.svg rename to app/public/icons/unicorn_clipboard-alt.svg diff --git a/web-client/public/icons/unicorn_exclamation-circle.svg b/app/public/icons/unicorn_exclamation-circle.svg similarity index 100% rename from web-client/public/icons/unicorn_exclamation-circle.svg rename to app/public/icons/unicorn_exclamation-circle.svg diff --git a/web-client/public/icons/unicorn_exit.svg b/app/public/icons/unicorn_exit.svg similarity index 100% rename from web-client/public/icons/unicorn_exit.svg rename to app/public/icons/unicorn_exit.svg diff --git a/web-client/public/icons/unicorn_image-v.svg b/app/public/icons/unicorn_image-v.svg similarity index 100% rename from web-client/public/icons/unicorn_image-v.svg rename to app/public/icons/unicorn_image-v.svg diff --git a/web-client/public/icons/unicorn_image-v2.svg b/app/public/icons/unicorn_image-v2.svg similarity index 100% rename from web-client/public/icons/unicorn_image-v2.svg rename to app/public/icons/unicorn_image-v2.svg diff --git a/web-client/public/icons/unicorn_info-circle-fill.svg b/app/public/icons/unicorn_info-circle-fill.svg similarity index 100% rename from web-client/public/icons/unicorn_info-circle-fill.svg rename to app/public/icons/unicorn_info-circle-fill.svg diff --git a/web-client/public/icons/unicorn_info-circle.svg b/app/public/icons/unicorn_info-circle.svg similarity index 100% rename from web-client/public/icons/unicorn_info-circle.svg rename to app/public/icons/unicorn_info-circle.svg diff --git a/web-client/public/icons/unicorn_layers-alt.svg b/app/public/icons/unicorn_layers-alt.svg similarity index 100% rename from web-client/public/icons/unicorn_layers-alt.svg rename to app/public/icons/unicorn_layers-alt.svg diff --git a/web-client/public/icons/unicorn_plus.svg b/app/public/icons/unicorn_plus.svg similarity index 100% rename from web-client/public/icons/unicorn_plus.svg rename to app/public/icons/unicorn_plus.svg diff --git a/web-client/public/icons/unicorn_trash.svg b/app/public/icons/unicorn_trash.svg similarity index 100% rename from web-client/public/icons/unicorn_trash.svg rename to app/public/icons/unicorn_trash.svg diff --git a/app/public/icons/unicorn_twitter.svg b/app/public/icons/unicorn_twitter.svg new file mode 100644 index 000000000..b1bfc9b05 --- /dev/null +++ b/app/public/icons/unicorn_twitter.svg @@ -0,0 +1,3 @@ +<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22.25 5.79997C21.4983 6.12606 20.7034 6.34163 19.89 6.43997C20.7482 5.92729 21.3913 5.12075 21.7 4.16997C20.8936 4.65003 20.0108 4.98826 19.09 5.16997C18.4745 4.50254 17.655 4.05826 16.7598 3.90682C15.8647 3.75537 14.9445 3.90532 14.1438 4.33315C13.343 4.76099 12.7069 5.4425 12.3352 6.2708C11.9635 7.09911 11.8773 8.02736 12.09 8.90997C10.4594 8.82749 8.86444 8.40292 7.40865 7.66383C5.95287 6.92474 4.66885 5.88766 3.64 4.61997C3.27914 5.25013 3.08952 5.96379 3.09 6.68997C3.08872 7.36435 3.25422 8.02858 3.57176 8.62353C3.88929 9.21848 4.34902 9.72568 4.91 10.1C4.25798 10.0822 3.61989 9.90726 3.05 9.58997V9.63997C3.05489 10.5849 3.38599 11.4991 3.98731 12.2279C4.58864 12.9568 5.42326 13.4556 6.35 13.64C5.99326 13.7485 5.62287 13.8058 5.25 13.81C4.99189 13.807 4.73442 13.7835 4.48 13.74C4.74391 14.5528 5.25462 15.2631 5.94107 15.7721C6.62753 16.2811 7.45558 16.5635 8.31 16.58C6.8672 17.7152 5.08588 18.3348 3.25 18.34C2.91574 18.3411 2.58174 18.321 2.25 18.28C4.12443 19.4902 6.30881 20.1327 8.54 20.13C10.0797 20.146 11.6071 19.855 13.0331 19.274C14.4591 18.6931 15.755 17.8338 16.8452 16.7465C17.9354 15.6591 18.798 14.3654 19.3826 12.9409C19.9672 11.5164 20.262 9.98969 20.25 8.44997C20.25 8.27996 20.25 8.09997 20.25 7.91997C21.0347 7.33478 21.7115 6.61739 22.25 5.79997Z" fill="#6B7280"/> +</svg> diff --git a/web-client/public/icons/upload_photo.svg b/app/public/icons/upload_photo.svg similarity index 100% rename from web-client/public/icons/upload_photo.svg rename to app/public/icons/upload_photo.svg diff --git a/web-client/public/icons/whatsapp-icon.svg b/app/public/icons/whatsapp-icon.svg similarity index 100% rename from web-client/public/icons/whatsapp-icon.svg rename to app/public/icons/whatsapp-icon.svg diff --git a/app/public/images/banner.jpg b/app/public/images/banner.jpg new file mode 100644 index 000000000..dddc713a9 Binary files /dev/null and b/app/public/images/banner.jpg differ diff --git a/web-client/public/images/mobile.jpg b/app/public/images/mobile.jpg similarity index 100% rename from web-client/public/images/mobile.jpg rename to app/public/images/mobile.jpg diff --git a/web-client/public/images/preview.jpg b/app/public/images/preview.jpg similarity index 100% rename from web-client/public/images/preview.jpg rename to app/public/images/preview.jpg diff --git a/web-client/public/next.svg b/app/public/next.svg similarity index 100% rename from web-client/public/next.svg rename to app/public/next.svg diff --git a/web-client/public/vercel.svg b/app/public/vercel.svg similarity index 100% rename from web-client/public/vercel.svg rename to app/public/vercel.svg diff --git a/app/shared/coreService.ts b/app/shared/coreService.ts new file mode 100644 index 000000000..f465c39a6 --- /dev/null +++ b/app/shared/coreService.ts @@ -0,0 +1,33 @@ +export type CoreService = + | DataService + | ModelService + | InfereceService + | ModelManagementService + | PreferenceService; + +export enum DataService { + GET_CONVERSATIONS = "getConversations", + CREATE_CONVERSATION = "createConversation", + DELETE_CONVERSATION = "deleteConversation", + CREATE_MESSAGE = "createMessage", + GET_CONVERSATION_MESSAGES = "getConversationMessages", +} + +export enum ModelService { + GET_MODELS = "getModels", +} + +export enum InfereceService { + INFERENCE = "inference", +} + +export enum ModelManagementService { + GET_DOWNLOADED_MODELS = "getDownloadedModels", + DELETE_MODEL = "deleteModel", + DOWNLOAD_MODEL = "downloadModel", + INIT_MODEL = "initModel", +} + +export enum PreferenceService { + GET_EXPERIMENT_COMPONENT = "experimentComponent", +} diff --git a/web-client/tailwind.config.js b/app/tailwind.config.js similarity index 100% rename from web-client/tailwind.config.js rename to app/tailwind.config.js diff --git a/web-client/tsconfig.json b/app/tsconfig.json similarity index 76% rename from web-client/tsconfig.json rename to app/tsconfig.json index 3da4fedfa..db61aff09 100644 --- a/web-client/tsconfig.json +++ b/app/tsconfig.json @@ -21,9 +21,16 @@ ], "paths": { "@/*": ["./app/*"], - "@/graphql": ["./graphql/generated/graphql"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "electron/renderer.js", + "electron/preload.js", + "electron/main.ts" + ], "exclude": ["node_modules"] } diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 000000000..42a6cb985 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,12 @@ +{ + "systemParams": "darwin-arm64-93", + "modulesFolders": [ + "node_modules" + ], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/web-client/README.md b/web-client/README.md deleted file mode 100644 index ef0d70d5e..000000000 --- a/web-client/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# Jan Web - -Jan Web is a Next.js application designed to provide users with the ability to interact with the Language Model (LLM) through chat or generate art using Stable Diffusion. This application runs as a single-page application (SPA) and is encapsulated within a Docker container for easy local deployment. - -## Features - -- Chat with the Language Model: Engage in interactive conversations with the Language Model. Ask questions, seek information, or simply have a chat. - -- Generate Art with Stable Diffusion: Utilize the power of Stable Diffusion to generate unique and captivating pieces of art. Experiment with various parameters to achieve desired results. - -## Installation and Usage - -### Use as complete suite -For using our complete solution, check [this](https://github.com/janhq/jan) - -### For interactive development - -1. **Clone the Repository:** - - ``` - git clone https://github.com/your-username/jan-web.git - cd jan-web - ``` - -2. **Install dependencies:** - - ``` - yarn - ``` - -3. **Run development:** - - ``` - yarn dev - ``` -4. **Regenerate Graphql:** - - ``` - HASURA_ADMIN_TOKEN="[hasura_admin_secret_key]" yarn generate - ``` - -5. **Access Jan Web:** - - Open your web browser and navigate to `http://localhost:3000` to access the Jan Web application. - -## Configuration - -You can customize the endpoint of the Jan Web application through environment file. These options can be found in the `.env` file located in the project's root directory. - -```env -// .env - -KEYCLOAK_CLIENT_ID=hasura -KEYCLOAK_CLIENT_SECRET=********** -AUTH_ISSUER=http://localhost:8088/realms/hasura -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=my-secret -END_SESSION_URL=http://localhost:8088/realms/hasura/protocol/openid-connect/logout -REFRESH_TOKEN_URL=http://localhost:8088/realms/hasura/protocol/openid-connect/token -HASURA_ADMIN_TOKEN=myadminsecretkey -NEXT_PUBLIC_GRAPHQL_ENGINE_URL=localhost:8080 -``` - -Replace above configuration with your actual infrastructure. - -## Dependencies - -|Library| Category | Version | Description | -|--|--|--|--| -| [next](https://nextjs.org/) | Framework | 13.4.10 | -| [typescript](https://www.typescriptlang.org/) | Language | 5.1.6 | -| [tailwindcss](https://tailwindcss.com/) | UI | 3.3.3 | -| [Tailwind UI](https://tailwindui.com/) | UI | | -| [react-hook-form](https://www.react-hook-form.com/) | UI | ^7.45.4 | -| [@headlessui/react](https://headlessui.com/) | UI | ^1.7.15 | -| [@heroicons/react](https://heroicons.com/) | UI | ^2.0.18 | -| [@tailwindcss/typography](https://tailwindcss.com/docs/typography-plugin) | UI | ^0.5.9 | -| [embla-carousel](https://www.embla-carousel.com/) | UI | ^8.0.0-rc11 | -| [@apollo/client](https://www.apollographql.com/docs/react/) | State management | ^3.8.1 | -| [jotai](https://jotai.org/) | State management | ^2.4.0 | - - -## Deploy to Netlify -Clone this repository on own GitHub account and deploy to Netlify: - -[![Netlify Deploy button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/janhq/jan-web) - -## Deploy to Vercel - -Deploy Jan Web on Vercel in one click: - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/janhq/jan-web) - - -## Contributing - -Contributions are welcome! If you find a bug or have suggestions for improvements, feel free to open an issue or submit a pull request on the [GitHub repository](https://github.com/janhq/jan-web/tree/6337306c54e735a4a5c2132dcd1377f21fd76a33). - -## License - -This project is licensed under the Fair-code License - see the [License](https://faircode.io/#licenses) for more details. - ---- - -Feel free to reach out [Discord](https://jan.ai/discord) if you have any questions or need further assistance. Happy coding with Jan Web and exploring the capabilities of the Language Model and Stable Diffusion! 🚀🎨🤖 \ No newline at end of file diff --git a/web-client/app/_components/ActionButton/index.tsx b/web-client/app/_components/ActionButton/index.tsx deleted file mode 100644 index a23bb51e2..000000000 --- a/web-client/app/_components/ActionButton/index.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import classNames from "classnames"; -import Image from "next/image"; - -type Props = { - title: string; - icon: string; - isLoading?: boolean; - onClick: () => void; -}; - -const ActionButton: React.FC<Props> = (props) => { - return ( - <> - {!props.isLoading && ( - <button - type="button" - className={classNames( - "rounded-xl flex items-center h-[40px] gap-1 bg-[#F3F4F6] px-2 text-xs font-normal text-gray-900 shadow-sm", - !props.isLoading && "hover:bg-indigo-100" - )} - onClick={props.onClick} - > - <Image src={props.icon} width={16} height={16} alt="" /> - <span>{props.title}</span> - </button> - )} - {props.isLoading && ( - <div className="w-[80px] flex flex-row justify-center items-center"> - <Image - src="/icons/loading.svg" - width={32} - height={32} - alt="loading" - /> - </div> - )} - </> - ); -}; - -export default ActionButton; diff --git a/web-client/app/_components/ApiPane/index.tsx b/web-client/app/_components/ApiPane/index.tsx deleted file mode 100644 index dc451a487..000000000 --- a/web-client/app/_components/ApiPane/index.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import Image from "next/image"; -import { useState } from "react"; -import { Light as SyntaxHighlighter } from "react-syntax-highlighter"; -import js from "react-syntax-highlighter/dist/esm/languages/hljs/javascript"; -import { atomOneDark } from "react-syntax-highlighter/dist/esm/styles/hljs"; -import useGetModelApiInfo from "@/_hooks/useGetModelApiInfo"; - -SyntaxHighlighter.registerLanguage("javascript", js); - -const ApiPane: React.FC = () => { - const [expend, setExpend] = useState(true); - const { data } = useGetModelApiInfo(); - const [highlightCode, setHighlightCode] = useState(data[0]); - - return ( - <div className="h-full flex flex-col relative"> - <div className="absolute top-0 left-0 h-full w-full overflow-x-hidden scroll"> - <button - onClick={() => setExpend(!expend)} - className="flex items-center flex-none" - > - <Image - src={"/icons/unicorn_angle-down.svg"} - width={24} - height={24} - alt="" - /> - <span>Request</span> - </button> - <div - className={`${ - expend ? "block" : "hidden" - } bg-[#1F2A37] rounded-lg w-full flex-1`} - > - <div className="p-2 flex justify-between flex-1"> - <div className="flex"> - {data.map((item, index) => ( - <button - className={`py-1 text-xs text-[#9CA3AF] px-2 flex gap-[10px] rounded ${ - highlightCode?.type === item.type - ? "bg-[#374151] text-white" - : "" - }`} - key={index} - onClick={() => setHighlightCode(item)} - > - {item.type} - </button> - ))} - </div> - <button - onClick={() => - navigator.clipboard.writeText(highlightCode?.stringCode) - } - > - <Image - src={"/icons/unicorn_clipboard-alt.svg"} - width={24} - height={24} - alt="" - /> - </button> - </div> - <SyntaxHighlighter - className="w-full bg-transparent overflow-x-hidden scroll resize-none" - language="jsx" - style={atomOneDark} - customStyle={{ padding: "12px", background: "transparent" }} - wrapLongLines={true} - > - {highlightCode?.stringCode} - </SyntaxHighlighter> - </div> - </div> - </div> - ); -}; - -export default ApiPane; \ No newline at end of file diff --git a/web-client/app/_components/GenerativeSampleContainer/index.tsx b/web-client/app/_components/GenerativeSampleContainer/index.tsx deleted file mode 100644 index f42be8be3..000000000 --- a/web-client/app/_components/GenerativeSampleContainer/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import JanWelcomeTitle from "../JanWelcomeTitle"; -import { GetProductPromptsQuery, GetProductPromptsDocument } from "@/graphql"; -import { useQuery } from "@apollo/client"; -import { Product } from "@/_models/Product"; -import { useSetAtom } from "jotai"; -import { currentPromptAtom } from "@/_helpers/JotaiWrapper"; - -type Props = { - product: Product; -}; - -const GenerativeSampleContainer: React.FC<Props> = ({ product }) => { - const setCurrentPrompt = useSetAtom(currentPromptAtom); - const { data } = useQuery<GetProductPromptsQuery>(GetProductPromptsDocument, { - variables: { productSlug: product.slug }, - }); - - return ( - <div className="flex flex-col max-w-2xl flex-shrink-0 mx-auto mt-6"> - <JanWelcomeTitle - title={product.name} - description={product.longDescription} - /> - <div className="flex flex-col"> - <h2 className="font-semibold text-xl leading-6 tracking-[-0.4px] mb-5"> - Create now - </h2> - <div className="grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3"> - {data?.prompts.map((item) => ( - <button - key={item.slug} - onClick={() => setCurrentPrompt(item.content ?? "")} - className="w-full h-full" - > - <img - style={{ objectFit: "cover" }} - className="w-full h-full rounded col-span-1 flex flex-col" - src={item.image_url ?? ""} - alt="" - /> - </button> - ))} - </div> - </div> - </div> - ); -}; - -export default GenerativeSampleContainer; diff --git a/web-client/app/_components/Header/index.tsx b/web-client/app/_components/Header/index.tsx deleted file mode 100644 index 98a3a125d..000000000 --- a/web-client/app/_components/Header/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; -import UserProfileDropDown from "../UserProfileDropDown"; -import LoginButton from "../LoginButton"; -import HamburgerButton from "../HamburgerButton"; - -const Header: React.FC = () => ( - <header className="flex border-b-[1px] border-gray-200 p-3 dark:bg-gray-800"> - <nav className="flex-1 justify-center"> - <HamburgerButton /> - </nav> - <LoginButton /> - <UserProfileDropDown /> - </header> -); - -export default Header; diff --git a/web-client/app/_components/HistoryEmpty/index.tsx b/web-client/app/_components/HistoryEmpty/index.tsx deleted file mode 100644 index ed4f07f2c..000000000 --- a/web-client/app/_components/HistoryEmpty/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; - -const HistoryEmpty: React.FC = () => { - return ( - <div className="flex flex-col w-full h-full items-center justify-center gap-4"> - <Image - src={"/icons/chats-circle-light.svg"} - width={50} - height={50} - alt="" - /> - <p className="text-sm leading-5 text-center text-[#9CA3AF]"> - Jan allows you to use 100s of AIs on your mobile phone - </p> - <Link - href="/ai" - className="bg-[#1F2A37] py-[10px] px-5 gap-2 rounded-[8px] text-[14px] font-medium leading-[21px] text-white" - > - Explore AIs - </Link> - </div> - ); -}; - -export default React.memo(HistoryEmpty); diff --git a/web-client/app/_components/LoadingIndicator.tsx b/web-client/app/_components/LoadingIndicator.tsx deleted file mode 100644 index 21220305d..000000000 --- a/web-client/app/_components/LoadingIndicator.tsx +++ /dev/null @@ -1,13 +0,0 @@ -const LoadingIndicator = () => { - let circleCommonClasses = "h-1.5 w-1.5 bg-current rounded-full"; - - return ( - <div className="flex"> - <div className={`${circleCommonClasses} mr-1 animate-bounce`}></div> - <div className={`${circleCommonClasses} mr-1 animate-bounce200`}></div> - <div className={`${circleCommonClasses} animate-bounce400`}></div> - </div> - ); -}; - -export default LoadingIndicator; diff --git a/web-client/app/_components/LoginButton/index.tsx b/web-client/app/_components/LoginButton/index.tsx deleted file mode 100644 index f2712eeaf..000000000 --- a/web-client/app/_components/LoginButton/index.tsx +++ /dev/null @@ -1,27 +0,0 @@ -"use client"; - -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; -import useSignIn from "@/_hooks/useSignIn"; - -const LoginButton: React.FC = () => { - const { signInWithKeyCloak } = useSignIn(); - const { user, loading } = useGetCurrentUser(); - - if (loading || user) { - return <div />; - } - - return ( - <div className="hidden lg:block"> - <button - onClick={signInWithKeyCloak} - type="button" - className="rounded-md bg-indigo-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" - > - Login - </button> - </div> - ); -}; - -export default LoginButton; diff --git a/web-client/app/_components/MenuHeader/index.tsx b/web-client/app/_components/MenuHeader/index.tsx deleted file mode 100644 index f04f5d1b4..000000000 --- a/web-client/app/_components/MenuHeader/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Link from "next/link"; -import { Popover, Transition } from "@headlessui/react"; -import { Fragment } from "react"; -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; -import { useSetAtom } from "jotai"; -import { showConfirmSignOutModalAtom } from "@/_helpers/JotaiWrapper"; - -export const MenuHeader: React.FC = () => { - const setShowConfirmSignOutModal = useSetAtom(showConfirmSignOutModalAtom); - const { user } = useGetCurrentUser(); - - if (!user) { - return <div></div>; - } - - return ( - <Transition - as={Fragment} - enter="transition ease-out duration-200" - enterFrom="opacity-0 translate-y-1" - enterTo="opacity-100 translate-y-0" - leave="transition ease-in duration-150" - leaveFrom="opacity-100 translate-y-0" - leaveTo="opacity-0 translate-y-1" - > - <Popover.Panel className="absolute shadow-profile -right-2 top-full z-10 mt-3 w-[224px] overflow-hidden rounded-[6px] bg-white shadow-lg ring-1 ring-gray-200"> - <div className="py-3 px-4 gap-2 flex flex-col"> - <h2 className="text-[20px] leading-[25px] tracking-[-0.4px] font-bold text-[#111928]"> - {user.displayName} - </h2> - <span className="text-[#6B7280] leading-[17.5px] text-sm"> - {user.email} - </span> - </div> - <hr /> - <button - onClick={() => setShowConfirmSignOutModal(true)} - className="px-4 py-3 text-sm w-full text-left text-gray-700" - > - Sign Out - </button> - <hr /> - <div className="flex gap-2 px-4 py-2 justify-center items-center"> - <Link href="/privacy"> - <span className="text-[#6B7280] text-xs">Privacy</span> - </Link> - <div className="w-1 h-1 bg-[#D9D9D9] rounded-lg" /> - <Link href="/support"> - <span className="text-[#6B7280] text-xs">Support</span> - </Link> - </div> - </Popover.Panel> - </Transition> - ); -}; diff --git a/web-client/app/_components/ProductOverview/index.tsx b/web-client/app/_components/ProductOverview/index.tsx deleted file mode 100644 index 2ab063456..000000000 --- a/web-client/app/_components/ProductOverview/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from "react"; -import Slider from "../Slider"; -import ConversationalList from "../ConversationalList"; -import GenerateImageList from "../GenerateImageList"; -import Image from "next/image"; -import useGetProducts from "@/_hooks/useGetProducts"; - -const ProductOverview: React.FC = () => { - const { loading, featured, conversational, generativeArts } = - useGetProducts(); - - if (loading) { - return ( - <div className="w-full flex flex-grow flex-row justify-center items-center"> - <Image src="/icons/loading.svg" width={32} height={32} alt="loading" /> - </div> - ); - } - - return ( - <div className="bg-gray-100 overflow-y-auto flex-grow scroll"> - <Slider products={featured} /> - <ConversationalList products={conversational} /> - <GenerateImageList products={generativeArts} /> - </div> - ); -}; - -export default ProductOverview; diff --git a/web-client/app/_components/ShortcutList/index.tsx b/web-client/app/_components/ShortcutList/index.tsx deleted file mode 100644 index 2c2e9930f..000000000 --- a/web-client/app/_components/ShortcutList/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -"use client"; - -import React, { useEffect, useState } from "react"; -import ShortcutItem from "../ShortcutItem"; -import { GetProductsDocument, GetProductsQuery } from "@/graphql"; -import ExpandableHeader from "../ExpandableHeader"; -import { useQuery } from "@apollo/client"; -import { useAtomValue } from "jotai"; -import { searchAtom } from "@/_helpers/JotaiWrapper"; -import { Product, toProduct } from "@/_models/Product"; - -const ShortcutList: React.FC = () => { - const searchText = useAtomValue(searchAtom); - const { data } = useQuery<GetProductsQuery>(GetProductsDocument); - const [expand, setExpand] = useState<boolean>(true); - const [featuredProducts, setFeaturedProducts] = useState<Product[]>([]); - - useEffect(() => { - if (data?.products) { - const products: Product[] = data.products.map((p) => toProduct(p)); - setFeaturedProducts( - [...(products || [])] - .sort(() => 0.5 - Math.random()) - .slice(0, 3) - .filter( - (e) => - searchText === "" || - e.name.toLowerCase().includes(searchText.toLowerCase()) - ) || [] - ); - } - }, [data?.products, searchText]); - - return ( - <div className="flex flex-col mt-6 gap-2"> - <ExpandableHeader - title="START A NEW CHAT" - expanded={expand} - onClick={() => setExpand(!expand)} - /> - {expand ? ( - <div className="flex flex-row mx-1 items-center rounded-lg hover:bg-hover-light"> - {featuredProducts.map((product) => ( - <ShortcutItem key={product.slug} product={product} /> - ))} - </div> - ) : null} - </div> - ); -}; - -export default ShortcutList; diff --git a/web-client/app/_components/TryItYourself/index.tsx b/web-client/app/_components/TryItYourself/index.tsx deleted file mode 100644 index 707569a51..000000000 --- a/web-client/app/_components/TryItYourself/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { currentProductAtom, currentPromptAtom } from "@/_helpers/JotaiWrapper"; -import { GetProductPromptsQuery, GetProductPromptsDocument } from "@/graphql"; -import { useQuery } from "@apollo/client"; -import { useAtomValue, useSetAtom } from "jotai"; - -const TryItYourself = () => { - const setCurrentPrompt = useSetAtom(currentPromptAtom); - const product = useAtomValue(currentProductAtom); - const { data } = useQuery<GetProductPromptsQuery>(GetProductPromptsDocument, { - variables: { productSlug: product?.slug ?? "" }, - }); - - if (!data || data.prompts.length === 0) { - return <div />; - } - - const promps = data.prompts; - - return ( - <div className="flex flex-col gap-4 tracking-[-0.4px] leading-[22px] text-base"> - <h2 className="font-bold">Try it yourself</h2> - <ul className="border-[1px] border-[#D1D5DB] rounded-[12px]"> - {promps.map((prompt, index) => ( - <button - onClick={() => setCurrentPrompt(prompt.content ?? "")} - key={prompt.slug} - className={`text-sm text-gray-500 leading-[20px] flex gap-[10px] border-b-[${ - index !== promps.length - 1 ? "1" : "0" - }px] border-[#E5E7EB] hover:text-blue-400 text-left p-3 w-full`} - > - {prompt.content} - </button> - ))} - </ul> - </div> - ); -}; - -export default TryItYourself; diff --git a/web-client/app/_components/UserProfileDropDown/index.tsx b/web-client/app/_components/UserProfileDropDown/index.tsx deleted file mode 100644 index 3b2f10ca5..000000000 --- a/web-client/app/_components/UserProfileDropDown/index.tsx +++ /dev/null @@ -1,36 +0,0 @@ -"use client"; - -import React from "react"; -import { Popover } from "@headlessui/react"; -import { MenuHeader } from "../MenuHeader"; -import useGetCurrentUser from "@/_hooks/useGetCurrentUser"; - -const UserProfileDropDown: React.FC = () => { - const { loading, user } = useGetCurrentUser(); - - if (loading || !user) { - return <div></div>; - } - - return ( - <Popover.Group className="hidden lg:flex lg:gap-x-12"> - <Popover className="relative"> - <Popover.Button className="flex items-center gap-2 outline-none"> - <img - className="rounded-sm w-8 aspect-square" - src={user.avatarUrl ?? "/icons/app_icon.svg"} - alt="" - /> - <div className="flex flex-col justify-start"> - <h2 className="text-sm leading-5 text-[#111928] dark:text-gray-400"> - {user.displayName} - </h2> - </div> - </Popover.Button> - <MenuHeader /> - </Popover> - </Popover.Group> - ); -}; - -export default UserProfileDropDown; diff --git a/web-client/app/_helpers/ApolloWrapper.tsx b/web-client/app/_helpers/ApolloWrapper.tsx deleted file mode 100644 index 8afcd2295..000000000 --- a/web-client/app/_helpers/ApolloWrapper.tsx +++ /dev/null @@ -1,74 +0,0 @@ -"use client"; - -import { - ApolloProvider, - ApolloClient, - InMemoryCache, - HttpLink, - concat, - split, -} from "@apollo/client"; -import { GraphQLWsLink } from "@apollo/client/link/subscriptions"; -import { setContext } from "@apollo/client/link/context"; -import { createClient } from "graphql-ws"; -import { getMainDefinition } from "@apollo/client/utilities"; -import { getAccessToken } from "@/_utils/tokenAccessor"; -import { ReactNode } from "react"; - -const authMiddleware = setContext(async (_, { headers }) => { - const token = await getAccessToken(); - return { - headers: { - ...headers, - ...(token && { authorization: token ? `Bearer ${token}` : "" }), - }, - }; -}); - -const wsLink = - typeof window !== "undefined" - ? new GraphQLWsLink( - createClient({ - url: `${process.env.NEXT_PUBLIC_GRAPHQL_ENGINE_WEB_SOCKET_URL}`, - connectionParams: async () => { - const token = await getAccessToken(); - return { - headers: { - Authorization: `Bearer ${token}`, - }, - }; - }, - }) - ) - : null; -const httpLink = new HttpLink({ - uri: `${process.env.NEXT_PUBLIC_GRAPHQL_ENGINE_URL}`, -}); - -const link = - typeof window !== "undefined" && wsLink != null - ? split( - ({ query }) => { - const definition = getMainDefinition(query); - return ( - definition.kind === "OperationDefinition" && - definition.operation === "subscription" - ); - }, - wsLink, - httpLink - ) - : httpLink; - -type Props = { - children: ReactNode; -}; - -export const ApolloWrapper: React.FC<Props> = ({ children }) => { - const client = new ApolloClient({ - link: concat(authMiddleware, link), - cache: new InMemoryCache(), - }); - - return <ApolloProvider client={client}>{children}</ApolloProvider>; -}; diff --git a/web-client/app/_hooks/useChatMessageSubscription.ts b/web-client/app/_hooks/useChatMessageSubscription.ts deleted file mode 100644 index 0cbb54bde..000000000 --- a/web-client/app/_hooks/useChatMessageSubscription.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - SubscribeMessageSubscription, - SubscribeMessageDocument, -} from "@/graphql"; -import { useSubscription } from "@apollo/client"; - -const useChatMessageSubscription = (messageId: string) => { - const { data, loading, error } = - useSubscription<SubscribeMessageSubscription>(SubscribeMessageDocument, { - variables: { id: messageId }, - }); - - return { data, loading, error }; -}; - -export default useChatMessageSubscription; diff --git a/web-client/app/_hooks/useChatMessages.ts b/web-client/app/_hooks/useChatMessages.ts deleted file mode 100644 index 47914edc0..000000000 --- a/web-client/app/_hooks/useChatMessages.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - addOldMessagesAtom, - conversationStatesAtom, - currentConversationAtom, - updateConversationHasMoreAtom, -} from "@/_helpers/JotaiWrapper"; -import { ChatMessage, toChatMessage } from "@/_models/ChatMessage"; -import { MESSAGE_PER_PAGE } from "@/_utils/const"; -import { - GetConversationMessagesQuery, - GetConversationMessagesDocument, - GetConversationMessagesQueryVariables, - MessageDetailFragment, -} from "@/graphql"; -import { useLazyQuery } from "@apollo/client"; -import { useAtomValue, useSetAtom } from "jotai"; -import { useEffect } from "react"; - -/** - * Custom hooks to get chat messages for current(active) conversation - * - * @param offset for pagination purpose - * @returns - */ -const useChatMessages = (offset = 0) => { - const addOldChatMessages = useSetAtom(addOldMessagesAtom); - const currentConvo = useAtomValue(currentConversationAtom); - if (!currentConvo) { - throw new Error("activeConversation is null"); - } - const convoStates = useAtomValue(conversationStatesAtom); - const updateConvoHasMore = useSetAtom(updateConversationHasMoreAtom); - const [getConversationMessages, { loading, error }] = - useLazyQuery<GetConversationMessagesQuery>(GetConversationMessagesDocument); - - useEffect(() => { - const hasMore = convoStates[currentConvo.id]?.hasMore ?? true; - if (!hasMore) return; - - const variables: GetConversationMessagesQueryVariables = { - conversation_id: currentConvo.id, - limit: MESSAGE_PER_PAGE, - offset: offset, - }; - - getConversationMessages({ variables }).then((data) => { - parseMessages(data.data?.messages ?? []).then((newMessages) => { - const isHasMore = newMessages.length === MESSAGE_PER_PAGE; - addOldChatMessages(newMessages); - updateConvoHasMore(currentConvo.id, isHasMore); - }); - }); - }, [offset, currentConvo.id]); - - return { - loading, - error, - hasMore: convoStates[currentConvo.id]?.hasMore ?? true, - }; -}; - -async function parseMessages( - messages: MessageDetailFragment[] -): Promise<ChatMessage[]> { - const newMessages: ChatMessage[] = []; - for (const m of messages) { - const chatMessage = await toChatMessage(m); - newMessages.push(chatMessage); - } - return newMessages; -} - -export default useChatMessages; diff --git a/web-client/app/_hooks/useCreateConversation.ts b/web-client/app/_hooks/useCreateConversation.ts deleted file mode 100644 index badf3ff4c..000000000 --- a/web-client/app/_hooks/useCreateConversation.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { - CreateConversationMutation, - CreateConversationDocument, - CreateConversationMutationVariables, -} from "@/graphql"; -import useGetCurrentUser from "./useGetCurrentUser"; -import { useMutation } from "@apollo/client"; -import useSignIn from "./useSignIn"; -import { useAtom, useSetAtom } from "jotai"; -import { - addNewConversationStateAtom, - setActiveConvoIdAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; -import { Conversation } from "@/_models/Conversation"; -import { Product } from "@/_models/Product"; -import { MessageSenderType, MessageType } from "@/_models/ChatMessage"; - -const useCreateConversation = () => { - const [userConversations, setUserConversations] = useAtom( - userConversationsAtom - ); - const setActiveConvoId = useSetAtom(setActiveConvoIdAtom); - const addNewConvoState = useSetAtom(addNewConversationStateAtom); - const { user } = useGetCurrentUser(); - const { signInWithKeyCloak } = useSignIn(); - const [createConversation] = useMutation<CreateConversationMutation>( - CreateConversationDocument - ); - - const requestCreateConvo = async ( - product: Product, - forceCreate: boolean = false - ) => { - if (!user) { - signInWithKeyCloak(); - return; - } - - // search if any fresh convo with particular product id - const convo = userConversations.find( - (convo) => convo.product.slug === product.slug - ); - - if (convo && !forceCreate) { - setActiveConvoId(convo.id); - return; - } - - const variables: CreateConversationMutationVariables = { - data: { - product_id: product.id, - user_id: user.id, - last_image_url: "", - last_text_message: product.greeting, - conversation_messages: { - data: [ - { - content: product.greeting || "Hello there 👋", - sender: MessageSenderType.Ai, - sender_name: product.name, - sender_avatar_url: product.avatarUrl, - message_type: MessageType.Text, - message_sender_type: MessageSenderType.Ai, - }, - ], - }, - }, - }; - const result = await createConversation({ - variables, - }); - const newConvo = result.data?.insert_conversations_one; - - if (newConvo) { - const mappedConvo: Conversation = { - id: newConvo.id, - product: product, - user: { - id: user.id, - displayName: user.displayName, - }, - lastTextMessage: newConvo.last_text_message ?? "", - createdAt: Date.now(), - updatedAt: Date.now(), - }; - addNewConvoState(newConvo.id, { - hasMore: true, - waitingForResponse: false, - }); - setUserConversations([...userConversations, mappedConvo]); - setActiveConvoId(newConvo.id); - } - // if not found, create new convo and set it as current - }; - - return { - requestCreateConvo, - }; -}; - -export default useCreateConversation; diff --git a/web-client/app/_hooks/useGetProducts.ts b/web-client/app/_hooks/useGetProducts.ts deleted file mode 100644 index a87c6537e..000000000 --- a/web-client/app/_hooks/useGetProducts.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { ProductType, toProduct } from "@/_models/Product"; -import { GetProductsDocument, GetProductsQuery } from "@/graphql"; -import { useQuery } from "@apollo/client"; - -export default function useGetProducts() { - const { loading, data } = useQuery<GetProductsQuery>(GetProductsDocument, { - variables: { slug: "conversational" }, - }); - - const allProducts = (data?.products ?? []).map((e) => toProduct(e)); - - const featured = allProducts.sort(() => 0.5 - Math.random()).slice(0, 3); - const conversational = allProducts.filter((e) => e.type === ProductType.LLM); - const generativeArts = allProducts.filter( - (e) => e.type === ProductType.GenerativeArt - ); - - return { - loading, - featured, - conversational, - generativeArts, - }; -} diff --git a/web-client/app/_hooks/useGetUserConversations.ts b/web-client/app/_hooks/useGetUserConversations.ts deleted file mode 100644 index 883518d9b..000000000 --- a/web-client/app/_hooks/useGetUserConversations.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { GetConversationsQuery, GetConversationsDocument } from "@/graphql"; -import { useLazyQuery } from "@apollo/client"; -import { ConversationState, toConversation } from "@/_models/Conversation"; -import { useSetAtom } from "jotai"; -import { - conversationStatesAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; - -const useGetUserConversations = () => { - const setConversationStates = useSetAtom(conversationStatesAtom); - const setConversations = useSetAtom(userConversationsAtom); - const [getConvos] = useLazyQuery<GetConversationsQuery>( - GetConversationsDocument - ); - - const getUserConversations = async () => { - const results = await getConvos(); - if (!results || !results.data || results.data.conversations.length === 0) { - return; - } - - const convos = results.data.conversations.map((e) => toConversation(e)); - const convoStates: Record<string, ConversationState> = {}; - convos.forEach((convo) => { - convoStates[convo.id] = { - hasMore: true, - waitingForResponse: false, - }; - }); - setConversationStates(convoStates); - setConversations(convos); - }; - - return { - getUserConversations, - }; -}; - -export default useGetUserConversations; diff --git a/web-client/app/_hooks/useSendChatMessage.ts b/web-client/app/_hooks/useSendChatMessage.ts deleted file mode 100644 index c67f7c668..000000000 --- a/web-client/app/_hooks/useSendChatMessage.ts +++ /dev/null @@ -1,383 +0,0 @@ -import { - addNewMessageAtom, - currentChatMessagesAtom, - currentConversationAtom, - currentPromptAtom, - currentStreamingMessageAtom, - setConvoLastImageAtom, - setConvoUpdatedAtAtom, - updateConversationWaitingForResponseAtom, - updateMessageAtom, - userConversationsAtom, -} from "@/_helpers/JotaiWrapper"; -import { - ChatMessage, - MessageSenderType, - MessageStatus, - MessageType, -} from "@/_models/ChatMessage"; -import { Conversation } from "@/_models/Conversation"; -import { ProductType } from "@/_models/Product"; -import { - CreateMessageDocument, - CreateMessageMutation, - CreateMessageMutationVariables, - GenerateImageDocument, - GenerateImageMutation, - GenerateImageMutationVariables, - UpdateMessageMutation, - UpdateMessageDocument, - UpdateMessageMutationVariables, - UpdateConversationMutation, - UpdateConversationDocument, - UpdateConversationMutationVariables, -} from "@/graphql"; -import { useMutation } from "@apollo/client"; -import { useAtom, useAtomValue, useSetAtom } from "jotai"; -import useSignIn from "./useSignIn"; -import useGetCurrentUser from "./useGetCurrentUser"; -import { Role } from "@/_models/User"; - -export default function useSendChatMessage() { - const { user } = useGetCurrentUser(); - const { signInWithKeyCloak } = useSignIn(); - const [currentPrompt, setCurrentPrompt] = useAtom(currentPromptAtom); - const [userConversations, setUserConversations] = useAtom( - userConversationsAtom - ); - const addNewMessage = useSetAtom(addNewMessageAtom); - const activeConversation = useAtomValue(currentConversationAtom); - const currentMessages = useAtomValue(currentChatMessagesAtom); - const [createMessageMutation] = useMutation<CreateMessageMutation>( - CreateMessageDocument - ); - const [updateMessageMutation] = useMutation<UpdateMessageMutation>( - UpdateMessageDocument - ); - const [updateConversationMutation] = useMutation<UpdateConversationMutation>( - UpdateConversationDocument - ); - const [imageGenerationMutation] = useMutation<GenerateImageMutation>( - GenerateImageDocument - ); - const updateConvoWaitingState = useSetAtom( - updateConversationWaitingForResponseAtom - ); - const updateMessageText = useSetAtom(updateMessageAtom); - const [, setTextMessage] = useAtom(currentStreamingMessageAtom); - const setConvoLastImageUrl = useSetAtom(setConvoLastImageAtom); - const setConvoUpdateAt = useSetAtom(setConvoUpdatedAtAtom); - - const sendTextToTextMessage = async ( - conversation: Conversation, - latestUserMessage: ChatMessage - ) => { - // TODO: handle case timeout using higher order function - const messageToSend = [ - latestUserMessage, - ...currentMessages.slice(0, 4), - ].reverse(); - const latestMessages = messageToSend.map((e) => ({ - role: - e.messageSenderType === MessageSenderType.User - ? Role.User - : Role.Assistant, - content: e.text, - })); - - const variables: CreateMessageMutationVariables = { - data: { - conversation_id: conversation.id, - sender: MessageSenderType.Ai, - message_sender_type: MessageSenderType.Ai, - message_type: MessageType.Text, - sender_avatar_url: conversation.product.avatarUrl, - sender_name: conversation.product.name, - prompt_cache: latestMessages, - status: MessageStatus.Pending, - }, - }; - const result = await createMessageMutation({ - variables, - }); - - if (!result.data?.insert_messages_one?.id) { - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(conversation.id, false); - return; - } - - const aiResponseMessage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: conversation.id, - messageType: MessageType.Text, - messageSenderType: MessageSenderType.Ai, - senderUid: conversation.product.slug, - senderName: conversation.product.name, - senderAvatarUrl: conversation.product.avatarUrl ?? "/icons/app_icon.svg", - text: "", - status: MessageStatus.Pending, - createdAt: Date.now(), - }; - - setTextMessage(aiResponseMessage); - addNewMessage(aiResponseMessage); - - try { - const response = await fetch( - `${process.env.NEXT_PUBLIC_OPENAPI_ENDPOINT}`, - { - method: "POST", - cache: "no-cache", - keepalive: true, - headers: { - "Content-Type": "application/json", - Accept: "text/event-stream", - }, - body: JSON.stringify({ - messages: latestMessages, - model: "gpt-3.5-turbo", - stream: true, - max_tokens: 500, - }), - } - ); - if (!response.ok) { - updateMessageText( - aiResponseMessage.id, - conversation.id, - "There is an error while retrieving the result. Please try again later." - ); - } else { - const data = response.body; - if (!data) { - return; - } - const reader = data.getReader(); - const decoder = new TextDecoder(); - let done = false; - - let currentResponse: string = ""; - updateConvoWaitingState(conversation.id, false); - while (!done) { - const { value, done: doneReading } = await reader.read(); - done = doneReading; - const chunkValue = decoder.decode(value); - chunkValue.split("\n").forEach((chunk) => { - console.log("chunk", chunk); - const text = parsedBuffer(chunk) ?? ""; - currentResponse += text; - updateMessageText( - aiResponseMessage.id, - conversation.id, - currentResponse - ); - }); - } - mutateMessageText( - aiResponseMessage.id, - conversation.id, - currentResponse - ); - } - } catch (err) { - const errorText = - "There is an error while retrieving the result. Please try again later."; - updateMessageText(aiResponseMessage.id, conversation.id, errorText); - mutateMessageText(aiResponseMessage.id, conversation.id, errorText); - } - updateConvoWaitingState(conversation.id, false); - }; - - const sendTextToImageMessage = async (conversation: Conversation) => { - // TODO: handle case timeout using higher order function - const variables: GenerateImageMutationVariables = { - model: conversation.product.slug, - prompt: currentPrompt, - neg_prompt: "", - seed: Math.floor(Math.random() * 429496729), - steps: 30, - width: 512, - height: 512, - }; - - const data = await imageGenerationMutation({ - variables, - }); - - if (!data.data?.imageGeneration?.url) { - // TODO: display error - console.error("Error creating user message", JSON.stringify(data.errors)); - updateConvoWaitingState(conversation.id, false); - return; - } - - const imageUrl: string = data.data.imageGeneration.url; - - const createMessageVariables: CreateMessageMutationVariables = { - data: { - conversation_id: conversation.id, - content: currentPrompt, - sender: MessageSenderType.Ai, - message_sender_type: MessageSenderType.Ai, - message_type: MessageType.Image, - sender_avatar_url: conversation.product.avatarUrl, - sender_name: conversation.product.name, - status: MessageStatus.Ready, - message_medias: { - data: [ - { - media_url: imageUrl, - mime_type: "image/jpeg", - }, - ], - }, - }, - }; - const result = await createMessageMutation({ - variables: createMessageVariables, - }); - - if (!result.data?.insert_messages_one?.id) { - // TODO: display error - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(conversation.id, false); - return; - } - - const imageResponseMessage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: conversation.id, - messageType: MessageType.Image, - messageSenderType: MessageSenderType.Ai, - senderUid: conversation.product.slug, - senderName: conversation.product.name, - senderAvatarUrl: conversation.product.avatarUrl, - text: currentPrompt, - imageUrls: [imageUrl], - createdAt: Date.now(), - status: MessageStatus.Ready, - }; - - addNewMessage(imageResponseMessage); - setConvoUpdateAt(conversation.id); - setConvoLastImageUrl(conversation.id, imageUrl); - updateConvoWaitingState(conversation.id, false); - }; - - const sendChatMessage = async () => { - if (!user) { - signInWithKeyCloak(); - return; - } - if (currentPrompt.trim().length === 0) return; - - if (!activeConversation) { - console.error("No active conversation"); - return; - } - - updateConvoWaitingState(activeConversation.id, true); - const variables: CreateMessageMutationVariables = { - data: { - conversation_id: activeConversation.id, - content: currentPrompt, - sender: user.id, - message_sender_type: MessageSenderType.User, - message_type: MessageType.Text, - sender_avatar_url: user.avatarUrl, - sender_name: user.displayName, - }, - }; - const result = await createMessageMutation({ variables }); - - if (!result.data?.insert_messages_one?.id) { - // TODO: display error - console.error( - "Error creating user message", - JSON.stringify(result.errors) - ); - updateConvoWaitingState(activeConversation.id, false); - return; - } - - const userMesssage: ChatMessage = { - id: result.data.insert_messages_one.id, - conversationId: activeConversation.id, - messageType: MessageType.Text, - messageSenderType: MessageSenderType.User, - senderUid: user.id, - senderName: user.displayName, - senderAvatarUrl: user.avatarUrl ?? "/icons/app_icon.svg", - text: currentPrompt, - createdAt: Date.now(), - status: MessageStatus.Ready, - }; - - addNewMessage(userMesssage); - const newUserConversations = userConversations.map((e) => { - if (e.id === activeConversation.id) { - e.lastTextMessage = userMesssage.text; - } - return e; - }); - - setUserConversations(newUserConversations); - - if (activeConversation.product.type === ProductType.LLM) { - await sendTextToTextMessage(activeConversation, userMesssage); - setCurrentPrompt(""); - } else if (activeConversation.product.type === ProductType.GenerativeArt) { - await sendTextToImageMessage(activeConversation); - setCurrentPrompt(""); - } else { - console.error( - "We do not support this model type yet:", - activeConversation.product.type - ); - } - }; - - const parsedBuffer = (buffer: string) => { - try { - const json = buffer.replace("data: ", ""); - return JSON.parse(json).choices[0].delta.content; - } catch (e) { - return ""; - } - }; - - const mutateMessageText = ( - messageId: string, - convId: string, - text: string - ) => { - const variables: UpdateMessageMutationVariables = { - data: { - content: text, - status: MessageStatus.Ready, - }, - id: messageId, - }; - updateMessageMutation({ - variables, - }); - - updateConversationMutation({ - variables: { - id: convId, - lastMessageText: text, - }, - }); - }; - - return { - sendChatMessage, - }; -} diff --git a/web-client/app/_models/ChatMessage.ts b/web-client/app/_models/ChatMessage.ts deleted file mode 100644 index 083fa1d2c..000000000 --- a/web-client/app/_models/ChatMessage.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { MessageDetailFragment } from "@/graphql"; -import { remark } from "remark"; -import html from "remark-html"; - -export enum MessageType { - Text = "Text", - Image = "Image", - ImageWithText = "ImageWithText", - Error = "Error", -} - -export enum MessageSenderType { - Ai = "Ai", - User = "User", -} - -export enum MessageStatus { - Ready = "ready", - Pending = "pending", -} - -export interface ChatMessage { - id: string; - conversationId: string; - messageType: MessageType; - messageSenderType: MessageSenderType; - senderUid: string; - senderName: string; - senderAvatarUrl: string; - text: string | undefined; - imageUrls?: string[] | undefined; - createdAt: number; - status: MessageStatus; -} - -export const toChatMessage = async ( - m: MessageDetailFragment -): Promise<ChatMessage> => { - const createdAt = new Date(m.created_at).getTime(); - const imageUrls: string[] = []; - const imageUrl = - m.message_medias.length > 0 ? m.message_medias[0].media_url : null; - if (imageUrl) { - imageUrls.push(imageUrl); - } - - const messageType = m.message_type - ? MessageType[m.message_type as keyof typeof MessageType] - : MessageType.Text; - const messageSenderType = m.message_sender_type - ? MessageSenderType[m.message_sender_type as keyof typeof MessageSenderType] - : MessageSenderType.Ai; - - const content = m.content ?? ""; - const processedContent = await remark().use(html).process(content); - const contentHtml = processedContent.toString(); - - return { - id: m.id, - conversationId: m.conversation_id, - messageType: messageType, - messageSenderType: messageSenderType, - senderUid: m.sender, - senderName: m.sender_name ?? "", - senderAvatarUrl: m.sender_avatar_url ?? "/icons/app_icon.svg", - text: contentHtml, - imageUrls: imageUrls, - createdAt: createdAt, - status: m.status as MessageStatus, - }; -}; diff --git a/web-client/app/_models/Conversation.ts b/web-client/app/_models/Conversation.ts deleted file mode 100644 index 890c1c9e6..000000000 --- a/web-client/app/_models/Conversation.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { ConversationDetailFragment } from "@/graphql"; -import { Product, toProduct } from "./Product"; - -export interface Conversation { - id: string; - product: Product; - createdAt: number; - updatedAt?: number; - lastImageUrl?: string; - lastTextMessage?: string; -} - -/** - * Store the state of conversation like fetching, waiting for response, etc. - */ -export type ConversationState = { - hasMore: boolean; - waitingForResponse: boolean; -}; - -export const toConversation = ( - convo: ConversationDetailFragment -): Conversation => { - const product = convo.conversation_product; - if (!product) { - throw new Error("Product is not defined"); - } - return { - id: convo.id, - product: toProduct(product), - lastImageUrl: convo.last_image_url ?? undefined, - lastTextMessage: convo.last_text_message ?? undefined, - createdAt: new Date(convo.created_at).getTime(), - updatedAt: convo.updated_at - ? new Date(convo.updated_at).getTime() - : undefined, - }; -}; diff --git a/web-client/app/_models/Product.ts b/web-client/app/_models/Product.ts deleted file mode 100644 index 570e0b3e3..000000000 --- a/web-client/app/_models/Product.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { ProductDetailFragment } from "@/graphql"; -import { ProductInput } from "./ProductInput"; -import { ProductOutput } from "./ProductOutput"; - -export enum ProductType { - LLM = "LLM", - GenerativeArt = "GenerativeArt", - ControlNet = "ControlNet", -} - -export interface Product { - id: string; - slug: string; - name: string; - description: string; - avatarUrl: string; - longDescription: string; - technicalDescription: string; - author: string; - version: string; - modelUrl: string; - nsfw: boolean; - greeting: string; - type: ProductType; - inputs?: ProductInput; - outputs?: ProductOutput; - createdAt: number; - updatedAt?: number; -} - -export function toProduct( - productDetailFragment: ProductDetailFragment -): Product { - const { - id, - slug, - name, - description, - image_url, - long_description, - technical_description, - author, - version, - source_url, - nsfw, - greeting, - created_at, - updated_at, - } = productDetailFragment; - let modelType: ProductType | undefined = undefined; - if (productDetailFragment.inputs.slug === "llm") { - modelType = ProductType.LLM; - } else if (productDetailFragment.inputs.slug === "sd") { - modelType = ProductType.GenerativeArt; - } else if (productDetailFragment.inputs.slug === "controlnet") { - modelType = ProductType.ControlNet; - } else { - throw new Error("Model type not supported"); - } - - const product: Product = { - id, - slug, - name, - description: description ?? "", - avatarUrl: image_url ?? "/icons/app_icon.svg", - longDescription: long_description ?? "", - technicalDescription: technical_description ?? "", - author: author ?? "", - version: version ?? "", - modelUrl: source_url ?? "", - nsfw: nsfw ?? false, - greeting: greeting ?? "", - type: modelType, - createdAt: new Date(created_at).getTime(), - updatedAt: new Date(updated_at).getTime(), - }; - - return product; -} diff --git a/web-client/app/_services/controlnet.ts b/web-client/app/_services/controlnet.ts deleted file mode 100644 index 86c0a365a..000000000 --- a/web-client/app/_services/controlnet.ts +++ /dev/null @@ -1,42 +0,0 @@ -export const controlNetRequest = async ( - token: string, - prompt: string, - negPrompt: string, - fileInput: any -): Promise<Record<string, unknown> | undefined> => { - const formData = new FormData(); - - const advancedPrompt: AdvancedPrompt = { - prompt: prompt, - neg_prompt: negPrompt ?? "", - control_net_model: "controlnet_canny", - seed: 1024, - steps: 20, - control_scale: 1.0, - }; - - formData.append("file", fileInput); - formData.append("data", JSON.stringify(advancedPrompt)); - - const res = await fetch("https://sd-inference.jan.ai/controlnet_inference", { - method: "POST", - body: formData, - }); - - if (!res.ok) { - console.error("fetchConversations error", res); - return; - } - const body = await res.json(); - - return body.url; -}; - -export type AdvancedPrompt = { - prompt: string; - neg_prompt: string; - control_net_model: string; - seed: number; - steps: number; - control_scale: number; -}; diff --git a/web-client/app/_utils/tokenAccessor.ts b/web-client/app/_utils/tokenAccessor.ts deleted file mode 100644 index 90b9c88b6..000000000 --- a/web-client/app/_utils/tokenAccessor.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getSession } from "next-auth/react"; - -export async function getAccessToken() { - const session = await getSession(); - if (session) { - // @ts-ignore - return session.access_token; - } - return null; -} - -export async function getIdToken() { - const session = await getSession(); - if (session) { - // @ts-ignore - return session.id_token; - } - return null; -} diff --git a/web-client/app/api/auth/[...nextauth]/route.ts b/web-client/app/api/auth/[...nextauth]/route.ts deleted file mode 100644 index 474673d8b..000000000 --- a/web-client/app/api/auth/[...nextauth]/route.ts +++ /dev/null @@ -1,74 +0,0 @@ -// @ts-nocheck -import NextAuth from "next-auth/next"; -import KeycloakProvider from "next-auth/providers/keycloak"; -import jwt_decode from "jwt-decode"; - -async function refreshAccessToken(token) { - const resp = await fetch(`${process.env.REFRESH_TOKEN_URL}`, { - headers: { "Content-Type": "application/x-www-form-urlencoded" }, - body: new URLSearchParams({ - client_id: process.env.KEYCLOAK_CLIENT_ID, - client_secret: process.env.KEYCLOAK_CLIENT_SECRET, - grant_type: "refresh_token", - refresh_token: token.refresh_token, - }), - method: "POST", - }); - const refreshToken = await resp.json(); - if (!resp.ok) throw refreshToken; - return { - ...token, - access_token: refreshToken.access_token, - decoded: jwt_decode(refreshToken.access_token), - id_token: refreshToken.id_token, - expired_at: Math.floor(Date.now() / 1000) + refreshToken.expired_in, - refresh_token: refreshToken.refresh_token, - }; -} - -export const authOptions = { - providers: [ - KeycloakProvider({ - clientId: `${process.env.KEYCLOAK_CLIENT_ID}`, - clientSecret: `${process.env.KEYCLOAK_CLIENT_SECRET}`, - issuer: `${process.env.AUTH_ISSUER}`, - }), - ], - secret: `${process.env.NEXTAUTH_SECRET}`, - callbacks: { - async jwt({ token, account }) { - const nowTimestamp = Math.floor(Date.now() / 1000); - if (account) { - token.decoded = jwt_decode(account.id_token); - token.access_token = account.access_token; - token.id_token = account.id_token; - token.expires_at = account.expires_at; - token.refresh_token = account.refresh_token; - return token; - } else if (nowTimestamp < token.expires_at) { - return token; - } else { - console.log("token is expired, refresh it"); - try { - const refreshedToken = await refreshAccessToken(token); - console.log("token is refreshed"); - return refreshedToken; - } catch (e) { - console.error("Error refreshing access token", e); - return { ...token, error: "RefreshAccessTokenError" }; - } - } - }, - async session({ session, token }) { - session.access_token = token.access_token; - session.id_token = token.id_token; - session.user.user_id = token.sub; - session.error = token.error; - return session; - }, - }, -}; - -const handler = NextAuth(authOptions); - -export { handler as GET, handler as POST }; diff --git a/web-client/app/api/auth/logout/route.ts b/web-client/app/api/auth/logout/route.ts deleted file mode 100644 index 8f1f02d0b..000000000 --- a/web-client/app/api/auth/logout/route.ts +++ /dev/null @@ -1,23 +0,0 @@ -// @ts-nocheck -import { getServerSession } from "next-auth"; -import { authOptions } from "../[...nextauth]/route"; - -export async function GET() { - const session = await getServerSession(authOptions); - if (session) { - const url = `${process.env.END_SESSION_URL}?id_token_hint=${ - session.id_token - }&post_logout_redirect_uri=${encodeURIComponent( - process.env.NEXTAUTH_URL ?? "/" - )}`; - - try { - await fetch(url, { method: "GET" }); - } catch (e) { - console.error(e); - return new Response({ status: 500 }); - } - } - - return new Response({ status: 200 }); -} diff --git a/web-client/app/api/openai/route.ts b/web-client/app/api/openai/route.ts deleted file mode 100644 index 4ed892ccb..000000000 --- a/web-client/app/api/openai/route.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { OpenAI } from "openai-streams"; - -export async function POST(req: Request) { - const { messages } = await req.json(); - if (!messages) { - return new Response(null, { - status: 400, - statusText: "Did not include `messages` parameter", - }); - } - const completionsStream = await OpenAI( - "chat", - { - model: "gpt-3.5-turbo", - stream: true, - messages, - max_tokens: 500, - }, - { - apiBase: process.env.OPENAPI_ENDPOINT, - apiKey: process.env.OPENAPI_KEY, - } - ); - - return new Response(completionsStream); -} diff --git a/web-client/app/download/page.tsx b/web-client/app/download/page.tsx deleted file mode 100644 index a14d34612..000000000 --- a/web-client/app/download/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -"use client"; - -import { useEffect } from "react"; -import { redirect } from "next/navigation"; - -const Page = () => { - useEffect(() => { - var userAgent = navigator.userAgent || navigator.vendor; - // iOS detection from: http://stackoverflow.com/a/9039885/177710 - if (/iPad|iPhone|iPod/.test(userAgent)) { - window.open(process.env.NEXT_PUBLIC_DOWNLOAD_APP_IOS, "_blank_"); - } else { - window.open(process.env.NEXT_PUBLIC_DOWNLOAD_APP_ANDROID, "_blank_"); - } - redirect("/", undefined); - }, []); - return <></>; -}; -export default Page; diff --git a/web-client/app/layout.tsx b/web-client/app/layout.tsx deleted file mode 100644 index 1ebe5f4d0..000000000 --- a/web-client/app/layout.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import "./globals.css"; -import { Inter } from "next/font/google"; -import classNames from "classnames"; -import { Metadata } from "next"; -import SessionProviderWrapper from "@/_components/SessionProviderWrapper"; - -const inter = Inter({ subsets: ["latin"] }); - -export const metadata: Metadata = { - title: "Jan", - description: - "Self-hosted, local, AI Inference Platform that scales from personal use to production deployments for a team.", - metadataBase: new URL( - process.env.NEXT_PUBLIC_WEB_URL ?? "https://cloud.jan.ai" - ), - openGraph: { - images: "/images/preview.jpg", - }, -}; - -type Props = { - children: React.ReactNode; -}; - -export default function RootLayout({ children }: Props) { - return ( - <SessionProviderWrapper> - {/* suppressHydrationWarning is for next-themes */} - <html lang="en" suppressHydrationWarning> - <body className={classNames(inter.className)}>{children}</body> - </html> - </SessionProviderWrapper> - ); -} diff --git a/web-client/app/page.tsx b/web-client/app/page.tsx deleted file mode 100644 index 8112809d1..000000000 --- a/web-client/app/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { ApolloWrapper } from "./_helpers/ApolloWrapper"; -import { ThemeWrapper } from "./_helpers/ThemeWrapper"; -import JotaiWrapper from "./_helpers/JotaiWrapper"; -import LeftContainer from "./_components/LeftContainer"; -import RightContainer from "./_components/RightContainer"; -import { ModalWrapper } from "./_helpers/ModalWrapper"; - -const Page: React.FC = () => ( - <ApolloWrapper> - <JotaiWrapper> - <ThemeWrapper> - <ModalWrapper> - <div className="flex"> - <LeftContainer /> - <RightContainer /> - </div> - </ModalWrapper> - </ThemeWrapper> - </JotaiWrapper> - </ApolloWrapper> -); - -export default Page; diff --git a/web-client/codegen.ts b/web-client/codegen.ts deleted file mode 100644 index 521d0fe29..000000000 --- a/web-client/codegen.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { CodegenConfig } from "@graphql-codegen/cli"; -import dotenv from "dotenv"; -dotenv.config(); - -const config: CodegenConfig = { - overwrite: true, - schema: { - "http://localhost:8080/v1/graphql": { - headers: { - "x-hasura-admin-secret": process.env.HASURA_ADMIN_TOKEN || "", - }, - }, - }, - documents: "graphql/**/*.graphql", - generates: { - "graphql/generated/": { - preset: "client", - plugins: [], - presetConfig: { - gqlTagName: "gql", - fragmentMasking: false, - }, - }, - }, -}; - -export default config; diff --git a/web-client/graphql/fragments/collection.graphql b/web-client/graphql/fragments/collection.graphql deleted file mode 100644 index fdbb34cd5..000000000 --- a/web-client/graphql/fragments/collection.graphql +++ /dev/null @@ -1,4 +0,0 @@ -fragment CollectionDetail on collections { - slug - name -} \ No newline at end of file diff --git a/web-client/graphql/fragments/conversation.graphql b/web-client/graphql/fragments/conversation.graphql deleted file mode 100644 index 621c0cb71..000000000 --- a/web-client/graphql/fragments/conversation.graphql +++ /dev/null @@ -1,12 +0,0 @@ -fragment ConversationDetail on conversations { - id - product_id - user_id - last_image_url - last_text_message - created_at - updated_at - conversation_product { - ...ProductDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/fragments/media.graphql b/web-client/graphql/fragments/media.graphql deleted file mode 100644 index bb905ef98..000000000 --- a/web-client/graphql/fragments/media.graphql +++ /dev/null @@ -1,7 +0,0 @@ -fragment MessageMedia on message_medias { - id - message_id - media_url - mime_type - updated_at -} diff --git a/web-client/graphql/fragments/message.graphql b/web-client/graphql/fragments/message.graphql deleted file mode 100644 index eee01ec93..000000000 --- a/web-client/graphql/fragments/message.graphql +++ /dev/null @@ -1,16 +0,0 @@ -fragment MessageDetail on messages { - id - conversation_id - sender - sender_name - sender_avatar_url - content - message_type - message_sender_type - created_at - updated_at - status - message_medias { - ...MessageMedia - } -} \ No newline at end of file diff --git a/web-client/graphql/fragments/product.graphql b/web-client/graphql/fragments/product.graphql deleted file mode 100644 index 9717b63f5..000000000 --- a/web-client/graphql/fragments/product.graphql +++ /dev/null @@ -1,18 +0,0 @@ -fragment ProductDetail on products { - id - name - slug - description - long_description - technical_description - image_url - author - greeting - source_url - version - inputs - outputs - nsfw - created_at - updated_at -} \ No newline at end of file diff --git a/web-client/graphql/fragments/prompt.graphql b/web-client/graphql/fragments/prompt.graphql deleted file mode 100644 index 4281e844a..000000000 --- a/web-client/graphql/fragments/prompt.graphql +++ /dev/null @@ -1,5 +0,0 @@ -fragment PromptDetail on prompts { - slug - content - image_url -} diff --git a/web-client/graphql/generated/gql.ts b/web-client/graphql/generated/gql.ts deleted file mode 100644 index 425e7cc21..000000000 --- a/web-client/graphql/generated/gql.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* eslint-disable */ -import * as types from './graphql'; -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; - -/** - * Map of all GraphQL operations in the project. - * - * This map has several performance disadvantages: - * 1. It is not tree-shakeable, so it will include all operations in the project. - * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. - * 3. It does not support dead code elimination, so it will add unused operations. - * - * Therefore it is highly recommended to use the babel or swc plugin for production. - */ -const documents = { - "fragment CollectionDetail on collections {\n slug\n name\n}": types.CollectionDetailFragmentDoc, - "fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}": types.ConversationDetailFragmentDoc, - "fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}": types.MessageMediaFragmentDoc, - "fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}": types.MessageDetailFragmentDoc, - "fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}": types.ProductDetailFragmentDoc, - "fragment PromptDetail on prompts {\n slug\n content\n image_url\n}": types.PromptDetailFragmentDoc, - "mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}": types.CreateConversationDocument, - "mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}": types.CreateMessageDocument, - "mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}": types.DeleteConversationDocument, - "mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}": types.GenerateImageDocument, - "mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}": types.UpdateConversationDocument, - "mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}": types.UpdateMessageDocument, - "query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}": types.GetCollectionsDocument, - "query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}": types.GetConversationMessagesDocument, - "query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}": types.GetConversationsDocument, - "query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}": types.GetProductsByCollectionSlugDocument, - "query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}": types.GetProductPromptsDocument, - "query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}": types.GetProductsDocument, - "query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}": types.GetProductsInDocument, - "subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}": types.SubscribeMessageDocument, -}; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - * - * - * @example - * ```ts - * const query = gql(`query GetUser($id: ID!) { user(id: $id) { name } }`); - * ``` - * - * The query argument is unknown! - * Please regenerate the types. - */ -export function gql(source: string): unknown; - -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment CollectionDetail on collections {\n slug\n name\n}"): (typeof documents)["fragment CollectionDetail on collections {\n slug\n name\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}"): (typeof documents)["fragment ConversationDetail on conversations {\n id\n product_id\n user_id\n last_image_url\n last_text_message\n created_at\n updated_at\n conversation_product {\n ...ProductDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}"): (typeof documents)["fragment MessageMedia on message_medias {\n id\n message_id\n media_url\n mime_type\n updated_at\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}"): (typeof documents)["fragment MessageDetail on messages {\n id\n conversation_id\n sender\n sender_name\n sender_avatar_url\n content\n message_type\n message_sender_type\n created_at\n updated_at\n status\n message_medias {\n ...MessageMedia\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}"): (typeof documents)["fragment ProductDetail on products {\n id\n name\n slug\n description\n long_description\n technical_description\n image_url\n author\n greeting\n source_url\n version\n inputs\n outputs\n nsfw\n created_at\n updated_at\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "fragment PromptDetail on prompts {\n slug\n content\n image_url\n}"): (typeof documents)["fragment PromptDetail on prompts {\n slug\n content\n image_url\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}"): (typeof documents)["mutation createConversation($data: conversations_insert_input!) {\n insert_conversations_one(object: $data) {\n ...ConversationDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}"): (typeof documents)["mutation createMessage($data: messages_insert_input!) {\n insert_messages_one(object: $data) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}"): (typeof documents)["mutation deleteConversation($id: uuid!) {\n delete_conversations_by_pk(id: $id) {\n id\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}"): (typeof documents)["mutation generateImage($model: String = \"\", $neg_prompt: String = \"\", $prompt: String = \"\", $seed: Int = 10, $steps: Int = 10, $width: Int = 512, $height: Int = 512) {\n imageGeneration(\n input: {model: $model, neg_prompt: $neg_prompt, prompt: $prompt, seed: $seed, steps: $steps, width: $width, height: $height}\n ) {\n url\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}"): (typeof documents)["mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) {\n update_conversations_by_pk(\n pk_columns: {id: $id}\n _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}\n ) {\n ...ConversationDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}"): (typeof documents)["mutation updateMessage($id: uuid = \"\", $data: messages_set_input!) {\n update_messages_by_pk(pk_columns: {id: $id}, _set: $data) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}"): (typeof documents)["query getCollections {\n collections {\n ...CollectionDetail\n collection_products {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}"): (typeof documents)["query getConversationMessages($conversation_id: uuid = \"\", $limit: Int = 100, $offset: Int = 100) {\n messages(\n offset: $offset\n limit: $limit\n where: {conversation_id: {_eq: $conversation_id}}\n order_by: {created_at: desc}\n ) {\n ...MessageDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}"): (typeof documents)["query getConversations {\n conversations(order_by: {updated_at: desc}) {\n ...ConversationDetail\n conversation_messages {\n ...MessageDetail\n message_medias {\n ...MessageMedia\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"): (typeof documents)["query getProductsByCollectionSlug($slug: String = \"\") {\n products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}"): (typeof documents)["query getProductPrompts($productSlug: String = \"\") {\n prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) {\n ...PromptDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"): (typeof documents)["query getProducts {\n products {\n ...ProductDetail\n product_prompts {\n prompts {\n ...PromptDetail\n }\n }\n product_collections {\n collections {\n ...CollectionDetail\n }\n }\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}"): (typeof documents)["query getProductsIn($_in: [String!] = \"\") {\n products(where: {slug: {_in: $_in}}) {\n ...ProductDetail\n }\n}"]; -/** - * The gql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. - */ -export function gql(source: "subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}"): (typeof documents)["subscription subscribeMessage($id: uuid = \"\") {\n messages_by_pk(id: $id) {\n id\n content\n status\n }\n}"]; - -export function gql(source: string) { - return (documents as any)[source] ?? {}; -} - -export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/web-client/graphql/generated/graphql.ts b/web-client/graphql/generated/graphql.ts deleted file mode 100644 index 1734c7b91..000000000 --- a/web-client/graphql/generated/graphql.ts +++ /dev/null @@ -1,3774 +0,0 @@ -/* eslint-disable */ -import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -export type Maybe<T> = T | null; -export type InputMaybe<T> = Maybe<T>; -export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }; -export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }; -export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }; -export type MakeEmpty<T extends { [key: string]: unknown }, K extends keyof T> = { [_ in K]?: never }; -export type Incremental<T> = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; -/** All built-in and custom scalars, mapped to their actual values */ -export type Scalars = { - ID: { input: string; output: string; } - String: { input: string; output: string; } - Boolean: { input: boolean; output: boolean; } - Int: { input: number; output: number; } - Float: { input: number; output: number; } - jsonb: { input: any; output: any; } - timestamptz: { input: any; output: any; } - uuid: { input: any; output: any; } -}; - -/** Boolean expression to compare columns of type "Boolean". All fields are combined with logical 'AND'. */ -export type Boolean_Comparison_Exp = { - _eq?: InputMaybe<Scalars['Boolean']['input']>; - _gt?: InputMaybe<Scalars['Boolean']['input']>; - _gte?: InputMaybe<Scalars['Boolean']['input']>; - _in?: InputMaybe<Array<Scalars['Boolean']['input']>>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - _lt?: InputMaybe<Scalars['Boolean']['input']>; - _lte?: InputMaybe<Scalars['Boolean']['input']>; - _neq?: InputMaybe<Scalars['Boolean']['input']>; - _nin?: InputMaybe<Array<Scalars['Boolean']['input']>>; -}; - -export type ImageGenerationInput = { - height: Scalars['Int']['input']; - model: Scalars['String']['input']; - neg_prompt: Scalars['String']['input']; - prompt: Scalars['String']['input']; - seed: Scalars['Int']['input']; - steps: Scalars['Int']['input']; - width: Scalars['Int']['input']; -}; - -export type ImageGenerationOutput = { - __typename?: 'ImageGenerationOutput'; - url: Scalars['String']['output']; -}; - -/** Boolean expression to compare columns of type "Int". All fields are combined with logical 'AND'. */ -export type Int_Comparison_Exp = { - _eq?: InputMaybe<Scalars['Int']['input']>; - _gt?: InputMaybe<Scalars['Int']['input']>; - _gte?: InputMaybe<Scalars['Int']['input']>; - _in?: InputMaybe<Array<Scalars['Int']['input']>>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - _lt?: InputMaybe<Scalars['Int']['input']>; - _lte?: InputMaybe<Scalars['Int']['input']>; - _neq?: InputMaybe<Scalars['Int']['input']>; - _nin?: InputMaybe<Array<Scalars['Int']['input']>>; -}; - -/** Boolean expression to compare columns of type "String". All fields are combined with logical 'AND'. */ -export type String_Comparison_Exp = { - _eq?: InputMaybe<Scalars['String']['input']>; - _gt?: InputMaybe<Scalars['String']['input']>; - _gte?: InputMaybe<Scalars['String']['input']>; - /** does the column match the given case-insensitive pattern */ - _ilike?: InputMaybe<Scalars['String']['input']>; - _in?: InputMaybe<Array<Scalars['String']['input']>>; - /** does the column match the given POSIX regular expression, case insensitive */ - _iregex?: InputMaybe<Scalars['String']['input']>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - /** does the column match the given pattern */ - _like?: InputMaybe<Scalars['String']['input']>; - _lt?: InputMaybe<Scalars['String']['input']>; - _lte?: InputMaybe<Scalars['String']['input']>; - _neq?: InputMaybe<Scalars['String']['input']>; - /** does the column NOT match the given case-insensitive pattern */ - _nilike?: InputMaybe<Scalars['String']['input']>; - _nin?: InputMaybe<Array<Scalars['String']['input']>>; - /** does the column NOT match the given POSIX regular expression, case insensitive */ - _niregex?: InputMaybe<Scalars['String']['input']>; - /** does the column NOT match the given pattern */ - _nlike?: InputMaybe<Scalars['String']['input']>; - /** does the column NOT match the given POSIX regular expression, case sensitive */ - _nregex?: InputMaybe<Scalars['String']['input']>; - /** does the column NOT match the given SQL regular expression */ - _nsimilar?: InputMaybe<Scalars['String']['input']>; - /** does the column match the given POSIX regular expression, case sensitive */ - _regex?: InputMaybe<Scalars['String']['input']>; - /** does the column match the given SQL regular expression */ - _similar?: InputMaybe<Scalars['String']['input']>; -}; - -/** columns and relationships of "collection_products" */ -export type Collection_Products = { - __typename?: 'collection_products'; - collection_id: Scalars['uuid']['output']; - /** An array relationship */ - collections: Array<Collections>; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - product_id: Scalars['uuid']['output']; - /** An array relationship */ - products: Array<Products>; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsCollectionsArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsCollections_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsProductsArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -/** columns and relationships of "collection_products" */ -export type Collection_ProductsProducts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - -/** aggregated selection of "collection_products" */ -export type Collection_Products_Aggregate = { - __typename?: 'collection_products_aggregate'; - aggregate?: Maybe<Collection_Products_Aggregate_Fields>; - nodes: Array<Collection_Products>; -}; - -export type Collection_Products_Aggregate_Bool_Exp = { - count?: InputMaybe<Collection_Products_Aggregate_Bool_Exp_Count>; -}; - -export type Collection_Products_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Collection_Products_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Collection_Products_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "collection_products" */ -export type Collection_Products_Aggregate_Fields = { - __typename?: 'collection_products_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Collection_Products_Max_Fields>; - min?: Maybe<Collection_Products_Min_Fields>; -}; - - -/** aggregate fields of "collection_products" */ -export type Collection_Products_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Collection_Products_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "collection_products" */ -export type Collection_Products_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Collection_Products_Max_Order_By>; - min?: InputMaybe<Collection_Products_Min_Order_By>; -}; - -/** input type for inserting array relation for remote table "collection_products" */ -export type Collection_Products_Arr_Rel_Insert_Input = { - data: Array<Collection_Products_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Collection_Products_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "collection_products". All fields are combined with a logical 'AND'. */ -export type Collection_Products_Bool_Exp = { - _and?: InputMaybe<Array<Collection_Products_Bool_Exp>>; - _not?: InputMaybe<Collection_Products_Bool_Exp>; - _or?: InputMaybe<Array<Collection_Products_Bool_Exp>>; - collection_id?: InputMaybe<Uuid_Comparison_Exp>; - collections?: InputMaybe<Collections_Bool_Exp>; - collections_aggregate?: InputMaybe<Collections_Aggregate_Bool_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - product_id?: InputMaybe<Uuid_Comparison_Exp>; - products?: InputMaybe<Products_Bool_Exp>; - products_aggregate?: InputMaybe<Products_Aggregate_Bool_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "collection_products" */ -export enum Collection_Products_Constraint { - /** unique or primary key constraint on columns "product_id", "collection_id" */ - CollectionProductsCollectionIdProductIdKey = 'collection_products_collection_id_product_id_key', - /** unique or primary key constraint on columns "id" */ - CollectionProductsPkey = 'collection_products_pkey' -} - -/** input type for inserting data into table "collection_products" */ -export type Collection_Products_Insert_Input = { - collection_id?: InputMaybe<Scalars['uuid']['input']>; - collections?: InputMaybe<Collections_Arr_Rel_Insert_Input>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - products?: InputMaybe<Products_Arr_Rel_Insert_Input>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Collection_Products_Max_Fields = { - __typename?: 'collection_products_max_fields'; - collection_id?: Maybe<Scalars['uuid']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "collection_products" */ -export type Collection_Products_Max_Order_By = { - collection_id?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Collection_Products_Min_Fields = { - __typename?: 'collection_products_min_fields'; - collection_id?: Maybe<Scalars['uuid']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "collection_products" */ -export type Collection_Products_Min_Order_By = { - collection_id?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "collection_products" */ -export type Collection_Products_Mutation_Response = { - __typename?: 'collection_products_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Collection_Products>; -}; - -/** on_conflict condition type for table "collection_products" */ -export type Collection_Products_On_Conflict = { - constraint: Collection_Products_Constraint; - update_columns?: Array<Collection_Products_Update_Column>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - -/** Ordering options when selecting data from "collection_products". */ -export type Collection_Products_Order_By = { - collection_id?: InputMaybe<Order_By>; - collections_aggregate?: InputMaybe<Collections_Aggregate_Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - products_aggregate?: InputMaybe<Products_Aggregate_Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: collection_products */ -export type Collection_Products_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "collection_products" */ -export enum Collection_Products_Select_Column { - /** column name */ - CollectionId = 'collection_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "collection_products" */ -export type Collection_Products_Set_Input = { - collection_id?: InputMaybe<Scalars['uuid']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "collection_products" */ -export type Collection_Products_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Collection_Products_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Collection_Products_Stream_Cursor_Value_Input = { - collection_id?: InputMaybe<Scalars['uuid']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "collection_products" */ -export enum Collection_Products_Update_Column { - /** column name */ - CollectionId = 'collection_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Collection_Products_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Collection_Products_Set_Input>; - /** filter the rows which have to be updated */ - where: Collection_Products_Bool_Exp; -}; - -/** columns and relationships of "collections" */ -export type Collections = { - __typename?: 'collections'; - /** An array relationship */ - collection_products: Array<Collection_Products>; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - created_at: Scalars['timestamptz']['output']; - description: Scalars['String']['output']; - id: Scalars['uuid']['output']; - name: Scalars['String']['output']; - slug: Scalars['String']['output']; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "collections" */ -export type CollectionsCollection_ProductsArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -/** columns and relationships of "collections" */ -export type CollectionsCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - -/** aggregated selection of "collections" */ -export type Collections_Aggregate = { - __typename?: 'collections_aggregate'; - aggregate?: Maybe<Collections_Aggregate_Fields>; - nodes: Array<Collections>; -}; - -export type Collections_Aggregate_Bool_Exp = { - count?: InputMaybe<Collections_Aggregate_Bool_Exp_Count>; -}; - -export type Collections_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Collections_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Collections_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "collections" */ -export type Collections_Aggregate_Fields = { - __typename?: 'collections_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Collections_Max_Fields>; - min?: Maybe<Collections_Min_Fields>; -}; - - -/** aggregate fields of "collections" */ -export type Collections_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Collections_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "collections" */ -export type Collections_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Collections_Max_Order_By>; - min?: InputMaybe<Collections_Min_Order_By>; -}; - -/** input type for inserting array relation for remote table "collections" */ -export type Collections_Arr_Rel_Insert_Input = { - data: Array<Collections_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Collections_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "collections". All fields are combined with a logical 'AND'. */ -export type Collections_Bool_Exp = { - _and?: InputMaybe<Array<Collections_Bool_Exp>>; - _not?: InputMaybe<Collections_Bool_Exp>; - _or?: InputMaybe<Array<Collections_Bool_Exp>>; - collection_products?: InputMaybe<Collection_Products_Bool_Exp>; - collection_products_aggregate?: InputMaybe<Collection_Products_Aggregate_Bool_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - description?: InputMaybe<String_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - name?: InputMaybe<String_Comparison_Exp>; - slug?: InputMaybe<String_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "collections" */ -export enum Collections_Constraint { - /** unique or primary key constraint on columns "id" */ - CollectionsPkey = 'collections_pkey', - /** unique or primary key constraint on columns "slug" */ - CollectionsSlugKey = 'collections_slug_key' -} - -/** input type for inserting data into table "collections" */ -export type Collections_Insert_Input = { - collection_products?: InputMaybe<Collection_Products_Arr_Rel_Insert_Input>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Collections_Max_Fields = { - __typename?: 'collections_max_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - description?: Maybe<Scalars['String']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - name?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "collections" */ -export type Collections_Max_Order_By = { - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Collections_Min_Fields = { - __typename?: 'collections_min_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - description?: Maybe<Scalars['String']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - name?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "collections" */ -export type Collections_Min_Order_By = { - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "collections" */ -export type Collections_Mutation_Response = { - __typename?: 'collections_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Collections>; -}; - -/** on_conflict condition type for table "collections" */ -export type Collections_On_Conflict = { - constraint: Collections_Constraint; - update_columns?: Array<Collections_Update_Column>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - -/** Ordering options when selecting data from "collections". */ -export type Collections_Order_By = { - collection_products_aggregate?: InputMaybe<Collection_Products_Aggregate_Order_By>; - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: collections */ -export type Collections_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "collections" */ -export enum Collections_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Id = 'id', - /** column name */ - Name = 'name', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "collections" */ -export type Collections_Set_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "collections" */ -export type Collections_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Collections_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Collections_Stream_Cursor_Value_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "collections" */ -export enum Collections_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Id = 'id', - /** column name */ - Name = 'name', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Collections_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Collections_Set_Input>; - /** filter the rows which have to be updated */ - where: Collections_Bool_Exp; -}; - -/** columns and relationships of "conversations" */ -export type Conversations = { - __typename?: 'conversations'; - /** An array relationship */ - conversation_messages: Array<Messages>; - /** An aggregate relationship */ - conversation_messages_aggregate: Messages_Aggregate; - /** An object relationship */ - conversation_product?: Maybe<Products>; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - last_image_url?: Maybe<Scalars['String']['output']>; - last_text_message?: Maybe<Scalars['String']['output']>; - product_id: Scalars['uuid']['output']; - updated_at: Scalars['timestamptz']['output']; - user_id: Scalars['String']['output']; -}; - - -/** columns and relationships of "conversations" */ -export type ConversationsConversation_MessagesArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -/** columns and relationships of "conversations" */ -export type ConversationsConversation_Messages_AggregateArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - -/** aggregated selection of "conversations" */ -export type Conversations_Aggregate = { - __typename?: 'conversations_aggregate'; - aggregate?: Maybe<Conversations_Aggregate_Fields>; - nodes: Array<Conversations>; -}; - -/** aggregate fields of "conversations" */ -export type Conversations_Aggregate_Fields = { - __typename?: 'conversations_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Conversations_Max_Fields>; - min?: Maybe<Conversations_Min_Fields>; -}; - - -/** aggregate fields of "conversations" */ -export type Conversations_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Conversations_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** Boolean expression to filter rows from the table "conversations". All fields are combined with a logical 'AND'. */ -export type Conversations_Bool_Exp = { - _and?: InputMaybe<Array<Conversations_Bool_Exp>>; - _not?: InputMaybe<Conversations_Bool_Exp>; - _or?: InputMaybe<Array<Conversations_Bool_Exp>>; - conversation_messages?: InputMaybe<Messages_Bool_Exp>; - conversation_messages_aggregate?: InputMaybe<Messages_Aggregate_Bool_Exp>; - conversation_product?: InputMaybe<Products_Bool_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - last_image_url?: InputMaybe<String_Comparison_Exp>; - last_text_message?: InputMaybe<String_Comparison_Exp>; - product_id?: InputMaybe<Uuid_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; - user_id?: InputMaybe<String_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "conversations" */ -export enum Conversations_Constraint { - /** unique or primary key constraint on columns "id" */ - ConversationsPkey = 'conversations_pkey' -} - -/** input type for inserting data into table "conversations" */ -export type Conversations_Insert_Input = { - conversation_messages?: InputMaybe<Messages_Arr_Rel_Insert_Input>; - conversation_product?: InputMaybe<Products_Obj_Rel_Insert_Input>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - last_image_url?: InputMaybe<Scalars['String']['input']>; - last_text_message?: InputMaybe<Scalars['String']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - user_id?: InputMaybe<Scalars['String']['input']>; -}; - -/** aggregate max on columns */ -export type Conversations_Max_Fields = { - __typename?: 'conversations_max_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - last_image_url?: Maybe<Scalars['String']['output']>; - last_text_message?: Maybe<Scalars['String']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; - user_id?: Maybe<Scalars['String']['output']>; -}; - -/** aggregate min on columns */ -export type Conversations_Min_Fields = { - __typename?: 'conversations_min_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - last_image_url?: Maybe<Scalars['String']['output']>; - last_text_message?: Maybe<Scalars['String']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; - user_id?: Maybe<Scalars['String']['output']>; -}; - -/** response of any mutation on the table "conversations" */ -export type Conversations_Mutation_Response = { - __typename?: 'conversations_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Conversations>; -}; - -/** input type for inserting object relation for remote table "conversations" */ -export type Conversations_Obj_Rel_Insert_Input = { - data: Conversations_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe<Conversations_On_Conflict>; -}; - -/** on_conflict condition type for table "conversations" */ -export type Conversations_On_Conflict = { - constraint: Conversations_Constraint; - update_columns?: Array<Conversations_Update_Column>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - -/** Ordering options when selecting data from "conversations". */ -export type Conversations_Order_By = { - conversation_messages_aggregate?: InputMaybe<Messages_Aggregate_Order_By>; - conversation_product?: InputMaybe<Products_Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - last_image_url?: InputMaybe<Order_By>; - last_text_message?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; - user_id?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: conversations */ -export type Conversations_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "conversations" */ -export enum Conversations_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - LastImageUrl = 'last_image_url', - /** column name */ - LastTextMessage = 'last_text_message', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - UserId = 'user_id' -} - -/** input type for updating data in table "conversations" */ -export type Conversations_Set_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - last_image_url?: InputMaybe<Scalars['String']['input']>; - last_text_message?: InputMaybe<Scalars['String']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - user_id?: InputMaybe<Scalars['String']['input']>; -}; - -/** Streaming cursor of the table "conversations" */ -export type Conversations_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Conversations_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Conversations_Stream_Cursor_Value_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - last_image_url?: InputMaybe<Scalars['String']['input']>; - last_text_message?: InputMaybe<Scalars['String']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - user_id?: InputMaybe<Scalars['String']['input']>; -}; - -/** update columns of table "conversations" */ -export enum Conversations_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - LastImageUrl = 'last_image_url', - /** column name */ - LastTextMessage = 'last_text_message', - /** column name */ - ProductId = 'product_id', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - UserId = 'user_id' -} - -export type Conversations_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Conversations_Set_Input>; - /** filter the rows which have to be updated */ - where: Conversations_Bool_Exp; -}; - -/** ordering argument of a cursor */ -export enum Cursor_Ordering { - /** ascending ordering of the cursor */ - Asc = 'ASC', - /** descending ordering of the cursor */ - Desc = 'DESC' -} - -export type Jsonb_Cast_Exp = { - String?: InputMaybe<String_Comparison_Exp>; -}; - -/** Boolean expression to compare columns of type "jsonb". All fields are combined with logical 'AND'. */ -export type Jsonb_Comparison_Exp = { - _cast?: InputMaybe<Jsonb_Cast_Exp>; - /** is the column contained in the given json value */ - _contained_in?: InputMaybe<Scalars['jsonb']['input']>; - /** does the column contain the given json value at the top level */ - _contains?: InputMaybe<Scalars['jsonb']['input']>; - _eq?: InputMaybe<Scalars['jsonb']['input']>; - _gt?: InputMaybe<Scalars['jsonb']['input']>; - _gte?: InputMaybe<Scalars['jsonb']['input']>; - /** does the string exist as a top-level key in the column */ - _has_key?: InputMaybe<Scalars['String']['input']>; - /** do all of these strings exist as top-level keys in the column */ - _has_keys_all?: InputMaybe<Array<Scalars['String']['input']>>; - /** do any of these strings exist as top-level keys in the column */ - _has_keys_any?: InputMaybe<Array<Scalars['String']['input']>>; - _in?: InputMaybe<Array<Scalars['jsonb']['input']>>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - _lt?: InputMaybe<Scalars['jsonb']['input']>; - _lte?: InputMaybe<Scalars['jsonb']['input']>; - _neq?: InputMaybe<Scalars['jsonb']['input']>; - _nin?: InputMaybe<Array<Scalars['jsonb']['input']>>; -}; - -/** columns and relationships of "message_medias" */ -export type Message_Medias = { - __typename?: 'message_medias'; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - /** An object relationship */ - media_message?: Maybe<Messages>; - media_url?: Maybe<Scalars['String']['output']>; - message_id: Scalars['uuid']['output']; - mime_type?: Maybe<Scalars['String']['output']>; - updated_at: Scalars['timestamptz']['output']; -}; - -/** aggregated selection of "message_medias" */ -export type Message_Medias_Aggregate = { - __typename?: 'message_medias_aggregate'; - aggregate?: Maybe<Message_Medias_Aggregate_Fields>; - nodes: Array<Message_Medias>; -}; - -export type Message_Medias_Aggregate_Bool_Exp = { - count?: InputMaybe<Message_Medias_Aggregate_Bool_Exp_Count>; -}; - -export type Message_Medias_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Message_Medias_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Message_Medias_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "message_medias" */ -export type Message_Medias_Aggregate_Fields = { - __typename?: 'message_medias_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Message_Medias_Max_Fields>; - min?: Maybe<Message_Medias_Min_Fields>; -}; - - -/** aggregate fields of "message_medias" */ -export type Message_Medias_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Message_Medias_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "message_medias" */ -export type Message_Medias_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Message_Medias_Max_Order_By>; - min?: InputMaybe<Message_Medias_Min_Order_By>; -}; - -/** input type for inserting array relation for remote table "message_medias" */ -export type Message_Medias_Arr_Rel_Insert_Input = { - data: Array<Message_Medias_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Message_Medias_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "message_medias". All fields are combined with a logical 'AND'. */ -export type Message_Medias_Bool_Exp = { - _and?: InputMaybe<Array<Message_Medias_Bool_Exp>>; - _not?: InputMaybe<Message_Medias_Bool_Exp>; - _or?: InputMaybe<Array<Message_Medias_Bool_Exp>>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - media_message?: InputMaybe<Messages_Bool_Exp>; - media_url?: InputMaybe<String_Comparison_Exp>; - message_id?: InputMaybe<Uuid_Comparison_Exp>; - mime_type?: InputMaybe<String_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "message_medias" */ -export enum Message_Medias_Constraint { - /** unique or primary key constraint on columns "id" */ - MessageMediasPkey = 'message_medias_pkey' -} - -/** input type for inserting data into table "message_medias" */ -export type Message_Medias_Insert_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - media_message?: InputMaybe<Messages_Obj_Rel_Insert_Input>; - media_url?: InputMaybe<Scalars['String']['input']>; - message_id?: InputMaybe<Scalars['uuid']['input']>; - mime_type?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Message_Medias_Max_Fields = { - __typename?: 'message_medias_max_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - media_url?: Maybe<Scalars['String']['output']>; - message_id?: Maybe<Scalars['uuid']['output']>; - mime_type?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "message_medias" */ -export type Message_Medias_Max_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - media_url?: InputMaybe<Order_By>; - message_id?: InputMaybe<Order_By>; - mime_type?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Message_Medias_Min_Fields = { - __typename?: 'message_medias_min_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - media_url?: Maybe<Scalars['String']['output']>; - message_id?: Maybe<Scalars['uuid']['output']>; - mime_type?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "message_medias" */ -export type Message_Medias_Min_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - media_url?: InputMaybe<Order_By>; - message_id?: InputMaybe<Order_By>; - mime_type?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "message_medias" */ -export type Message_Medias_Mutation_Response = { - __typename?: 'message_medias_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Message_Medias>; -}; - -/** on_conflict condition type for table "message_medias" */ -export type Message_Medias_On_Conflict = { - constraint: Message_Medias_Constraint; - update_columns?: Array<Message_Medias_Update_Column>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - -/** Ordering options when selecting data from "message_medias". */ -export type Message_Medias_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - media_message?: InputMaybe<Messages_Order_By>; - media_url?: InputMaybe<Order_By>; - message_id?: InputMaybe<Order_By>; - mime_type?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: message_medias */ -export type Message_Medias_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "message_medias" */ -export enum Message_Medias_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MediaUrl = 'media_url', - /** column name */ - MessageId = 'message_id', - /** column name */ - MimeType = 'mime_type', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "message_medias" */ -export type Message_Medias_Set_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - media_url?: InputMaybe<Scalars['String']['input']>; - message_id?: InputMaybe<Scalars['uuid']['input']>; - mime_type?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "message_medias" */ -export type Message_Medias_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Message_Medias_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Message_Medias_Stream_Cursor_Value_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - media_url?: InputMaybe<Scalars['String']['input']>; - message_id?: InputMaybe<Scalars['uuid']['input']>; - mime_type?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "message_medias" */ -export enum Message_Medias_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MediaUrl = 'media_url', - /** column name */ - MessageId = 'message_id', - /** column name */ - MimeType = 'mime_type', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Message_Medias_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Message_Medias_Set_Input>; - /** filter the rows which have to be updated */ - where: Message_Medias_Bool_Exp; -}; - -/** columns and relationships of "messages" */ -export type Messages = { - __typename?: 'messages'; - content?: Maybe<Scalars['String']['output']>; - conversation_id: Scalars['uuid']['output']; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - /** An object relationship */ - message_conversation?: Maybe<Conversations>; - /** An array relationship */ - message_medias: Array<Message_Medias>; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - message_sender_type?: Maybe<Scalars['String']['output']>; - message_type?: Maybe<Scalars['String']['output']>; - prompt_cache?: Maybe<Scalars['jsonb']['output']>; - sender: Scalars['String']['output']; - sender_avatar_url?: Maybe<Scalars['String']['output']>; - sender_name?: Maybe<Scalars['String']['output']>; - status?: Maybe<Scalars['String']['output']>; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "messages" */ -export type MessagesMessage_MediasArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -/** columns and relationships of "messages" */ -export type MessagesMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -/** columns and relationships of "messages" */ -export type MessagesPrompt_CacheArgs = { - path?: InputMaybe<Scalars['String']['input']>; -}; - -/** aggregated selection of "messages" */ -export type Messages_Aggregate = { - __typename?: 'messages_aggregate'; - aggregate?: Maybe<Messages_Aggregate_Fields>; - nodes: Array<Messages>; -}; - -export type Messages_Aggregate_Bool_Exp = { - count?: InputMaybe<Messages_Aggregate_Bool_Exp_Count>; -}; - -export type Messages_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Messages_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Messages_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "messages" */ -export type Messages_Aggregate_Fields = { - __typename?: 'messages_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Messages_Max_Fields>; - min?: Maybe<Messages_Min_Fields>; -}; - - -/** aggregate fields of "messages" */ -export type Messages_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Messages_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "messages" */ -export type Messages_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Messages_Max_Order_By>; - min?: InputMaybe<Messages_Min_Order_By>; -}; - -/** append existing jsonb value of filtered columns with new jsonb value */ -export type Messages_Append_Input = { - prompt_cache?: InputMaybe<Scalars['jsonb']['input']>; -}; - -/** input type for inserting array relation for remote table "messages" */ -export type Messages_Arr_Rel_Insert_Input = { - data: Array<Messages_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Messages_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "messages". All fields are combined with a logical 'AND'. */ -export type Messages_Bool_Exp = { - _and?: InputMaybe<Array<Messages_Bool_Exp>>; - _not?: InputMaybe<Messages_Bool_Exp>; - _or?: InputMaybe<Array<Messages_Bool_Exp>>; - content?: InputMaybe<String_Comparison_Exp>; - conversation_id?: InputMaybe<Uuid_Comparison_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - message_conversation?: InputMaybe<Conversations_Bool_Exp>; - message_medias?: InputMaybe<Message_Medias_Bool_Exp>; - message_medias_aggregate?: InputMaybe<Message_Medias_Aggregate_Bool_Exp>; - message_sender_type?: InputMaybe<String_Comparison_Exp>; - message_type?: InputMaybe<String_Comparison_Exp>; - prompt_cache?: InputMaybe<Jsonb_Comparison_Exp>; - sender?: InputMaybe<String_Comparison_Exp>; - sender_avatar_url?: InputMaybe<String_Comparison_Exp>; - sender_name?: InputMaybe<String_Comparison_Exp>; - status?: InputMaybe<String_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "messages" */ -export enum Messages_Constraint { - /** unique or primary key constraint on columns "id" */ - MessagesPkey = 'messages_pkey' -} - -/** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ -export type Messages_Delete_At_Path_Input = { - prompt_cache?: InputMaybe<Array<Scalars['String']['input']>>; -}; - -/** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ -export type Messages_Delete_Elem_Input = { - prompt_cache?: InputMaybe<Scalars['Int']['input']>; -}; - -/** delete key/value pair or string element. key/value pairs are matched based on their key value */ -export type Messages_Delete_Key_Input = { - prompt_cache?: InputMaybe<Scalars['String']['input']>; -}; - -/** input type for inserting data into table "messages" */ -export type Messages_Insert_Input = { - content?: InputMaybe<Scalars['String']['input']>; - conversation_id?: InputMaybe<Scalars['uuid']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - message_conversation?: InputMaybe<Conversations_Obj_Rel_Insert_Input>; - message_medias?: InputMaybe<Message_Medias_Arr_Rel_Insert_Input>; - message_sender_type?: InputMaybe<Scalars['String']['input']>; - message_type?: InputMaybe<Scalars['String']['input']>; - prompt_cache?: InputMaybe<Scalars['jsonb']['input']>; - sender?: InputMaybe<Scalars['String']['input']>; - sender_avatar_url?: InputMaybe<Scalars['String']['input']>; - sender_name?: InputMaybe<Scalars['String']['input']>; - status?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Messages_Max_Fields = { - __typename?: 'messages_max_fields'; - content?: Maybe<Scalars['String']['output']>; - conversation_id?: Maybe<Scalars['uuid']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - message_sender_type?: Maybe<Scalars['String']['output']>; - message_type?: Maybe<Scalars['String']['output']>; - sender?: Maybe<Scalars['String']['output']>; - sender_avatar_url?: Maybe<Scalars['String']['output']>; - sender_name?: Maybe<Scalars['String']['output']>; - status?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "messages" */ -export type Messages_Max_Order_By = { - content?: InputMaybe<Order_By>; - conversation_id?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - message_sender_type?: InputMaybe<Order_By>; - message_type?: InputMaybe<Order_By>; - sender?: InputMaybe<Order_By>; - sender_avatar_url?: InputMaybe<Order_By>; - sender_name?: InputMaybe<Order_By>; - status?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Messages_Min_Fields = { - __typename?: 'messages_min_fields'; - content?: Maybe<Scalars['String']['output']>; - conversation_id?: Maybe<Scalars['uuid']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - message_sender_type?: Maybe<Scalars['String']['output']>; - message_type?: Maybe<Scalars['String']['output']>; - sender?: Maybe<Scalars['String']['output']>; - sender_avatar_url?: Maybe<Scalars['String']['output']>; - sender_name?: Maybe<Scalars['String']['output']>; - status?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "messages" */ -export type Messages_Min_Order_By = { - content?: InputMaybe<Order_By>; - conversation_id?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - message_sender_type?: InputMaybe<Order_By>; - message_type?: InputMaybe<Order_By>; - sender?: InputMaybe<Order_By>; - sender_avatar_url?: InputMaybe<Order_By>; - sender_name?: InputMaybe<Order_By>; - status?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "messages" */ -export type Messages_Mutation_Response = { - __typename?: 'messages_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Messages>; -}; - -/** input type for inserting object relation for remote table "messages" */ -export type Messages_Obj_Rel_Insert_Input = { - data: Messages_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe<Messages_On_Conflict>; -}; - -/** on_conflict condition type for table "messages" */ -export type Messages_On_Conflict = { - constraint: Messages_Constraint; - update_columns?: Array<Messages_Update_Column>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - -/** Ordering options when selecting data from "messages". */ -export type Messages_Order_By = { - content?: InputMaybe<Order_By>; - conversation_id?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - message_conversation?: InputMaybe<Conversations_Order_By>; - message_medias_aggregate?: InputMaybe<Message_Medias_Aggregate_Order_By>; - message_sender_type?: InputMaybe<Order_By>; - message_type?: InputMaybe<Order_By>; - prompt_cache?: InputMaybe<Order_By>; - sender?: InputMaybe<Order_By>; - sender_avatar_url?: InputMaybe<Order_By>; - sender_name?: InputMaybe<Order_By>; - status?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: messages */ -export type Messages_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** prepend existing jsonb value of filtered columns with new jsonb value */ -export type Messages_Prepend_Input = { - prompt_cache?: InputMaybe<Scalars['jsonb']['input']>; -}; - -/** select columns of table "messages" */ -export enum Messages_Select_Column { - /** column name */ - Content = 'content', - /** column name */ - ConversationId = 'conversation_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MessageSenderType = 'message_sender_type', - /** column name */ - MessageType = 'message_type', - /** column name */ - PromptCache = 'prompt_cache', - /** column name */ - Sender = 'sender', - /** column name */ - SenderAvatarUrl = 'sender_avatar_url', - /** column name */ - SenderName = 'sender_name', - /** column name */ - Status = 'status', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "messages" */ -export type Messages_Set_Input = { - content?: InputMaybe<Scalars['String']['input']>; - conversation_id?: InputMaybe<Scalars['uuid']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - message_sender_type?: InputMaybe<Scalars['String']['input']>; - message_type?: InputMaybe<Scalars['String']['input']>; - prompt_cache?: InputMaybe<Scalars['jsonb']['input']>; - sender?: InputMaybe<Scalars['String']['input']>; - sender_avatar_url?: InputMaybe<Scalars['String']['input']>; - sender_name?: InputMaybe<Scalars['String']['input']>; - status?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "messages" */ -export type Messages_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Messages_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Messages_Stream_Cursor_Value_Input = { - content?: InputMaybe<Scalars['String']['input']>; - conversation_id?: InputMaybe<Scalars['uuid']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - message_sender_type?: InputMaybe<Scalars['String']['input']>; - message_type?: InputMaybe<Scalars['String']['input']>; - prompt_cache?: InputMaybe<Scalars['jsonb']['input']>; - sender?: InputMaybe<Scalars['String']['input']>; - sender_avatar_url?: InputMaybe<Scalars['String']['input']>; - sender_name?: InputMaybe<Scalars['String']['input']>; - status?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "messages" */ -export enum Messages_Update_Column { - /** column name */ - Content = 'content', - /** column name */ - ConversationId = 'conversation_id', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - MessageSenderType = 'message_sender_type', - /** column name */ - MessageType = 'message_type', - /** column name */ - PromptCache = 'prompt_cache', - /** column name */ - Sender = 'sender', - /** column name */ - SenderAvatarUrl = 'sender_avatar_url', - /** column name */ - SenderName = 'sender_name', - /** column name */ - Status = 'status', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Messages_Updates = { - /** append existing jsonb value of filtered columns with new jsonb value */ - _append?: InputMaybe<Messages_Append_Input>; - /** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ - _delete_at_path?: InputMaybe<Messages_Delete_At_Path_Input>; - /** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ - _delete_elem?: InputMaybe<Messages_Delete_Elem_Input>; - /** delete key/value pair or string element. key/value pairs are matched based on their key value */ - _delete_key?: InputMaybe<Messages_Delete_Key_Input>; - /** prepend existing jsonb value of filtered columns with new jsonb value */ - _prepend?: InputMaybe<Messages_Prepend_Input>; - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Messages_Set_Input>; - /** filter the rows which have to be updated */ - where: Messages_Bool_Exp; -}; - -/** mutation root */ -export type Mutation_Root = { - __typename?: 'mutation_root'; - /** delete data from the table: "collection_products" */ - delete_collection_products?: Maybe<Collection_Products_Mutation_Response>; - /** delete single row from the table: "collection_products" */ - delete_collection_products_by_pk?: Maybe<Collection_Products>; - /** delete data from the table: "collections" */ - delete_collections?: Maybe<Collections_Mutation_Response>; - /** delete single row from the table: "collections" */ - delete_collections_by_pk?: Maybe<Collections>; - /** delete data from the table: "conversations" */ - delete_conversations?: Maybe<Conversations_Mutation_Response>; - /** delete single row from the table: "conversations" */ - delete_conversations_by_pk?: Maybe<Conversations>; - /** delete data from the table: "message_medias" */ - delete_message_medias?: Maybe<Message_Medias_Mutation_Response>; - /** delete single row from the table: "message_medias" */ - delete_message_medias_by_pk?: Maybe<Message_Medias>; - /** delete data from the table: "messages" */ - delete_messages?: Maybe<Messages_Mutation_Response>; - /** delete single row from the table: "messages" */ - delete_messages_by_pk?: Maybe<Messages>; - /** delete data from the table: "product_prompts" */ - delete_product_prompts?: Maybe<Product_Prompts_Mutation_Response>; - /** delete single row from the table: "product_prompts" */ - delete_product_prompts_by_pk?: Maybe<Product_Prompts>; - /** delete data from the table: "products" */ - delete_products?: Maybe<Products_Mutation_Response>; - /** delete single row from the table: "products" */ - delete_products_by_pk?: Maybe<Products>; - /** delete data from the table: "prompts" */ - delete_prompts?: Maybe<Prompts_Mutation_Response>; - /** delete single row from the table: "prompts" */ - delete_prompts_by_pk?: Maybe<Prompts>; - imageGeneration?: Maybe<ImageGenerationOutput>; - /** insert data into the table: "collection_products" */ - insert_collection_products?: Maybe<Collection_Products_Mutation_Response>; - /** insert a single row into the table: "collection_products" */ - insert_collection_products_one?: Maybe<Collection_Products>; - /** insert data into the table: "collections" */ - insert_collections?: Maybe<Collections_Mutation_Response>; - /** insert a single row into the table: "collections" */ - insert_collections_one?: Maybe<Collections>; - /** insert data into the table: "conversations" */ - insert_conversations?: Maybe<Conversations_Mutation_Response>; - /** insert a single row into the table: "conversations" */ - insert_conversations_one?: Maybe<Conversations>; - /** insert data into the table: "message_medias" */ - insert_message_medias?: Maybe<Message_Medias_Mutation_Response>; - /** insert a single row into the table: "message_medias" */ - insert_message_medias_one?: Maybe<Message_Medias>; - /** insert data into the table: "messages" */ - insert_messages?: Maybe<Messages_Mutation_Response>; - /** insert a single row into the table: "messages" */ - insert_messages_one?: Maybe<Messages>; - /** insert data into the table: "product_prompts" */ - insert_product_prompts?: Maybe<Product_Prompts_Mutation_Response>; - /** insert a single row into the table: "product_prompts" */ - insert_product_prompts_one?: Maybe<Product_Prompts>; - /** insert data into the table: "products" */ - insert_products?: Maybe<Products_Mutation_Response>; - /** insert a single row into the table: "products" */ - insert_products_one?: Maybe<Products>; - /** insert data into the table: "prompts" */ - insert_prompts?: Maybe<Prompts_Mutation_Response>; - /** insert a single row into the table: "prompts" */ - insert_prompts_one?: Maybe<Prompts>; - /** update data of the table: "collection_products" */ - update_collection_products?: Maybe<Collection_Products_Mutation_Response>; - /** update single row of the table: "collection_products" */ - update_collection_products_by_pk?: Maybe<Collection_Products>; - /** update multiples rows of table: "collection_products" */ - update_collection_products_many?: Maybe<Array<Maybe<Collection_Products_Mutation_Response>>>; - /** update data of the table: "collections" */ - update_collections?: Maybe<Collections_Mutation_Response>; - /** update single row of the table: "collections" */ - update_collections_by_pk?: Maybe<Collections>; - /** update multiples rows of table: "collections" */ - update_collections_many?: Maybe<Array<Maybe<Collections_Mutation_Response>>>; - /** update data of the table: "conversations" */ - update_conversations?: Maybe<Conversations_Mutation_Response>; - /** update single row of the table: "conversations" */ - update_conversations_by_pk?: Maybe<Conversations>; - /** update multiples rows of table: "conversations" */ - update_conversations_many?: Maybe<Array<Maybe<Conversations_Mutation_Response>>>; - /** update data of the table: "message_medias" */ - update_message_medias?: Maybe<Message_Medias_Mutation_Response>; - /** update single row of the table: "message_medias" */ - update_message_medias_by_pk?: Maybe<Message_Medias>; - /** update multiples rows of table: "message_medias" */ - update_message_medias_many?: Maybe<Array<Maybe<Message_Medias_Mutation_Response>>>; - /** update data of the table: "messages" */ - update_messages?: Maybe<Messages_Mutation_Response>; - /** update single row of the table: "messages" */ - update_messages_by_pk?: Maybe<Messages>; - /** update multiples rows of table: "messages" */ - update_messages_many?: Maybe<Array<Maybe<Messages_Mutation_Response>>>; - /** update data of the table: "product_prompts" */ - update_product_prompts?: Maybe<Product_Prompts_Mutation_Response>; - /** update single row of the table: "product_prompts" */ - update_product_prompts_by_pk?: Maybe<Product_Prompts>; - /** update multiples rows of table: "product_prompts" */ - update_product_prompts_many?: Maybe<Array<Maybe<Product_Prompts_Mutation_Response>>>; - /** update data of the table: "products" */ - update_products?: Maybe<Products_Mutation_Response>; - /** update single row of the table: "products" */ - update_products_by_pk?: Maybe<Products>; - /** update multiples rows of table: "products" */ - update_products_many?: Maybe<Array<Maybe<Products_Mutation_Response>>>; - /** update data of the table: "prompts" */ - update_prompts?: Maybe<Prompts_Mutation_Response>; - /** update single row of the table: "prompts" */ - update_prompts_by_pk?: Maybe<Prompts>; - /** update multiples rows of table: "prompts" */ - update_prompts_many?: Maybe<Array<Maybe<Prompts_Mutation_Response>>>; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collection_ProductsArgs = { - where: Collection_Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_CollectionsArgs = { - where: Collections_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Collections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_ConversationsArgs = { - where: Conversations_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Conversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Message_MediasArgs = { - where: Message_Medias_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Message_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_MessagesArgs = { - where: Messages_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Messages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Product_PromptsArgs = { - where: Product_Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Product_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_ProductsArgs = { - where: Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootDelete_PromptsArgs = { - where: Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootDelete_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -/** mutation root */ -export type Mutation_RootImageGenerationArgs = { - input: ImageGenerationInput; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collection_ProductsArgs = { - objects: Array<Collection_Products_Insert_Input>; - on_conflict?: InputMaybe<Collection_Products_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collection_Products_OneArgs = { - object: Collection_Products_Insert_Input; - on_conflict?: InputMaybe<Collection_Products_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_CollectionsArgs = { - objects: Array<Collections_Insert_Input>; - on_conflict?: InputMaybe<Collections_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Collections_OneArgs = { - object: Collections_Insert_Input; - on_conflict?: InputMaybe<Collections_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_ConversationsArgs = { - objects: Array<Conversations_Insert_Input>; - on_conflict?: InputMaybe<Conversations_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Conversations_OneArgs = { - object: Conversations_Insert_Input; - on_conflict?: InputMaybe<Conversations_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Message_MediasArgs = { - objects: Array<Message_Medias_Insert_Input>; - on_conflict?: InputMaybe<Message_Medias_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Message_Medias_OneArgs = { - object: Message_Medias_Insert_Input; - on_conflict?: InputMaybe<Message_Medias_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_MessagesArgs = { - objects: Array<Messages_Insert_Input>; - on_conflict?: InputMaybe<Messages_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Messages_OneArgs = { - object: Messages_Insert_Input; - on_conflict?: InputMaybe<Messages_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Product_PromptsArgs = { - objects: Array<Product_Prompts_Insert_Input>; - on_conflict?: InputMaybe<Product_Prompts_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Product_Prompts_OneArgs = { - object: Product_Prompts_Insert_Input; - on_conflict?: InputMaybe<Product_Prompts_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_ProductsArgs = { - objects: Array<Products_Insert_Input>; - on_conflict?: InputMaybe<Products_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Products_OneArgs = { - object: Products_Insert_Input; - on_conflict?: InputMaybe<Products_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_PromptsArgs = { - objects: Array<Prompts_Insert_Input>; - on_conflict?: InputMaybe<Prompts_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootInsert_Prompts_OneArgs = { - object: Prompts_Insert_Input; - on_conflict?: InputMaybe<Prompts_On_Conflict>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_ProductsArgs = { - _set?: InputMaybe<Collection_Products_Set_Input>; - where: Collection_Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_Products_By_PkArgs = { - _set?: InputMaybe<Collection_Products_Set_Input>; - pk_columns: Collection_Products_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collection_Products_ManyArgs = { - updates: Array<Collection_Products_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_CollectionsArgs = { - _set?: InputMaybe<Collections_Set_Input>; - where: Collections_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collections_By_PkArgs = { - _set?: InputMaybe<Collections_Set_Input>; - pk_columns: Collections_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Collections_ManyArgs = { - updates: Array<Collections_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_ConversationsArgs = { - _set?: InputMaybe<Conversations_Set_Input>; - where: Conversations_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Conversations_By_PkArgs = { - _set?: InputMaybe<Conversations_Set_Input>; - pk_columns: Conversations_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Conversations_ManyArgs = { - updates: Array<Conversations_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_MediasArgs = { - _set?: InputMaybe<Message_Medias_Set_Input>; - where: Message_Medias_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_Medias_By_PkArgs = { - _set?: InputMaybe<Message_Medias_Set_Input>; - pk_columns: Message_Medias_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Message_Medias_ManyArgs = { - updates: Array<Message_Medias_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_MessagesArgs = { - _append?: InputMaybe<Messages_Append_Input>; - _delete_at_path?: InputMaybe<Messages_Delete_At_Path_Input>; - _delete_elem?: InputMaybe<Messages_Delete_Elem_Input>; - _delete_key?: InputMaybe<Messages_Delete_Key_Input>; - _prepend?: InputMaybe<Messages_Prepend_Input>; - _set?: InputMaybe<Messages_Set_Input>; - where: Messages_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Messages_By_PkArgs = { - _append?: InputMaybe<Messages_Append_Input>; - _delete_at_path?: InputMaybe<Messages_Delete_At_Path_Input>; - _delete_elem?: InputMaybe<Messages_Delete_Elem_Input>; - _delete_key?: InputMaybe<Messages_Delete_Key_Input>; - _prepend?: InputMaybe<Messages_Prepend_Input>; - _set?: InputMaybe<Messages_Set_Input>; - pk_columns: Messages_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Messages_ManyArgs = { - updates: Array<Messages_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_PromptsArgs = { - _set?: InputMaybe<Product_Prompts_Set_Input>; - where: Product_Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_Prompts_By_PkArgs = { - _set?: InputMaybe<Product_Prompts_Set_Input>; - pk_columns: Product_Prompts_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Product_Prompts_ManyArgs = { - updates: Array<Product_Prompts_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_ProductsArgs = { - _append?: InputMaybe<Products_Append_Input>; - _delete_at_path?: InputMaybe<Products_Delete_At_Path_Input>; - _delete_elem?: InputMaybe<Products_Delete_Elem_Input>; - _delete_key?: InputMaybe<Products_Delete_Key_Input>; - _prepend?: InputMaybe<Products_Prepend_Input>; - _set?: InputMaybe<Products_Set_Input>; - where: Products_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Products_By_PkArgs = { - _append?: InputMaybe<Products_Append_Input>; - _delete_at_path?: InputMaybe<Products_Delete_At_Path_Input>; - _delete_elem?: InputMaybe<Products_Delete_Elem_Input>; - _delete_key?: InputMaybe<Products_Delete_Key_Input>; - _prepend?: InputMaybe<Products_Prepend_Input>; - _set?: InputMaybe<Products_Set_Input>; - pk_columns: Products_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Products_ManyArgs = { - updates: Array<Products_Updates>; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_PromptsArgs = { - _set?: InputMaybe<Prompts_Set_Input>; - where: Prompts_Bool_Exp; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Prompts_By_PkArgs = { - _set?: InputMaybe<Prompts_Set_Input>; - pk_columns: Prompts_Pk_Columns_Input; -}; - - -/** mutation root */ -export type Mutation_RootUpdate_Prompts_ManyArgs = { - updates: Array<Prompts_Updates>; -}; - -/** column ordering options */ -export enum Order_By { - /** in ascending order, nulls last */ - Asc = 'asc', - /** in ascending order, nulls first */ - AscNullsFirst = 'asc_nulls_first', - /** in ascending order, nulls last */ - AscNullsLast = 'asc_nulls_last', - /** in descending order, nulls first */ - Desc = 'desc', - /** in descending order, nulls first */ - DescNullsFirst = 'desc_nulls_first', - /** in descending order, nulls last */ - DescNullsLast = 'desc_nulls_last' -} - -/** columns and relationships of "product_prompts" */ -export type Product_Prompts = { - __typename?: 'product_prompts'; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - product_id: Scalars['uuid']['output']; - /** An array relationship */ - products: Array<Products>; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - prompt_id: Scalars['uuid']['output']; - /** An array relationship */ - prompts: Array<Prompts>; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsProductsArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsProducts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsPromptsArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - - -/** columns and relationships of "product_prompts" */ -export type Product_PromptsPrompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - -/** aggregated selection of "product_prompts" */ -export type Product_Prompts_Aggregate = { - __typename?: 'product_prompts_aggregate'; - aggregate?: Maybe<Product_Prompts_Aggregate_Fields>; - nodes: Array<Product_Prompts>; -}; - -export type Product_Prompts_Aggregate_Bool_Exp = { - count?: InputMaybe<Product_Prompts_Aggregate_Bool_Exp_Count>; -}; - -export type Product_Prompts_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Product_Prompts_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Product_Prompts_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "product_prompts" */ -export type Product_Prompts_Aggregate_Fields = { - __typename?: 'product_prompts_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Product_Prompts_Max_Fields>; - min?: Maybe<Product_Prompts_Min_Fields>; -}; - - -/** aggregate fields of "product_prompts" */ -export type Product_Prompts_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Product_Prompts_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "product_prompts" */ -export type Product_Prompts_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Product_Prompts_Max_Order_By>; - min?: InputMaybe<Product_Prompts_Min_Order_By>; -}; - -/** input type for inserting array relation for remote table "product_prompts" */ -export type Product_Prompts_Arr_Rel_Insert_Input = { - data: Array<Product_Prompts_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Product_Prompts_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "product_prompts". All fields are combined with a logical 'AND'. */ -export type Product_Prompts_Bool_Exp = { - _and?: InputMaybe<Array<Product_Prompts_Bool_Exp>>; - _not?: InputMaybe<Product_Prompts_Bool_Exp>; - _or?: InputMaybe<Array<Product_Prompts_Bool_Exp>>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - product_id?: InputMaybe<Uuid_Comparison_Exp>; - products?: InputMaybe<Products_Bool_Exp>; - products_aggregate?: InputMaybe<Products_Aggregate_Bool_Exp>; - prompt_id?: InputMaybe<Uuid_Comparison_Exp>; - prompts?: InputMaybe<Prompts_Bool_Exp>; - prompts_aggregate?: InputMaybe<Prompts_Aggregate_Bool_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "product_prompts" */ -export enum Product_Prompts_Constraint { - /** unique or primary key constraint on columns "id" */ - ProductPromptsPkey = 'product_prompts_pkey', - /** unique or primary key constraint on columns "product_id", "prompt_id" */ - ProductPromptsProductIdPromptIdKey = 'product_prompts_product_id_prompt_id_key' -} - -/** input type for inserting data into table "product_prompts" */ -export type Product_Prompts_Insert_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - products?: InputMaybe<Products_Arr_Rel_Insert_Input>; - prompt_id?: InputMaybe<Scalars['uuid']['input']>; - prompts?: InputMaybe<Prompts_Arr_Rel_Insert_Input>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Product_Prompts_Max_Fields = { - __typename?: 'product_prompts_max_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - prompt_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "product_prompts" */ -export type Product_Prompts_Max_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - prompt_id?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Product_Prompts_Min_Fields = { - __typename?: 'product_prompts_min_fields'; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - product_id?: Maybe<Scalars['uuid']['output']>; - prompt_id?: Maybe<Scalars['uuid']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "product_prompts" */ -export type Product_Prompts_Min_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - prompt_id?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "product_prompts" */ -export type Product_Prompts_Mutation_Response = { - __typename?: 'product_prompts_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Product_Prompts>; -}; - -/** on_conflict condition type for table "product_prompts" */ -export type Product_Prompts_On_Conflict = { - constraint: Product_Prompts_Constraint; - update_columns?: Array<Product_Prompts_Update_Column>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - -/** Ordering options when selecting data from "product_prompts". */ -export type Product_Prompts_Order_By = { - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - product_id?: InputMaybe<Order_By>; - products_aggregate?: InputMaybe<Products_Aggregate_Order_By>; - prompt_id?: InputMaybe<Order_By>; - prompts_aggregate?: InputMaybe<Prompts_Aggregate_Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: product_prompts */ -export type Product_Prompts_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "product_prompts" */ -export enum Product_Prompts_Select_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - PromptId = 'prompt_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "product_prompts" */ -export type Product_Prompts_Set_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - prompt_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "product_prompts" */ -export type Product_Prompts_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Product_Prompts_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Product_Prompts_Stream_Cursor_Value_Input = { - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - product_id?: InputMaybe<Scalars['uuid']['input']>; - prompt_id?: InputMaybe<Scalars['uuid']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "product_prompts" */ -export enum Product_Prompts_Update_Column { - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ProductId = 'product_id', - /** column name */ - PromptId = 'prompt_id', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Product_Prompts_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Product_Prompts_Set_Input>; - /** filter the rows which have to be updated */ - where: Product_Prompts_Bool_Exp; -}; - -/** columns and relationships of "products" */ -export type Products = { - __typename?: 'products'; - author?: Maybe<Scalars['String']['output']>; - created_at: Scalars['timestamptz']['output']; - description?: Maybe<Scalars['String']['output']>; - greeting?: Maybe<Scalars['String']['output']>; - id: Scalars['uuid']['output']; - image_url?: Maybe<Scalars['String']['output']>; - inputs?: Maybe<Scalars['jsonb']['output']>; - long_description?: Maybe<Scalars['String']['output']>; - name: Scalars['String']['output']; - nsfw: Scalars['Boolean']['output']; - outputs?: Maybe<Scalars['jsonb']['output']>; - /** An array relationship */ - product_collections: Array<Collection_Products>; - /** An aggregate relationship */ - product_collections_aggregate: Collection_Products_Aggregate; - /** An array relationship */ - product_prompts: Array<Product_Prompts>; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - slug: Scalars['String']['output']; - source_url?: Maybe<Scalars['String']['output']>; - technical_description?: Maybe<Scalars['String']['output']>; - updated_at: Scalars['timestamptz']['output']; - version?: Maybe<Scalars['String']['output']>; -}; - - -/** columns and relationships of "products" */ -export type ProductsInputsArgs = { - path?: InputMaybe<Scalars['String']['input']>; -}; - - -/** columns and relationships of "products" */ -export type ProductsOutputsArgs = { - path?: InputMaybe<Scalars['String']['input']>; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_CollectionsArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_Collections_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_PromptsArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -/** columns and relationships of "products" */ -export type ProductsProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - -/** aggregated selection of "products" */ -export type Products_Aggregate = { - __typename?: 'products_aggregate'; - aggregate?: Maybe<Products_Aggregate_Fields>; - nodes: Array<Products>; -}; - -export type Products_Aggregate_Bool_Exp = { - bool_and?: InputMaybe<Products_Aggregate_Bool_Exp_Bool_And>; - bool_or?: InputMaybe<Products_Aggregate_Bool_Exp_Bool_Or>; - count?: InputMaybe<Products_Aggregate_Bool_Exp_Count>; -}; - -export type Products_Aggregate_Bool_Exp_Bool_And = { - arguments: Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_And_Arguments_Columns; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Products_Bool_Exp>; - predicate: Boolean_Comparison_Exp; -}; - -export type Products_Aggregate_Bool_Exp_Bool_Or = { - arguments: Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Products_Bool_Exp>; - predicate: Boolean_Comparison_Exp; -}; - -export type Products_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Products_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Products_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "products" */ -export type Products_Aggregate_Fields = { - __typename?: 'products_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Products_Max_Fields>; - min?: Maybe<Products_Min_Fields>; -}; - - -/** aggregate fields of "products" */ -export type Products_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Products_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "products" */ -export type Products_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Products_Max_Order_By>; - min?: InputMaybe<Products_Min_Order_By>; -}; - -/** append existing jsonb value of filtered columns with new jsonb value */ -export type Products_Append_Input = { - inputs?: InputMaybe<Scalars['jsonb']['input']>; - outputs?: InputMaybe<Scalars['jsonb']['input']>; -}; - -/** input type for inserting array relation for remote table "products" */ -export type Products_Arr_Rel_Insert_Input = { - data: Array<Products_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Products_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "products". All fields are combined with a logical 'AND'. */ -export type Products_Bool_Exp = { - _and?: InputMaybe<Array<Products_Bool_Exp>>; - _not?: InputMaybe<Products_Bool_Exp>; - _or?: InputMaybe<Array<Products_Bool_Exp>>; - author?: InputMaybe<String_Comparison_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - description?: InputMaybe<String_Comparison_Exp>; - greeting?: InputMaybe<String_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - image_url?: InputMaybe<String_Comparison_Exp>; - inputs?: InputMaybe<Jsonb_Comparison_Exp>; - long_description?: InputMaybe<String_Comparison_Exp>; - name?: InputMaybe<String_Comparison_Exp>; - nsfw?: InputMaybe<Boolean_Comparison_Exp>; - outputs?: InputMaybe<Jsonb_Comparison_Exp>; - product_collections?: InputMaybe<Collection_Products_Bool_Exp>; - product_collections_aggregate?: InputMaybe<Collection_Products_Aggregate_Bool_Exp>; - product_prompts?: InputMaybe<Product_Prompts_Bool_Exp>; - product_prompts_aggregate?: InputMaybe<Product_Prompts_Aggregate_Bool_Exp>; - slug?: InputMaybe<String_Comparison_Exp>; - source_url?: InputMaybe<String_Comparison_Exp>; - technical_description?: InputMaybe<String_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; - version?: InputMaybe<String_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "products" */ -export enum Products_Constraint { - /** unique or primary key constraint on columns "id" */ - ProductsPkey = 'products_pkey', - /** unique or primary key constraint on columns "slug" */ - ProductsSlugKey = 'products_slug_key' -} - -/** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ -export type Products_Delete_At_Path_Input = { - inputs?: InputMaybe<Array<Scalars['String']['input']>>; - outputs?: InputMaybe<Array<Scalars['String']['input']>>; -}; - -/** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ -export type Products_Delete_Elem_Input = { - inputs?: InputMaybe<Scalars['Int']['input']>; - outputs?: InputMaybe<Scalars['Int']['input']>; -}; - -/** delete key/value pair or string element. key/value pairs are matched based on their key value */ -export type Products_Delete_Key_Input = { - inputs?: InputMaybe<Scalars['String']['input']>; - outputs?: InputMaybe<Scalars['String']['input']>; -}; - -/** input type for inserting data into table "products" */ -export type Products_Insert_Input = { - author?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - greeting?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - inputs?: InputMaybe<Scalars['jsonb']['input']>; - long_description?: InputMaybe<Scalars['String']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - nsfw?: InputMaybe<Scalars['Boolean']['input']>; - outputs?: InputMaybe<Scalars['jsonb']['input']>; - product_collections?: InputMaybe<Collection_Products_Arr_Rel_Insert_Input>; - product_prompts?: InputMaybe<Product_Prompts_Arr_Rel_Insert_Input>; - slug?: InputMaybe<Scalars['String']['input']>; - source_url?: InputMaybe<Scalars['String']['input']>; - technical_description?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - version?: InputMaybe<Scalars['String']['input']>; -}; - -/** aggregate max on columns */ -export type Products_Max_Fields = { - __typename?: 'products_max_fields'; - author?: Maybe<Scalars['String']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - description?: Maybe<Scalars['String']['output']>; - greeting?: Maybe<Scalars['String']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - image_url?: Maybe<Scalars['String']['output']>; - long_description?: Maybe<Scalars['String']['output']>; - name?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - source_url?: Maybe<Scalars['String']['output']>; - technical_description?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; - version?: Maybe<Scalars['String']['output']>; -}; - -/** order by max() on columns of table "products" */ -export type Products_Max_Order_By = { - author?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - greeting?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - long_description?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - source_url?: InputMaybe<Order_By>; - technical_description?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; - version?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Products_Min_Fields = { - __typename?: 'products_min_fields'; - author?: Maybe<Scalars['String']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - description?: Maybe<Scalars['String']['output']>; - greeting?: Maybe<Scalars['String']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - image_url?: Maybe<Scalars['String']['output']>; - long_description?: Maybe<Scalars['String']['output']>; - name?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - source_url?: Maybe<Scalars['String']['output']>; - technical_description?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; - version?: Maybe<Scalars['String']['output']>; -}; - -/** order by min() on columns of table "products" */ -export type Products_Min_Order_By = { - author?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - greeting?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - long_description?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - source_url?: InputMaybe<Order_By>; - technical_description?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; - version?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "products" */ -export type Products_Mutation_Response = { - __typename?: 'products_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Products>; -}; - -/** input type for inserting object relation for remote table "products" */ -export type Products_Obj_Rel_Insert_Input = { - data: Products_Insert_Input; - /** upsert condition */ - on_conflict?: InputMaybe<Products_On_Conflict>; -}; - -/** on_conflict condition type for table "products" */ -export type Products_On_Conflict = { - constraint: Products_Constraint; - update_columns?: Array<Products_Update_Column>; - where?: InputMaybe<Products_Bool_Exp>; -}; - -/** Ordering options when selecting data from "products". */ -export type Products_Order_By = { - author?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - description?: InputMaybe<Order_By>; - greeting?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - inputs?: InputMaybe<Order_By>; - long_description?: InputMaybe<Order_By>; - name?: InputMaybe<Order_By>; - nsfw?: InputMaybe<Order_By>; - outputs?: InputMaybe<Order_By>; - product_collections_aggregate?: InputMaybe<Collection_Products_Aggregate_Order_By>; - product_prompts_aggregate?: InputMaybe<Product_Prompts_Aggregate_Order_By>; - slug?: InputMaybe<Order_By>; - source_url?: InputMaybe<Order_By>; - technical_description?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; - version?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: products */ -export type Products_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** prepend existing jsonb value of filtered columns with new jsonb value */ -export type Products_Prepend_Input = { - inputs?: InputMaybe<Scalars['jsonb']['input']>; - outputs?: InputMaybe<Scalars['jsonb']['input']>; -}; - -/** select columns of table "products" */ -export enum Products_Select_Column { - /** column name */ - Author = 'author', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Greeting = 'greeting', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Inputs = 'inputs', - /** column name */ - LongDescription = 'long_description', - /** column name */ - Name = 'name', - /** column name */ - Nsfw = 'nsfw', - /** column name */ - Outputs = 'outputs', - /** column name */ - Slug = 'slug', - /** column name */ - SourceUrl = 'source_url', - /** column name */ - TechnicalDescription = 'technical_description', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - Version = 'version' -} - -/** select "products_aggregate_bool_exp_bool_and_arguments_columns" columns of table "products" */ -export enum Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_And_Arguments_Columns { - /** column name */ - Nsfw = 'nsfw' -} - -/** select "products_aggregate_bool_exp_bool_or_arguments_columns" columns of table "products" */ -export enum Products_Select_Column_Products_Aggregate_Bool_Exp_Bool_Or_Arguments_Columns { - /** column name */ - Nsfw = 'nsfw' -} - -/** input type for updating data in table "products" */ -export type Products_Set_Input = { - author?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - greeting?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - inputs?: InputMaybe<Scalars['jsonb']['input']>; - long_description?: InputMaybe<Scalars['String']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - nsfw?: InputMaybe<Scalars['Boolean']['input']>; - outputs?: InputMaybe<Scalars['jsonb']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - source_url?: InputMaybe<Scalars['String']['input']>; - technical_description?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - version?: InputMaybe<Scalars['String']['input']>; -}; - -/** Streaming cursor of the table "products" */ -export type Products_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Products_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Products_Stream_Cursor_Value_Input = { - author?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - description?: InputMaybe<Scalars['String']['input']>; - greeting?: InputMaybe<Scalars['String']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - inputs?: InputMaybe<Scalars['jsonb']['input']>; - long_description?: InputMaybe<Scalars['String']['input']>; - name?: InputMaybe<Scalars['String']['input']>; - nsfw?: InputMaybe<Scalars['Boolean']['input']>; - outputs?: InputMaybe<Scalars['jsonb']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - source_url?: InputMaybe<Scalars['String']['input']>; - technical_description?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; - version?: InputMaybe<Scalars['String']['input']>; -}; - -/** update columns of table "products" */ -export enum Products_Update_Column { - /** column name */ - Author = 'author', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Description = 'description', - /** column name */ - Greeting = 'greeting', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Inputs = 'inputs', - /** column name */ - LongDescription = 'long_description', - /** column name */ - Name = 'name', - /** column name */ - Nsfw = 'nsfw', - /** column name */ - Outputs = 'outputs', - /** column name */ - Slug = 'slug', - /** column name */ - SourceUrl = 'source_url', - /** column name */ - TechnicalDescription = 'technical_description', - /** column name */ - UpdatedAt = 'updated_at', - /** column name */ - Version = 'version' -} - -export type Products_Updates = { - /** append existing jsonb value of filtered columns with new jsonb value */ - _append?: InputMaybe<Products_Append_Input>; - /** delete the field or element with specified path (for JSON arrays, negative integers count from the end) */ - _delete_at_path?: InputMaybe<Products_Delete_At_Path_Input>; - /** delete the array element with specified index (negative integers count from the end). throws an error if top level container is not an array */ - _delete_elem?: InputMaybe<Products_Delete_Elem_Input>; - /** delete key/value pair or string element. key/value pairs are matched based on their key value */ - _delete_key?: InputMaybe<Products_Delete_Key_Input>; - /** prepend existing jsonb value of filtered columns with new jsonb value */ - _prepend?: InputMaybe<Products_Prepend_Input>; - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Products_Set_Input>; - /** filter the rows which have to be updated */ - where: Products_Bool_Exp; -}; - -/** columns and relationships of "prompts" */ -export type Prompts = { - __typename?: 'prompts'; - content?: Maybe<Scalars['String']['output']>; - created_at: Scalars['timestamptz']['output']; - id: Scalars['uuid']['output']; - image_url?: Maybe<Scalars['String']['output']>; - /** An array relationship */ - prompt_products: Array<Product_Prompts>; - /** An aggregate relationship */ - prompt_products_aggregate: Product_Prompts_Aggregate; - slug: Scalars['String']['output']; - updated_at: Scalars['timestamptz']['output']; -}; - - -/** columns and relationships of "prompts" */ -export type PromptsPrompt_ProductsArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -/** columns and relationships of "prompts" */ -export type PromptsPrompt_Products_AggregateArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - -/** aggregated selection of "prompts" */ -export type Prompts_Aggregate = { - __typename?: 'prompts_aggregate'; - aggregate?: Maybe<Prompts_Aggregate_Fields>; - nodes: Array<Prompts>; -}; - -export type Prompts_Aggregate_Bool_Exp = { - count?: InputMaybe<Prompts_Aggregate_Bool_Exp_Count>; -}; - -export type Prompts_Aggregate_Bool_Exp_Count = { - arguments?: InputMaybe<Array<Prompts_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; - filter?: InputMaybe<Prompts_Bool_Exp>; - predicate: Int_Comparison_Exp; -}; - -/** aggregate fields of "prompts" */ -export type Prompts_Aggregate_Fields = { - __typename?: 'prompts_aggregate_fields'; - count: Scalars['Int']['output']; - max?: Maybe<Prompts_Max_Fields>; - min?: Maybe<Prompts_Min_Fields>; -}; - - -/** aggregate fields of "prompts" */ -export type Prompts_Aggregate_FieldsCountArgs = { - columns?: InputMaybe<Array<Prompts_Select_Column>>; - distinct?: InputMaybe<Scalars['Boolean']['input']>; -}; - -/** order by aggregate values of table "prompts" */ -export type Prompts_Aggregate_Order_By = { - count?: InputMaybe<Order_By>; - max?: InputMaybe<Prompts_Max_Order_By>; - min?: InputMaybe<Prompts_Min_Order_By>; -}; - -/** input type for inserting array relation for remote table "prompts" */ -export type Prompts_Arr_Rel_Insert_Input = { - data: Array<Prompts_Insert_Input>; - /** upsert condition */ - on_conflict?: InputMaybe<Prompts_On_Conflict>; -}; - -/** Boolean expression to filter rows from the table "prompts". All fields are combined with a logical 'AND'. */ -export type Prompts_Bool_Exp = { - _and?: InputMaybe<Array<Prompts_Bool_Exp>>; - _not?: InputMaybe<Prompts_Bool_Exp>; - _or?: InputMaybe<Array<Prompts_Bool_Exp>>; - content?: InputMaybe<String_Comparison_Exp>; - created_at?: InputMaybe<Timestamptz_Comparison_Exp>; - id?: InputMaybe<Uuid_Comparison_Exp>; - image_url?: InputMaybe<String_Comparison_Exp>; - prompt_products?: InputMaybe<Product_Prompts_Bool_Exp>; - prompt_products_aggregate?: InputMaybe<Product_Prompts_Aggregate_Bool_Exp>; - slug?: InputMaybe<String_Comparison_Exp>; - updated_at?: InputMaybe<Timestamptz_Comparison_Exp>; -}; - -/** unique or primary key constraints on table "prompts" */ -export enum Prompts_Constraint { - /** unique or primary key constraint on columns "id" */ - PromptsPkey = 'prompts_pkey', - /** unique or primary key constraint on columns "slug" */ - PromptsSlugKey = 'prompts_slug_key' -} - -/** input type for inserting data into table "prompts" */ -export type Prompts_Insert_Input = { - content?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - prompt_products?: InputMaybe<Product_Prompts_Arr_Rel_Insert_Input>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** aggregate max on columns */ -export type Prompts_Max_Fields = { - __typename?: 'prompts_max_fields'; - content?: Maybe<Scalars['String']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - image_url?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by max() on columns of table "prompts" */ -export type Prompts_Max_Order_By = { - content?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** aggregate min on columns */ -export type Prompts_Min_Fields = { - __typename?: 'prompts_min_fields'; - content?: Maybe<Scalars['String']['output']>; - created_at?: Maybe<Scalars['timestamptz']['output']>; - id?: Maybe<Scalars['uuid']['output']>; - image_url?: Maybe<Scalars['String']['output']>; - slug?: Maybe<Scalars['String']['output']>; - updated_at?: Maybe<Scalars['timestamptz']['output']>; -}; - -/** order by min() on columns of table "prompts" */ -export type Prompts_Min_Order_By = { - content?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** response of any mutation on the table "prompts" */ -export type Prompts_Mutation_Response = { - __typename?: 'prompts_mutation_response'; - /** number of rows affected by the mutation */ - affected_rows: Scalars['Int']['output']; - /** data from the rows affected by the mutation */ - returning: Array<Prompts>; -}; - -/** on_conflict condition type for table "prompts" */ -export type Prompts_On_Conflict = { - constraint: Prompts_Constraint; - update_columns?: Array<Prompts_Update_Column>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - -/** Ordering options when selecting data from "prompts". */ -export type Prompts_Order_By = { - content?: InputMaybe<Order_By>; - created_at?: InputMaybe<Order_By>; - id?: InputMaybe<Order_By>; - image_url?: InputMaybe<Order_By>; - prompt_products_aggregate?: InputMaybe<Product_Prompts_Aggregate_Order_By>; - slug?: InputMaybe<Order_By>; - updated_at?: InputMaybe<Order_By>; -}; - -/** primary key columns input for table: prompts */ -export type Prompts_Pk_Columns_Input = { - id: Scalars['uuid']['input']; -}; - -/** select columns of table "prompts" */ -export enum Prompts_Select_Column { - /** column name */ - Content = 'content', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -/** input type for updating data in table "prompts" */ -export type Prompts_Set_Input = { - content?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** Streaming cursor of the table "prompts" */ -export type Prompts_Stream_Cursor_Input = { - /** Stream column input with initial value */ - initial_value: Prompts_Stream_Cursor_Value_Input; - /** cursor ordering */ - ordering?: InputMaybe<Cursor_Ordering>; -}; - -/** Initial value of the column from where the streaming should start */ -export type Prompts_Stream_Cursor_Value_Input = { - content?: InputMaybe<Scalars['String']['input']>; - created_at?: InputMaybe<Scalars['timestamptz']['input']>; - id?: InputMaybe<Scalars['uuid']['input']>; - image_url?: InputMaybe<Scalars['String']['input']>; - slug?: InputMaybe<Scalars['String']['input']>; - updated_at?: InputMaybe<Scalars['timestamptz']['input']>; -}; - -/** update columns of table "prompts" */ -export enum Prompts_Update_Column { - /** column name */ - Content = 'content', - /** column name */ - CreatedAt = 'created_at', - /** column name */ - Id = 'id', - /** column name */ - ImageUrl = 'image_url', - /** column name */ - Slug = 'slug', - /** column name */ - UpdatedAt = 'updated_at' -} - -export type Prompts_Updates = { - /** sets the columns of the filtered rows to the given values */ - _set?: InputMaybe<Prompts_Set_Input>; - /** filter the rows which have to be updated */ - where: Prompts_Bool_Exp; -}; - -export type Query_Root = { - __typename?: 'query_root'; - /** An array relationship */ - collection_products: Array<Collection_Products>; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - /** fetch data from the table: "collection_products" using primary key columns */ - collection_products_by_pk?: Maybe<Collection_Products>; - /** An array relationship */ - collections: Array<Collections>; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - /** fetch data from the table: "collections" using primary key columns */ - collections_by_pk?: Maybe<Collections>; - /** fetch data from the table: "conversations" */ - conversations: Array<Conversations>; - /** fetch aggregated fields from the table: "conversations" */ - conversations_aggregate: Conversations_Aggregate; - /** fetch data from the table: "conversations" using primary key columns */ - conversations_by_pk?: Maybe<Conversations>; - /** An array relationship */ - message_medias: Array<Message_Medias>; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - /** fetch data from the table: "message_medias" using primary key columns */ - message_medias_by_pk?: Maybe<Message_Medias>; - /** fetch data from the table: "messages" */ - messages: Array<Messages>; - /** fetch aggregated fields from the table: "messages" */ - messages_aggregate: Messages_Aggregate; - /** fetch data from the table: "messages" using primary key columns */ - messages_by_pk?: Maybe<Messages>; - /** An array relationship */ - product_prompts: Array<Product_Prompts>; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - /** fetch data from the table: "product_prompts" using primary key columns */ - product_prompts_by_pk?: Maybe<Product_Prompts>; - /** An array relationship */ - products: Array<Products>; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - /** fetch data from the table: "products" using primary key columns */ - products_by_pk?: Maybe<Products>; - /** An array relationship */ - prompts: Array<Prompts>; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - /** fetch data from the table: "prompts" using primary key columns */ - prompts_by_pk?: Maybe<Prompts>; -}; - - -export type Query_RootCollection_ProductsArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -export type Query_RootCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -export type Query_RootCollection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootCollectionsArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -export type Query_RootCollections_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -export type Query_RootCollections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootConversationsArgs = { - distinct_on?: InputMaybe<Array<Conversations_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Conversations_Order_By>>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - - -export type Query_RootConversations_AggregateArgs = { - distinct_on?: InputMaybe<Array<Conversations_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Conversations_Order_By>>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - - -export type Query_RootConversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootMessage_MediasArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -export type Query_RootMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -export type Query_RootMessage_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootMessagesArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -export type Query_RootMessages_AggregateArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -export type Query_RootMessages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootProduct_PromptsArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -export type Query_RootProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -export type Query_RootProduct_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootProductsArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -export type Query_RootProducts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -export type Query_RootProducts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Query_RootPromptsArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - - -export type Query_RootPrompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - - -export type Query_RootPrompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - -export type Subscription_Root = { - __typename?: 'subscription_root'; - /** An array relationship */ - collection_products: Array<Collection_Products>; - /** An aggregate relationship */ - collection_products_aggregate: Collection_Products_Aggregate; - /** fetch data from the table: "collection_products" using primary key columns */ - collection_products_by_pk?: Maybe<Collection_Products>; - /** fetch data from the table in a streaming manner: "collection_products" */ - collection_products_stream: Array<Collection_Products>; - /** An array relationship */ - collections: Array<Collections>; - /** An aggregate relationship */ - collections_aggregate: Collections_Aggregate; - /** fetch data from the table: "collections" using primary key columns */ - collections_by_pk?: Maybe<Collections>; - /** fetch data from the table in a streaming manner: "collections" */ - collections_stream: Array<Collections>; - /** fetch data from the table: "conversations" */ - conversations: Array<Conversations>; - /** fetch aggregated fields from the table: "conversations" */ - conversations_aggregate: Conversations_Aggregate; - /** fetch data from the table: "conversations" using primary key columns */ - conversations_by_pk?: Maybe<Conversations>; - /** fetch data from the table in a streaming manner: "conversations" */ - conversations_stream: Array<Conversations>; - /** An array relationship */ - message_medias: Array<Message_Medias>; - /** An aggregate relationship */ - message_medias_aggregate: Message_Medias_Aggregate; - /** fetch data from the table: "message_medias" using primary key columns */ - message_medias_by_pk?: Maybe<Message_Medias>; - /** fetch data from the table in a streaming manner: "message_medias" */ - message_medias_stream: Array<Message_Medias>; - /** fetch data from the table: "messages" */ - messages: Array<Messages>; - /** fetch aggregated fields from the table: "messages" */ - messages_aggregate: Messages_Aggregate; - /** fetch data from the table: "messages" using primary key columns */ - messages_by_pk?: Maybe<Messages>; - /** fetch data from the table in a streaming manner: "messages" */ - messages_stream: Array<Messages>; - /** An array relationship */ - product_prompts: Array<Product_Prompts>; - /** An aggregate relationship */ - product_prompts_aggregate: Product_Prompts_Aggregate; - /** fetch data from the table: "product_prompts" using primary key columns */ - product_prompts_by_pk?: Maybe<Product_Prompts>; - /** fetch data from the table in a streaming manner: "product_prompts" */ - product_prompts_stream: Array<Product_Prompts>; - /** An array relationship */ - products: Array<Products>; - /** An aggregate relationship */ - products_aggregate: Products_Aggregate; - /** fetch data from the table: "products" using primary key columns */ - products_by_pk?: Maybe<Products>; - /** fetch data from the table in a streaming manner: "products" */ - products_stream: Array<Products>; - /** An array relationship */ - prompts: Array<Prompts>; - /** An aggregate relationship */ - prompts_aggregate: Prompts_Aggregate; - /** fetch data from the table: "prompts" using primary key columns */ - prompts_by_pk?: Maybe<Prompts>; - /** fetch data from the table in a streaming manner: "prompts" */ - prompts_stream: Array<Prompts>; -}; - - -export type Subscription_RootCollection_ProductsArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -export type Subscription_RootCollection_Products_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collection_Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collection_Products_Order_By>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -export type Subscription_RootCollection_Products_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootCollection_Products_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Collection_Products_Stream_Cursor_Input>>; - where?: InputMaybe<Collection_Products_Bool_Exp>; -}; - - -export type Subscription_RootCollectionsArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -export type Subscription_RootCollections_AggregateArgs = { - distinct_on?: InputMaybe<Array<Collections_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Collections_Order_By>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -export type Subscription_RootCollections_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootCollections_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Collections_Stream_Cursor_Input>>; - where?: InputMaybe<Collections_Bool_Exp>; -}; - - -export type Subscription_RootConversationsArgs = { - distinct_on?: InputMaybe<Array<Conversations_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Conversations_Order_By>>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - - -export type Subscription_RootConversations_AggregateArgs = { - distinct_on?: InputMaybe<Array<Conversations_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Conversations_Order_By>>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - - -export type Subscription_RootConversations_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootConversations_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Conversations_Stream_Cursor_Input>>; - where?: InputMaybe<Conversations_Bool_Exp>; -}; - - -export type Subscription_RootMessage_MediasArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -export type Subscription_RootMessage_Medias_AggregateArgs = { - distinct_on?: InputMaybe<Array<Message_Medias_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Message_Medias_Order_By>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -export type Subscription_RootMessage_Medias_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootMessage_Medias_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Message_Medias_Stream_Cursor_Input>>; - where?: InputMaybe<Message_Medias_Bool_Exp>; -}; - - -export type Subscription_RootMessagesArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -export type Subscription_RootMessages_AggregateArgs = { - distinct_on?: InputMaybe<Array<Messages_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Messages_Order_By>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -export type Subscription_RootMessages_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootMessages_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Messages_Stream_Cursor_Input>>; - where?: InputMaybe<Messages_Bool_Exp>; -}; - - -export type Subscription_RootProduct_PromptsArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -export type Subscription_RootProduct_Prompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Product_Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Product_Prompts_Order_By>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -export type Subscription_RootProduct_Prompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootProduct_Prompts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Product_Prompts_Stream_Cursor_Input>>; - where?: InputMaybe<Product_Prompts_Bool_Exp>; -}; - - -export type Subscription_RootProductsArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -export type Subscription_RootProducts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Products_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Products_Order_By>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -export type Subscription_RootProducts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootProducts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Products_Stream_Cursor_Input>>; - where?: InputMaybe<Products_Bool_Exp>; -}; - - -export type Subscription_RootPromptsArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - - -export type Subscription_RootPrompts_AggregateArgs = { - distinct_on?: InputMaybe<Array<Prompts_Select_Column>>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; - order_by?: InputMaybe<Array<Prompts_Order_By>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - - -export type Subscription_RootPrompts_By_PkArgs = { - id: Scalars['uuid']['input']; -}; - - -export type Subscription_RootPrompts_StreamArgs = { - batch_size: Scalars['Int']['input']; - cursor: Array<InputMaybe<Prompts_Stream_Cursor_Input>>; - where?: InputMaybe<Prompts_Bool_Exp>; -}; - -/** Boolean expression to compare columns of type "timestamptz". All fields are combined with logical 'AND'. */ -export type Timestamptz_Comparison_Exp = { - _eq?: InputMaybe<Scalars['timestamptz']['input']>; - _gt?: InputMaybe<Scalars['timestamptz']['input']>; - _gte?: InputMaybe<Scalars['timestamptz']['input']>; - _in?: InputMaybe<Array<Scalars['timestamptz']['input']>>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - _lt?: InputMaybe<Scalars['timestamptz']['input']>; - _lte?: InputMaybe<Scalars['timestamptz']['input']>; - _neq?: InputMaybe<Scalars['timestamptz']['input']>; - _nin?: InputMaybe<Array<Scalars['timestamptz']['input']>>; -}; - -/** Boolean expression to compare columns of type "uuid". All fields are combined with logical 'AND'. */ -export type Uuid_Comparison_Exp = { - _eq?: InputMaybe<Scalars['uuid']['input']>; - _gt?: InputMaybe<Scalars['uuid']['input']>; - _gte?: InputMaybe<Scalars['uuid']['input']>; - _in?: InputMaybe<Array<Scalars['uuid']['input']>>; - _is_null?: InputMaybe<Scalars['Boolean']['input']>; - _lt?: InputMaybe<Scalars['uuid']['input']>; - _lte?: InputMaybe<Scalars['uuid']['input']>; - _neq?: InputMaybe<Scalars['uuid']['input']>; - _nin?: InputMaybe<Array<Scalars['uuid']['input']>>; -}; - -export type CollectionDetailFragment = { __typename?: 'collections', slug: string, name: string }; - -export type ConversationDetailFragment = { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null }; - -export type MessageMediaFragment = { __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }; - -export type MessageDetailFragment = { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }; - -export type ProductDetailFragment = { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any }; - -export type PromptDetailFragment = { __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }; - -export type CreateConversationMutationVariables = Exact<{ - data: Conversations_Insert_Input; -}>; - - -export type CreateConversationMutation = { __typename?: 'mutation_root', insert_conversations_one?: { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null } | null }; - -export type CreateMessageMutationVariables = Exact<{ - data: Messages_Insert_Input; -}>; - - -export type CreateMessageMutation = { __typename?: 'mutation_root', insert_messages_one?: { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> } | null }; - -export type DeleteConversationMutationVariables = Exact<{ - id: Scalars['uuid']['input']; -}>; - - -export type DeleteConversationMutation = { __typename?: 'mutation_root', delete_conversations_by_pk?: { __typename?: 'conversations', id: any } | null }; - -export type GenerateImageMutationVariables = Exact<{ - model?: InputMaybe<Scalars['String']['input']>; - neg_prompt?: InputMaybe<Scalars['String']['input']>; - prompt?: InputMaybe<Scalars['String']['input']>; - seed?: InputMaybe<Scalars['Int']['input']>; - steps?: InputMaybe<Scalars['Int']['input']>; - width?: InputMaybe<Scalars['Int']['input']>; - height?: InputMaybe<Scalars['Int']['input']>; -}>; - - -export type GenerateImageMutation = { __typename?: 'mutation_root', imageGeneration?: { __typename?: 'ImageGenerationOutput', url: string } | null }; - -export type UpdateConversationMutationVariables = Exact<{ - id: Scalars['uuid']['input']; - lastMessageText?: InputMaybe<Scalars['String']['input']>; - lastMessageUrl?: InputMaybe<Scalars['String']['input']>; -}>; - - -export type UpdateConversationMutation = { __typename?: 'mutation_root', update_conversations_by_pk?: { __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null } | null }; - -export type UpdateMessageMutationVariables = Exact<{ - id?: InputMaybe<Scalars['uuid']['input']>; - data: Messages_Set_Input; -}>; - - -export type UpdateMessageMutation = { __typename?: 'mutation_root', update_messages_by_pk?: { __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> } | null }; - -export type GetCollectionsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetCollectionsQuery = { __typename?: 'query_root', collections: Array<{ __typename?: 'collections', slug: string, name: string, collection_products: Array<{ __typename?: 'collection_products', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }> }> }> }> }; - -export type GetConversationMessagesQueryVariables = Exact<{ - conversation_id?: InputMaybe<Scalars['uuid']['input']>; - limit?: InputMaybe<Scalars['Int']['input']>; - offset?: InputMaybe<Scalars['Int']['input']>; -}>; - - -export type GetConversationMessagesQuery = { __typename?: 'query_root', messages: Array<{ __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }> }; - -export type GetConversationsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetConversationsQuery = { __typename?: 'query_root', conversations: Array<{ __typename?: 'conversations', id: any, product_id: any, user_id: string, last_image_url?: string | null, last_text_message?: string | null, created_at: any, updated_at: any, conversation_messages: Array<{ __typename?: 'messages', id: any, conversation_id: any, sender: string, sender_name?: string | null, sender_avatar_url?: string | null, content?: string | null, message_type?: string | null, message_sender_type?: string | null, created_at: any, updated_at: any, status?: string | null, message_medias: Array<{ __typename?: 'message_medias', id: any, message_id: any, media_url?: string | null, mime_type?: string | null, updated_at: any }> }>, conversation_product?: { __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any } | null }> }; - -export type GetProductsByCollectionSlugQueryVariables = Exact<{ - slug?: InputMaybe<Scalars['String']['input']>; -}>; - - -export type GetProductsByCollectionSlugQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }>, product_collections: Array<{ __typename?: 'collection_products', collections: Array<{ __typename?: 'collections', slug: string, name: string }> }> }> }; - -export type GetProductPromptsQueryVariables = Exact<{ - productSlug?: InputMaybe<Scalars['String']['input']>; -}>; - - -export type GetProductPromptsQuery = { __typename?: 'query_root', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }; - -export type GetProductsQueryVariables = Exact<{ [key: string]: never; }>; - - -export type GetProductsQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any, product_prompts: Array<{ __typename?: 'product_prompts', prompts: Array<{ __typename?: 'prompts', slug: string, content?: string | null, image_url?: string | null }> }>, product_collections: Array<{ __typename?: 'collection_products', collections: Array<{ __typename?: 'collections', slug: string, name: string }> }> }> }; - -export type GetProductsInQueryVariables = Exact<{ - _in?: InputMaybe<Array<Scalars['String']['input']> | Scalars['String']['input']>; -}>; - - -export type GetProductsInQuery = { __typename?: 'query_root', products: Array<{ __typename?: 'products', id: any, name: string, slug: string, description?: string | null, long_description?: string | null, technical_description?: string | null, image_url?: string | null, author?: string | null, greeting?: string | null, source_url?: string | null, version?: string | null, inputs?: any | null, outputs?: any | null, nsfw: boolean, created_at: any, updated_at: any }> }; - -export type SubscribeMessageSubscriptionVariables = Exact<{ - id?: InputMaybe<Scalars['uuid']['input']>; -}>; - - -export type SubscribeMessageSubscription = { __typename?: 'subscription_root', messages_by_pk?: { __typename?: 'messages', id: any, content?: string | null, status?: string | null } | null }; - -export const CollectionDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode<CollectionDetailFragment, unknown>; -export const ProductDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode<ProductDetailFragment, unknown>; -export const ConversationDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode<ConversationDetailFragment, unknown>; -export const MessageMediaFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode<MessageMediaFragment, unknown>; -export const MessageDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode<MessageDetailFragment, unknown>; -export const PromptDetailFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode<PromptDetailFragment, unknown>; -export const CreateConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"conversations_insert_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"insert_conversations_one"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"object"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}}]} as unknown as DocumentNode<CreateConversationMutation, CreateConversationMutationVariables>; -export const CreateMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"messages_insert_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"insert_messages_one"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"object"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode<CreateMessageMutation, CreateMessageMutationVariables>; -export const DeleteConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"deleteConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"delete_conversations_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode<DeleteConversationMutation, DeleteConversationMutationVariables>; -export const GenerateImageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"generateImage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"model"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"neg_prompt"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"prompt"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"seed"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"10"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"steps"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"10"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"width"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"512"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"height"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"512"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"imageGeneration"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"model"},"value":{"kind":"Variable","name":{"kind":"Name","value":"model"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"neg_prompt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"neg_prompt"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"prompt"},"value":{"kind":"Variable","name":{"kind":"Name","value":"prompt"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"seed"},"value":{"kind":"Variable","name":{"kind":"Name","value":"seed"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"steps"},"value":{"kind":"Variable","name":{"kind":"Name","value":"steps"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"width"},"value":{"kind":"Variable","name":{"kind":"Name","value":"width"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"height"},"value":{"kind":"Variable","name":{"kind":"Name","value":"height"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"url"}}]}}]}}]} as unknown as DocumentNode<GenerateImageMutation, GenerateImageMutationVariables>; -export const UpdateConversationDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"updateConversation"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageText"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageUrl"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"update_conversations_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pk_columns"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}},{"kind":"Argument","name":{"kind":"Name","value":"_set"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"last_text_message"},"value":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageText"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"last_image_url"},"value":{"kind":"Variable","name":{"kind":"Name","value":"lastMessageUrl"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}}]} as unknown as DocumentNode<UpdateConversationMutation, UpdateConversationMutationVariables>; -export const UpdateMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"updateMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"messages_set_input"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"update_messages_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pk_columns"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}]}},{"kind":"Argument","name":{"kind":"Name","value":"_set"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode<UpdateMessageMutation, UpdateMessageMutationVariables>; -export const GetCollectionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getCollections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}},{"kind":"Field","name":{"kind":"Name","value":"collection_products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode<GetCollectionsQuery, GetCollectionsQueryVariables>; -export const GetConversationMessagesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getConversationMessages"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"conversation_id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"limit"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"100"}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offset"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"Int"}},"defaultValue":{"kind":"IntValue","value":"100"}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"messages"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"offset"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offset"}}},{"kind":"Argument","name":{"kind":"Name","value":"limit"},"value":{"kind":"Variable","name":{"kind":"Name","value":"limit"}}},{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"conversation_id"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"conversation_id"}}}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"created_at"},"value":{"kind":"EnumValue","value":"desc"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode<GetConversationMessagesQuery, GetConversationMessagesQueryVariables>; -export const GetConversationsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getConversations"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"conversations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"order_by"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"updated_at"},"value":{"kind":"EnumValue","value":"desc"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ConversationDetail"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_messages"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageDetail"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageMedia"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"message_medias"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"message_id"}},{"kind":"Field","name":{"kind":"Name","value":"media_url"}},{"kind":"Field","name":{"kind":"Name","value":"mime_type"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ConversationDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"conversations"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"product_id"}},{"kind":"Field","name":{"kind":"Name","value":"user_id"}},{"kind":"Field","name":{"kind":"Name","value":"last_image_url"}},{"kind":"Field","name":{"kind":"Name","value":"last_text_message"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_product"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"MessageDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"messages"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"conversation_id"}},{"kind":"Field","name":{"kind":"Name","value":"sender"}},{"kind":"Field","name":{"kind":"Name","value":"sender_name"}},{"kind":"Field","name":{"kind":"Name","value":"sender_avatar_url"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"message_type"}},{"kind":"Field","name":{"kind":"Name","value":"message_sender_type"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"message_medias"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"MessageMedia"}}]}}]}}]} as unknown as DocumentNode<GetConversationsQuery, GetConversationsQueryVariables>; -export const GetProductsByCollectionSlugDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductsByCollectionSlug"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"slug"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"product_collections"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"collections"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"slug"}}}]}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"product_collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode<GetProductsByCollectionSlugQuery, GetProductsByCollectionSlugQueryVariables>; -export const GetProductPromptsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductPrompts"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"productSlug"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"prompt_products"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"products"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"productSlug"}}}]}}]}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}}]} as unknown as DocumentNode<GetProductPromptsQuery, GetProductPromptsQueryVariables>; -export const GetProductsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProducts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}},{"kind":"Field","name":{"kind":"Name","value":"product_prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"prompts"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"PromptDetail"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"product_collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"collections"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CollectionDetail"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"PromptDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"prompts"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CollectionDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"collections"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]} as unknown as DocumentNode<GetProductsQuery, GetProductsQueryVariables>; -export const GetProductsInDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"getProductsIn"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"_in"}},"type":{"kind":"ListType","type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"products"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"where"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"slug"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"_in"},"value":{"kind":"Variable","name":{"kind":"Name","value":"_in"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ProductDetail"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ProductDetail"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"products"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"long_description"}},{"kind":"Field","name":{"kind":"Name","value":"technical_description"}},{"kind":"Field","name":{"kind":"Name","value":"image_url"}},{"kind":"Field","name":{"kind":"Name","value":"author"}},{"kind":"Field","name":{"kind":"Name","value":"greeting"}},{"kind":"Field","name":{"kind":"Name","value":"source_url"}},{"kind":"Field","name":{"kind":"Name","value":"version"}},{"kind":"Field","name":{"kind":"Name","value":"inputs"}},{"kind":"Field","name":{"kind":"Name","value":"outputs"}},{"kind":"Field","name":{"kind":"Name","value":"nsfw"}},{"kind":"Field","name":{"kind":"Name","value":"created_at"}},{"kind":"Field","name":{"kind":"Name","value":"updated_at"}}]}}]} as unknown as DocumentNode<GetProductsInQuery, GetProductsInQueryVariables>; -export const SubscribeMessageDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"subscribeMessage"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"uuid"}},"defaultValue":{"kind":"StringValue","value":"","block":false}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"messages_by_pk"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"content"}},{"kind":"Field","name":{"kind":"Name","value":"status"}}]}}]}}]} as unknown as DocumentNode<SubscribeMessageSubscription, SubscribeMessageSubscriptionVariables>; \ No newline at end of file diff --git a/web-client/graphql/generated/index.ts b/web-client/graphql/generated/index.ts deleted file mode 100644 index af7839936..000000000 --- a/web-client/graphql/generated/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./gql"; \ No newline at end of file diff --git a/web-client/graphql/mutations/createConversation.graphql b/web-client/graphql/mutations/createConversation.graphql deleted file mode 100644 index ad8fef426..000000000 --- a/web-client/graphql/mutations/createConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation createConversation($data: conversations_insert_input!) { - insert_conversations_one(object: $data) { - ...ConversationDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/createMessage.graphql b/web-client/graphql/mutations/createMessage.graphql deleted file mode 100644 index 36578d9c6..000000000 --- a/web-client/graphql/mutations/createMessage.graphql +++ /dev/null @@ -1,9 +0,0 @@ -mutation createMessage( - $data: messages_insert_input! -) { - insert_messages_one( - object: $data - ) { - ...MessageDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/deleteConversation.graphql b/web-client/graphql/mutations/deleteConversation.graphql deleted file mode 100644 index 0e1f5d2c3..000000000 --- a/web-client/graphql/mutations/deleteConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation deleteConversation($id: uuid!) { - delete_conversations_by_pk(id: $id) { - id - } -} diff --git a/web-client/graphql/mutations/imageGeneration.graphql b/web-client/graphql/mutations/imageGeneration.graphql deleted file mode 100644 index fcda3070f..000000000 --- a/web-client/graphql/mutations/imageGeneration.graphql +++ /dev/null @@ -1,23 +0,0 @@ -mutation generateImage( - $model: String = "" - $neg_prompt: String = "" - $prompt: String = "" - $seed: Int = 10 - $steps: Int = 10 - $width: Int = 512 - $height: Int = 512 -) { - imageGeneration( - input: { - model: $model - neg_prompt: $neg_prompt - prompt: $prompt - seed: $seed - steps: $steps - width: $width - height: $height - } - ) { - url - } -} diff --git a/web-client/graphql/mutations/updateConversation.graphql b/web-client/graphql/mutations/updateConversation.graphql deleted file mode 100644 index 4e391c0a2..000000000 --- a/web-client/graphql/mutations/updateConversation.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation updateConversation($id: uuid!, $lastMessageText: String, $lastMessageUrl: String) { - update_conversations_by_pk(pk_columns: {id: $id}, _set: {last_text_message: $lastMessageText, last_image_url: $lastMessageUrl}) { - ...ConversationDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/mutations/updateMessage.graphql b/web-client/graphql/mutations/updateMessage.graphql deleted file mode 100644 index 886f9de5a..000000000 --- a/web-client/graphql/mutations/updateMessage.graphql +++ /dev/null @@ -1,5 +0,0 @@ -mutation updateMessage($id: uuid = "", $data: messages_set_input!) { - update_messages_by_pk(pk_columns: { id: $id }, _set: $data) { - ...MessageDetail - } -} diff --git a/web-client/graphql/queries/getCollections.graphql b/web-client/graphql/queries/getCollections.graphql deleted file mode 100644 index f5a3ed20f..000000000 --- a/web-client/graphql/queries/getCollections.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getCollections { - collections { - ...CollectionDetail - collection_products { - products { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getConversationMessages.graphql b/web-client/graphql/queries/getConversationMessages.graphql deleted file mode 100644 index 43f5c585e..000000000 --- a/web-client/graphql/queries/getConversationMessages.graphql +++ /dev/null @@ -1,14 +0,0 @@ -query getConversationMessages( - $conversation_id: uuid = "", - $limit: Int = 100, - $offset: Int = 100, -) { - messages( - offset: $offset, - limit: $limit, - where: { conversation_id: { _eq: $conversation_id } }, - order_by: {created_at: desc} - ) { - ...MessageDetail - } -} diff --git a/web-client/graphql/queries/getConversations.graphql b/web-client/graphql/queries/getConversations.graphql deleted file mode 100644 index bbadccd08..000000000 --- a/web-client/graphql/queries/getConversations.graphql +++ /dev/null @@ -1,11 +0,0 @@ -query getConversations { - conversations(order_by: {updated_at: desc}) { - ...ConversationDetail - conversation_messages { - ...MessageDetail - message_medias { - ...MessageMedia - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProductByCollectionSlug.graphql b/web-client/graphql/queries/getProductByCollectionSlug.graphql deleted file mode 100644 index 514d817c6..000000000 --- a/web-client/graphql/queries/getProductByCollectionSlug.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getProductsByCollectionSlug($slug: String = "") { - products(where: {product_collections: {collections: {slug: {_eq: $slug}}}}) { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - product_collections { - collections { - ...CollectionDetail - } - } - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProductPrompts.graphql b/web-client/graphql/queries/getProductPrompts.graphql deleted file mode 100644 index e307de8c4..000000000 --- a/web-client/graphql/queries/getProductPrompts.graphql +++ /dev/null @@ -1,5 +0,0 @@ -query getProductPrompts($productSlug: String = "") { - prompts(where: {prompt_products: {products: {slug: {_eq: $productSlug}}}}) { - ...PromptDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/queries/getProducts.graphql b/web-client/graphql/queries/getProducts.graphql deleted file mode 100644 index 0ac975360..000000000 --- a/web-client/graphql/queries/getProducts.graphql +++ /dev/null @@ -1,15 +0,0 @@ -query getProducts { - products { - ...ProductDetail - product_prompts { - prompts { - ...PromptDetail - } - } - product_collections { - collections { - ...CollectionDetail - } - } - } -} diff --git a/web-client/graphql/queries/getProductsIn.graphql b/web-client/graphql/queries/getProductsIn.graphql deleted file mode 100644 index d2d0d434a..000000000 --- a/web-client/graphql/queries/getProductsIn.graphql +++ /dev/null @@ -1,5 +0,0 @@ -query getProductsIn($_in: [String!] = "") { - products(where: {slug: {_in: $_in}}) { - ...ProductDetail - } -} \ No newline at end of file diff --git a/web-client/graphql/subscriptions/subscribeMessage.graphql b/web-client/graphql/subscriptions/subscribeMessage.graphql deleted file mode 100644 index 8cdf9d2f4..000000000 --- a/web-client/graphql/subscriptions/subscribeMessage.graphql +++ /dev/null @@ -1,7 +0,0 @@ -subscription subscribeMessage($id: uuid = "") { - messages_by_pk(id: $id) { - id - content - status - } -} diff --git a/web-client/next.config.js b/web-client/next.config.js deleted file mode 100644 index d287ee0c8..000000000 --- a/web-client/next.config.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - experimental: { - serverActions: true, - }, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "**", - }, - ], - }, -}; - -module.exports = nextConfig; diff --git a/web-client/yarn.lock b/web-client/yarn.lock deleted file mode 100644 index a76cde32c..000000000 --- a/web-client/yarn.lock +++ /dev/null @@ -1,6069 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@apollo/client@^3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.8.1.tgz#a1e3045a5fb276c08e38f7b5f930551d79741257" - integrity sha512-JGGj/9bdoLEqzatRikDeN8etseY5qeFAY0vSAx/Pd0ePNsaflKzHx6V2NZ0NsGkInq+9IXXX3RLVDf0EotizMA== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - "@wry/context" "^0.7.3" - "@wry/equality" "^0.5.6" - "@wry/trie" "^0.4.3" - graphql-tag "^2.12.6" - hoist-non-react-statics "^3.3.2" - optimism "^0.17.5" - prop-types "^15.7.2" - response-iterator "^0.2.6" - symbol-observable "^4.0.0" - ts-invariant "^0.10.3" - tslib "^2.3.0" - zen-observable-ts "^1.2.5" - -"@ardatan/relay-compiler@12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" - integrity sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q== - dependencies: - "@babel/core" "^7.14.0" - "@babel/generator" "^7.14.0" - "@babel/parser" "^7.14.0" - "@babel/runtime" "^7.0.0" - "@babel/traverse" "^7.14.0" - "@babel/types" "^7.0.0" - babel-preset-fbjs "^3.4.0" - chalk "^4.0.0" - fb-watchman "^2.0.0" - fbjs "^3.0.0" - glob "^7.1.1" - immutable "~3.7.6" - invariant "^2.2.4" - nullthrows "^1.1.1" - relay-runtime "12.0.0" - signedsource "^1.0.0" - yargs "^15.3.1" - -"@ardatan/sync-fetch@^0.0.1": - version "0.0.1" - resolved "https://registry.yarnpkg.com/@ardatan/sync-fetch/-/sync-fetch-0.0.1.tgz#3385d3feedceb60a896518a1db857ec1e945348f" - integrity sha512-xhlTqH0m31mnsG0tIP4ETgfSB6gXDaYYsUWTrlUV93fFQPI9dd8hE0Ot6MHLCtqgB32hwJAC3YZMWlXZw7AleA== - dependencies: - node-fetch "^2.6.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.10.tgz#1c20e612b768fefa75f6e90d6ecb86329247f0a3" - integrity sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA== - dependencies: - "@babel/highlight" "^7.22.10" - chalk "^2.4.2" - -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== - -"@babel/core@^7.14.0", "@babel/core@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.10.tgz#aad442c7bcd1582252cb4576747ace35bc122f35" - integrity sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.10" - "@babel/parser" "^7.22.10" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.1" - -"@babel/generator@^7.14.0", "@babel/generator@^7.18.13", "@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz#dd2612d59eac45588021ac3d6fa976d08f4e95a3" - integrity sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helpers@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.10.tgz#ae6005c539dfbcb5cd71fb51bfc8a52ba63bc37a" - integrity sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.10" - "@babel/types" "^7.22.10" - -"@babel/highlight@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.10.tgz#02a3f6d8c1cb4521b2fd0ab0da8f4739936137d7" - integrity sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.14.0", "@babel/parser@^7.16.8", "@babel/parser@^7.22.10", "@babel/parser@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.10.tgz#e37634f9a12a1716136c44624ef54283cabd3f55" - integrity sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ== - -"@babel/plugin-proposal-class-properties@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-syntax-class-properties@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" - integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-transform-arrow-functions@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoped-functions@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz#88a1dccc3383899eb5e660534a76a22ecee64faa" - integrity sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-classes@^7.0.0": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - -"@babel/plugin-transform-destructuring@^7.0.0": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz#38e2273814a58c810b6c34ea293be4973c4eb5e2" - integrity sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-flow-strip-types@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" - integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-flow" "^7.22.5" - -"@babel/plugin-transform-for-of@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-member-expression-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-object-super@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-property-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/plugin-transform-shorthand-properties@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-spread@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.0.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.13": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.10.tgz#ae3e9631fd947cb7e3610d3e9d8fef5f76696682" - integrity sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.14.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.10.tgz#20252acb240e746d27c2e82b4484f199cf8141aa" - integrity sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.10" - "@babel/types" "^7.22.10" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.16.8", "@babel/types@^7.18.13", "@babel/types@^7.22.10", "@babel/types@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.10.tgz#4a9e76446048f2c66982d1a989dd12b8a2d2dc03" - integrity sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== - -"@eslint/eslintrc@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" - integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.44.0": - version "8.44.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" - integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== - -"@graphql-codegen/add@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-5.0.0.tgz#578ebaf4fa87c1e934c381cd679bcedcf79feaba" - integrity sha512-ynWDOsK2yxtFHwcJTB9shoSkUd7YXd6ZE57f0nk7W5cu/nAgxZZpEsnTPEpZB/Mjf14YRGe2uJHQ7AfElHjqUQ== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - tslib "~2.5.0" - -"@graphql-codegen/cli@5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-5.0.0.tgz#761dcf08cfee88bbdd9cdf8097b2343445ec6f0a" - integrity sha512-A7J7+be/a6e+/ul2KI5sfJlpoqeqwX8EzktaKCeduyVKgOLA6W5t+NUGf6QumBDXU8PEOqXk3o3F+RAwCWOiqA== - dependencies: - "@babel/generator" "^7.18.13" - "@babel/template" "^7.18.10" - "@babel/types" "^7.18.13" - "@graphql-codegen/core" "^4.0.0" - "@graphql-codegen/plugin-helpers" "^5.0.1" - "@graphql-tools/apollo-engine-loader" "^8.0.0" - "@graphql-tools/code-file-loader" "^8.0.0" - "@graphql-tools/git-loader" "^8.0.0" - "@graphql-tools/github-loader" "^8.0.0" - "@graphql-tools/graphql-file-loader" "^8.0.0" - "@graphql-tools/json-file-loader" "^8.0.0" - "@graphql-tools/load" "^8.0.0" - "@graphql-tools/prisma-loader" "^8.0.0" - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.8.0" - chalk "^4.1.0" - cosmiconfig "^8.1.3" - debounce "^1.2.0" - detect-indent "^6.0.0" - graphql-config "^5.0.2" - inquirer "^8.0.0" - is-glob "^4.0.1" - jiti "^1.17.1" - json-to-pretty-yaml "^1.2.2" - listr2 "^4.0.5" - log-symbols "^4.0.0" - micromatch "^4.0.5" - shell-quote "^1.7.3" - string-env-interpolation "^1.0.1" - ts-log "^2.2.3" - tslib "^2.4.0" - yaml "^2.3.1" - yargs "^17.0.0" - -"@graphql-codegen/client-preset@4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/client-preset/-/client-preset-4.1.0.tgz#81becd32b78b207b0e966876900537ec172d8df1" - integrity sha512-/3Ymb/fjxIF1+HGmaI1YwSZbWsrZAWMSQjh3dU425eBjctjsVQ6gzGRr+l/gE5F1mtmCf+vlbTAT03heAc/QIw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" - "@graphql-codegen/add" "^5.0.0" - "@graphql-codegen/gql-tag-operations" "4.0.1" - "@graphql-codegen/plugin-helpers" "^5.0.1" - "@graphql-codegen/typed-document-node" "^5.0.1" - "@graphql-codegen/typescript" "^4.0.1" - "@graphql-codegen/typescript-operations" "^4.0.1" - "@graphql-codegen/visitor-plugin-common" "^4.0.1" - "@graphql-tools/documents" "^1.0.0" - "@graphql-tools/utils" "^10.0.0" - "@graphql-typed-document-node/core" "3.2.0" - tslib "~2.5.0" - -"@graphql-codegen/core@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-4.0.0.tgz#b29c911746a532a675e33720acb4eb2119823e01" - integrity sha512-JAGRn49lEtSsZVxeIlFVIRxts2lWObR+OQo7V2LHDJ7ohYYw3ilv7nJ8pf8P4GTg/w6ptcYdSdVVdkI8kUHB/Q== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "~2.5.0" - -"@graphql-codegen/gql-tag-operations@4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.1.tgz#36c7d40a135b9889d7f225166be323c3d48cee87" - integrity sha512-qF6wIbBzW8BNT+wiVsBxrYOs2oYcsxQ7mRvCpfEI3HnNZMAST/uX76W8MqFEJvj4mw7NIDv7xYJAcAZIWM5LWw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - "@graphql-tools/utils" "^10.0.0" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/introspection@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/introspection/-/introspection-4.0.0.tgz#1d851d8fb38efbeaf45128456e3010a16e6c9708" - integrity sha512-t9g3AkK99dfHblMWtG4ynUM9+A7JrWq5110zSpNV2wlSnv0+bRKagDW8gozwgXfR5i1IIG8QDjJZ6VgXQVqCZw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "^4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/plugin-helpers@^5.0.0", "@graphql-codegen/plugin-helpers@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.0.1.tgz#e2429fcfba3f078d5aa18aa062d46c922bbb0d55" - integrity sha512-6L5sb9D8wptZhnhLLBcheSPU7Tg//DGWgc5tQBWX46KYTOTQHGqDpv50FxAJJOyFVJrveN9otWk9UT9/yfY4ww== - dependencies: - "@graphql-tools/utils" "^10.0.0" - change-case-all "1.0.15" - common-tags "1.8.2" - import-from "4.0.0" - lodash "~4.17.0" - tslib "~2.5.0" - -"@graphql-codegen/schema-ast@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@graphql-codegen/schema-ast/-/schema-ast-4.0.0.tgz#5d60996c87b64f81847da8fcb2d8ef50ede89755" - integrity sha512-WIzkJFa9Gz28FITAPILbt+7A8+yzOyd1NxgwFh7ie+EmO9a5zQK6UQ3U/BviirguXCYnn+AR4dXsoDrSrtRA1g== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "~2.5.0" - -"@graphql-codegen/typed-document-node@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typed-document-node/-/typed-document-node-5.0.1.tgz#ac90cf67c61554f63ec100d6076b47c9f0b18b27" - integrity sha512-VFkhCuJnkgtbbgzoCAwTdJe2G1H6sd3LfCrDqWUrQe53y2ukfSb5Ov1PhAIkCBStKCMQBUY9YgGz9GKR40qQ8g== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - change-case-all "1.0.15" - tslib "~2.5.0" - -"@graphql-codegen/typescript-operations@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-4.0.1.tgz#930af3e2d2ae8ff06de696291be28fe7046a2fef" - integrity sha512-GpUWWdBVUec/Zqo23aFLBMrXYxN2irypHqDcKjN78JclDPdreasAEPcIpMfqf4MClvpmvDLy4ql+djVAwmkjbw== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/typescript" "^4.0.1" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/typescript@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-4.0.1.tgz#7481d68f59bea802dd10e278dce73c8a1552b2a4" - integrity sha512-3YziQ21dCVdnHb+Us1uDb3pA6eG5Chjv0uTK+bt9dXeMlwYBU8MbtzvQTo4qvzWVC1AxSOKj0rgfNu1xCXqJyA== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-codegen/schema-ast" "^4.0.0" - "@graphql-codegen/visitor-plugin-common" "4.0.1" - auto-bind "~4.0.0" - tslib "~2.5.0" - -"@graphql-codegen/visitor-plugin-common@4.0.1", "@graphql-codegen/visitor-plugin-common@^4.0.0", "@graphql-codegen/visitor-plugin-common@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-4.0.1.tgz#64e293728b3c186f6767141e41fcdb310e50d367" - integrity sha512-Bi/1z0nHg4QMsAqAJhds+ForyLtk7A3HQOlkrZNm3xEkY7lcBzPtiOTLBtvziwopBsXUxqeSwVjOOFPLS5Yw1Q== - dependencies: - "@graphql-codegen/plugin-helpers" "^5.0.0" - "@graphql-tools/optimize" "^2.0.0" - "@graphql-tools/relay-operation-optimizer" "^7.0.0" - "@graphql-tools/utils" "^10.0.0" - auto-bind "~4.0.0" - change-case-all "1.0.15" - dependency-graph "^0.11.0" - graphql-tag "^2.11.0" - parse-filepath "^1.0.2" - tslib "~2.5.0" - -"@graphql-tools/apollo-engine-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.0.tgz#ac1f351cbe41508411784f25757f5557b0f27489" - integrity sha512-axQTbN5+Yxs1rJ6cWQBOfw3AEeC+fvIuZSfJLPLLvFJLj4pUm9fhxey/g6oQZAAQJqKPfw+tLDUQvnfvRK8Kmg== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.9.0" - tslib "^2.4.0" - -"@graphql-tools/batch-execute@^9.0.1": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/batch-execute/-/batch-execute-9.0.1.tgz#9269da9fb8c0be50afe0cafef59aa8f6ab2bea72" - integrity sha512-cc96n/JNARtnYjru6KQl3u3MLrQLfFBu8VoDRRG2BQmShodw4QJ8fn7MzFABjkBHFQPydNGN1QOKBCjq6ui/3g== - dependencies: - "@graphql-tools/utils" "^10.0.5" - dataloader "^2.2.2" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/code-file-loader@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-8.0.2.tgz#224b9ce29d9229c52d8bd7b6d976038f4ea5d3f4" - integrity sha512-AKNpkElUL2cWocYpC4DzNEpo6qJw8Lp+L3bKQ/mIfmbsQxgLz5uve6zHBMhDaFPdlwfIox41N3iUSvi77t9e8A== - dependencies: - "@graphql-tools/graphql-tag-pluck" "8.0.2" - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/delegate@^10.0.0": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-10.0.2.tgz#26fdd4b186969799570cc6d2451d05d1d7cb7c90" - integrity sha512-ZU7VnR2xFgHrGnsuw6+nRJkcvSucn7w5ooxb/lTKlVfrNJfTwJevNcNKMnbtPUSajG3+CaFym/nU6v44GXCmNw== - dependencies: - "@graphql-tools/batch-execute" "^9.0.1" - "@graphql-tools/executor" "^1.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.5" - dataloader "^2.2.2" - tslib "^2.5.0" - -"@graphql-tools/documents@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/documents/-/documents-1.0.0.tgz#e3ed97197cc22ec830ca227fd7d17e86d8424bdf" - integrity sha512-rHGjX1vg/nZ2DKqRGfDPNC55CWZBMldEVcH+91BThRa6JeT80NqXknffLLEZLRUxyikCfkwMsk6xR3UNMqG0Rg== - dependencies: - lodash.sortby "^4.7.0" - tslib "^2.4.0" - -"@graphql-tools/executor-graphql-ws@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-1.1.0.tgz#7727159ebaa9df4dc793d0d02e74dd1ca4a7cc60" - integrity sha512-yM67SzwE8rYRpm4z4AuGtABlOp9mXXVy6sxXnTJRoYIdZrmDbKVfIY+CpZUJCqS0FX3xf2+GoHlsj7Qswaxgcg== - dependencies: - "@graphql-tools/utils" "^10.0.2" - "@types/ws" "^8.0.0" - graphql-ws "^5.14.0" - isomorphic-ws "^5.0.0" - tslib "^2.4.0" - ws "^8.13.0" - -"@graphql-tools/executor-http@^1.0.0": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-http/-/executor-http-1.0.2.tgz#d7964a6e5ec883842f9a8e3f104f93c9b8f472be" - integrity sha512-JKTB4E3kdQM2/1NEcyrVPyQ8057ZVthCV5dFJiKktqY9IdmF00M8gupFcW3jlbM/Udn78ickeUBsUzA3EouqpA== - dependencies: - "@graphql-tools/utils" "^10.0.2" - "@repeaterjs/repeater" "^3.0.4" - "@whatwg-node/fetch" "^0.9.0" - extract-files "^11.0.0" - meros "^1.2.1" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/executor-legacy-ws@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.0.1.tgz#49764812fc93f401cb3f3ef32b2d6db4a9cd8db5" - integrity sha512-PQrTJ+ncHMEQspBARc2lhwiQFfRAX/z/CsOdZTFjIljOHgRWGAA1DAx7pEN0j6PflbLCfZ3NensNq2jCBwF46w== - dependencies: - "@graphql-tools/utils" "^10.0.0" - "@types/ws" "^8.0.0" - isomorphic-ws "5.0.0" - tslib "^2.4.0" - ws "8.13.0" - -"@graphql-tools/executor@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/executor/-/executor-1.2.0.tgz#6c45f4add765769d9820c4c4405b76957ba39c79" - integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== - dependencies: - "@graphql-tools/utils" "^10.0.0" - "@graphql-typed-document-node/core" "3.2.0" - "@repeaterjs/repeater" "^3.0.4" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/git-loader@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-8.0.2.tgz#d26d87e176ff0cea86e0acfe7c2072f32fd836c3" - integrity sha512-AuCB0nlPvsHh8u42zRZdlD/ZMaWP9A44yAkQUVCZir1E/LG63fsZ9svTWJ+CbusW3Hd0ZP9qpxEhlHxnd4Tlsg== - dependencies: - "@graphql-tools/graphql-tag-pluck" "8.0.2" - "@graphql-tools/utils" "^10.0.0" - is-glob "4.0.3" - micromatch "^4.0.4" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/github-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-8.0.0.tgz#683195800618364701cfea9bc6f88674486f053b" - integrity sha512-VuroArWKcG4yaOWzV0r19ElVIV6iH6UKDQn1MXemND0xu5TzrFme0kf3U9o0YwNo0kUYEk9CyFM0BYg4he17FA== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/executor-http" "^1.0.0" - "@graphql-tools/graphql-tag-pluck" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@whatwg-node/fetch" "^0.9.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/graphql-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.0.tgz#a2026405bce86d974000455647511bf65df4f211" - integrity sha512-wRXj9Z1IFL3+zJG1HWEY0S4TXal7+s1vVhbZva96MSp0kbb/3JBF7j0cnJ44Eq0ClccMgGCDFqPFXty4JlpaPg== - dependencies: - "@graphql-tools/import" "7.0.0" - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/graphql-tag-pluck@8.0.2", "@graphql-tools/graphql-tag-pluck@^8.0.0": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.0.2.tgz#c1ce8226c951583a27765dccceea19dc5827a948" - integrity sha512-U6fE4yEHxuk/nqmPixHpw1WhqdS6aYuaV60m1bEmUmGJNbpAhaMBy01JncpvpF15yZR5LZ0UjkHg+A3Lhoc8YQ== - dependencies: - "@babel/core" "^7.22.9" - "@babel/parser" "^7.16.8" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/import@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-7.0.0.tgz#a6a91a90a707d5f46bad0fd3fde2f407b548b2be" - integrity sha512-NVZiTO8o1GZs6OXzNfjB+5CtQtqsZZpQOq+Uu0w57kdUkT4RlQKlwhT8T81arEsbV55KpzkpFsOZP7J1wdmhBw== - dependencies: - "@graphql-tools/utils" "^10.0.0" - resolve-from "5.0.0" - tslib "^2.4.0" - -"@graphql-tools/json-file-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-8.0.0.tgz#9b1b62902f766ef3f1c9cd1c192813ea4f48109c" - integrity sha512-ki6EF/mobBWJjAAC84xNrFMhNfnUFD6Y0rQMGXekrUgY0NdeYXHU0ZUgHzC9O5+55FslqUmAUHABePDHTyZsLg== - dependencies: - "@graphql-tools/utils" "^10.0.0" - globby "^11.0.3" - tslib "^2.4.0" - unixify "^1.0.0" - -"@graphql-tools/load@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-8.0.0.tgz#62e00f48c39b4085167a096f66ba6c21fb3fc796" - integrity sha512-Cy874bQJH0FP2Az7ELPM49iDzOljQmK1PPH6IuxsWzLSTxwTqd8dXA09dcVZrI7/LsN26heTY2R8q2aiiv0GxQ== - dependencies: - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - p-limit "3.1.0" - tslib "^2.4.0" - -"@graphql-tools/merge@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-9.0.0.tgz#b0a3636c82716454bff88e9bb40108b0471db281" - integrity sha512-J7/xqjkGTTwOJmaJQJ2C+VDBDOWJL3lKrHJN4yMaRLAJH3PosB7GiPRaSDZdErs0+F77sH2MKs2haMMkywzx7Q== - dependencies: - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/optimize@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/optimize/-/optimize-2.0.0.tgz#7a9779d180824511248a50c5a241eff6e7a2d906" - integrity sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg== - dependencies: - tslib "^2.4.0" - -"@graphql-tools/prisma-loader@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-8.0.1.tgz#0a013c69b04e0779b5be15757173d458cdf94e35" - integrity sha512-bl6e5sAYe35Z6fEbgKXNrqRhXlCJYeWKBkarohgYA338/SD9eEhXtg3Cedj7fut3WyRLoQFpHzfiwxKs7XrgXg== - dependencies: - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - "@types/js-yaml" "^4.0.0" - "@types/json-stable-stringify" "^1.0.32" - "@whatwg-node/fetch" "^0.9.0" - chalk "^4.1.0" - debug "^4.3.1" - dotenv "^16.0.0" - graphql-request "^6.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - jose "^4.11.4" - js-yaml "^4.0.0" - json-stable-stringify "^1.0.1" - lodash "^4.17.20" - scuid "^1.1.0" - tslib "^2.4.0" - yaml-ast-parser "^0.0.43" - -"@graphql-tools/relay-operation-optimizer@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.0.tgz#24367666af87bc5a81748de5e8e9b3c523fd4207" - integrity sha512-UNlJi5y3JylhVWU4MBpL0Hun4Q7IoJwv9xYtmAz+CgRa066szzY7dcuPfxrA7cIGgG/Q6TVsKsYaiF4OHPs1Fw== - dependencies: - "@ardatan/relay-compiler" "12.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - -"@graphql-tools/schema@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" - integrity sha512-kf3qOXMFcMs2f/S8Y3A8fm/2w+GaHAkfr3Gnhh2LOug/JgpY/ywgFVxO3jOeSpSEdoYcDKLcXVjMigNbY4AdQg== - dependencies: - "@graphql-tools/merge" "^9.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-tools/url-loader@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-8.0.0.tgz#8d952d5ebb7325e587cb914aaebded3dbd078cf6" - integrity sha512-rPc9oDzMnycvz+X+wrN3PLrhMBQkG4+sd8EzaFN6dypcssiefgWKToXtRKI8HHK68n2xEq1PyrOpkjHFJB+GwA== - dependencies: - "@ardatan/sync-fetch" "^0.0.1" - "@graphql-tools/delegate" "^10.0.0" - "@graphql-tools/executor-graphql-ws" "^1.0.0" - "@graphql-tools/executor-http" "^1.0.0" - "@graphql-tools/executor-legacy-ws" "^1.0.0" - "@graphql-tools/utils" "^10.0.0" - "@graphql-tools/wrap" "^10.0.0" - "@types/ws" "^8.0.0" - "@whatwg-node/fetch" "^0.9.0" - isomorphic-ws "^5.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.11" - ws "^8.12.0" - -"@graphql-tools/utils@^10.0.0", "@graphql-tools/utils@^10.0.2", "@graphql-tools/utils@^10.0.5": - version "10.0.5" - resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-10.0.5.tgz#b76c7b5b7fc3f67da734b51cf6e33c52dee09974" - integrity sha512-ZTioQqg9z9eCG3j+KDy54k1gp6wRIsLqkx5yi163KVvXVkfjsrdErCyZjrEug21QnKE9piP4tyxMpMMOT1RuRw== - dependencies: - "@graphql-typed-document-node/core" "^3.1.1" - dset "^3.1.2" - tslib "^2.4.0" - -"@graphql-tools/wrap@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-10.0.0.tgz#573ab111482387d4acf4757d5fb7f9553a504bc1" - integrity sha512-HDOeUUh6UhpiH0WPJUQl44ODt1x5pnMUbOJZ7GjTdGQ7LK0AgVt3ftaAQ9duxLkiAtYJmu5YkULirfZGj4HzDg== - dependencies: - "@graphql-tools/delegate" "^10.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.0" - tslib "^2.4.0" - value-or-promise "^1.0.12" - -"@graphql-typed-document-node/core@3.2.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" - integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== - -"@headlessui/react@^1.7.15": - version "1.7.15" - resolved "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz" - integrity sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw== - dependencies: - client-only "^0.0.1" - -"@heroicons/react@^2.0.18": - version "2.0.18" - resolved "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz" - integrity sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw== - -"@humanwhocodes/config-array@^0.11.10": - version "0.11.10" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" - integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@next/env@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz" - integrity sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ== - -"@next/eslint-plugin-next@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.10.tgz" - integrity sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA== - dependencies: - glob "7.1.7" - -"@next/swc-darwin-arm64@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz#962ac55559970d1725163ff9d62d008bc1c33503" - integrity sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg== - -"@next/swc-darwin-x64@13.4.10": - version "13.4.10" - resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz" - integrity sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg== - -"@next/swc-linux-arm64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz#8fc25052c345ffc8f6c51f61d1bb6c359b80ab2b" - integrity sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg== - -"@next/swc-linux-arm64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz#25e6b0dbb87c89c44c3e3680227172862bc7072c" - integrity sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q== - -"@next/swc-linux-x64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz#24fa8070ea0855c0aa020832ce7d1b84d3413fc1" - integrity sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ== - -"@next/swc-linux-x64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz#ae55914d50589a4f8b91c8eeebdd713f0c1b1675" - integrity sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg== - -"@next/swc-win32-arm64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz#ab3098b2305f3c0e46dfb2e318a9988bff884047" - integrity sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ== - -"@next/swc-win32-ia32-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz#a1c5980538641ca656012c00d05b08882cf0ec9f" - integrity sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ== - -"@next/swc-win32-x64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz#44dd9eea943ed14a1012edd5011b8e905f5e6fc4" - integrity sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@panva/hkdf@^1.0.2": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.1.1.tgz#ab9cd8755d1976e72fc77a00f7655a64efe6cd5d" - integrity sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA== - -"@peculiar/asn1-schema@^2.3.6": - version "2.3.6" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" - integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== - dependencies: - asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -"@peculiar/json-schema@^1.1.12": - version "1.1.12" - resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" - integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== - dependencies: - tslib "^2.0.0" - -"@peculiar/webcrypto@^1.4.0": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" - integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - pvtsutils "^1.3.2" - tslib "^2.5.0" - webcrypto-core "^1.7.7" - -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - -"@repeaterjs/repeater@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@repeaterjs/repeater/-/repeater-3.0.4.tgz#a04d63f4d1bf5540a41b01a921c9a7fddc3bd1ca" - integrity sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA== - -"@rushstack/eslint-patch@^1.1.3": - version "1.3.2" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz" - integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== - -"@swc/helpers@0.5.1": - version "0.5.1" - resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz" - integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== - dependencies: - tslib "^2.4.0" - -"@tailwindcss/forms@^0.5.4": - version "0.5.4" - resolved "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.4.tgz" - integrity sha512-YAm12D3R7/9Mh4jFbYSMnsd6jG++8KxogWgqs7hbdo/86aWjjlIEvL7+QYdVELmAI0InXTpZqFIg5e7aDVWI2Q== - dependencies: - mini-svg-data-uri "^1.2.3" - -"@tailwindcss/typography@^0.5.9": - version "0.5.9" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.9.tgz#027e4b0674929daaf7c921c900beee80dbad93e8" - integrity sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg== - dependencies: - lodash.castarray "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - postcss-selector-parser "6.0.10" - -"@types/debug@^4.0.0": - version "4.1.8" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== - dependencies: - "@types/ms" "*" - -"@types/hast@^2.0.0": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.5.tgz#08caac88b44d0fdd04dc17a19142355f43bd8a7a" - integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== - dependencies: - "@types/unist" "^2" - -"@types/js-yaml@^4.0.0": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" - integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== - -"@types/json-stable-stringify@^1.0.32": - version "1.0.34" - resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.34.tgz#c0fb25e4d957e0ee2e497c1f553d7f8bb668fd75" - integrity sha512-s2cfwagOQAS8o06TcwKfr9Wx11dNGbH2E9vJz1cqV+a/LOyhWNLUNd6JSRYNzvB4d29UuJX2M0Dj9vE1T8fRXw== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== - dependencies: - "@types/unist" "^2" - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/node@*": - version "20.5.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.3.tgz#fa52c147f405d56b2f1dd8780d840aa87ddff629" - integrity sha512-ITI7rbWczR8a/S6qjAW7DMqxqFMjjTo61qZVWJ1ubPvbIQsL5D/TvwjYEalM8Kthpe3hTzOGrF2TGbAu2uyqeA== - -"@types/node@20.4.2": - version "20.4.2" - resolved "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz" - integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== - -"@types/parse5@^6.0.0": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" - integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/react-dom@18.2.7": - version "18.2.7" - resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" - integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== - dependencies: - "@types/react" "*" - -"@types/react-syntax-highlighter@^15.5.7": - version "15.5.7" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.7.tgz#bd29020ccb118543d88779848f99059b64b02d0f" - integrity sha512-bo5fEO5toQeyCp0zVHBeggclqf5SQ/Z5blfFmjwO5dkMVGPgmiwZsJh9nu/Bo5L7IHTuGWrja6LxJVE2uB5ZrQ== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@18.2.15": - version "18.2.15" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz" - integrity sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/unist@^2": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" - integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== - -"@types/unist@^2.0.0": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== - -"@types/ws@^8.0.0": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== - dependencies: - "@types/node" "*" - -"@typescript-eslint/parser@^5.42.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" - integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== - dependencies: - "@typescript-eslint/scope-manager" "5.62.0" - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/typescript-estree" "5.62.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" - integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - -"@typescript-eslint/types@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" - integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== - -"@typescript-eslint/typescript-estree@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" - integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== - dependencies: - "@typescript-eslint/types" "5.62.0" - "@typescript-eslint/visitor-keys" "5.62.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@5.62.0": - version "5.62.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" - integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== - dependencies: - "@typescript-eslint/types" "5.62.0" - eslint-visitor-keys "^3.3.0" - -"@whatwg-node/events@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" - integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== - -"@whatwg-node/events@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.1.1.tgz#0ca718508249419587e130da26d40e29d99b5356" - integrity sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w== - -"@whatwg-node/fetch@^0.8.0": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" - integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== - dependencies: - "@peculiar/webcrypto" "^1.4.0" - "@whatwg-node/node-fetch" "^0.3.6" - busboy "^1.6.0" - urlpattern-polyfill "^8.0.0" - web-streams-polyfill "^3.2.1" - -"@whatwg-node/fetch@^0.9.0": - version "0.9.9" - resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.9.9.tgz#65e68aaf8353755c20657b803f2fe983dbdabf91" - integrity sha512-OTVoDm039CNyAWSRc2WBimMl/N9J4Fk2le21Xzcf+3OiWPNNSIbMnpWKBUyraPh2d9SAEgoBdQxTfVNihXgiUw== - dependencies: - "@whatwg-node/node-fetch" "^0.4.8" - urlpattern-polyfill "^9.0.0" - -"@whatwg-node/node-fetch@^0.3.6": - version "0.3.6" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" - integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== - dependencies: - "@whatwg-node/events" "^0.0.3" - busboy "^1.6.0" - fast-querystring "^1.1.1" - fast-url-parser "^1.1.3" - tslib "^2.3.1" - -"@whatwg-node/node-fetch@^0.4.8": - version "0.4.14" - resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.4.14.tgz#b3dbdd92bac227026a39fb882207a7f739ada5bf" - integrity sha512-ii/eZz2PcjLGj9D6WfsmfzlTzZV1Kz6MxYpq2Vc5P21J8vkKfENWC9B2ISsFCKovxElLukIwPg8HTrHFsLNflg== - dependencies: - "@whatwg-node/events" "^0.1.0" - busboy "^1.6.0" - fast-querystring "^1.1.1" - fast-url-parser "^1.1.3" - tslib "^2.3.1" - -"@wry/context@^0.7.0", "@wry/context@^0.7.3": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.3.tgz#240f6dfd4db5ef54f81f6597f6714e58d4f476a1" - integrity sha512-Nl8WTesHp89RF803Se9X3IiHjdmLBrIvPMaJkl+rKVJAYyPsz1TEUbu89943HpvujtSJgDUx9W4vZw3K1Mr3sA== - dependencies: - tslib "^2.3.0" - -"@wry/equality@^0.5.6": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.6.tgz#cd4a533c72c3752993ab8cbf682d3d20e3cb601e" - integrity sha512-D46sfMTngaYlrH+OspKf8mIJETntFnf6Hsjb0V41jAXJ7Bx2kB8Rv8RCUujuVWYttFtHkUNp7g+FwxNQAr6mXA== - dependencies: - tslib "^2.3.0" - -"@wry/trie@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@wry/trie/-/trie-0.4.3.tgz#077d52c22365871bf3ffcbab8e95cb8bc5689af4" - integrity sha512-I6bHwH0fSf6RqQcnnXLJKhkSXG45MFral3GxPaY4uAl0LYDZM+YDVDAiU9bYwjTuysy1S0IeecWtmq1SZA3M1w== - dependencies: - tslib "^2.3.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" - integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== - dependencies: - debug "^4.3.4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.1.3: - version "5.3.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1js@^3.0.1, asn1js@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" - integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== - dependencies: - pvtsutils "^1.3.2" - pvutils "^1.1.3" - tslib "^2.4.0" - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -auto-bind@~4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" - integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== - -autoprefixer@10.4.14: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axe-core@^4.6.2: - version "4.7.2" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" - integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== - -axobject-query@^3.1.1: - version "3.2.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: - version "7.0.0-beta.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" - integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== - -babel-preset-fbjs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" - integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== - dependencies: - "@babel/plugin-proposal-class-properties" "^7.0.0" - "@babel/plugin-proposal-object-rest-spread" "^7.0.0" - "@babel/plugin-syntax-class-properties" "^7.0.0" - "@babel/plugin-syntax-flow" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.0.0" - "@babel/plugin-transform-arrow-functions" "^7.0.0" - "@babel/plugin-transform-block-scoped-functions" "^7.0.0" - "@babel/plugin-transform-block-scoping" "^7.0.0" - "@babel/plugin-transform-classes" "^7.0.0" - "@babel/plugin-transform-computed-properties" "^7.0.0" - "@babel/plugin-transform-destructuring" "^7.0.0" - "@babel/plugin-transform-flow-strip-types" "^7.0.0" - "@babel/plugin-transform-for-of" "^7.0.0" - "@babel/plugin-transform-function-name" "^7.0.0" - "@babel/plugin-transform-literals" "^7.0.0" - "@babel/plugin-transform-member-expression-literals" "^7.0.0" - "@babel/plugin-transform-modules-commonjs" "^7.0.0" - "@babel/plugin-transform-object-super" "^7.0.0" - "@babel/plugin-transform-parameters" "^7.0.0" - "@babel/plugin-transform-property-literals" "^7.0.0" - "@babel/plugin-transform-react-display-name" "^7.0.0" - "@babel/plugin-transform-react-jsx" "^7.0.0" - "@babel/plugin-transform-shorthand-properties" "^7.0.0" - "@babel/plugin-transform-spread" "^7.0.0" - "@babel/plugin-transform-template-literals" "^7.0.0" - babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" - -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.5: - version "4.21.9" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== - dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -busboy@1.6.0, busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: - version "1.0.30001516" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz" - integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== - -caniuse-lite@^1.0.30001517: - version "1.0.30001522" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz#44b87a406c901269adcdb834713e23582dd71856" - integrity sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg== - -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case-all@1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/change-case-all/-/change-case-all-1.0.15.tgz#de29393167fc101d646cd76b0ef23e27d09756ad" - integrity sha512-3+GIFhk3sNuvFAJKU46o26OdzudQlPNBCu1ZQi3cMeMHhty1bhDxu2WrEilVNYaGvqUtR1VSigFcJOiS13dRhQ== - dependencies: - change-case "^4.1.2" - is-lower-case "^2.0.2" - is-upper-case "^2.0.2" - lower-case "^2.0.2" - lower-case-first "^2.0.2" - sponge-case "^1.0.1" - swap-case "^2.0.2" - title-case "^3.0.3" - upper-case "^2.0.2" - upper-case-first "^2.0.2" - -change-case@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" - -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -classnames@^2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -client-only@0.0.1, client-only@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.16: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -comma-separated-tokens@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" - integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -common-tags@1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cosmiconfig@^8.1.0, cosmiconfig@^8.1.3: - version "8.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -dataloader@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" - integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== - -debounce@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dependency-graph@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" - integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== - -dequal@^2.0.0, dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dotenv@^16.0.0: - version "16.3.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== - -dset@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/dset/-/dset-3.1.2.tgz#89c436ca6450398396dc6538ea00abc0c54cd45a" - integrity sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q== - -electron-to-chromium@^1.4.431: - version "1.4.463" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz" - integrity sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw== - -electron-to-chromium@^1.4.477: - version "1.4.499" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.499.tgz#dc36b67f4c8e273524e8d2080c5203a6a76987b6" - integrity sha512-0NmjlYBLKVHva4GABWAaHuPJolnDuL0AhV3h1hES6rcLCWEIbRL6/8TghfsVwkx6TEroQVdliX7+aLysUpKvjw== - -embla-carousel-react@^8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.0.0-rc11.tgz#0e2fde5cafa3cae9c30721e18aee648599527994" - integrity sha512-hXOAUMOIa0GF5BtdTTqBuKcjgU+ipul6thTCXOZttqnu2c6VS3SIzUUT+onIIEw+AptzKJcPwGcoAByAGa9eJw== - dependencies: - embla-carousel "8.0.0-rc11" - embla-carousel-reactive-utils "8.0.0-rc11" - -embla-carousel-reactive-utils@8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.0-rc11.tgz#d5493bd2bfeb68b1cbf65d4c836a4d36779a03de" - integrity sha512-pDNVJNCn0dybLkHw93My+cMfkRQ5oLZff6ZCwgmrw+96aPiZUyo5ANywz8Lb70SWWgD/TNBRrtQCquvjHS31Sg== - -embla-carousel@8.0.0-rc11, embla-carousel@^8.0.0-rc11: - version "8.0.0-rc11" - resolved "https://registry.yarnpkg.com/embla-carousel/-/embla-carousel-8.0.0-rc11.tgz#700ab6b3e4825ef9e6ac83238b81e3e1a316c3f4" - integrity sha512-Toeaug98PGYzSY56p/xsa+u4zbQbAXgGymwEDUc2wqT+1XCnnUsH42MClglhABJQbobwDYxOabhJrfXyJKUMig== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.22.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@13.4.10: - version "13.4.10" - resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.10.tgz" - integrity sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g== - dependencies: - "@next/eslint-plugin-next" "13.4.10" - "@rushstack/eslint-patch" "^1.1.3" - "@typescript-eslint/parser" "^5.42.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.26.0" - eslint-plugin-jsx-a11y "^6.5.1" - eslint-plugin-react "^7.31.7" - eslint-plugin-react-hooks "5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-import-resolver-typescript@^3.5.2: - version "3.5.5" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - get-tsconfig "^4.5.0" - globby "^13.1.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - synckit "^0.8.5" - -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.26.0: - version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - 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-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jsx-a11y@^6.5.1: - version "6.7.1" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - version "5.0.0-canary-7118f5dd7-20230705" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz" - integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== - -eslint-plugin-react@^7.31.7: - version "7.32.2" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" - -eslint-scope@^7.2.0: - version "7.2.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz" - integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: - version "3.4.1" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" - integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== - -eslint@8.45.0: - version "8.45.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz" - integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.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" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.0" - eslint-visitor-keys "^3.4.1" - espree "^9.6.0" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extract-files@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-11.0.0.tgz#b72d428712f787eef1f5193aff8ab5351ca8469a" - integrity sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ== - -fast-decode-uri-component@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" - integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-querystring@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" - integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== - dependencies: - fast-decode-uri-component "^1.0.1" - -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-stream@^6.0.0, get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz" - integrity sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7, glob@^7.1.3: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.1: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.0.3, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.3: - version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -graphql-config@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-5.0.2.tgz#7e962f94ccddcc2ee0aa71d75cf4491ec5092bdb" - integrity sha512-7TPxOrlbiG0JplSZYCyxn2XQtqVhXomEjXUmWJVSS5ET1nPhOJSsIb/WTwqWhcYX6G0RlHXSj9PLtGTKmxLNGg== - dependencies: - "@graphql-tools/graphql-file-loader" "^8.0.0" - "@graphql-tools/json-file-loader" "^8.0.0" - "@graphql-tools/load" "^8.0.0" - "@graphql-tools/merge" "^9.0.0" - "@graphql-tools/url-loader" "^8.0.0" - "@graphql-tools/utils" "^10.0.0" - cosmiconfig "^8.1.0" - jiti "^1.18.2" - minimatch "^4.2.3" - string-env-interpolation "^1.0.1" - tslib "^2.4.0" - -graphql-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" - integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== - dependencies: - "@graphql-typed-document-node/core" "^3.2.0" - cross-fetch "^3.1.5" - -graphql-tag@^2.11.0, graphql-tag@^2.12.6: - version "2.12.6" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.12.6.tgz#d441a569c1d2537ef10ca3d1633b48725329b5f1" - integrity sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg== - dependencies: - tslib "^2.1.0" - -graphql-ws@^5.14.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/graphql-ws/-/graphql-ws-5.14.0.tgz#766f249f3974fc2c48fae0d1fb20c2c4c79cd591" - integrity sha512-itrUTQZP/TgswR4GSSYuwWUzrE/w5GhbwM2GX3ic2U7aw33jgEsayfIlvaj7/GcIvZgNMzsPTrE5hqPuFUiE5g== - -graphql@^16.8.0: - version "16.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" - integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-util-from-parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" - integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - hastscript "^7.0.0" - property-information "^6.0.0" - vfile "^5.0.0" - vfile-location "^4.0.0" - web-namespaces "^2.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-parse-selector@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" - integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== - dependencies: - "@types/hast" "^2.0.0" - -hast-util-raw@^7.0.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" - integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== - dependencies: - "@types/hast" "^2.0.0" - "@types/parse5" "^6.0.0" - hast-util-from-parse5 "^7.0.0" - hast-util-to-parse5 "^7.0.0" - html-void-elements "^2.0.0" - parse5 "^6.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-sanitize@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-4.1.0.tgz#d90f8521f5083547095c5c63a7e03150303e0286" - integrity sha512-Hd9tU0ltknMGRDv+d6Ro/4XKzBqQnP/EZrpiTbpFYfXv/uOhWeKc+2uajcbEvAEH98VZd7eII2PiXm13RihnLw== - dependencies: - "@types/hast" "^2.0.0" - -hast-util-to-html@^8.0.0: - version "8.0.4" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" - integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-raw "^7.0.0" - hast-util-whitespace "^2.0.0" - html-void-elements "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.0" - zwitch "^2.0.4" - -hast-util-to-parse5@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" - integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - web-namespaces "^2.0.0" - zwitch "^2.0.0" - -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -hastscript@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" - integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-parse-selector "^3.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" - integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== - -http-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" - integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - -https-proxy-agent@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" - integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== - dependencies: - agent-base "^7.0.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -immutable@~3.7.6: - version "3.7.6" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" - integrity sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-4.0.0.tgz#2710b8d66817d232e16f4166e319248d3d5492e2" - integrity sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^8.0.0: - version "8.2.6" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" - integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^6.0.1" - -internal-slot@^1.0.3, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.12.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@4.0.3, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-2.0.2.tgz#1c0884d3012c841556243483aa5d522f47396d2a" - integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== - dependencies: - tslib "^2.0.3" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-2.0.2.tgz#f1105ced1fe4de906a5f39553e7d3803fd804649" - integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== - dependencies: - tslib "^2.0.3" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-ws@5.0.0, isomorphic-ws@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" - integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== - -jiti@^1.17.1: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== - -jiti@^1.18.2: - version "1.19.1" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" - integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== - -jose@^4.11.4, jose@^4.14.4: - version "4.14.4" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.14.4.tgz#59e09204e2670c3164ee24cbfe7115c6f8bff9ca" - integrity sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g== - -jotai-optics@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/jotai-optics/-/jotai-optics-0.3.1.tgz#7ff38470551429460cc41d9cd1320193665354e0" - integrity sha512-KibUx9IneM2hGWGIYGs/v0KCxU985lg7W2c6dt5RodJCB2XPbmok8rkkLmdVk9+fKsn2shkPMi+AG8XzHgB3+w== - -jotai@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.4.2.tgz#85610d82d247a7b19de7cce82e8d3ddf007f8d4d" - integrity sha512-90jXVOd9h6gi5JXk558M+wnJfaaVN2WegcNOCfiFbWboNaDl6DkRgiY/K1oeqTfYJmq8yM7XPsL99LAvcOPqhw== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.0.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stable-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== - dependencies: - jsonify "^0.0.1" - -json-to-pretty-yaml@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" - integrity sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A== - dependencies: - remedial "^1.0.7" - remove-trailing-spaces "^1.0.6" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.4" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz" - integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -jwt-decode@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" - integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== - -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -listr2@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== - -lodash@^4.17.20, lodash@^4.17.21, lodash@~4.17.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -longest-streak@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" - integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-2.0.2.tgz#64c2324a2250bf7c37c5901e76a5b5309301160b" - integrity sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg== - dependencies: - tslib "^2.0.3" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -map-cache@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-from-markdown@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-phrasing@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" - integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== - dependencies: - "@types/mdast" "^3.0.0" - unist-util-is "^5.0.0" - -mdast-util-to-hast@^12.0.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-markdown@^1.0.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" - integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-phrasing "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -meros@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/meros/-/meros-1.3.0.tgz#c617d2092739d55286bf618129280f362e6242f2" - integrity sha512-2BNGOimxEz5hmjUG2FwoxCt5HN7BXdaWyFqEwxPTrJzVdABtrL4TiHTcsWSFAxPQ/tOnEaQEJh3qWq71QRMY+w== - -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== - -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -mini-svg-data-uri@^1.2.3: - version "1.4.4" - resolved "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz" - integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.3.tgz#b4dcece1d674dee104bb0fb833ebb85a78cbbca6" - integrity sha512-lIUdtK5hdofgCTu3aT0sOaHsYR37viUuIc0rwnnDXImbwFRcumyLMeZaM0t0I/fgxS6s6JMfu0rLD1Wz9pv1ng== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -ms@2.1.2, ms@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.4, nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-auth@^4.23.1: - version "4.23.1" - resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.23.1.tgz#7a82f5327cf4c7e32819da4eb977f2251a23c3cf" - integrity sha512-mL083z8KgRtlrIV6CDca2H1kduWJuK/3pTS0Fe2og15KOm4v2kkLGdSDfc2g+019aEBrJUT0pPW2Xx42ImN1WA== - dependencies: - "@babel/runtime" "^7.20.13" - "@panva/hkdf" "^1.0.2" - cookie "^0.5.0" - jose "^4.11.4" - oauth "^0.9.15" - openid-client "^5.4.0" - preact "^10.6.3" - preact-render-to-string "^5.1.19" - uuid "^8.3.2" - -next-themes@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" - integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== - -next@13.4.10: - version "13.4.10" - resolved "https://registry.npmjs.org/next/-/next-13.4.10.tgz" - integrity sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A== - dependencies: - "@next/env" "13.4.10" - "@swc/helpers" "0.5.1" - busboy "1.6.0" - caniuse-lite "^1.0.30001406" - postcss "8.4.14" - styled-jsx "5.1.1" - watchpack "2.4.0" - zod "3.21.4" - optionalDependencies: - "@next/swc-darwin-arm64" "13.4.10" - "@next/swc-darwin-x64" "13.4.10" - "@next/swc-linux-arm64-gnu" "13.4.10" - "@next/swc-linux-arm64-musl" "13.4.10" - "@next/swc-linux-x64-gnu" "13.4.10" - "@next/swc-linux-x64-musl" "13.4.10" - "@next/swc-win32-arm64-msvc" "13.4.10" - "@next/swc-win32-ia32-msvc" "13.4.10" - "@next/swc-win32-x64-msvc" "13.4.10" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@^2.6.1, node-fetch@^2.6.12: - version "2.6.13" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.13.tgz#a20acbbec73c2e09f9007de5cda17104122e0010" - integrity sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA== - dependencies: - whatwg-url "^5.0.0" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.12, node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -nullthrows@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" - integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== - -oauth@^0.9.15: - version "0.9.15" - resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1" - integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5" - integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== - dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -oidc-token-hash@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz#9a229f0a1ce9d4fc89bcaee5478c97a889e7b7b6" - integrity sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -openid-client@^5.4.0: - version "5.4.3" - resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.4.3.tgz#c75d2f6d07a25d383a72c8ff34605a36b7e2cd73" - integrity sha512-sVQOvjsT/sbSfYsQI/9liWQGVZH/Pp3rrtlGEwgk/bbHfrUDZ24DN57lAagIwFtuEu+FM9Ev7r85s8S/yPjimQ== - dependencies: - jose "^4.14.4" - lru-cache "^6.0.0" - object-hash "^2.2.0" - oidc-token-hash "^5.0.3" - -optics-ts@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/optics-ts/-/optics-ts-2.4.1.tgz#de94bda2b0ed7fde5b7631283031b9699459d40d" - integrity sha512-HaYzMHvC80r7U/LqAd4hQyopDezC60PO2qF5GuIwALut2cl5rK1VWHsqTp0oqoJJWjiv6uXKqsO+Q2OO0C3MmQ== - -optimism@^0.17.5: - version "0.17.5" - resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.17.5.tgz#a4c78b3ad12c58623abedbebb4f2f2c19b8e8816" - integrity sha512-TEcp8ZwK1RczmvMnvktxHSF2tKgMWjJ71xEFGX5ApLh67VsMSTy1ZUlipJw8W+KaqgOmQ+4pqwkeivY89j+4Vw== - dependencies: - "@wry/context" "^0.7.0" - "@wry/trie" "^0.4.3" - tslib "^2.3.0" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-limit@3.1.0, p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-filepath@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - integrity sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q== - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - integrity sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ== - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - integrity sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg== - dependencies: - path-root-regex "^0.1.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.11: - version "6.0.13" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@8.4.26, postcss@^8.4.23: - version "8.4.26" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz" - integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -preact-render-to-string@^5.1.19: - version "5.2.6" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604" - integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw== - dependencies: - pretty-format "^3.8.0" - -preact@^10.6.3: - version "10.17.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" - integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-format@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" - integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew== - -prismjs@^1.27.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -prismjs@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -property-information@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.3.0.tgz#ba4a06ec6b4e1e90577df9931286953cdf4282c3" - integrity sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg== - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pvtsutils@^1.3.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" - integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== - dependencies: - tslib "^2.6.1" - -pvutils@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" - integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-hook-form@^7.45.4: - version "7.45.4" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.45.4.tgz#73d228b704026ae95d7e5f7b207a681b173ec62a" - integrity sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ== - -react-is@^16.13.1, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-syntax-highlighter@^15.5.0: - version "15.5.0" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz#4b3eccc2325fa2ec8eff1e2d6c18fa4a9e07ab20" - integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.27.0" - refractor "^3.6.0" - -react@18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -refractor@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a" - integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.27.0" - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -relay-runtime@12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-12.0.0.tgz#1e039282bdb5e0c1b9a7dc7f6b9a09d4f4ff8237" - integrity sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug== - dependencies: - "@babel/runtime" "^7.0.0" - fbjs "^3.0.0" - invariant "^2.2.4" - -remark-html@^15.0.2: - version "15.0.2" - resolved "https://registry.yarnpkg.com/remark-html/-/remark-html-15.0.2.tgz#44ff77c876f037658b406662b5ce15e26ed34d80" - integrity sha512-/CIOI7wzHJzsh48AiuIyIe1clxVkUtreul73zcCXLub0FmnevQE0UMFDQm7NUx8/3rl/4zCshlMfqBdWScQthw== - dependencies: - "@types/mdast" "^3.0.0" - hast-util-sanitize "^4.0.0" - hast-util-to-html "^8.0.0" - mdast-util-to-hast "^12.0.0" - unified "^10.0.0" - -remark-parse@^10.0.0: - version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" - integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-stringify@^10.0.0: - version "10.0.3" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.3.tgz#83b43f2445c4ffbb35b606f967d121b2b6d69717" - integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.0.0" - unified "^10.0.0" - -remark@^14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/remark/-/remark-14.0.3.tgz#e477886a7579df612908f387c7753dc93cdaa3fc" - integrity sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew== - dependencies: - "@types/mdast" "^3.0.0" - remark-parse "^10.0.0" - remark-stringify "^10.0.0" - unified "^10.0.0" - -remedial@^1.0.7: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" - integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -remove-trailing-spaces@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.8.tgz#4354d22f3236374702f58ee373168f6d6887ada7" - integrity sha512-O3vsMYfWighyFbTd8hk8VaSj9UAGENxAtX+//ugIst2RMk5e03h6RoIS+0ylsFxY1gvmPuAY/PO4It+gPEeySA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-from@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -response-iterator@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/response-iterator/-/response-iterator-0.2.6.tgz#249005fb14d2e4eeb478a3f735a28fd8b4c9f3da" - integrity sha512-pVzEEzrsg23Sh053rmDUvLSkGXluZio0qu8VT6ukrYuvtjVfCbDZH9d6PGXb8HZfzdNZt8feXv/jvUzlhRgLnw== - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -scuid@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" - integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.7: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signedsource@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" - integrity sha512-6+eerH9fEnNmi/hyM1DXcRK3pWdoMQtlkQ+ns0ntzunjKqp5i3sKCc80ym8Fib3iaYhdJUOPdhlJWj1tvge2Ww== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -space-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" - integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== - -sponge-case@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sponge-case/-/sponge-case-1.0.1.tgz#260833b86453883d974f84854cdb63aecc5aef4c" - integrity sha512-dblb9Et4DAtiZ5YSUZHLl4XhH4uK80GhAZrVXdN4O2P4gQ40Wa5UIOPUHlA/nFd2PLblBZWUioLMMAVrgpoYcA== - dependencies: - tslib "^2.0.3" - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-env-interpolation@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz#ad4397ae4ac53fe6c91d1402ad6f6a52862c7152" - integrity sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -stringify-entities@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.33.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.33.0.tgz" - integrity sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swap-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-2.0.2.tgz#671aedb3c9c137e2985ef51c51f9e98445bf70d9" - integrity sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw== - dependencies: - tslib "^2.0.3" - -symbol-observable@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" - integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - -tailwindcss@3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz" - integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.2.12" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.18.2" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -title-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-3.0.3.tgz#bc689b46f02e411f1d1e1d081f7c3deca0489982" - integrity sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA== - dependencies: - tslib "^2.0.3" - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -ts-invariant@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" - integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== - dependencies: - tslib "^2.1.0" - -ts-log@^2.2.3: - version "2.2.5" - resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.2.5.tgz#aef3252f1143d11047e2cb6f7cfaac7408d96623" - integrity sha512-PGcnJoTBnVGy6yYNFxWVNkdcAuAMstvutN9MgDJIV6L0oG8fB+ZNNy1T+wJzah8RPGor1mZuPQkVfXNDpy9eHA== - -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== - -tslib@~2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typescript@5.1.6: - version "5.1.6" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" - integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== - -ua-parser-js@^1.0.35: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== - -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - -unixify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" - integrity sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg== - dependencies: - normalize-path "^2.1.1" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urlpattern-polyfill@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" - integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== - -urlpattern-polyfill@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz#bc7e386bb12fd7898b58d1509df21d3c29ab3460" - integrity sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - -value-or-promise@^1.0.11, value-or-promise@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" - integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== - -vfile-location@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" - integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== - dependencies: - "@types/unist" "^2.0.0" - vfile "^5.0.0" - -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - -watchpack@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -web-namespaces@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" - integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== - -web-streams-polyfill@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== - -webcrypto-core@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" - integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - asn1js "^3.0.1" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" - integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== - -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@8.13.0, ws@^8.12.0, ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@^0.0.43: - version "0.0.43" - resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz#e8a23e6fb4c38076ab92995c5dca33f3d3d7c9bb" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^2.1.1, yaml@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^15.3.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^17.0.0: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zen-observable-ts@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" - integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== - dependencies: - zen-observable "0.8.15" - -zen-observable@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" - integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== - -zod@3.21.4: - version "3.21.4" - resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz" - integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== - -zwitch@^2.0.0, zwitch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" - integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..fb57ccd13 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +