diff --git a/package.json b/package.json index 27ce3afb..37312cae 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,9 @@ "framer-motion": "^11.0.5", "google-spreadsheet": "^3.2.0", "jsforce": "^1.11.0", + "mdast-util-toc": "^7.0.0", "next": "^14.1.0", + "next-mdx-remote": "^4.4.1", "next-sitemap": "^2.5.7", "papaparse": "^5.3.1", "react": "^18.2.0", @@ -38,7 +40,8 @@ "react-intersection-observer": "^8.33.1", "react-markdown": "^8.0.0", "redaxios": "^0.4.1", - "sharp": "^0.33.2" + "sharp": "^0.33.2", + "unist-util-visit": "^5.0.0" }, "devDependencies": { "@hookform/resolvers": "^3.1.0", @@ -46,6 +49,7 @@ "@types/google-spreadsheet": "^3.1.5", "@types/jsforce": "^1.9.37", "@types/mailchimp__mailchimp_marketing": "^3.0.3", + "@types/mdast": "^4.0.3", "@types/node": "17.0.0", "@types/papaparse": "^5.3.2", "@types/react": "^18.2.55", diff --git a/src/components/Banners.tsx b/src/components/Banners.tsx index adafd038..fe357c57 100644 --- a/src/components/Banners.tsx +++ b/src/components/Banners.tsx @@ -1,17 +1,17 @@ import { FC } from 'react'; -import { useRouter } from 'next/router'; import { Box, Link } from '@chakra-ui/react'; +import { useCurrentPath } from '../hooks/useCurrentPath'; import { Banner } from './UI'; import { DATA_CHALLENGE_ROUND_URL, ZK_GRANTS_URL } from '../constants'; export const Banners: FC = () => { - const router = useRouter(); + const path = useCurrentPath(); if ( - !router.pathname.includes(ZK_GRANTS_URL) && - !router.pathname.includes(DATA_CHALLENGE_ROUND_URL) + !path.includes(ZK_GRANTS_URL) && + !path.includes(DATA_CHALLENGE_ROUND_URL) ) { return ( diff --git a/src/components/UI/common/ApplicantsSidebar.tsx b/src/components/UI/common/ApplicantsSidebar.tsx index 2fb4bb11..3320f379 100644 --- a/src/components/UI/common/ApplicantsSidebar.tsx +++ b/src/components/UI/common/ApplicantsSidebar.tsx @@ -38,11 +38,13 @@ export const ApplicantsSidebar: FC = ({ sidebarLinks, sectionsInView }) = /> - - - {text} - - + + + + {text} + + + ))} diff --git a/src/components/UI/md/MdLink.tsx b/src/components/UI/md/MdLink.tsx new file mode 100644 index 00000000..8044ee79 --- /dev/null +++ b/src/components/UI/md/MdLink.tsx @@ -0,0 +1,5 @@ +import { Link, LinkProps } from '@chakra-ui/react'; + +export const MdLink = (props: LinkProps) => { + return ; +}; diff --git a/src/components/UI/md/MdSidebar.tsx b/src/components/UI/md/MdSidebar.tsx new file mode 100644 index 00000000..67fa8700 --- /dev/null +++ b/src/components/UI/md/MdSidebar.tsx @@ -0,0 +1,50 @@ +import { Box, Flex, Link } from '@chakra-ui/react'; +import { FC, useMemo } from 'react'; +import NextLink from 'next/link'; + +import { PageText } from '..'; + +import { SidebarLink } from '../../../types'; +import { useActiveHash } from '../../../hooks/useActiveHash'; + +interface Props { + sidebarLinks: SidebarLink[]; +} + +export const MdSidebar: FC = ({ sidebarLinks }) => { + const hrefs = useMemo(() => sidebarLinks.map(({ href }) => href), [sidebarLinks]); + const activeHash = useActiveHash(hrefs, '0px'); + + return ( + + {sidebarLinks.map(({ text, href }, idx) => ( + + + + + + + {text} + + + + + ))} + + ); +}; diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx index bc74c01a..355e4c6c 100644 --- a/src/components/layout/Layout.tsx +++ b/src/components/layout/Layout.tsx @@ -1,8 +1,8 @@ import { Box, Container, ContainerProps } from '@chakra-ui/react'; import { FC, ReactNode } from 'react'; -import { useRouter } from 'next/router'; import { Footer, FooterBackgroundImage, HomepageHero } from '../UI'; +import { useCurrentPath } from '../../hooks/useCurrentPath'; import { Forms } from '../forms'; import { @@ -44,10 +44,10 @@ import { } from '../../constants'; export const Layout: FC = ({ children, ...props }) => { - const router = useRouter(); + const path = useCurrentPath(); const renderContent = (): ReactNode => { - if (router.pathname === HOME_URL) { + if (path === HOME_URL) { return ( <> @@ -57,7 +57,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname.startsWith(APPLICANTS_URL)) { + if (path.startsWith(APPLICANTS_URL)) { return (
@@ -67,7 +67,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname.startsWith(ABOUT_URL)) { + if (path.startsWith(ABOUT_URL)) { return (
@@ -77,7 +77,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === DEVCON_GRANTS_URL) { + if (path === DEVCON_GRANTS_URL) { return (
@@ -87,7 +87,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === ACADEMIC_GRANTS_2022_URL) { + if (path === ACADEMIC_GRANTS_2022_URL) { return (
@@ -97,7 +97,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === ACADEMIC_GRANTS_2023_URL) { + if (path === ACADEMIC_GRANTS_2023_URL) { return (
@@ -107,7 +107,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === ACADEMIC_GRANTS_URL) { + if (path === ACADEMIC_GRANTS_URL) { return (
@@ -117,7 +117,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === MERGE_DATA_CHALLENGE_URL) { + if (path === MERGE_DATA_CHALLENGE_URL) { return (
@@ -128,7 +128,7 @@ export const Layout: FC = ({ children, ...props }) => { } // TODO: refactor these if conditions ???? - if (router.pathname === SEMAPHORE_GRANT_URL) { + if (path === SEMAPHORE_GRANT_URL) { return (
@@ -138,7 +138,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === LAYER_2_GRANTS_URL) { + if (path === LAYER_2_GRANTS_URL) { return (
@@ -148,7 +148,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === ACCOUNT_ABSTRACTION_GRANTS_URL) { + if (path === ACCOUNT_ABSTRACTION_GRANTS_URL) { return (
@@ -158,7 +158,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === RUN_A_NODE_GRANTS_URL) { + if (path === RUN_A_NODE_GRANTS_URL) { return (
@@ -168,7 +168,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === DATA_COLLECTION_ROUND_URL) { + if (path === DATA_COLLECTION_ROUND_URL) { return (
@@ -178,7 +178,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === ZK_GRANTS_URL) { + if (path === ZK_GRANTS_URL) { return (
@@ -188,7 +188,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (router.pathname === DATA_CHALLENGE_ROUND_URL) { + if (path === DATA_CHALLENGE_ROUND_URL) { return (
@@ -198,7 +198,7 @@ export const Layout: FC = ({ children, ...props }) => { ); } - if (GRANTS_URLS.includes(router.pathname)) { + if (GRANTS_URLS.includes(path)) { return (
diff --git a/src/components/layout/MdLayout.tsx b/src/components/layout/MdLayout.tsx new file mode 100644 index 00000000..1330153f --- /dev/null +++ b/src/components/layout/MdLayout.tsx @@ -0,0 +1,41 @@ +import { ReactNode } from 'react'; +import { Box, Flex, Stack } from '@chakra-ui/react'; + +import { PageMetadata } from '../UI'; +import { MdSidebar } from '../UI/md/MdSidebar'; + +import type { Frontmatter, ToCNodeEntry, TocNodeType } from '../../types'; + +type LayoutProps = { + children: ReactNode; + frontmatter: Frontmatter; + tocNodeItems: TocNodeType[]; +}; + +export const MdLayout = ({ children, frontmatter, tocNodeItems }: LayoutProps) => { + const { metaTitle, metaDescription, metaImage } = frontmatter; + + return ( + + + + + + + !('items' in item)) + .map(item => ({ text: item.title || '', href: item.url || '' }))} + /> + + + + {children} + + + + + + + ); +}; diff --git a/src/constants.ts b/src/constants.ts index 79770fe3..0656811e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -380,3 +380,6 @@ export const DATA_CHALLENGE_GRANTS_PREVIEW_URL = // Thank you and apply urls export const GRANTS_URLS = [DEVCON_GRANTS_APPLY_URL, DEVCON_GRANTS_THANK_YOU_PAGE_URL]; + +// Markdown +export const MARKDOWN_CONTENT_PATH = 'src/content'; diff --git a/src/hooks/useActiveHash.ts b/src/hooks/useActiveHash.ts new file mode 100644 index 00000000..d9ddf53d --- /dev/null +++ b/src/hooks/useActiveHash.ts @@ -0,0 +1,46 @@ +import { useEffect, useState } from 'react'; + +/** + * A hook to determine which section of the page is currently in the viewport. + * @param {*} itemIds Array of document ids to observe + * @param {*} rootMargin + * @returns id of the element currently in viewport + */ +export const useActiveHash = (itemIds: Array, rootMargin = `0% 0% -80% 0%`): string => { + const [hashes, setHashes] = useState>(() => + itemIds.reduce((acc, id, index) => ({ [id]: index === 0, ...acc }), {}) + ); + + useEffect(() => { + const observer = new IntersectionObserver( + entries => { + entries.forEach(entry => { + const hash = `#${entry.target.id}`; + setHashes(hashes => ({ ...hashes, [hash]: entry.isIntersecting })); + }); + }, + { rootMargin } + ); + + itemIds?.forEach(id => { + // Remove # from id. EX: #element-id -> element-id + const element = document.getElementById(id.replace('#', '')); + if (element !== null) { + observer.observe(element); + } + }); + + return () => { + itemIds?.forEach(id => { + const element = document.getElementById(id); + if (element !== null) { + observer.unobserve(element); + } + }); + }; + }, [itemIds, rootMargin]); + + const firstActiveHash = itemIds.find(id => hashes[id]); + + return firstActiveHash || itemIds[0]; +}; diff --git a/src/hooks/useCurrentPath.ts b/src/hooks/useCurrentPath.ts new file mode 100644 index 00000000..65f1f6b2 --- /dev/null +++ b/src/hooks/useCurrentPath.ts @@ -0,0 +1,9 @@ +import { useRouter } from 'next/router'; + +// Gets the current path from the slug param (if this is a dynamic route) or the +// router pathname (if this is a static route) +export const useCurrentPath = () => { + const { query, pathname } = useRouter(); + + return query.slug ? query.slug.toString() : pathname; +}; diff --git a/src/pages/[...slug].tsx b/src/pages/[...slug].tsx new file mode 100644 index 00000000..1071092f --- /dev/null +++ b/src/pages/[...slug].tsx @@ -0,0 +1,81 @@ +import { serialize } from 'next-mdx-remote/serialize'; +import { MDXRemote, MDXRemoteSerializeResult } from 'next-mdx-remote'; +import type { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next/types'; +import type { ParsedUrlQuery } from 'querystring'; +import { Accordion, Link, ListItem } from '@chakra-ui/react'; + +import { FAQItem, List, PageSection, PageText, ReadyToApply } from '../components/UI'; +import { MdLayout } from '../components/layout/MdLayout'; +import { MdLink } from '../components/UI/md/MdLink'; + +import remarkInferToc from '../utils/remark/remarkInferToc'; +import rehypeHeadingIds from '../utils/remark/rehypeHeadingIds'; +import { getContentPaths, getMdxSource } from '../utils/md'; + +import type { Frontmatter, TocNodeType } from '../types'; + +interface Params extends ParsedUrlQuery { + slug: string[]; +} + +type Props = { + mdxSource: MDXRemoteSerializeResult; + tocNodeItems: TocNodeType[]; +}; + +export const getStaticPaths = (() => { + const paths = getContentPaths(); + + return { + paths: paths.map(path => { + return { + params: { + slug: path.split('.mdx') + } + }; + }), + fallback: false + }; +}) satisfies GetStaticPaths; + +export const getStaticProps = (async ({ params }) => { + const slug = params?.slug.join('') || ''; + const mdxText = getMdxSource(slug); + + let tocNodeItems: TocNodeType[] = []; + const tocCallback = (toc: TocNodeType): void => { + tocNodeItems = 'items' in toc ? toc.items : []; + }; + + const mdxSource = await serialize, Frontmatter>(mdxText, { + mdxOptions: { + remarkPlugins: [[remarkInferToc, { callback: tocCallback }]], + rehypePlugins: [[rehypeHeadingIds]] + }, + parseFrontmatter: true + }); + + return { props: { mdxSource, tocNodeItems } }; +}) satisfies GetStaticProps; + +const components = { + h3: PageSection, + p: PageText, + a: MdLink, + ul: List, + li: ListItem, + ReadyToApply, + Accordion, + FAQItem +}; + +export default function Page({ + mdxSource, + ...props +}: InferGetStaticPropsType) { + return ( + + + + ); +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 0bdf3ce5..f149b811 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -2,11 +2,11 @@ import { useEffect } from 'react'; import { ChakraProvider } from '@chakra-ui/react'; import type { AppProps } from 'next/app'; import Head from 'next/head'; -import { useRouter } from 'next/router'; import { init } from '@socialgouv/matomo-next'; import { Layout } from '../components/layout'; import { Banners } from '../components'; +import { useCurrentPath } from '../hooks/useCurrentPath'; import { getBg, getBgGradient, getLayoutHeight } from '../utils'; @@ -24,7 +24,7 @@ import favicon16 from '../../public/images/favicon-16x16.png'; import favicon32 from '../../public/images/favicon-32x32.png'; function MyApp({ Component, pageProps }: AppProps) { - const router = useRouter(); + const path = useCurrentPath(); useEffect(() => { init({ @@ -47,9 +47,9 @@ function MyApp({ Component, pageProps }: AppProps) { diff --git a/src/types.ts b/src/types.ts index 4af6ccde..73200a37 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,6 @@ import { NextApiRequest } from 'next'; +import type { Options } from 'mdast-util-toc'; + import { PROJECT_GRANTS_PROJECT_CATEGORY_OPTIONS, APPLYING_AS_OPTIONS, @@ -263,27 +265,28 @@ export type TokenPreference = 'ETH' | 'DAI'; export type ReasonForMeeting = typeof REASONS_FOR_MEETING; -export type ProjectCategory = typeof PROJECT_CATEGORY_OPTIONS[number]; +export type ProjectCategory = (typeof PROJECT_CATEGORY_OPTIONS)[number]; -export type AcademicGrantsProjectCategory = typeof ACADEMIC_GRANTS_PROJECT_CATEGORY_OPTIONS[number]; +export type AcademicGrantsProjectCategory = + (typeof ACADEMIC_GRANTS_PROJECT_CATEGORY_OPTIONS)[number]; -export type ProjectGrantsProjectCategory = typeof PROJECT_GRANTS_PROJECT_CATEGORY_OPTIONS[number]; +export type ProjectGrantsProjectCategory = (typeof PROJECT_GRANTS_PROJECT_CATEGORY_OPTIONS)[number]; -export type EventType = typeof EVENT_TYPE_OPTIONS[number]; +export type EventType = (typeof EVENT_TYPE_OPTIONS)[number]; -export type EventFormat = typeof EVENT_FORMAT_OPTIONS[number]; +export type EventFormat = (typeof EVENT_FORMAT_OPTIONS)[number]; -export type WouldYouShareYourResearch = typeof WOULD_YOU_SHARE_YOUR_RESEARCH_OPTIONS[number]; +export type WouldYouShareYourResearch = (typeof WOULD_YOU_SHARE_YOUR_RESEARCH_OPTIONS)[number]; -export type Country = typeof COUNTRY_OPTIONS[number]; +export type Country = (typeof COUNTRY_OPTIONS)[number]; -export type ReferralSource = typeof HOW_DID_YOU_HEAR_ABOUT_ESP_OPTIONS[number]; +export type ReferralSource = (typeof HOW_DID_YOU_HEAR_ABOUT_ESP_OPTIONS)[number]; -export type GrantsReferralSource = typeof HOW_DID_YOU_HEAR_ABOUT_GRANTS_WAVE[number]; +export type GrantsReferralSource = (typeof HOW_DID_YOU_HEAR_ABOUT_GRANTS_WAVE)[number]; -export type Timezone = typeof TIMEZONE_OPTIONS[number]; +export type Timezone = (typeof TIMEZONE_OPTIONS)[number]; -export type ApplyingAs = typeof APPLYING_AS_OPTIONS[number]; +export type ApplyingAs = (typeof APPLYING_AS_OPTIONS)[number]; export type Href = typeof HOME_URL | typeof APPLICANTS_URL | typeof ABOUT_URL | typeof ESP_BLOG_URL; @@ -473,3 +476,28 @@ export interface PSESponsorshipsNextApiRequest extends NextApiRequest { additionalInfo: string; }; } + +export type Frontmatter = { + metaTitle: string; + metaDescription: string; + metaImage: string; +}; + +/** + * Table of contents + */ +export type ToCNodeEntry = { + url?: string; + title?: string; +}; + +export type TocNodeType = + | ToCNodeEntry + | { + items: TocNodeType[]; + }; + +export type IRemarkTocOptions = { + maxDepth?: Options['maxDepth']; + callback: (toc: TocNodeType) => void; +}; diff --git a/src/utils/md.ts b/src/utils/md.ts new file mode 100644 index 00000000..6c7de1fc --- /dev/null +++ b/src/utils/md.ts @@ -0,0 +1,16 @@ +import fs from 'fs'; + +import { MARKDOWN_CONTENT_PATH } from '../constants'; + +export function getContentPaths() { + try { + return fs.readdirSync(MARKDOWN_CONTENT_PATH); + } catch (e: unknown) { + console.error(e); + return []; + } +} + +export function getMdxSource(slug: string) { + return fs.readFileSync(`${MARKDOWN_CONTENT_PATH}/${slug}.mdx`, 'utf8'); +} diff --git a/src/utils/remark/rehypeHeadingIds.ts b/src/utils/remark/rehypeHeadingIds.ts new file mode 100644 index 00000000..0efb58c5 --- /dev/null +++ b/src/utils/remark/rehypeHeadingIds.ts @@ -0,0 +1,51 @@ +import type { Element, ElementContent, Root } from 'hast'; +import type { Plugin } from 'unified'; +import { visit } from 'unist-util-visit'; + +import { parseHeadingId, trimmedTitle } from '../toc'; + +function concatenateNodeValues(node: Element): string { + return node.children.reduce((acc: string, child) => { + if (child.type === 'element' && child.children) { + return acc + concatenateNodeValues(child); + } + + if ('value' in child) { + return acc + child.value; + } + + return acc; + }, ''); +} + +/** + * Parses DOM elements to find all headings, setting an `id` attribute on each one. + * The `parseHeadingId` Table of Contents utility functions is used to generate the `id` + * for each, allowing ToC links to match. + * The `trimmedTitle` function is used to remove any trailing `{#id}` from the heading + * @returns Plugin<[{}], Root>, a rehype plugin that can be used in [...dynamic-md-pages].tsx + */ +const rehypeHeadingIds: Plugin<[{}], Root> = () => (tree, _file) => { + visit(tree, 'element', node => { + // Ignore non-heading elements + const headingElements = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + if (!headingElements.includes(node.tagName as string)) return; + + const concatenated = concatenateNodeValues(node); + if (node.properties) { + node.properties.id = parseHeadingId(concatenated); + } + + const lastIndex = node.children.length - 1; + const lastChild = node.children[lastIndex] as ElementContent; + if ('value' in lastChild) { + const lastChildValue: string = lastChild.value as string; + node.children[lastIndex] = { + type: 'text', + value: trimmedTitle(lastChildValue) + }; + } + }); +}; + +export default rehypeHeadingIds; diff --git a/src/utils/remark/remarkInferToc.ts b/src/utils/remark/remarkInferToc.ts new file mode 100644 index 00000000..321a3554 --- /dev/null +++ b/src/utils/remark/remarkInferToc.ts @@ -0,0 +1,78 @@ +import { toc } from 'mdast-util-toc'; +import { visit } from 'unist-util-visit'; +import type { BlockContent, DefinitionContent, ListContent } from 'mdast'; +import type { List, Nodes } from 'mdast-util-toc/lib'; +import type { Plugin } from 'unified'; + +import type { IRemarkTocOptions, ToCNodeEntry, TocNodeType } from '../../types'; + +const remarkInferToc: Plugin<[IRemarkTocOptions]> = options => { + const { callback, maxDepth }: IRemarkTocOptions = { + maxDepth: 6, + ...options + }; + + const processToC = ( + node: BlockContent | DefinitionContent | List | ListContent | null, + current: TocNodeType + ): TocNodeType => { + if (!node) { + return {}; + } + + switch (node.type) { + case `paragraph`: { + const typedCurrent = current as ToCNodeEntry; + + visit(node, item => { + if (item.type === `link`) { + typedCurrent.url = item.url; + } + if (item.type === `text` || item.type === `inlineCode`) { + if (typedCurrent.title) { + typedCurrent.title += item.value; + } else { + typedCurrent.title = item.value; + } + } + }); + + return current; + } + + case `list`: { + const typedCurrent = current as { items: Array }; + + typedCurrent.items = node.children.map(item => processToC(item, {})); + + return typedCurrent; + } + + case `listItem`: { + if (node.children.length) { + const heading = processToC(node.children[0], {}); + + if (node.children.length > 1) { + processToC(node.children[1], heading); + } + + return heading; + } + } + + default: + return {}; + } + }; + + return tree => { + const generatedToC = toc(tree as Nodes, { maxDepth }); + + if (generatedToC.map) { + const processedToC = processToC(generatedToC.map, {}); + callback(processedToC); + } + }; +}; + +export default remarkInferToc; diff --git a/src/utils/toc.ts b/src/utils/toc.ts new file mode 100644 index 00000000..beb93f41 --- /dev/null +++ b/src/utils/toc.ts @@ -0,0 +1,36 @@ +// RegEx patterns +const customIdRegEx = /^.+(\s*\{#([^\}]+?)\}\s*)$/; +const emojiRegEx = //g; + +/** + * Creates a slug from a string (Hello world => hello-world) + * @param s Any string + * @returns Lowercased string with spaces replaced with hyphens (kebab-casing) + */ +const slugify = (s: string): string => + encodeURIComponent(String(s).trim().toLowerCase().replace(/\s+/g, '-')); + +/** + * Parse a heading ID from a heading string. If the heading contains a custom ID, + * it will be used as the ID, otherwise the heading will be slugified and used. + * @param heading Heading string without leading #s that may contain a {#custom-id} + * @returns Heading ID string + */ +export const parseHeadingId = (heading: string): string => { + const match = customIdRegEx.exec(heading); + return match ? match[2].toLowerCase() : slugify(heading); +}; + +/** + * Removes any custom ID and Emoji components from a heading string + * @param title Heading string, not yet trimmed + * @returns Trimmed heading string + */ +export const trimmedTitle = (title: string): string => { + const match = customIdRegEx.exec(title); + const trimmedTitle = match ? title.replace(match[1], '').trim() : title; + + // Removes Twemoji components from title + const emojiMatch = emojiRegEx.exec(trimmedTitle); + return emojiMatch ? trimmedTitle.replaceAll(emojiRegEx, '') : trimmedTitle; +}; diff --git a/yarn.lock b/yarn.lock index fa0ee39f..9a8a6437 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1301,6 +1301,37 @@ dotenv "^8.2.0" superagent "3.8.1" +"@mdx-js/mdx@^2.2.1": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" + integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/mdx" "^2.0.0" + estree-util-build-jsx "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-util-to-js "^1.1.0" + estree-walker "^3.0.0" + hast-util-to-estree "^2.0.0" + markdown-extensions "^1.0.0" + periscopic "^3.0.0" + remark-mdx "^2.0.0" + remark-parse "^10.0.0" + remark-rehype "^10.0.0" + unified "^10.0.0" + unist-util-position-from-estree "^1.0.0" + unist-util-stringify-position "^3.0.0" + unist-util-visit "^4.0.0" + vfile "^5.0.0" + +"@mdx-js/react@^2.2.1": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" + integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== + dependencies: + "@types/mdx" "^2.0.0" + "@types/react" ">=16" + "@next/env@14.1.0": version "14.1.0" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341" @@ -1406,6 +1437,13 @@ dependencies: tslib "^2.4.0" +"@types/acorn@^4.0.0": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" + integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== + dependencies: + "@types/estree" "*" + "@types/debug@^4.0.0": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -1413,6 +1451,18 @@ dependencies: "@types/ms" "*" +"@types/estree-jsx@^1.0.0": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.4.tgz#8d34b43444887dde8a73af530f772f23e1d3287c" + integrity sha512-5idy3hvI9lAMqsyilBM+N+boaCf1MgoefbDxN6KEO5aK17TOHwFAYT9sjxzeKAiIWRUBgLxmZ9mPcnzZXtTcRQ== + dependencies: + "@types/estree" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/formidable@^2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/formidable/-/formidable-2.0.4.tgz#fdda9c4952ac7c7866485fea8e15e2cbcebfcc44" @@ -1432,6 +1482,11 @@ dependencies: "@types/unist" "*" +"@types/js-yaml@^4.0.0": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== + "@types/jsforce@^1.9.37": version "1.9.37" resolved "https://registry.yarnpkg.com/@types/jsforce/-/jsforce-1.9.37.tgz#63494c9e7fb926a3242c66823d623460d39f60bb" @@ -1475,11 +1530,23 @@ dependencies: "@types/unist" "*" +"@types/mdast@^4.0.0", "@types/mdast@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + "@types/mdurl@^1.0.0": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== +"@types/mdx@^2.0.0": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.11.tgz#21f4c166ed0e0a3a733869ba04cd8daea9834b8e" + integrity sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw== + "@types/ms@*": version "0.7.31" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" @@ -1530,7 +1597,7 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^18.2.55": +"@types/react@>=16", "@types/react@^18.2.55": version "18.2.55" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.55.tgz#38141821b7084404b5013742bc4ae08e44da7a67" integrity sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA== @@ -1544,11 +1611,21 @@ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/ungap__structured-clone@^0.3.0": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@types/ungap__structured-clone/-/ungap__structured-clone-0.3.3.tgz#cf7e1252f18f5ee39291a8f52fa83c31b0102fc6" + integrity sha512-RNmhIPwoip6K/zZOv3ypksTAqaqLEXvlNSXKyrC93xMSOAHZCR7PifW6xKZCwkbbnbM9dwB9X56PPoNTlNwEqw== + "@types/unist@*", "@types/unist@^2.0.0": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== + "@types/validator@^13.7.12": version "13.7.12" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.12.tgz#a285379b432cc8d103b69d223cbb159a253cf2f7" @@ -1600,7 +1677,7 @@ "@typescript-eslint/types" "6.21.0" eslint-visitor-keys "^3.4.1" -"@ungap/structured-clone@^1.2.0": +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== @@ -1629,12 +1706,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -acorn-jsx@^5.3.2: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +acorn@^8.0.0, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -1833,6 +1910,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +astring@^1.8.0: + version "1.8.6" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" + integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== + asynciterator.prototype@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" @@ -1993,6 +2075,11 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== + chakra-react-select@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/chakra-react-select/-/chakra-react-select-3.0.1.tgz#58656d6283a1da3a1982d9a1dc04c3ccd8944801" @@ -2024,11 +2111,26 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + character-entities@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.1.tgz#98724833e1e27990dee0bd0f2b8a859c3476aac7" integrity sha512-OzmutCf2Kmc+6DrFrrPS8/tDh2+DpnrfzdICHWhcVC9eOd0N1PXmQEE1a8iM4IziIAG+8tmTq3K+oo0ubH6RRQ== +character-reference-invalid@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -2760,6 +2862,51 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-util-attach-comments@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" + integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== + dependencies: + "@types/estree" "^1.0.0" + +estree-util-build-jsx@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" + integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== + dependencies: + "@types/estree-jsx" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + estree-walker "^3.0.0" + +estree-util-is-identifier-name@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" + integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== + +estree-util-to-js@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" + integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== + dependencies: + "@types/estree-jsx" "^1.0.0" + astring "^1.8.0" + source-map "^0.7.0" + +estree-util-visit@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" + integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/unist" "^2.0.0" + +estree-walker@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3087,6 +3234,11 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-slugger@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" + integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== + glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3290,6 +3442,27 @@ hasown@^2.0.0, hasown@^2.0.1: dependencies: function-bind "^1.1.2" +hast-util-to-estree@^2.0.0: + version "2.3.3" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz#da60142ffe19a6296923ec222aba73339c8bf470" + integrity sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ== + dependencies: + "@types/estree" "^1.0.0" + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdxjs-esm "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.4.1" + unist-util-position "^4.0.0" + zwitch "^2.0.0" + hast-util-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" @@ -3390,6 +3563,19 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +is-alphabetical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== + +is-alphanumerical@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== + dependencies: + is-alphabetical "^2.0.0" + is-decimal "^2.0.0" + is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -3466,6 +3652,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-decimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3497,6 +3688,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" +is-hexadecimal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== + is-map@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -3529,6 +3725,13 @@ is-plain-obj@^4.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== +is-reference@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -3655,7 +3858,7 @@ jackspeak@^2.3.5: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^4.1.0: +js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -3834,6 +4037,11 @@ lodash@^4.17.19, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +longest-streak@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3853,6 +4061,11 @@ lru-cache@^6.0.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== +markdown-extensions@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" + integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== + mdast-util-definitions@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.0.tgz#b6d10ef00a3c4cf191e8d9a5fa58d7f4a366f817" @@ -3880,6 +4093,83 @@ mdast-util-from-markdown@^1.0.0: unist-util-stringify-position "^3.0.0" uvu "^0.5.0" +mdast-util-from-markdown@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-mdx-expression@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" + integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdx-jsx@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.4.tgz#7c1f07f10751a78963cfabee38017cbc8b7786d1" + integrity sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + ccount "^2.0.0" + mdast-util-from-markdown "^1.1.0" + mdast-util-to-markdown "^1.3.0" + parse-entities "^4.0.0" + stringify-entities "^4.0.0" + unist-util-remove-position "^4.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + +mdast-util-mdx@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" + integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-mdx-expression "^1.0.0" + mdast-util-mdx-jsx "^2.0.0" + mdast-util-mdxjs-esm "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-mdxjs-esm@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" + integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== + dependencies: + "@types/estree-jsx" "^1.0.0" + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.0.0" + +mdast-util-phrasing@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + mdast-util-to-hast@^12.1.0: version "12.1.1" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca" @@ -3896,11 +4186,52 @@ mdast-util-to-hast@^12.1.0: unist-util-position "^4.0.0" unist-util-visit "^4.0.0" +mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + longest-streak "^3.0.0" + mdast-util-phrasing "^3.0.0" + mdast-util-to-string "^3.0.0" + micromark-util-decode-string "^1.0.0" + unist-util-visit "^4.0.0" + zwitch "^2.0.0" + +mdast-util-to-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-string@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== +mdast-util-to-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" + integrity sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg== + dependencies: + "@types/mdast" "^4.0.0" + +mdast-util-toc@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-7.0.0.tgz#d09715600eb32a053345803010a9b394bf5af179" + integrity sha512-C28UcSqjmnWuvgT8d97qpaItHKvySqVPAECUzqQ51xuMyNFFJwcFoKW77KoMjtXrclTidLQFDzLUmTmrshRweA== + dependencies: + "@types/mdast" "^4.0.0" + "@types/ungap__structured-clone" "^0.3.0" + "@ungap/structured-clone" "^1.0.0" + github-slugger "^2.0.0" + mdast-util-to-string "^4.0.0" + unist-util-is "^6.0.0" + unist-util-visit "^5.0.0" + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -3921,6 +4252,28 @@ methods@^1.1.1: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micromark-core-commonmark@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromark-core-commonmark@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" @@ -3943,6 +4296,72 @@ micromark-core-commonmark@^1.0.1: micromark-util-types "^1.0.1" uvu "^0.5.0" +micromark-extension-mdx-expression@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz#5bc1f5fd90388e8293b3ef4f7c6f06c24aff6314" + integrity sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw== + dependencies: + "@types/estree" "^1.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-mdx-jsx@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.5.tgz#e72d24b7754a30d20fb797ece11e2c4e2cae9e82" + integrity sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + estree-util-is-identifier-name "^2.0.0" + micromark-factory-mdx-expression "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdx-md@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.1.tgz#595d4b2f692b134080dca92c12272ab5b74c6d1a" + integrity sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-extension-mdxjs-esm@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.5.tgz#e4f8be9c14c324a80833d8d3a227419e2b25dec1" + integrity sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w== + dependencies: + "@types/estree" "^1.0.0" + micromark-core-commonmark "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.1.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + +micromark-extension-mdxjs@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.1.tgz#f78d4671678d16395efeda85170c520ee795ded8" + integrity sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q== + dependencies: + acorn "^8.0.0" + acorn-jsx "^5.0.0" + micromark-extension-mdx-expression "^1.0.0" + micromark-extension-mdx-jsx "^1.0.0" + micromark-extension-mdx-md "^1.0.0" + micromark-extension-mdxjs-esm "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + micromark-factory-destination@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" @@ -3962,6 +4381,20 @@ micromark-factory-label@^1.0.0: micromark-util-types "^1.0.0" uvu "^0.5.0" +micromark-factory-mdx-expression@^1.0.0: + version "1.0.9" + resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.9.tgz#57ba4571b69a867a1530f34741011c71c73a4976" + integrity sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA== + dependencies: + "@types/estree" "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-events-to-acorn "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-position-from-estree "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-factory-space@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" @@ -4045,6 +4478,20 @@ micromark-util-encode@^1.0.0: resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== +micromark-util-events-to-acorn@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.3.tgz#a4ab157f57a380e646670e49ddee97a72b58b557" + integrity sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w== + dependencies: + "@types/acorn" "^4.0.0" + "@types/estree" "^1.0.0" + "@types/unist" "^2.0.0" + estree-util-visit "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + vfile-message "^3.0.0" + micromark-util-html-tag-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.0.0.tgz#75737e92fef50af0c6212bd309bc5cb8dbd489ed" @@ -4210,6 +4657,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +next-mdx-remote@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz#96b16e2adc54dbcd0a7f204a9a3c3fd269d41abf" + integrity sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ== + dependencies: + "@mdx-js/mdx" "^2.2.1" + "@mdx-js/react" "^2.2.1" + vfile "^5.3.0" + vfile-matter "^3.0.1" + next-sitemap@^2.5.7: version "2.5.7" resolved "https://registry.yarnpkg.com/next-sitemap/-/next-sitemap-2.5.7.tgz#8376ecc8e91b94438f901dff732d5bef39e9d98c" @@ -4396,6 +4853,20 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" + integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== + dependencies: + "@types/unist" "^2.0.0" + character-entities "^2.0.0" + character-entities-legacy "^3.0.0" + character-reference-invalid "^2.0.0" + decode-named-character-reference "^1.0.0" + is-alphanumerical "^2.0.0" + is-decimal "^2.0.0" + is-hexadecimal "^2.0.0" + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -4444,6 +4915,15 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +periscopic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^3.0.0" + is-reference "^3.0.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4730,6 +5210,14 @@ regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +remark-mdx@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" + integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== + dependencies: + mdast-util-mdx "^2.0.0" + micromark-extension-mdxjs "^1.0.0" + remark-parse@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" @@ -4998,6 +5486,11 @@ source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.7.0: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + space-separated-tokens@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b" @@ -5107,6 +5600,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -5138,6 +5639,13 @@ style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" +style-to-object@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.4.tgz#266e3dfd56391a7eefb7770423612d043c3f33ec" + integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== + dependencies: + inline-style-parser "0.1.1" + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -5397,11 +5905,33 @@ unist-util-is@^5.0.0: resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== +unist-util-is@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" + integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== + dependencies: + "@types/unist" "^2.0.0" + unist-util-position@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.1.tgz#f8484b2da19a897a0180556d160c28633070dbb9" integrity sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA== +unist-util-remove-position@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" + integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-visit "^4.0.0" + unist-util-stringify-position@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" @@ -5425,6 +5955,14 @@ unist-util-visit-parents@^5.0.0: "@types/unist" "^2.0.0" unist-util-is "^5.0.0" +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" @@ -5443,6 +5981,15 @@ unist-util-visit@^4.0.0: unist-util-is "^5.0.0" unist-util-visit-parents "^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== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -5504,6 +6051,15 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vfile-matter@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-3.0.1.tgz#85e26088e43aa85c04d42ffa3693635fa2bc5624" + integrity sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg== + dependencies: + "@types/js-yaml" "^4.0.0" + is-buffer "^2.0.0" + js-yaml "^4.0.0" + vfile-message@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.0.tgz#5437035aa43185ff4b9210d32fada6c640e59143" @@ -5522,6 +6078,16 @@ vfile@^5.0.0: unist-util-stringify-position "^3.0.0" vfile-message "^3.0.0" +vfile@^5.3.0: + version "5.3.7" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -5661,3 +6227,8 @@ zod@^3.22.3: version "3.22.3" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug== + +zwitch@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==