diff --git a/components/Chat/index.tsx b/components/Chat/Chat.tsx similarity index 80% rename from components/Chat/index.tsx rename to components/Chat/Chat.tsx index 52a6d7c2..9f199d97 100644 --- a/components/Chat/index.tsx +++ b/components/Chat/Chat.tsx @@ -1,10 +1,9 @@ import React, { useEffect, useState } from "react"; -import SourceDocuments from "./components/Answer/SourceDocuments"; -import StreamingAnswer from "./components/Answer/StreamingAnswer"; -import { StreamingMessage } from "./types/chat"; +import ChatResponse from "@/components/Chat/Response/Response"; +import { StreamingMessage } from "@/types/components/chat"; import { Work } from "@nulib/dcapi-types"; -import { prepareQuestion } from "../../lib/chat-helpers"; +import { prepareQuestion } from "@/lib/chat-helpers"; const Chat = ({ authToken, @@ -66,19 +65,15 @@ const Chat = ({ }; }, [chatSocket, chatSocket?.url]); + if (!question) return null; + return ( - <> -

{question}

- {question && ( - <> - - - - )} - + ); }; diff --git a/components/Chat/Response/Images.test.tsx b/components/Chat/Response/Images.test.tsx new file mode 100644 index 00000000..a7123d63 --- /dev/null +++ b/components/Chat/Response/Images.test.tsx @@ -0,0 +1,26 @@ +import { render, screen, waitFor } from "@testing-library/react"; + +import ResponseImages from "@/components/Chat/Response/Images"; +import { sampleWork1 } from "@/mocks/sample-work1"; +import { sampleWork2 } from "@/mocks/sample-work2"; + +describe("ResponseImages", () => { + it("renders the component", async () => { + const sourceDocuments = [sampleWork1, sampleWork2]; + + render(); + + sourceDocuments.forEach(async (doc) => { + // check that the item is not in the document on initial render + expect(screen.queryByText(`${doc?.title}`)).not.toBeInTheDocument(); + + // check that the items are in the document after 1 second + await waitFor( + () => { + expect(screen.getByText(`${doc?.title}`)).toBeInTheDocument(); + }, + { timeout: 1000 } + ); + }); + }); +}); diff --git a/components/Chat/Response/Images.tsx b/components/Chat/Response/Images.tsx new file mode 100644 index 00000000..8a1d1a5f --- /dev/null +++ b/components/Chat/Response/Images.tsx @@ -0,0 +1,29 @@ +import { useEffect, useState } from "react"; + +import GridItem from "@/components/Grid/Item"; +import { StyledImages } from "@/components/Chat/Response/Response.styled"; +import { Work } from "@nulib/dcapi-types"; + +const ResponseImages = ({ sourceDocuments }: { sourceDocuments: Work[] }) => { + const [nextIndex, setNextIndex] = useState(0); + + useEffect(() => { + if (nextIndex < sourceDocuments.length) { + const timer = setTimeout(() => { + setNextIndex(nextIndex + 1); + }, 382); + + return () => clearTimeout(timer); + } + }, [nextIndex, sourceDocuments.length]); + + return ( + + {sourceDocuments.slice(0, nextIndex).map((document: Work) => ( + + ))} + + ); +}; + +export default ResponseImages; diff --git a/components/Chat/Response/Response.styled.tsx b/components/Chat/Response/Response.styled.tsx new file mode 100644 index 00000000..8493dd04 --- /dev/null +++ b/components/Chat/Response/Response.styled.tsx @@ -0,0 +1,123 @@ +import { keyframes, styled } from "@/stitches.config"; + +/* eslint sort-keys: 0 */ + +const CursorKeyframes = keyframes({ + "50%": { + opacity: 0, + }, +}); + +const StyledResponse = styled("section", { + display: "flex", + position: "relative", + gap: "$gr5", + zIndex: "0", + margin: "0 $gr4", + + "@xl": { + margin: "0 $gr4", + }, + + "@lg": { + margin: "0", + }, +}); + +const StyledResponseAside = styled("aside", { + // background: "linear-gradient(7deg, $white 0%, $gray6 100%)", + width: "38.2%", + flexShrink: 0, + borderRadius: "inherit", + borderTopLeftRadius: "unset", + borderBottomLeftRadius: "unset", +}); + +const StyledResponseContent = styled("div", { + width: "61.8%", + flexGrow: 0, +}); + +const StyledResponseWrapper = styled("div", { + background: + "linear-gradient(0deg, $white calc(100% - 100px), $brightBlueB calc(100% + 100px))", + padding: "$gr6 0 $gr4", +}); + +const StyledImages = styled("div", { + display: "flex", + flexDirection: "row", + flexWrap: "wrap", + gap: "$gr4", + + "> div": { + width: "calc(33% - 20px)", + + "&:nth-child(1)": { + width: "calc(66% - 10px)", + }, + + figure: { + padding: "0", + + "> div": { + boxShadow: "5px 5px 13px rgba(0, 0, 0, 0.25)", + }, + + figcaption: { + "span:first-of-type": { + textOverflow: "ellipsis", + display: "-webkit-box", + WebkitLineClamp: "3", + WebkitBoxOrient: "vertical", + overflow: "hidden", + }, + }, + }, + }, +}); + +const StyledQuestion = styled("h3", { + fontFamily: "$northwesternDisplayBold", + fontWeight: "400", + fontSize: "$gr6", + lineHeight: "1.35em", + margin: "0", + padding: "0 0 $gr3 0", + color: "$black", +}); + +const StyledStreamedAnswer = styled("article", { + fontSize: "$gr3", + lineHeight: "1.7em", + + strong: { + fontWeight: "400", + fontFamily: "$northwesternSansBold", + }, + + "span.markdown-cursor": { + position: "relative", + marginLeft: "$gr1", + + "&::before": { + content: '""', + position: "absolute", + top: "-5px", + width: "9px", + height: "1.38em", + backgroundColor: "$black20", + animation: `${CursorKeyframes} 1s linear infinite`, + }, + }, +}); + +export { + StyledResponse, + StyledResponseAside, + StyledResponseContent, + StyledResponseWrapper, + StyledImages, + StyledQuestion, + StyledStreamedAnswer, +}; diff --git a/components/Chat/Response/Response.tsx b/components/Chat/Response/Response.tsx new file mode 100644 index 00000000..3ee18d9f --- /dev/null +++ b/components/Chat/Response/Response.tsx @@ -0,0 +1,55 @@ +import { + StyledQuestion, + StyledResponse, + StyledResponseAside, + StyledResponseContent, + StyledResponseWrapper, +} from "./Response.styled"; + +import BouncingLoader from "@/components/Shared/BouncingLoader"; +import Container from "@/components/Shared/Container"; +import React from "react"; +import ResponseImages from "@/components/Chat/Response/Images"; +import ResponseStreamedAnswer from "@/components/Chat/Response/StreamedAnswer"; +import { Work } from "@nulib/dcapi-types"; + +interface ChatResponseProps { + isStreamingComplete: boolean; + question: string; + sourceDocuments: Work[]; + streamedAnswer?: string; +} + +const ChatResponse: React.FC = ({ + isStreamingComplete, + question, + sourceDocuments, + streamedAnswer, +}) => { + return ( + + + + + {question} + {streamedAnswer ? ( + + ) : ( + + )} + + {sourceDocuments.length > 0 && ( + + + + )} + + + + ); +}; + +export default ChatResponse; diff --git a/components/Chat/Response/StreamedAnswer.tsx b/components/Chat/Response/StreamedAnswer.tsx new file mode 100644 index 00000000..91411c12 --- /dev/null +++ b/components/Chat/Response/StreamedAnswer.tsx @@ -0,0 +1,20 @@ +import React from "react"; +import { StyledStreamedAnswer } from "@/components/Chat/Response/Response.styled"; +import useMarkdown from "@/hooks/useMarkdown"; + +const ResponseStreamedAnswer = ({ + isStreamingComplete, + streamedAnswer, +}: { + isStreamingComplete: boolean; + streamedAnswer: string; +}) => { + const { jsx: content } = useMarkdown({ + hasCursor: !isStreamingComplete, + markdown: streamedAnswer, + }); + + return {content}; +}; + +export default ResponseStreamedAnswer; diff --git a/components/Chat/components/Wrapper.tsx b/components/Chat/Wrapper.tsx similarity index 54% rename from components/Chat/components/Wrapper.tsx rename to components/Chat/Wrapper.tsx index 6b2c81e0..f579a8e5 100644 --- a/components/Chat/components/Wrapper.tsx +++ b/components/Chat/Wrapper.tsx @@ -1,5 +1,5 @@ -import Chat from "@/components/Chat"; -import useChatSocket from "../../../hooks/useChatSocket"; +import Chat from "@/components/Chat/Chat"; +import useChatSocket from "@/hooks/useChatSocket"; import useQueryParams from "@/hooks/useQueryParams"; const ChatWrapper = () => { @@ -9,9 +9,7 @@ const ChatWrapper = () => { if (!authToken || !chatSocket || !question) return null; return ( -
- -
+ ); }; diff --git a/components/Chat/components/Answer/Answer.styled.tsx b/components/Chat/components/Answer/Answer.styled.tsx deleted file mode 100644 index 7de21fba..00000000 --- a/components/Chat/components/Answer/Answer.styled.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import * as Accordion from "@radix-ui/react-accordion"; - -import { AnswerTooltip } from "./Information"; -import { styled } from "@/stitches.config"; - -/* eslint sort-keys: 0 */ - -const StyledActions = styled("div", { - display: "flex", - paddingLeft: "$gr5", -}); - -const StyledRemoveButton = styled("button", { - background: "transparent", - border: "none", - cursor: "pointer", - fontFamily: "$northwesternSansRegular", - fontSize: "$gr2", - padding: "0", - - svg: { - fill: "$black50 !important", - transition: "opacity 0.2s ease-in-out", - }, - - "&:active, &:hover": { - svg: { - opacity: "1 !important", - fill: "$brightRed !important", - }, - }, -}); - -const StyledAnswerHeader = styled(Accordion.Header, { - margin: "$gr2 0", - display: "flex", - justifyContent: "space-between", - alignItems: "flex-start", - - button: { - background: "transparent !important", - border: "none", - cursor: "pointer", - margin: "0", - padding: "0", - color: "$black !important", - fontSize: "$gr5 !important", - fontFamily: "$northwesternSansBold !important", - textAlign: "left", - - "&:hover": { - color: "$brightBlueB !important", - }, - }, -}); - -const StyledAnswerItem = styled(Accordion.Item, { - "&::after": { - content: "", - display: "block", - height: "1px", - margin: "$gr3 0", - width: "100%", - backgroundColor: "$gray6", - }, - - [`&[data-state=closed] ${StyledAnswerHeader}`]: { - [`button`]: { - fontFamily: "$northwesternSansRegular !important", - color: "$black50 !important", - - "&:hover": { - color: "$brightBlueB !important", - }, - }, - - [`& ${AnswerTooltip}`]: { - display: "none", - cursor: "default", - }, - }, - - "&:hover button svg": { - opacity: "1", - }, -}); - -export { - StyledActions, - StyledAnswerHeader, - StyledAnswerItem, - StyledRemoveButton, -}; diff --git a/components/Chat/components/Answer/Card.tsx b/components/Chat/components/Answer/Card.tsx deleted file mode 100644 index 3015ca76..00000000 --- a/components/Chat/components/Answer/Card.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import AnswerCertainty from "./Certainity"; -import { DCAPI_PRODUCTION_ENDPOINT } from "@/lib/constants/endpoints"; -import Image from "next/image"; -import Link from "next/link"; -import React from "react"; -import { styled } from "@/stitches.config"; - -export interface AnswerCardProps { - metadata: any; - page_content: string; -} - -const AnswerCard: React.FC = ({ metadata, page_content }) => { - const { _additional, source, work_type } = metadata; - const dcLink = `https://dc.library.northwestern.edu/items/${source}`; - const thumbnail = `${DCAPI_PRODUCTION_ENDPOINT}/works/${source}/thumbnail?aspect=square`; - - return ( - -
- - {page_content} - {_additional?.certainty && ( - - )} - - -
- {page_content} - {work_type} -
-
-
-
- ); -}; - -/* eslint sort-keys: 0 */ - -const ImageWrapper = styled("div", { - backgroundColor: "$gray6", - borderRadius: "5px", - height: "$gr8", - width: "$gr8", - position: "relative", - - img: { - color: "transparent", - borderRadius: "6px", - }, -}); - -const Context = styled("div", { - padding: "$gr2 0", - display: "flex", - justifyContent: "space-between", -}); - -const StyledAnswerCard = styled(Link, { - figcaption: { - width: "$gr8", - span: { - color: "$black50 !important", - display: "block", - fontSize: "$gr2", - whiteSpace: "wrap", - }, - - strong: { - color: "$black", - display: "block", - fontFamily: "$northwesternSansBold", - fontWeight: "400", - marginBottom: "3px", - }, - }, - - figure: { - margin: 0, - padding: 0, - }, -}); - -export default AnswerCard; diff --git a/components/Chat/components/Answer/Certainity.tsx b/components/Chat/components/Answer/Certainity.tsx deleted file mode 100644 index 089f67fd..00000000 --- a/components/Chat/components/Answer/Certainity.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import { styled } from "@/stitches.config"; - -const AnswerCertainty = ({ amount }: { amount: number }) => { - return ( - {Math.floor(amount * 100)}% - ); -}; - -/* eslint sort-keys: 0 */ - -const StyledAnswerCertainty = styled("span", { - backgroundColor: "$white", - color: "$brightBlueB", - display: "flex", - fontFamily: "$northwesternSerifBold", - fontSize: "$gr2", - lineHeight: "1", - padding: "$gr1", - position: "absolute", - borderTopLeftRadius: "5px", - borderBottomRightRadius: "5px", - border: "1px solid $gray6", - right: "0", - bottom: "0", -}); - -export default AnswerCertainty; diff --git a/components/Chat/components/Answer/Information.tsx b/components/Chat/components/Answer/Information.tsx deleted file mode 100644 index ab13f902..00000000 --- a/components/Chat/components/Answer/Information.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import * as Tooltip from "@radix-ui/react-tooltip"; - -import React from "react"; -import { styled } from "@/stitches.config"; - -interface AnswerInformationProps { - timestamp: number; -} - -export const generativeAIWarning = `The answers and provided links are generated using chatGPT and metadata from Northwestern University Libraries Digital Collections. This is an experiment and results may be inaccurate, irrelevant, or potentially harmful.`; - -export const AnswerInformation: React.FC = ({ - timestamp, -}) => { - const date = new Date(timestamp); - const timeZone = Intl.DateTimeFormat()?.resolvedOptions()?.timeZone; - const answerDate = date.toLocaleDateString("en-US", { - year: "numeric", - month: "long", - day: "numeric", - hour: "numeric", - minute: "numeric", - timeZoneName: "short", - timeZone: timeZone ? timeZone : "America/Chicago", - }); - - return ( - - - - - About this Answer - - - - - - {generativeAIWarning} - Answered on {answerDate} - - - - - - - ); -}; - -/* eslint sort-keys: 0 */ - -export const AnswerTooltip = styled("span", { - display: "inline-block", - background: "transparent", - border: "none", - cursor: "help", - fontFamily: "$northwesternSansRegular", - fontSize: "$gr2 !important", - padding: "1px 0", - margin: "0 $gr2 0 0", - textDecoration: "none", - borderBottom: "1px dotted $black20", - lineHeight: "1em", - alignSelf: "center", - color: "$black50", - whiteSpace: "nowrap", - opacity: "1", - - "&:active, &:hover": { - color: "$brightBlueB !important", - borderColor: "$brightBlueB", - }, -}); - -export const AnswerTooltipArrow = styled(Tooltip.Arrow, { - fill: "$brightBlueB", -}); - -export const AnswerTooltipContent = styled("div", { - background: "$white", - boxShadow: "0 13px 21px 0 rgba(0, 0, 0, 0.13)", - width: "450px", - lineHeight: "1.5em", - fontSize: "$gr2 !important", - fontFamily: "$northwesternSansRegular", - padding: "$gr3", - borderRadius: "6px", - borderTop: "2px solid $brightBlueB", - - em: { - color: "$black50", - marginTop: "$gr1", - display: "block", - fontSize: "$gr1", - }, -}); - -export default AnswerInformation; diff --git a/components/Chat/components/Answer/SourceDocuments.tsx b/components/Chat/components/Answer/SourceDocuments.tsx deleted file mode 100644 index 2589c381..00000000 --- a/components/Chat/components/Answer/SourceDocuments.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from "react"; -import { Work } from "@nulib/dcapi-types"; -import { styled } from "@/stitches.config"; - -interface SourceDocumentsProps { - source_documents: Work[]; -} - -const SourceDocuments: React.FC = ({ - source_documents, -}) => { - return ( - - {/* eslint-disable-next-line @typescript-eslint/no-unused-vars */} - {source_documents.map((document, idx) => ( -
- {document.title} - -
- // - ))} -
- ); -}; - -const Sources = styled("div", { - display: "flex", - gap: "$gr4", - overflowX: "scroll", - padding: "$gr3 0 0", -}); - -export default SourceDocuments; diff --git a/components/Chat/components/Answer/StreamingAnswer.tsx b/components/Chat/components/Answer/StreamingAnswer.tsx deleted file mode 100644 index 65361f3b..00000000 --- a/components/Chat/components/Answer/StreamingAnswer.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useRef } from "react"; - -import { keyframes } from "@/stitches.config"; -import { styled } from "@stitches/react"; - -const StreamingAnswer = ({ - answer, - isComplete, -}: { - answer: string; - isComplete: boolean; -}) => { - const answerElement = useRef(null); - - return ( - - {answer} - {!isComplete && } - - ); -}; - -/* eslint sort-keys: 0 */ - -const Answer = styled("article", { - fontSize: "$gr3", - fontFamily: "$northwesternSerifRegular !important", - lineHeight: "1.76em", - margin: "$gr3 0 $gr2", -}); - -const Blinker = keyframes({ - "50%": { - opacity: 0, - }, -}); - -const Cursor = styled("span", { - position: "relative", - marginLeft: "$gr1", - - "&::before": { - content: '""', - position: "absolute", - width: "10px", - height: "1.4em", - backgroundColor: "$black20", - animation: `${Blinker} 1s linear infinite`, - }, -}); - -export default StreamingAnswer; diff --git a/components/Chat/components/Feedback/Prompt.tsx b/components/Chat/components/Feedback/Prompt.tsx deleted file mode 100644 index b2cd388a..00000000 --- a/components/Chat/components/Feedback/Prompt.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react"; -import { styled } from "@/stitches.config"; - -const FeedbackPrompt = () => { - return ( - -

- Do you have questions or feedback regarding these results?{" "} - Let us know. -

-
- ); -}; - -/* eslint sort-keys: 0 */ - -const StyledFeedbackPrompt = styled("div", { - fontSize: "$gr2", - fontFamily: "$northwesternSansRegular !important", - textAlign: "center", - color: "$black80", - padding: "$gr3 0", - - "a, a:visited": { - textDecoration: "underline", - color: "$black80", - }, -}); - -export default FeedbackPrompt; diff --git a/components/Chat/components/History/Dialog.tsx b/components/Chat/components/History/Dialog.tsx deleted file mode 100644 index ba2acfc4..00000000 --- a/components/Chat/components/History/Dialog.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react"; - -const HistoryDialog = () => { - return <>; -}; - -export default HistoryDialog; diff --git a/components/Chat/components/Question/Input.tsx b/components/Chat/components/Question/Input.tsx deleted file mode 100644 index 7fc26ab8..00000000 --- a/components/Chat/components/Question/Input.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, { useState } from "react"; - -import { Icon } from "@nulib/design-system"; -import { IconArrowForward } from "@/components/Shared/SVG/Icons"; -import { styled } from "@stitches/react"; - -const QuestionInput = ({ - onQuestionSubmission, -}: { - onQuestionSubmission: (question: string) => void; -}) => { - const [question, setQuestion] = useState(""); - - const handleInputChange = (event: React.ChangeEvent) => { - setQuestion(event.target.value); - }; - - const handleQuestionSubmission = ( - event: React.FormEvent - ) => { - event.preventDefault(); - event.stopPropagation(); - onQuestionSubmission(question); - - // @ts-ignore - event.target.reset(); - }; - - return ( - - - - - ); -}; - -/* eslint sort-keys: 0 */ - -const StyledQuestionInput = styled("form", { - backgroundColor: "$white", - display: "flex", - position: "relative", - border: "1px solid $gray6", - borderBottom: "none", - boxShadow: "0 13px 21px 0 rgba(0, 0, 0, 0.13)", - margin: "0 0 $gr4", - borderRadius: "8px", - - svg: { - height: "$gr3", - color: "$brightBlueB", - }, - - input: { - flexGrow: 1, - outlineColor: "$brightBlueB", - }, - - button: { - position: "absolute", - right: "0", - cursor: "pointer", - fontFamily: "$northwesternSansBold !important", - }, - - "input, button": { - background: "transparent", - border: "none", - color: "$black80", - fontFamily: "$northwesternSansRegular", - fontSize: "$gr4", - padding: "$gr3 $gr4", - }, -}); - -export default QuestionInput; diff --git a/components/Chat/components/SVG/History.tsx b/components/Chat/components/SVG/History.tsx deleted file mode 100644 index 3e538b5d..00000000 --- a/components/Chat/components/SVG/History.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from "react"; - -const SVGHistory = () => { - return ( - <> - - - - - - - - ); -}; - -export default SVGHistory; diff --git a/components/Chat/fixtures/mock-answer.ts b/components/Chat/fixtures/mock-answer.ts deleted file mode 100644 index 4ddb5f45..00000000 --- a/components/Chat/fixtures/mock-answer.ts +++ /dev/null @@ -1,236 +0,0 @@ -// @ts-ignore - -interface MockAnswerShape { - answer: string; - question: string; - sources: any; - source_documents: any; -} - -/* eslint sort-keys: 0 */ - -const mockAnswer: MockAnswerShape = { - answer: - "There are no videos of Northwestern University playing against Michigan State. \n", - question: - "Are there any videos of Northwestern University playing against Michigan State?", - source_documents: [ - { - page_content: - "Northwestern vs. Michigan/Northwestern vs. Minnesota/Northwestern vs. Michigan State", - _additional: { - certainty: 0.8492068648338318, - }, - metadata: { - alternate_title: null, - contributor: [ - "Paynter, John P.", - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Northwestern University (Evanston, Ill.)", - "Friedmann, Pete", - "Lonis, Dale", - "Williams, Clifton, 1923-1976", - "Paynter, John P.", - "Jones, Quincy, 1933-", - "Owens, Don (Don D.)", - ], - create_date: "2022-02-21T22:16:02.505726Z", - creator: null, - date_created: [ - "October 23, 1982", - "October 9, 1982", - "November 6, 1982", - ], - description: [ - 'Three performances by the Northwestern University Marching Band during the 1982 season. First, the Northwestern University Marching Band performs at the Northwestern Wildcats\' game against the Michigan Wolverines at Dyche Stadium in Evanston, Illinois. Conducted by Dale Lonis, pregame performances include the National Anthem, "America the Beautiful," "42nd Street," and "Go U Northwestern." Halftime performances include "New York, New York," "Give My Regards to Broadway," "On Broadway," "Somewhere," and "Alma Mater. Postgame performances include "Hail to the Victors," "Go U Northwestern," "Sinfonians," "42nd Street," and "Alma Mater." Footage of the end of the Northwestern Wildcats\' game against the Minnesota Gophers at Dyche Stadium in Evanston, Illinois follow. The Northwestern University Marching Band then performs a postgame show including "Go U Northwestern" and "Minnesota Rouser." The NUMB alums join the band to perform "When the Saints Go Marching In." The final performances are from a Northwestern Wildcats game against the Michigan State Spartans in East Lansing, Michigan. Pregame selections from Northwestern include "MSU Fight Song" and "Go U Northwestern. The Spartan Marching Band performs "MSU Fight Song," "Only Time Will Tell," "Go U Northwestern," "MSU Shadows," and "God Bless America." John P. Paynter then conducts the National Anthem. Northwestern\'s halftime performance was space-themed and included "Space Invaders" and "Go U Northwestern." Local high school bands join the Spartan Marching Band for a halftime performance that includes "Even the Nights Are Better," "Ai No Corrida," "Through the Years," and the "MSU Fight Song." Scenes from a Northwestern Marching Band practice at Dyche Stadium follow the game against Michigan State.', - ], - genre: ["VHS"], - identifier: "7746ddbb-eb5b-4177-b4aa-c65de6eba2e9", - keywords: null, - language: ["English"], - location: null, - physical_description_material: null, - physical_description_size: null, - scope_and_contents: null, - source: - "https://dc.library.northwestern.edu/items/7746ddbb-eb5b-4177-b4aa-c65de6eba2e9", - style_period: null, - subject: [ - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Music", - "Marching bands", - "Conductors (Music)", - "Band directors", - "University of Michigan", - "Michigan Wolverines (Football team)", - "Michigan State University", - "Michigan State Spartans (Football team)", - "Michigan--East Lansing", - "Illinois--Evanston", - "Ryan Field (Evanston, Ill.)", - "Northwestern University (Evanston, Ill.)", - "Northwestern Wildcats (Football team)", - "Michigan State University. Spartan Marching Band", - ], - table_of_contents: null, - technique: null, - work_type: "Video", - }, - }, - { - page_content: "Northwestern University Marching Band Highlights", - _additional: { - certainty: 0.8492068648338318, - }, - metadata: { - alternate_title: null, - contributor: [ - "Paynter, John P.", - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Northwestern University (Evanston, Ill.)", - "Paynter, John P.", - ], - create_date: "2022-01-25T17:21:28.787425Z", - creator: null, - date_created: ["1958"], - description: [ - "The Northwestern University Marching Band, conducted by John P. Paynter, performs pregame and halftime selections during Northwestern University's football game against Purdue University. The Northwestern University vs. Purdue game was broadcast on WNBQ. Later footage is of the Northwestern University Marching Band's performance during Northwestern University's football against Stanford University.", - ], - genre: ["16mm (photographic film size)"], - identifier: "ed9b77e2-7928-47c0-b12b-2f3fc0cff3bc", - keywords: null, - language: null, - location: null, - physical_description_material: null, - physical_description_size: ["16mm"], - scope_and_contents: null, - source: - "https://dc.library.northwestern.edu/items/ed9b77e2-7928-47c0-b12b-2f3fc0cff3bc", - style_period: null, - subject: [ - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Music", - "Marching bands", - "Conductors (Music)", - "Band directors", - "Purdue Boilermakers (Football team)", - "Purdue University", - "Ryan Field (Evanston, Ill.)", - "Northwestern Wildcats (Football team)", - "Northwestern University (Evanston, Ill.)", - "Stanford University", - "Stanford Cardinal (Football team)", - ], - table_of_contents: null, - technique: null, - work_type: "Video", - }, - }, - { - page_content: "Northwestern University vs. Illinois", - _additional: { - certainty: 0.8492068648338318, - }, - metadata: { - alternate_title: null, - contributor: [ - "Paynter, John P.", - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Northwestern University (Evanston, Ill.)", - "Paynter, John P.", - ], - create_date: "2022-01-25T17:21:16.866290Z", - creator: null, - date_created: ["1957"], - description: [ - "The Northwestern University Marching Band, conducted by John P. Paynter, performs during Northwestern University's football game against the University of Illinois at Urbana-Champaign, Illinois. Footage also includes baton twirling by the brother and sister act of Roger and Barbara Kurucz. Also included are scenes of the NU Marching Band boarding buses in Evanston, traveling to Urbana-Champaign, and practicing for the performance. Selections from another game are included after the Northwestern University vs. Illinois game.", - ], - genre: ["16mm (photographic film size)"], - identifier: "5e741755-673e-477f-b4e6-16acf1f4cbe8", - keywords: null, - language: null, - location: null, - physical_description_material: null, - physical_description_size: ["16mm"], - scope_and_contents: null, - source: - "https://dc.library.northwestern.edu/items/5e741755-673e-477f-b4e6-16acf1f4cbe8", - style_period: null, - subject: [ - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Music", - "Marching bands", - "Conductors (Music)", - "Band directors", - "Fighting Illini (Football team)", - "University of Illinois at Urbana-Champaign", - "Illinois--Champaign", - "Northwestern Wildcats (Football team)", - "Northwestern University (Evanston, Ill.)", - ], - table_of_contents: null, - technique: null, - work_type: "Video", - }, - }, - { - page_content: "Northwestern vs. Illinois", - _additional: { - certainty: 0.8492068648338318, - }, - metadata: { - alternate_title: null, - contributor: [ - "Paynter, John P.", - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Northwestern University (Evanston, Ill.)", - "Friedmann, Pete", - ], - create_date: "2022-02-09T14:59:42.744821Z", - creator: null, - date_created: ["November 21, 1981"], - description: [ - 'Northwestern University Marching Band performs at the Northwestern Wildcats\' game against the Fighting Illini at Dyche Stadium in Evanston, Illinois. The pregame performances include "America the Beautiful," the National Anthem, "Illinois Loyalty," "Sinfonians," and "Go U Northwestern." After the pregame show, two performances of "Alma Mater" are recorded. The second performance appears to be from the Northwestern vs. Illinois game on November 21, 1981. ', - ], - genre: ["Super 8"], - identifier: "1f825787-bf84-4a94-b8cb-dae58f66776d", - keywords: null, - language: ["English"], - location: null, - physical_description_material: null, - physical_description_size: null, - scope_and_contents: null, - source: - "https://dc.library.northwestern.edu/items/1f825787-bf84-4a94-b8cb-dae58f66776d", - style_period: null, - subject: [ - "Northwestern University (Evanston, Ill.). Marching Band", - "Northwestern University (Evanston, Ill.). School of Music", - "Music", - "Marching bands", - "Conductors (Music)", - "Band directors", - "Fighting Illini (Football team)", - "University of Illinois at Urbana-Champaign", - "Ryan Field (Evanston, Ill.)", - "Northwestern Wildcats (Football team)", - "Northwestern University (Evanston, Ill.)", - ], - table_of_contents: null, - technique: null, - work_type: "Video", - }, - }, - ], - sources: - "N/A (The sources list videos of Northwestern playing against other schools, but not Michigan State.)", -}; - -export default mockAnswer; diff --git a/components/Chat/hooks/useEventCallback.ts b/components/Chat/hooks/useEventCallback.ts deleted file mode 100644 index 1afdef5b..00000000 --- a/components/Chat/hooks/useEventCallback.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useCallback, useRef } from "react"; - -import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect"; - -export function useEventCallback( - fn: (...args: Args) => R -) { - const ref = useRef(() => { - throw new Error("Cannot call an event handler while rendering."); - }); - - useIsomorphicLayoutEffect(() => { - ref.current = fn; - }, [fn]); - - return useCallback((...args: Args) => ref.current(...args), [ref]); -} diff --git a/components/Chat/hooks/useEventListener.ts b/components/Chat/hooks/useEventListener.ts deleted file mode 100644 index d0ac9bb1..00000000 --- a/components/Chat/hooks/useEventListener.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { RefObject, useEffect, useRef } from "react"; - -import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect"; - -// MediaQueryList Event based useEventListener interface -function useEventListener( - eventName: K, - handler: (event: MediaQueryListEventMap[K]) => void, - element: RefObject, - options?: AddEventListenerOptions | boolean -): void; - -// Window Event based useEventListener interface -function useEventListener( - eventName: K, - handler: (event: WindowEventMap[K]) => void, - element?: undefined, - options?: AddEventListenerOptions | boolean -): void; - -// Element Event based useEventListener interface -function useEventListener< - K extends keyof HTMLElementEventMap, - T extends HTMLElement = HTMLDivElement ->( - eventName: K, - handler: (event: HTMLElementEventMap[K]) => void, - element: RefObject, - options?: AddEventListenerOptions | boolean -): void; - -// Document Event based useEventListener interface -function useEventListener( - eventName: K, - handler: (event: DocumentEventMap[K]) => void, - element: RefObject, - options?: AddEventListenerOptions | boolean -): void; - -function useEventListener< - KW extends keyof WindowEventMap, - KH extends keyof HTMLElementEventMap, - KM extends keyof MediaQueryListEventMap, - T extends HTMLElement | MediaQueryList | void = void ->( - eventName: KH | KM | KW, - handler: ( - event: - | Event - | HTMLElementEventMap[KH] - | MediaQueryListEventMap[KM] - | WindowEventMap[KW] - ) => void, - element?: RefObject, - options?: AddEventListenerOptions | boolean -) { - // Create a ref that stores handler - const savedHandler = useRef(handler); - - useIsomorphicLayoutEffect(() => { - savedHandler.current = handler; - }, [handler]); - - useEffect(() => { - // Define the listening target - const targetElement: T | Window = element?.current ?? window; - - if (!(targetElement && targetElement.addEventListener)) return; - - // Create event listener that calls handler function stored in ref - const listener: typeof handler = (event) => savedHandler.current(event); - - targetElement.addEventListener(eventName, listener, options); - - // Remove event listener on cleanup - return () => { - targetElement.removeEventListener(eventName, listener, options); - }; - }, [eventName, element, options]); -} - -export { useEventListener }; diff --git a/components/Chat/hooks/useIsomorphicLayoutEffect.ts b/components/Chat/hooks/useIsomorphicLayoutEffect.ts deleted file mode 100644 index ea6a0bc0..00000000 --- a/components/Chat/hooks/useIsomorphicLayoutEffect.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { useEffect, useLayoutEffect } from "react"; - -export const useIsomorphicLayoutEffect = - typeof window !== "undefined" ? useLayoutEffect : useEffect; diff --git a/components/Chat/hooks/useLocalStorage.ts b/components/Chat/hooks/useLocalStorage.ts deleted file mode 100644 index b339524d..00000000 --- a/components/Chat/hooks/useLocalStorage.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - Dispatch, - SetStateAction, - useCallback, - useEffect, - useState, -} from "react"; - -import { useEventCallback } from "./useEventCallback"; -import { useEventListener } from "./useEventListener"; - -declare global { - interface WindowEventMap { - "local-storage": CustomEvent; - } -} - -type SetValue = Dispatch>; - -export function useLocalStorage( - key: string, - initialValue: T -): [T, SetValue] { - // Get from local storage then - // parse stored json or return initialValue - const readValue = useCallback((): T => { - // Prevent build error "window is undefined" but keeps working - if (typeof window === "undefined") { - return initialValue; - } - - try { - const item = window.localStorage.getItem(key); - return item ? (parseJSON(item) as T) : initialValue; - } catch (error) { - console.warn(`Error reading localStorage key “${key}”:`, error); - return initialValue; - } - }, [initialValue, key]); - - // State to store our value - // Pass initial state function to useState so logic is only executed once - const [storedValue, setStoredValue] = useState(readValue); - - // Return a wrapped version of useState's setter function that ... - // ... persists the new value to localStorage. - const setValue: SetValue = useEventCallback((value) => { - // Prevent build error "window is undefined" but keeps working - if (typeof window === "undefined") { - console.warn( - `Tried setting localStorage key “${key}” even though environment is not a client` - ); - } - - try { - // Allow value to be a function so we have the same API as useState - const newValue = value instanceof Function ? value(storedValue) : value; - - // Save to local storage - window.localStorage.setItem(key, JSON.stringify(newValue)); - - // Save state - setStoredValue(newValue); - - // We dispatch a custom event so every useLocalStorage hook are notified - window.dispatchEvent(new Event("local-storage")); - } catch (error) { - console.warn(`Error setting localStorage key “${key}”:`, error); - } - }); - - useEffect(() => { - setStoredValue(readValue()); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const handleStorageChange = useCallback( - (event: CustomEvent | StorageEvent) => { - if ((event as StorageEvent)?.key && (event as StorageEvent).key !== key) { - return; - } - setStoredValue(readValue()); - }, - [key, readValue] - ); - - // this only works for other documents, not the current one - useEventListener("storage", handleStorageChange); - - // this is a custom event, triggered in writeValueToLocalStorage - // See: useLocalStorage() - useEventListener("local-storage", handleStorageChange); - - return [storedValue, setValue]; -} - -// A wrapper for "JSON.parse()"" to support "undefined" value -function parseJSON(value: string | null): T | undefined { - try { - return value === "undefined" ? undefined : JSON.parse(value ?? ""); - } catch { - console.log("parsing error on", { value }); - return undefined; - } -} diff --git a/components/Chat/hooks/useLocalStorageSimple.tsx b/components/Chat/hooks/useLocalStorageSimple.tsx deleted file mode 100644 index 8215eb2e..00000000 --- a/components/Chat/hooks/useLocalStorageSimple.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -function useLocalStorageSimple( - storageKey: string, - fallbackState: T -): [T, React.Dispatch>] { - const [value, setValue] = React.useState( - // @ts-ignore - JSON.parse(localStorage.getItem(storageKey)) ?? fallbackState - ); - - React.useEffect(() => { - localStorage.setItem(storageKey, JSON.stringify(value)); - }, [value, storageKey]); - - return [value, setValue]; -} - -export default useLocalStorageSimple; diff --git a/components/Search/GenerativeAIToggle.tsx b/components/Search/GenerativeAIToggle.tsx index 6253bd9e..9b459c14 100644 --- a/components/Search/GenerativeAIToggle.tsx +++ b/components/Search/GenerativeAIToggle.tsx @@ -19,10 +19,11 @@ import GenerativeAIDialog from "@/components/Shared/Dialog"; import { IconCheck } from "@/components/Shared/SVG/Icons"; import { IconInfo } from "@/components/Shared/SVG/Icons"; import React from "react"; -import { generativeAIWarning } from "@/components/Chat/components/Answer/Information"; import useGenerativeAISearchToggle from "@/hooks/useGenerativeAISearchToggle"; function GenerativeAITooltip() { + const generativeAIWarning = `The answers and provided links are generated using chatGPT and metadata from Northwestern University Libraries Digital Collections. This is an experiment and results may be inaccurate, irrelevant, or potentially harmful.`; + return ( diff --git a/components/Chat/components/Answer/Loader.js b/components/Shared/BouncingLoader.tsx similarity index 75% rename from components/Chat/components/Answer/Loader.js rename to components/Shared/BouncingLoader.tsx index ab24e18d..4859065b 100644 --- a/components/Chat/components/Answer/Loader.js +++ b/components/Shared/BouncingLoader.tsx @@ -1,13 +1,14 @@ import { keyframes, styled } from "@/stitches.config"; + import React from "react"; -const AnswerLoader = () => { +const BouncingLoader = () => { return ( - +
-
+ ); }; @@ -20,10 +21,9 @@ const bouncingLoader = keyframes({ }, }); -const StyledAnswerLoader = styled("div", { +const StyledBouncingLoader = styled("div", { display: "flex", - justifyContent: "center", - margin: "$gr5 auto", + margin: "$gr2 auto", "& > div": { width: "$gr2", @@ -44,4 +44,4 @@ const StyledAnswerLoader = styled("div", { }, }); -export default AnswerLoader; +export default BouncingLoader; diff --git a/hooks/useMarkdown.tsx b/hooks/useMarkdown.tsx new file mode 100644 index 00000000..104c25c7 --- /dev/null +++ b/hooks/useMarkdown.tsx @@ -0,0 +1,53 @@ +import { useEffect, useState } from "react"; + +import rehypeRaw from "rehype-raw"; +import rehypeStringify from "rehype-stringify"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import { unified } from "unified"; + +function useMarkdown({ + markdown, + hasCursor, +}: { + markdown: string; + hasCursor: boolean; +}): { + html: string; + jsx: JSX.Element; +} { + const [html, setHtml] = useState(""); + + const cursor = ""; + const preparedMarkdown = hasCursor ? markdown + cursor : markdown; + + useEffect(() => { + (async () => { + const processor = unified() + .use(remarkParse) + .use(remarkRehype, { allowDangerousHtml: true }) + .use(rehypeRaw) + .use(rehypeStringify); + + const result = await processor.process(preparedMarkdown); + const htmlContent = String(result); + + const cursorRegex = new RegExp(cursor, "g"); + const updatedHtml = hasCursor + ? htmlContent.replace( + cursorRegex, + `` + ) + : htmlContent; + + setHtml(updatedHtml); + })(); + }, [hasCursor, preparedMarkdown]); + + return { + html, + jsx:
, + }; +} + +export default useMarkdown; diff --git a/lib/chat-helpers.ts b/lib/chat-helpers.ts index 0c6382c1..cf205043 100644 --- a/lib/chat-helpers.ts +++ b/lib/chat-helpers.ts @@ -1,4 +1,4 @@ -import { Question } from "../components/Chat/types/chat"; +import { Question } from "../types/components/chat"; const prepareQuestion = (questionString: string, authToken: string) => { const date = new Date(); diff --git a/package-lock.json b/package-lock.json index b6c9197d..bcca2ea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,12 @@ "react-error-boundary": "^4.0.4", "react-masonry-css": "^1.0.16", "react-share": "^5.0.3", - "swiper": "^9.4.1" + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "swiper": "^9.4.1", + "unified": "^11.0.4" }, "devDependencies": { "@elastic/elasticsearch": "7.17", @@ -3968,6 +3973,14 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.4", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.4.tgz", @@ -4030,6 +4043,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -4123,11 +4144,24 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.11.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.23.tgz", @@ -4242,6 +4276,11 @@ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", @@ -4772,8 +4811,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", @@ -5582,6 +5620,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -5827,6 +5874,15 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5850,6 +5906,33 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -6063,6 +6146,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -6482,7 +6574,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -6498,8 +6589,7 @@ "node_modules/debug/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/decimal.js": { "version": "10.4.3", @@ -6507,6 +6597,18 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", @@ -6613,7 +6715,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "engines": { "node": ">=6" } @@ -6632,6 +6733,18 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -8026,8 +8139,7 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extract-zip": { "version": "2.0.1", @@ -8742,6 +8854,130 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", + "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^9.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hls.js": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.7.tgz", @@ -8779,6 +9015,15 @@ "void-elements": "3.1.0" } }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/htmlparser2": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", @@ -9304,6 +9549,17 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -12443,6 +12699,61 @@ "tmpl": "1.0.5" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -12457,6 +12768,427 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -13043,7 +13775,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, "dependencies": { "entities": "^4.4.0" }, @@ -13314,6 +14045,15 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -13634,6 +14374,65 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", + "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -14156,6 +14955,15 @@ "source-map": "^0.6.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -14371,6 +15179,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -14801,6 +15622,24 @@ "node": ">=12" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", @@ -15113,6 +15952,87 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -15271,6 +16191,46 @@ "node": ">=0.6.0" } }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -15314,6 +16274,15 @@ "node": ">=10.13.0" } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -15846,6 +16815,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 81ea40a7..a4edec6e 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,12 @@ "react-error-boundary": "^4.0.4", "react-masonry-css": "^1.0.16", "react-share": "^5.0.3", - "swiper": "^9.4.1" + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "swiper": "^9.4.1", + "unified": "^11.0.4" }, "devDependencies": { "@elastic/elasticsearch": "7.17", diff --git a/pages/search.tsx b/pages/search.tsx index 96415ce2..a650ddcd 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -7,7 +7,7 @@ import React, { useEffect, useState } from "react"; import { ApiSearchRequestBody } from "@/types/api/request"; import { ApiSearchResponse } from "@/types/api/response"; -import ChatWrapper from "@/components/Chat/components/Wrapper"; +import ChatWrapper from "@/components/Chat/Wrapper"; import Container from "@/components/Shared/Container"; import { DC_API_SEARCH_URL } from "@/lib/constants/endpoints"; import Facets from "@/components/Facets/Facets"; diff --git a/components/Chat/types/chat.ts b/types/components/chat.ts similarity index 100% rename from components/Chat/types/chat.ts rename to types/components/chat.ts