From 3eb9860b5b905cf9e856466f156e35ac39034174 Mon Sep 17 00:00:00 2001 From: Jingcheng Yang Date: Tue, 13 Aug 2024 00:17:39 -0400 Subject: [PATCH] Improve the answer using ChatGPT. --- src/api/mod.rs | 1 - src/api/route.rs | 6 +- src/api/schema.rs | 2 +- src/model/llm.rs | 2 +- src/model/mod.rs | 3 +- src/{api => model}/publication.rs | 88 +++- studio/package.json | 1 + studio/src/EdgeInfoPanel/PublicationDesc.tsx | 4 + studio/src/EdgeInfoPanel/PublicationPanel.tsx | 37 +- studio/src/EdgeInfoPanel/index.less | 24 ++ studio/src/EdgeInfoPanel/index.tsx | 2 +- studio/yarn.lock | 401 +++++++++++++++++- 12 files changed, 533 insertions(+), 38 deletions(-) rename src/{api => model}/publication.rs (83%) diff --git a/src/api/mod.rs b/src/api/mod.rs index 854f8a4..60c2972 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -3,4 +3,3 @@ pub mod route; pub mod schema; pub mod auth; -pub mod publication; diff --git a/src/api/route.rs b/src/api/route.rs index b09e005..7c08f4a 100644 --- a/src/api/route.rs +++ b/src/api/route.rs @@ -1,7 +1,6 @@ //! This module defines the routes of the API. use crate::api::auth::{CustomSecurityScheme, USERNAME_PLACEHOLDER}; -use crate::api::publication::Publication; use crate::api::schema::{ ApiTags, DeleteResponse, GetConsensusResultResponse, GetEntityAttrResponse, GetEntityColorMapResponse, GetGraphResponse, GetPromptResponse, GetPublicationsResponse, @@ -19,6 +18,7 @@ use crate::model::graph::Graph; use crate::model::init_db::get_kg_score_table_name; use crate::model::kge::DEFAULT_MODEL_NAME; use crate::model::llm::{ChatBot, Context, LlmResponse, PROMPTS}; +use crate::model::publication::Publication; use crate::model::util::match_color; use crate::query_builder::cypher_builder::{query_nhops, query_shared_nodes}; use crate::query_builder::sql_builder::{get_all_field_pairs, make_order_clause_by_pairs}; @@ -91,11 +91,13 @@ impl BiomedgpsApi { &self, publications: Json>, question: Query, + pool: Data<&Arc>, _token: CustomSecurityScheme, ) -> GetPublicationsSummaryResponse { let question = question.0; let publications = publications.0; - match Publication::fetch_summary_by_chatgpt(&question, &publications).await { + let pool_arc = pool.clone(); + match Publication::fetch_summary_by_chatgpt(&question, &publications, Some(&pool_arc)).await { Ok(result) => GetPublicationsSummaryResponse::ok(result), Err(e) => { let err = format!("Failed to fetch publications summary: {}", e); diff --git a/src/api/schema.rs b/src/api/schema.rs index edab732..c9a50c1 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; use validator::Validate; use validator::ValidationErrors; -use super::publication::{Publication, PublicationRecords, PublicationsSummary, ConsensusResult}; +use crate::model::publication::{Publication, PublicationRecords, PublicationsSummary, ConsensusResult}; #[derive(Tags)] pub enum ApiTags { diff --git a/src/model/llm.rs b/src/model/llm.rs index 05e2a54..ab25f1c 100644 --- a/src/model/llm.rs +++ b/src/model/llm.rs @@ -46,7 +46,7 @@ pub struct LlmResponse { pub created_at: DateTime, } -/// The context is used to store the context for the LLM. The context can be an entity, an expanded relation, or treatments with disease context. +/// The context is used to store the context for the LLM. The context can be an entity, an expanded relation, or treatments with disease context. The context is used to identify the specific context from the request. See the route.rs for more details. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Object)] pub struct Context { pub entity: Option, diff --git a/src/model/mod.rs b/src/model/mod.rs index 82d3543..9276111 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -7,4 +7,5 @@ pub mod llm; pub mod kge; pub mod init_db; pub mod entity; -pub mod entity_attr; \ No newline at end of file +pub mod entity_attr; +pub mod publication; diff --git a/src/api/publication.rs b/src/model/publication.rs similarity index 83% rename from src/api/publication.rs rename to src/model/publication.rs index 8496134..618a775 100644 --- a/src/api/publication.rs +++ b/src/model/publication.rs @@ -1,9 +1,10 @@ -use crate::model::llm::ChatBot; +use crate::model::llm::{ChatBot, LlmContext, LlmMessage, PROMPTS, PROMPT_TEMPLATE}; use anyhow; use log::info; use poem_openapi::Object; use reqwest; use serde::{Deserialize, Serialize}; +use std::collections::HashMap; use urlencoding; const GUIDESCOPER_PUBLICATIONS_API: &str = "/api/paper_search/"; @@ -35,6 +36,51 @@ pub struct Publication { pub provider_url: Option, } +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Object)] +pub struct PublicationsContext { + pub publications: Vec, + pub question: String, +} + +impl LlmContext for PublicationsContext { + fn get_context(&self) -> Self { + self.clone() + } + + fn render_prompt( + &self, + prompt_template_category: &str, + prompt_template: &str, + ) -> Result { + let mut prompt = prompt_template.to_string(); + let publications = self.publications.iter().map(|p| { + format!("Title: {}\nAuthors: {}\nJournal: {}\nYear: {}\nSummary: {}\nAbstract: {}\nDOI: {}\n", p.title, p.authors.join(", "), p.journal, p.year.unwrap_or(0), p.summary, p.article_abstract.as_ref().unwrap_or(&"".to_string()), p.doi.as_ref().unwrap_or(&"".to_string())) + }).collect::>(); + prompt = prompt.replace("{{publications}}", &publications.join("\n")); + prompt = prompt.replace("{{question}}", &self.question); + Ok(prompt) + } + + fn register_prompt_template() { + let mut prompt_templates = PROMPT_TEMPLATE.lock().unwrap(); + prompt_templates.insert("answer_question_with_publications", "I have a collection of papers wrappered by the ```:\n```\n{{publications}}\n```\n\nPlease carefully analyze these papers to answer the following question: \n{{question}}\n\nIn your response, please provide a well-integrated analysis that directly answers the question. Include citations from specific papers to support your answer, and ensure that the reasoning behind your answer is clearly explained. Reference relevant details from the papers' summaries or abstracts as needed."); + + let mut prompts = PROMPTS.lock().unwrap(); + + let mut m2 = HashMap::new(); + m2.insert("key", "answer_question_with_publications"); + m2.insert("label", "Answer question with publications"); + m2.insert("type", "question"); + + // Does it exist? + if prompts.contains(&m2) { + return; + } else { + prompts.push(m2); + } + } +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Object)] pub struct PublicationsSummary { pub summary: String, @@ -220,6 +266,7 @@ impl Publication { pub async fn fetch_summary_by_chatgpt( question: &str, publications: &Vec, + pool: Option<&sqlx::PgPool>, ) -> Result { let openai_api_key = std::env::var("OPENAI_API_KEY").unwrap(); if openai_api_key.is_empty() { @@ -227,20 +274,39 @@ impl Publication { } let chatbot = ChatBot::new("GPT4", &openai_api_key); + let publications_context = PublicationsContext { + publications: publications.clone(), + question: question.to_string(), + }; - let publications = publications.iter().map(|p| { - format!("Title: {}\nAuthors: {}\nJournal: {}\nYear: {}\nSummary: {}\nAbstract: {}\nDOI: {}\n", p.title, p.authors.join(", "), p.journal, p.year.unwrap_or(0), p.summary, p.article_abstract.as_ref().unwrap_or(&"".to_string()), p.doi.as_ref().unwrap_or(&"".to_string())) - }).collect::>(); + PublicationsContext::register_prompt_template(); + + let mut llm_msg = match LlmMessage::new( + "answer_question_with_publications", + publications_context, + None, + ) { + Ok(msg) => msg, + Err(e) => { + return Err(anyhow::Error::msg(format!( + "Failed to create LLM message: {}", + e + ))); + } + }; - let prompt = format!( - "I have a collection of papers wrappered by the ```:\n```\n{}\n```\n\nPlease carefully analyze these papers to answer the following question: \n{}\n\nIn your response, please provide a well-integrated analysis that directly answers the question. Include citations from specific papers to support your answer, and ensure that the reasoning behind your answer is clearly explained. Reference relevant details from the papers' summaries or abstracts as needed.", - publications.join("\n"), - question, - ); + let response = match llm_msg.answer(&chatbot, pool).await { + Ok(resp) => resp, + Err(e) => { + return Err(anyhow::Error::msg(format!( + "Failed to get response from LLM: {}", + e + ))); + } + }; - let response = chatbot.answer(prompt).await?; Ok(PublicationsSummary { - summary: response, + summary: response.message.clone(), daily_limit_reached: false, is_disputed: false, is_incomplete: false, diff --git a/studio/package.json b/studio/package.json index e5456f8..82f627d 100644 --- a/studio/package.json +++ b/studio/package.json @@ -33,6 +33,7 @@ "@mlc-ai/web-llm": "0.2.15", "@sentry/react": "^7.108.0", "@textea/json-viewer": "^2.9.0", + "@uiw/react-markdown-preview": "^5.1.2", "@umijs/max": "^4.1.2", "@umijs/route-utils": "^2.0.0", "antd": "5.8.0", diff --git a/studio/src/EdgeInfoPanel/PublicationDesc.tsx b/studio/src/EdgeInfoPanel/PublicationDesc.tsx index 7042561..ed5a0c5 100644 --- a/studio/src/EdgeInfoPanel/PublicationDesc.tsx +++ b/studio/src/EdgeInfoPanel/PublicationDesc.tsx @@ -29,6 +29,10 @@ const Desc: React.FC<{ const highlightWords = (text: string, words: string[]): string => { let newText = text; words.forEach(word => { + if (!word) { + return; + } + let escapedWord = escapeRegExp(word); let regex = new RegExp(`(${escapedWord})(?![^<]*>|[^<>]*<\/)`, 'gi'); newText = newText.replace(regex, '$1'); diff --git a/studio/src/EdgeInfoPanel/PublicationPanel.tsx b/studio/src/EdgeInfoPanel/PublicationPanel.tsx index cd288fd..24f4d36 100644 --- a/studio/src/EdgeInfoPanel/PublicationPanel.tsx +++ b/studio/src/EdgeInfoPanel/PublicationPanel.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { MarkdownViewer } from 'biominer-components'; import RehypeRaw from 'rehype-raw'; +import MarkdownPreview from '@uiw/react-markdown-preview'; import { Button, List, message, Row, Col, Tag } from 'antd'; import { FileProtectOutlined } from '@ant-design/icons'; import type { Publication, PublicationDetail } from 'biominer-components/dist/typings'; @@ -24,6 +24,7 @@ const PublicationPanel: React.FC = (props) => { const [abstractMap, setAbstractMap] = useState>({}); const [searchId, setSearchId] = useState(''); const [publicationSummary, setPublicationSummary] = useState('Loading...'); + const [publicationSummaryByChatGPT, setPublicationSummaryByChatGPT] = useState(''); const [generating, setGenerating] = useState(false); const showAbstract = async (doc_id: string): Promise => { @@ -82,7 +83,7 @@ const PublicationPanel: React.FC = (props) => { const docId = docIds[i]; if (!publicationMap[docId].article_abstract) { const msg = `Load ${i} publication...`; - setPublicationSummary(msg); + setPublicationSummaryByChatGPT(msg); await showAbstract(docId).then((publication) => { tempAbstractMap[docId] = publication.article_abstract || ''; }).catch((error) => { @@ -94,7 +95,7 @@ const PublicationPanel: React.FC = (props) => { } setAbstractMap(tempAbstractMap); - setPublicationSummary('Publications loaded, answering question...'); + setPublicationSummaryByChatGPT('Publications loaded, answering question...'); answerQuestionWithPublications( { @@ -104,11 +105,11 @@ const PublicationPanel: React.FC = (props) => { Object.values(publicationMap) ).then((response) => { console.log('Answer: ', response); - setPublicationSummary(response.summary); + setPublicationSummaryByChatGPT(response.summary); }).catch((error) => { setGenerating(false); console.error('Error: ', error); - setPublicationSummary('Failed to answer question, because of the following error: ' + error); + setPublicationSummaryByChatGPT('Failed to answer question, because of the following error: ' + error); }); } @@ -158,19 +159,23 @@ const PublicationPanel: React.FC = (props) => { Question - {props.queryStr} + {props.queryStr} -

+

{/* Answer by AI */} - + + Short Answer {publicationSummary} + + {publicationSummaryByChatGPT && + }

diff --git a/studio/src/EdgeInfoPanel/index.less b/studio/src/EdgeInfoPanel/index.less index 3daf3be..1ce1572 100644 --- a/studio/src/EdgeInfoPanel/index.less +++ b/studio/src/EdgeInfoPanel/index.less @@ -28,6 +28,10 @@ flex-direction: column; flex-wrap: nowrap; + .ant-tag { + font-size: 0.85rem; + } + .publication-tag { font-size: 1rem; margin-left: 10px; @@ -38,6 +42,26 @@ font-size: 1rem; padding: 20px; min-height: unset; + + .markdown-viewer, + .ant-empty { + border: 1px solid #d9d9d9; + padding: 10px; + border-radius: 4px; + margin: 10px 0 0; + max-height: 500px; + overflow: auto; + + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 5px; + margin-bottom: 5px; + } + } } .publication-panel-content { diff --git a/studio/src/EdgeInfoPanel/index.tsx b/studio/src/EdgeInfoPanel/index.tsx index 649d867..56e9e9b 100644 --- a/studio/src/EdgeInfoPanel/index.tsx +++ b/studio/src/EdgeInfoPanel/index.tsx @@ -36,7 +36,7 @@ const EdgeInfoPanel: React.FC = (props) => { if (queryStr) { return - + ; } } diff --git a/studio/yarn.lock b/studio/yarn.lock index e5e7c34..9908186 100644 --- a/studio/yarn.lock +++ b/studio/yarn.lock @@ -1741,6 +1741,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.17.2": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" @@ -3758,6 +3765,11 @@ dependencies: moment ">=2.14.0" +"@types/prismjs@^1.0.0": + version "1.26.4" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.4.tgz#1a9e1074619ce1d7322669e5b46fbe823925103a" + integrity sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg== + "@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.11", "@types/prop-types@^15.7.5": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -4016,6 +4028,30 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@uiw/copy-to-clipboard@~1.0.12": + version "1.0.17" + resolved "https://registry.yarnpkg.com/@uiw/copy-to-clipboard/-/copy-to-clipboard-1.0.17.tgz#86f501ddc8a6db0b45e6899bcd9d48e0b78f233e" + integrity sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A== + +"@uiw/react-markdown-preview@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@uiw/react-markdown-preview/-/react-markdown-preview-5.1.2.tgz#9de14c85536dbf3858a895195ea13031d37da2d9" + integrity sha512-IheBzajVKZ3NUhYAfrnnereJmKVNQ6vRZDjQhKEQy7IMarJXrUKC1eG8OzTgy1J/3m67MBTs6d52kkSB699efA== + dependencies: + "@babel/runtime" "^7.17.2" + "@uiw/copy-to-clipboard" "~1.0.12" + react-markdown "~9.0.1" + rehype-attr "~3.0.1" + rehype-autolink-headings "~7.1.0" + rehype-ignore "^2.0.0" + rehype-prism-plus "2.0.0" + rehype-raw "^7.0.0" + rehype-rewrite "~4.0.0" + rehype-slug "~6.0.0" + remark-gfm "~4.0.0" + remark-github-blockquote-alert "^1.0.0" + unist-util-visit "^5.0.0" + "@umijs/ast@4.1.8": version "4.1.8" resolved "https://registry.yarnpkg.com/@umijs/ast/-/ast-4.1.8.tgz#dcdf15d0e28b7937b7a035a42b64b9b83eaf34c6" @@ -5467,6 +5503,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bcp-47-match@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" + integrity sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -6765,6 +6806,11 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-selector-parser@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-3.0.5.tgz#9b636ebccf7c4bcce5c1ac21ae27de9f01180ae9" + integrity sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g== + css-styled@^1.0.8, css-styled@~1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/css-styled/-/css-styled-1.0.8.tgz#c9c05dc4abdef5571033090bfb8cfc5e19429974" @@ -7463,6 +7509,11 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +direction@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/direction/-/direction-2.0.1.tgz#71800dd3c4fa102406502905d3866e65bdebb985" + integrity sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA== + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -10090,6 +10141,18 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hast-util-from-html@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz#9cd38ee81bf40b2607368b92a04b0905fa987488" + integrity sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g== + dependencies: + "@types/hast" "^3.0.0" + devlop "^1.1.0" + hast-util-from-parse5 "^8.0.0" + parse5 "^7.0.0" + vfile "^6.0.0" + vfile-message "^4.0.0" + hast-util-from-parse5@^8.0.0: version "8.0.1" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" @@ -10109,6 +10172,13 @@ hast-util-has-property@^2.0.0: resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== +hast-util-has-property@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== + dependencies: + "@types/hast" "^3.0.0" + hast-util-heading-rank@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz#063b43b9cfb56a1a8ded84dd68d8af69e8864545" @@ -10143,6 +10213,13 @@ hast-util-parse-selector@^2.0.0: 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-parse-selector@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" @@ -10169,6 +10246,28 @@ hast-util-raw@^9.0.0: web-namespaces "^2.0.0" zwitch "^2.0.0" +hast-util-select@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hast-util-select/-/hast-util-select-6.0.2.tgz#f1e6c583ab6227cb510383471328734342bd1d1c" + integrity sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + bcp-47-match "^2.0.0" + comma-separated-tokens "^2.0.0" + css-selector-parser "^3.0.0" + devlop "^1.0.0" + direction "^2.0.0" + hast-util-has-property "^3.0.0" + hast-util-to-string "^3.0.0" + hast-util-whitespace "^3.0.0" + not "^0.1.0" + nth-check "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + unist-util-visit "^5.0.0" + zwitch "^2.0.0" + hast-util-to-jsx-runtime@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" @@ -10243,6 +10342,17 @@ hastscript@^6.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" + hastscript@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" @@ -12032,6 +12142,16 @@ mdast-util-find-and-replace@^2.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.0.0" +mdast-util-find-and-replace@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz#a6fc7b62f0994e973490e45262e4bc07607b04e0" + integrity sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + mdast-util-from-markdown@^0.8.0: version "0.8.5" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" @@ -12089,6 +12209,28 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-find-and-replace "^2.0.0" micromark-util-character "^1.0.0" +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz#5baf35407421310a08e68c15e5d8821e8898ba2a" + integrity sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz#25a1753c7d16db8bfd53cd84fe50562bd1e6d6a9" + integrity sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" @@ -12097,6 +12239,15 @@ mdast-util-gfm-strikethrough@^1.0.0: "@types/mdast" "^3.0.0" mdast-util-to-markdown "^1.3.0" +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + mdast-util-gfm-table@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" @@ -12107,6 +12258,17 @@ mdast-util-gfm-table@^1.0.0: mdast-util-from-markdown "^1.0.0" mdast-util-to-markdown "^1.3.0" +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" @@ -12115,6 +12277,16 @@ mdast-util-gfm-task-list-item@^1.0.0: "@types/mdast" "^3.0.0" mdast-util-to-markdown "^1.3.0" +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + mdast-util-gfm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-1.0.0.tgz#5cbedeabae72be2c3dff1ec958394e2f9553ec43" @@ -12125,6 +12297,19 @@ mdast-util-gfm@^1.0.0: mdast-util-gfm-table "^1.0.0" mdast-util-gfm-task-list-item "^1.0.0" +mdast-util-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz#3f2aecc879785c3cb6a81ff3a243dc11eca61095" + integrity sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + mdast-util-mdx-expression@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" @@ -12437,6 +12622,30 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" @@ -12449,6 +12658,18 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-extension-gfm-table@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" @@ -12460,6 +12681,17 @@ micromark-extension-gfm-table@^1.0.0: micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-extension-gfm-table@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" @@ -12467,6 +12699,13 @@ micromark-extension-gfm-tagfilter@^1.0.0: dependencies: micromark-util-types "^1.0.0" +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" @@ -12478,6 +12717,17 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + micromark-extension-gfm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-1.0.0.tgz#7a1cee0df200e3f2ab14cb63d7a5ea6820a82f1d" @@ -12491,6 +12741,20 @@ micromark-extension-gfm@^1.0.0: micromark-util-combine-extensions "^1.0.0" micromark-util-types "^1.0.0" +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.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" @@ -13410,6 +13674,11 @@ normals@^1.1.0: resolved "https://registry.yarnpkg.com/normals/-/normals-1.1.0.tgz#325b595ed34afe467a6c55a14fd9085787ff59c0" integrity sha512-XWeliW48BLvbVJ+cjQAOE+tA0m1M7Yi1iTPphAS9tBmW1A/c/cOVnEUecPCCMH5lEAihAcG6IRle56ls9k3xug== +not@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/not/-/not-0.1.0.tgz#c9691c1746c55dcfbe54cbd8bd4ff041bc2b519d" + integrity sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA== + npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" @@ -13424,7 +13693,7 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" -nth-check@^2.0.1: +nth-check@^2.0.0, nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== @@ -13894,6 +14163,11 @@ parse-node-version@^1.0.1: resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + parse-rect@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" @@ -16163,7 +16437,7 @@ react-markdown@8.0.7: unist-util-visit "^4.0.0" vfile "^5.0.0" -react-markdown@^9.0.1: +react-markdown@^9.0.1, react-markdown@~9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.1.tgz#c05ddbff67fd3b3f839f8c648e6fb35d022397d1" integrity sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg== @@ -16617,6 +16891,16 @@ reflect.getprototypeof@^1.0.4, reflect.getprototypeof@^1.0.5: globalthis "^1.0.3" which-builtin-type "^1.1.3" +refractor@^4.8.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-4.8.1.tgz#fbdd889333a3d86c9c864479622855c9b38e9d42" + integrity sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg== + dependencies: + "@types/hast" "^2.0.0" + "@types/prismjs" "^1.0.0" + hastscript "^7.0.0" + parse-entities "^4.0.0" + reftools@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/reftools/-/reftools-1.1.9.tgz#e16e19f662ccd4648605312c06d34e5da3a2b77e" @@ -16780,6 +17064,14 @@ regl@^2.0.0: resolved "https://registry.yarnpkg.com/@plotly/regl/-/regl-2.1.2.tgz#fd31e3e820ed8824d59a67ab5e766bb101b810b6" integrity sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw== +rehype-attr@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/rehype-attr/-/rehype-attr-3.0.3.tgz#36b9c3d2bd91708f0c56080bc3005cba60dec4a7" + integrity sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw== + dependencies: + unified "~11.0.0" + unist-util-visit "~5.0.0" + rehype-autolink-headings@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz#0cb874a56f3de6ead1c2268d7f0fc5006f244db5" @@ -16793,6 +17085,18 @@ rehype-autolink-headings@^6.1.1: unified "^10.0.0" unist-util-visit "^4.0.0" +rehype-autolink-headings@~7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz#531087e155d9df053944923efd47d99728f3b196" + integrity sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw== + dependencies: + "@types/hast" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-heading-rank "^3.0.0" + hast-util-is-element "^3.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + rehype-figure@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rehype-figure/-/rehype-figure-1.0.1.tgz#6fac89f0ec6042ce8b99163b4cc796a934267be0" @@ -16812,6 +17116,36 @@ rehype-highlight@^7.0.0: unist-util-visit "^5.0.0" vfile "^6.0.0" +rehype-ignore@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/rehype-ignore/-/rehype-ignore-2.0.2.tgz#1212335d3c8bd86422c15d4a4e5afaabc0488802" + integrity sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w== + dependencies: + hast-util-select "^6.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + +rehype-parse@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-9.0.0.tgz#3949faeec6f466ec57774215661e0d75469195d9" + integrity sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw== + dependencies: + "@types/hast" "^3.0.0" + hast-util-from-html "^2.0.0" + unified "^11.0.0" + +rehype-prism-plus@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rehype-prism-plus/-/rehype-prism-plus-2.0.0.tgz#75b1e2d0dd7496125987a1732cb7d560de02a0fd" + integrity sha512-FeM/9V2N7EvDZVdR2dqhAzlw5YI49m9Tgn7ZrYJeYHIahM6gcXpH0K1y2gNnKanZCydOMluJvX2cB9z3lhY8XQ== + dependencies: + hast-util-to-string "^3.0.0" + parse-numeric-range "^1.3.0" + refractor "^4.8.0" + rehype-parse "^9.0.0" + unist-util-filter "^5.0.0" + unist-util-visit "^5.0.0" + rehype-raw@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" @@ -16821,7 +17155,16 @@ rehype-raw@^7.0.0: hast-util-raw "^9.0.0" vfile "^6.0.0" -rehype-slug@^6.0.0: +rehype-rewrite@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/rehype-rewrite/-/rehype-rewrite-4.0.2.tgz#7b094bb586dfda83333994cb3dbb01cb1e8c361d" + integrity sha512-rjLJ3z6fIV11phwCqHp/KRo8xuUCO8o9bFJCNw5o6O2wlLk6g8r323aRswdGBQwfXPFYeSuZdAjp4tzo6RGqEg== + dependencies: + hast-util-select "^6.0.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + +rehype-slug@^6.0.0, rehype-slug@~6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/rehype-slug/-/rehype-slug-6.0.0.tgz#1d21cf7fc8a83ef874d873c15e6adaee6344eaf1" integrity sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A== @@ -16862,6 +17205,25 @@ remark-gfm@^2.0.0: micromark-extension-gfm "^1.0.0" unified "^10.0.0" +remark-gfm@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.0.tgz#aea777f0744701aa288b67d28c43565c7e8c35de" + integrity sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + +remark-github-blockquote-alert@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/remark-github-blockquote-alert/-/remark-github-blockquote-alert-1.2.1.tgz#adb58d7fb57e96bc5a53674167f130029d1cb3c0" + integrity sha512-qNf2mSAoZgh3Cl23/9Y1L7S4Kbf9NsdHvYK398ab/52yEsDPDU5I4cuTcgDRrdIX7Ltc6RK+KCLRtWkbFnL6Dg== + dependencies: + unist-util-visit "^5.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" @@ -16909,6 +17271,15 @@ remark-rehype@^11.0.0: unified "^11.0.0" vfile "^6.0.0" +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + remark-stringify@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" @@ -19260,6 +19631,19 @@ unified@^11.0.0: trough "^2.0.0" vfile "^6.0.0" +unified@^11.0.3, unified@~11.0.0: + version "11.0.5" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.5.tgz#f66677610a5c0a9ee90cab2b8d4d66037026d9e1" + integrity sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA== + 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" + unified@^9.1.0: version "9.2.2" resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" @@ -19287,6 +19671,15 @@ uniq@^1.0.0, uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== +unist-util-filter@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/unist-util-filter/-/unist-util-filter-5.0.1.tgz#f9f3a0bdee007e040964c274dda27bac663d0a39" + integrity sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + unist-util-find-after@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz#3fccc1b086b56f34c8b798e1ff90b5c54468e896" @@ -19411,7 +19804,7 @@ unist-util-visit@^4.0.0, unist-util-visit@~4.1.0: unist-util-is "^5.0.0" unist-util-visit-parents "^5.1.1" -unist-util-visit@^5.0.0: +unist-util-visit@^5.0.0, unist-util-visit@~5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==