diff --git a/CHANGELOG.md b/CHANGELOG.md index cb5b733e25..077dedce91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,122 @@ > All notable changes to this project will be documented in this file +## [2.19.0-beta.16](https://github.com/open-sauced/app/compare/v2.19.0-beta.15...v2.19.0-beta.16) (2024-04-17) + + +### 🍕 Features + +* switch [#100](https://github.com/open-sauced/app/issues/100)DaysOfOSS banner with Workspaces banner on feed page ([#3216](https://github.com/open-sauced/app/issues/3216)) ([417e98b](https://github.com/open-sauced/app/commit/417e98bf416370bb842bba6ada28b627cc0df6ab)) + +## [2.19.0-beta.15](https://github.com/open-sauced/app/compare/v2.19.0-beta.14...v2.19.0-beta.15) (2024-04-17) + + +### 🐛 Bug Fixes + +* fixed star search URL for SEO ([#3218](https://github.com/open-sauced/app/issues/3218)) ([69f8d67](https://github.com/open-sauced/app/commit/69f8d67cfff5c77a95b3cf84b7ecf75e56c4683f)) + +## [2.19.0-beta.14](https://github.com/open-sauced/app/compare/v2.19.0-beta.13...v2.19.0-beta.14) (2024-04-17) + + +### 🍕 Features + +* add support for blogpost from generic platforms ([#2555](https://github.com/open-sauced/app/issues/2555)) ([8ca6f25](https://github.com/open-sauced/app/commit/8ca6f25a24c1563e317ddf5e315ef75bc9c534a6)) +* styling `/starsearch` ([#3211](https://github.com/open-sauced/app/issues/3211)) ([5e4c037](https://github.com/open-sauced/app/commit/5e4c0370163b34036bde715c2be442fb3a9019ae)) + +## [2.19.0-beta.13](https://github.com/open-sauced/app/compare/v2.19.0-beta.12...v2.19.0-beta.13) (2024-04-17) + + +### 🐛 Bug Fixes + +* removed activity column from contributor grid ([#3206](https://github.com/open-sauced/app/issues/3206)) ([4b11168](https://github.com/open-sauced/app/commit/4b11168278a2a07a8ed7736ab276baae474eed36)) + +## [2.19.0-beta.12](https://github.com/open-sauced/app/compare/v2.19.0-beta.11...v2.19.0-beta.12) (2024-04-17) + + +### 🍕 Features + +* render markdown for `/starsearch` responses ([#3204](https://github.com/open-sauced/app/issues/3204)) ([49ce317](https://github.com/open-sauced/app/commit/49ce317c57ee0ba2a4ea53cbb9dc71f1f5e4e3be)) + +## [2.19.0-beta.11](https://github.com/open-sauced/app/compare/v2.19.0-beta.10...v2.19.0-beta.11) (2024-04-17) + + +### 🐛 Bug Fixes + +* update logic for most used languages to match contributor profile ([#3205](https://github.com/open-sauced/app/issues/3205)) ([e8f8a75](https://github.com/open-sauced/app/commit/e8f8a75319372a8f9aef548085f38e1b1f52f300)) + +## [2.19.0-beta.10](https://github.com/open-sauced/app/compare/v2.19.0-beta.9...v2.19.0-beta.10) (2024-04-17) + + +### 🐛 Bug Fixes + +* now links in collapsed sidebar no longer receive focus ([#3187](https://github.com/open-sauced/app/issues/3187)) ([5b05ace](https://github.com/open-sauced/app/commit/5b05acee0e54626167e230f6bee75f79ca5bec57)) +* now there is feedback when saving or updating workspace settings ([#3184](https://github.com/open-sauced/app/issues/3184)) ([43784b2](https://github.com/open-sauced/app/commit/43784b21d828dba3233f41f4c10189b8bf9a755b)) +* quick fix StarSearch response ([#3194](https://github.com/open-sauced/app/issues/3194)) ([0c2847e](https://github.com/open-sauced/app/commit/0c2847e5c1a0b889edfdc76b1ffde7e49e357124)) +* removed deprecated list pages ([#3197](https://github.com/open-sauced/app/issues/3197)) ([fa14557](https://github.com/open-sauced/app/commit/fa14557de1004c7f394563d807160a0d7130036f)) + +## [2.19.0-beta.9](https://github.com/open-sauced/app/compare/v2.19.0-beta.8...v2.19.0-beta.9) (2024-04-17) + + +### 🍕 Features + +* rename cumulative to history in Repo pages ([#3195](https://github.com/open-sauced/app/issues/3195)) ([8a33e24](https://github.com/open-sauced/app/commit/8a33e24802da851a314571b05d97fdbcacda7adb)) + +## [2.19.0-beta.8](https://github.com/open-sauced/app/compare/v2.19.0-beta.7...v2.19.0-beta.8) (2024-04-16) + + +### 🐛 Bug Fixes + +* now repo page OG images are corrext for production ([#3179](https://github.com/open-sauced/app/issues/3179)) ([772c7b5](https://github.com/open-sauced/app/commit/772c7b532178fc97d803d4f21de8783136c70066)) + +## [2.19.0-beta.7](https://github.com/open-sauced/app/compare/v2.19.0-beta.6...v2.19.0-beta.7) (2024-04-15) + + +### 🍕 Features + +* Create robots.txt ([#3183](https://github.com/open-sauced/app/issues/3183)) ([751c561](https://github.com/open-sauced/app/commit/751c561a71b0b9f3e6c134f1a2a87288f3be488c)) + +## [2.19.0-beta.6](https://github.com/open-sauced/app/compare/v2.19.0-beta.5...v2.19.0-beta.6) (2024-04-15) + + +### 🐛 Bug Fixes + +* remove console.info call from mutateHandler in AppSidebar component ([#3185](https://github.com/open-sauced/app/issues/3185)) ([96b63d7](https://github.com/open-sauced/app/commit/96b63d72f7936c3177a9679c9765cfa4d06fe224)) + +## [2.19.0-beta.5](https://github.com/open-sauced/app/compare/v2.19.0-beta.4...v2.19.0-beta.5) (2024-04-12) + + +### 🍕 Features + +* change repo links from github to repo pages ([#3178](https://github.com/open-sauced/app/issues/3178)) ([506dde2](https://github.com/open-sauced/app/commit/506dde2c0326be1eb67692cdc568b007bc2c2fbe)) + +## [2.19.0-beta.4](https://github.com/open-sauced/app/compare/v2.19.0-beta.3...v2.19.0-beta.4) (2024-04-12) + + +### 🍕 Features + +* created the workspace activity page with a pull requests table ([#3147](https://github.com/open-sauced/app/issues/3147)) ([9f65b9c](https://github.com/open-sauced/app/commit/9f65b9c5b3c9fbf95aa8e984e952938cd195072b)) + +## [2.19.0-beta.3](https://github.com/open-sauced/app/compare/v2.19.0-beta.2...v2.19.0-beta.3) (2024-04-12) + + +### 🍕 Features + +* add link from Repo pages to GitHub ([#3177](https://github.com/open-sauced/app/issues/3177)) ([f4e1de4](https://github.com/open-sauced/app/commit/f4e1de4f687cc1f5793a9819944f3c924496afbb)) + +## [2.19.0-beta.2](https://github.com/open-sauced/app/compare/v2.19.0-beta.1...v2.19.0-beta.2) (2024-04-12) + + +### 🐛 Bug Fixes + +* updated styles of create insights links in sidebar ([#3173](https://github.com/open-sauced/app/issues/3173)) ([6c0c5ce](https://github.com/open-sauced/app/commit/6c0c5ce80a581669d1f8c0fbd7111c737b5fed6b)) + +## [2.19.0-beta.1](https://github.com/open-sauced/app/compare/v2.18.0...v2.19.0-beta.1) (2024-04-11) + + +### 🍕 Features + +* basic implementation of StarSearch ([#3162](https://github.com/open-sauced/app/issues/3162)) ([0086134](https://github.com/open-sauced/app/commit/008613421a6f4fe4a415558c779850d443ba7568)) + ## [2.18.0](https://github.com/open-sauced/app/compare/v2.17.0...v2.18.0) (2024-04-11) diff --git a/components/Graphs/ForksChart.tsx b/components/Graphs/ForksChart.tsx index f0ca58b12b..e3d581086a 100644 --- a/components/Graphs/ForksChart.tsx +++ b/components/Graphs/ForksChart.tsx @@ -15,7 +15,7 @@ import { import { BiGitRepoForked } from "react-icons/bi"; import { type DayRange } from "components/shared/DayRangePicker"; import { type StatsType } from "lib/hooks/api/useFetchMetricStats"; -import { getCumulativeForksHistogramToDays, getDailyForksHistogramToDays, getTicks } from "lib/utils/repo-page-utils"; +import { getHistoryForksHistogramToDays, getDailyForksHistogramToDays, getTicks } from "lib/utils/repo-page-utils"; import Card from "components/atoms/Card/card"; import Button from "components/shared/Button/button"; @@ -30,12 +30,9 @@ type ForksChartProps = { }; export default function ForksChart({ stats, total, syncId, range = 30, isLoading }: ForksChartProps) { - const [category, setCategory] = useState<"daily" | "cumulative">("daily"); + const [category, setCategory] = useState<"daily" | "history">("daily"); const dailyData = useMemo(() => getDailyForksHistogramToDays({ stats, range }), [stats, range]); - const cumulativeData = useMemo( - () => getCumulativeForksHistogramToDays({ stats, total, range }), - [stats, total, range] - ); + const historyData = useMemo(() => getHistoryForksHistogramToDays({ stats, total, range }), [stats, total, range]); const bucketTicks = useMemo(() => getTicks({ histogram: dailyData, range }), [dailyData, range]); const renderChart = () => { @@ -50,9 +47,9 @@ export default function ForksChart({ stats, total, syncId, range = 30, isLoading ); - case "cumulative": + case "history": return ( - + @@ -78,11 +75,8 @@ export default function ForksChart({ stats, total, syncId, range = 30, isLoading - diff --git a/components/Graphs/StarsChart.tsx b/components/Graphs/StarsChart.tsx index 050a173fbc..f30e2f88a8 100644 --- a/components/Graphs/StarsChart.tsx +++ b/components/Graphs/StarsChart.tsx @@ -14,7 +14,7 @@ import { CartesianGrid, } from "recharts"; import { FaStar } from "react-icons/fa6"; -import { getCumulativeStarsHistogramToDays, getDailyStarsHistogramToDays, getTicks } from "lib/utils/repo-page-utils"; +import { getHistoryStarsHistogramToDays, getDailyStarsHistogramToDays, getTicks } from "lib/utils/repo-page-utils"; import { type DayRange } from "components/shared/DayRangePicker"; import { type StatsType } from "lib/hooks/api/useFetchMetricStats"; import Card from "components/atoms/Card/card"; @@ -30,12 +30,9 @@ type StarsChartProps = { }; export default function StarsChart({ stats, total, syncId, range = 30, isLoading }: StarsChartProps) { - const [category, setCategory] = useState<"daily" | "cumulative">("daily"); + const [category, setCategory] = useState<"daily" | "history">("daily"); const dailyData = useMemo(() => getDailyStarsHistogramToDays({ stats, range }), [stats, range]); - const cumulativeData = useMemo( - () => getCumulativeStarsHistogramToDays({ stats, total, range }), - [stats, total, range] - ); + const historyData = useMemo(() => getHistoryStarsHistogramToDays({ stats, total, range }), [stats, total, range]); const bucketTicks = useMemo(() => getTicks({ histogram: dailyData, range }), [dailyData, range]); const renderChart = () => { @@ -50,9 +47,9 @@ export default function StarsChart({ stats, total, syncId, range = 30, isLoading ); - case "cumulative": + case "history": return ( - + @@ -78,11 +75,8 @@ export default function StarsChart({ stats, total, syncId, range = 30, isLoading - diff --git a/components/PullRequests/PrStateAuthorIcon.tsx b/components/PullRequests/PrStateAuthorIcon.tsx index f0137168fc..cf85e78592 100644 --- a/components/PullRequests/PrStateAuthorIcon.tsx +++ b/components/PullRequests/PrStateAuthorIcon.tsx @@ -1,4 +1,5 @@ import { GitMergeIcon, GitPullRequestClosedIcon, GitPullRequestIcon } from "@primer/octicons-react"; +import Link from "next/link"; import { Avatar } from "components/atoms/Avatar/avatar-hover-card"; function getPullRequestStateIcon( @@ -51,7 +52,9 @@ export const PrStateAuthorIcon = ({ return (
- + + +
- + {!showingSidebar && (
); diff --git a/components/molecules/CardRepoList/card-repo-list.tsx b/components/molecules/CardRepoList/card-repo-list.tsx index 2f43e28c3d..af553dde78 100644 --- a/components/molecules/CardRepoList/card-repo-list.tsx +++ b/components/molecules/CardRepoList/card-repo-list.tsx @@ -45,7 +45,7 @@ const CardRepoList = ({
- + {repoName} diff --git a/components/molecules/ContributorHighlight/contributor-highlight-card.tsx b/components/molecules/ContributorHighlight/contributor-highlight-card.tsx index d9744f1d70..214cffc6e4 100644 --- a/components/molecules/ContributorHighlight/contributor-highlight-card.tsx +++ b/components/molecules/ContributorHighlight/contributor-highlight-card.tsx @@ -41,12 +41,14 @@ import useUserHighlightReactions from "lib/hooks/useUserHighlightReactions"; import Tooltip from "components/atoms/Tooltip/tooltip"; import useFollowUser from "lib/hooks/useFollowUser"; import { fetchGithubIssueInfo } from "lib/hooks/fetchGithubIssueInfo"; -import { isValidBlogUrl } from "lib/utils/dev-to"; +import { isValidUrl } from "lib/utils/urls"; +import { isValidDevToBlogUrl } from "lib/utils/dev-to"; import { fetchDevToBlogInfo } from "lib/hooks/fetchDevToBlogInfo"; import Search from "components/atoms/Search/search"; import Title from "components/atoms/Typography/title"; import { shortenUrl } from "lib/utils/shorten-url"; import GhOpenGraphImg from "../GhOpenGraphImg/gh-open-graph-img"; +import GenericBlogOpenGraphImg from "../GenericBlogOpenGraphImg/generic-blog-open-graph-img"; import { Dialog, DialogContent, @@ -260,7 +262,7 @@ const ContributorHighlightCard = ({ let repos: RepoList[] = []; - if (!taggedRepos || taggedRepos.length === 0) { + if (!taggedRepos || (taggedRepos.length === 0 && highlightLink.includes("github.com"))) { const { owner: repoOwner, repoName } = getOwnerAndRepoNameFromUrl(highlightLink); const repoIcon = getAvatarByUsername(repoOwner, 60); @@ -279,7 +281,7 @@ const ContributorHighlightCard = ({ return { text: "Pull request", icon: }; case "blog_post": return { - text: "Blog post", + text: highlightLink.includes("dev.to") ? "DevTo post" : "Blog post", icon: ( // Used svg as i could not find the exact icon in react-icons
Contributor
-
- Act -
+
Repositories
diff --git a/components/molecules/ContributorListTableRow/contributor-list-table-row.tsx b/components/molecules/ContributorListTableRow/contributor-list-table-row.tsx index 68fbf5e066..6982ecf326 100644 --- a/components/molecules/ContributorListTableRow/contributor-list-table-row.tsx +++ b/components/molecules/ContributorListTableRow/contributor-list-table-row.tsx @@ -194,10 +194,6 @@ const ContributorListTableRow = ({
- {/* Column: Act */} -
- {contributor.author_login ? getActivity(totalPrs, false) : "-"} -
{/* Column Repositories */}
diff --git a/components/molecules/DevProfile/dev-profile.tsx b/components/molecules/DevProfile/dev-profile.tsx index 2504e67577..30fe0a83c2 100644 --- a/components/molecules/DevProfile/dev-profile.tsx +++ b/components/molecules/DevProfile/dev-profile.tsx @@ -13,9 +13,9 @@ interface DevProfileProps { } const DevProfile = ({ username, hasBorder }: DevProfileProps) => { return ( - +
{/* Mobile */} -
+ { hasBorder={hasBorder} avatarURL={getAvatarByUsername(username)} /> -
+ {/* Desktop */}
@@ -33,7 +33,7 @@ const DevProfile = ({ username, hasBorder }: DevProfileProps) => { {username && username.length > 10 ? truncateString(username, 11) : username}
- +
); }; diff --git a/components/molecules/GenericBlogOpenGraphImg/generic-blog-open-graph-img.tsx b/components/molecules/GenericBlogOpenGraphImg/generic-blog-open-graph-img.tsx new file mode 100644 index 0000000000..702e79e686 --- /dev/null +++ b/components/molecules/GenericBlogOpenGraphImg/generic-blog-open-graph-img.tsx @@ -0,0 +1,46 @@ +import { useEffect, useState } from "react"; +import InvalidImage from "img/icons/fallback-image-disabled-square.svg"; + +interface GenericBlogOpenGraphImgProps { + blogLink: string; + className?: string; +} + +const GenericBlogOpenGraphImg = ({ blogLink, className }: GenericBlogOpenGraphImgProps): JSX.Element => { + const [socialImage, setSocialImage] = useState(""); + const [isValid, setIsValid] = useState(false); + + useEffect(() => { + const fetchBlogOGImage = async () => { + const response = await fetch(`/api/fetchOGData/?url=${blogLink}`); + const data = await response.json(); + return data; + }; + + fetchBlogOGImage().then(({ response }) => { + if (response) { + setSocialImage(response?.image?.url || response?.image?.url[response?.image?.url.length - 1]); + setIsValid(true); + } else { + setSocialImage(""); + setIsValid(false); + } + }); + }, [blogLink]); + + return ( + <> + {socialImage && ( + + {isValid + + )} + + ); +}; + +export default GenericBlogOpenGraphImg; diff --git a/components/molecules/HighlightInput/highlight-input-form.tsx b/components/molecules/HighlightInput/highlight-input-form.tsx index 916d19425c..90e89d907e 100644 --- a/components/molecules/HighlightInput/highlight-input-form.tsx +++ b/components/molecules/HighlightInput/highlight-input-form.tsx @@ -39,14 +39,16 @@ import { TypeWriterTextArea } from "components/atoms/TypeWriterTextArea/type-wri import { fetchGithubIssueInfo } from "lib/hooks/fetchGithubIssueInfo"; import generateIssueHighlightSummary from "lib/utils/generate-issue-highlight-summary"; import { fetchDevToBlogInfo } from "lib/hooks/fetchDevToBlogInfo"; -import { getBlogDetails, isValidBlogUrl } from "lib/utils/dev-to"; -import generateBlogHighlightSummary from "lib/utils/generate-blog-highlight-summary"; +import { getDevToBlogDetails, isValidDevToBlogUrl } from "lib/utils/dev-to"; +import generateDevToBlogHighlightSummary from "lib/utils/generate-dev-to-blog-highlight-summary"; import Search from "components/atoms/Search/search"; import useSupabaseAuth from "lib/hooks/useSupabaseAuth"; +import { isValidUrl } from "lib/utils/urls"; import { Calendar } from "../Calendar/calendar"; import { Popover, PopoverContent, PopoverTrigger } from "../Popover/popover"; import GhOpenGraphImg from "../GhOpenGraphImg/gh-open-graph-img"; import DevToSocialImg from "../DevToSocialImage/dev-to-social-img"; +import GenericBlogOpenGraphImg from "../GenericBlogOpenGraphImg/generic-blog-open-graph-img"; import CardRepoList, { RepoList } from "../CardRepoList/card-repo-list"; import { Dialog, @@ -163,16 +165,6 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E } }; - const checkIfHighlightLinkIsValid = (link: string) => { - if (!link) return setError(""); - if (isValidPullRequestUrl(link) || isValidIssueUrl(link) || isValidBlogUrl(link)) { - setIsHighlightURLValid(true); - setError(""); - } else { - setIsHighlightURLValid(false); - setError("Please provide a valid pull request, issue or dev.to blog link!"); - } - }; useEffect(() => { // disable scroll when form is open if (isFormOpenMobile) { @@ -342,6 +334,22 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E const newTaggedRepoList = [...taggedRepoList, newRepo]; setTaggedRepoList(newTaggedRepoList); } + + (() => { + if (!highlightLink) return setError(""); + if ( + isValidPullRequestUrl(highlightLink) || + isValidIssueUrl(highlightLink) || + isValidDevToBlogUrl(highlightLink) || + isValidUrl(highlightLink) + ) { + setIsHighlightURLValid(true); + setError(""); + } else { + setIsHighlightURLValid(false); + setError("Please provide a valid pull request, issue or dev.to blog link!"); + } + })(); }, [highlightLink]); const handleTaggedRepoAdd = async (repoFullName: string) => { @@ -384,15 +392,21 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E }; const handleGenerateHighlightSummary = async () => { - if ( - !highlightLink || - (!isValidPullRequestUrl(highlightLink) && !isValidIssueUrl(highlightLink) && !isValidBlogUrl(highlightLink)) - ) { + if (!highlightLink) { setError("Please provide a valid pull request, issue or dev.to blog link!"); return; } setIsHighlightURLValid(true); + if (highlightLink && (!highlightLink.includes("github.com") || !highlightLink.includes("dev.to"))) { + toast({ + description: "Auto-Summarize not supported for current link!", + title: "Oops!", + variant: "warning", + }); + return; + } + setIsSummaryButtonDisabled(true); let summary: string | null; @@ -404,8 +418,8 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E const issueComments = await getGithubIssueComments(highlightLink); summary = await generateIssueHighlightSummary(issueTitle, issueBody, issueComments); } else { - const { title: blogTitle, markdown: blogMarkdown } = await getBlogDetails(highlightLink); - summary = await generateBlogHighlightSummary(blogTitle, blogMarkdown); + const { title: blogTitle, markdown: blogMarkdown } = await getDevToBlogDetails(highlightLink); + summary = await generateDevToBlogHighlightSummary(blogTitle, blogMarkdown); } setIsSummaryButtonDisabled(false); @@ -433,7 +447,12 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E const highlight = bodyText; - if (isValidPullRequestUrl(highlightLink) || isValidIssueUrl(highlightLink) || isValidBlogUrl(highlightLink)) { + if ( + isValidPullRequestUrl(highlightLink) || + isValidIssueUrl(highlightLink) || + isValidDevToBlogUrl(highlightLink) || + isValidUrl(highlightLink) + ) { setIsHighlightURLValid(true); // generateApiPrUrl will return an object with repoName, orgName and issueId // it can work with both issue and pull request links @@ -648,19 +667,24 @@ const HighlightInputForm = ({ refreshCallback }: HighlightInputFormProps): JSX.E value={highlightLink} handleChange={(value) => { setHighlightLink(value); - checkIfHighlightLinkIsValid(value); }} placeholder="Paste the URL to your PR, Issue, or Dev.to blog post." />
- {highlightLink && isDivFocused && highlightLink.includes("github") && ( + {highlightLink && isDivFocused && highlightLink.includes("github.com") && ( )} {highlightLink && isDivFocused && highlightLink.includes("dev.to") && ( )} + {highlightLink && + isDivFocused && + !highlightLink.includes("github.com") && + !highlightLink.includes("dev.to") && ( + + )} - {middlePages.map((pageNumber) => { - return ( + {showPages && middlePages.length > 0 ? ( + <> - ); - })} + {middlePages.map((pageNumber) => { + return ( + + ); + })} + + + ) : null}
{showTotalPages && ( -
+
Total {totalPage > 999 ? humanizeNumber(totalPage, null) : totalPage} pages
diff --git a/components/molecules/RecommendedRepoCard/recommended-repo-card.tsx b/components/molecules/RecommendedRepoCard/recommended-repo-card.tsx index 0daf0379d7..93620fa387 100644 --- a/components/molecules/RecommendedRepoCard/recommended-repo-card.tsx +++ b/components/molecules/RecommendedRepoCard/recommended-repo-card.tsx @@ -33,7 +33,7 @@ const RecommendedRepoCard = ({ fullName, className }: RecommendedRepoCardProps): {data && ( <>
diff --git a/components/molecules/TableRepositoryName/table-repository-name.tsx b/components/molecules/TableRepositoryName/table-repository-name.tsx index 7a6cdd993a..d28c81a1fb 100644 --- a/components/molecules/TableRepositoryName/table-repository-name.tsx +++ b/components/molecules/TableRepositoryName/table-repository-name.tsx @@ -1,4 +1,5 @@ import { StaticImageData } from "next/image"; +import Link from "next/link"; import Avatar from "components/atoms/Avatar/avatar"; import Tooltip from "components/atoms/Tooltip/tooltip"; interface TableRepositoryNameProps { @@ -14,7 +15,7 @@ const TableRepositoryName = ({ avatarURL, fullName }: TableRepositoryNameProps): return (
{/* Avatar */} - + - + {/* Text */}
- - {name} - + {name}
diff --git a/components/organisms/TopNav/top-nav.tsx b/components/organisms/TopNav/top-nav.tsx index a031c446bb..2573985bb3 100644 --- a/components/organisms/TopNav/top-nav.tsx +++ b/components/organisms/TopNav/top-nav.tsx @@ -89,9 +89,9 @@ const Nav = ({ className }: { className?: string }) => {
  • Star Search logo

    StarSearch

    diff --git a/components/shared/AppSidebar/AppSidebar.tsx b/components/shared/AppSidebar/AppSidebar.tsx index 43c4011d74..ccf6a80786 100644 --- a/components/shared/AppSidebar/AppSidebar.tsx +++ b/components/shared/AppSidebar/AppSidebar.tsx @@ -73,9 +73,7 @@ export const AppSideBar = ({ workspaceId, hideSidebar, sidebarCollapsed }: AppSi } useEffectOnce(() => { - const mutateHandler = (event: Event) => { - // eslint-disable-next-line no-console - event instanceof CustomEvent && console.info(WORKSPACE_UPDATED_EVENT, event.detail); + const mutateHandler = () => { mutate(); }; @@ -92,8 +90,9 @@ export const AppSideBar = ({ workspaceId, hideSidebar, sidebarCollapsed }: AppSi return ( // TODO: get rid of the z-index. There is grid content like the avatars and paged data text that bleed through the sidebar atm.
    - + - + + + + )}
    ); }; diff --git a/components/shared/AppSidebar/InsightsPanel.tsx b/components/shared/AppSidebar/InsightsPanel.tsx index 8ce4325c69..7506aa4289 100644 --- a/components/shared/AppSidebar/InsightsPanel.tsx +++ b/components/shared/AppSidebar/InsightsPanel.tsx @@ -2,7 +2,6 @@ import { useState } from "react"; import { ChartBarSquareIcon, UsersIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; import SkeletonWrapper from "components/atoms/SkeletonLoader/skeleton-wrapper"; -import Button from "components/shared/Button/button"; import SidebarMenuItem from "./sidebar-menu-item"; interface InsightsPanelProps { @@ -73,16 +72,16 @@ export const InsightsPanel = ({ title, insights, type, isLoading, workspaceId }: }) ) : (
  • -

    You don't have any Insights yet!

    - +
  • )} {insights.length > 3 ? ( diff --git a/components/shared/Button/button.stories.tsx b/components/shared/Button/button.stories.tsx index 1204a3a5a6..f4d5c52572 100644 --- a/components/shared/Button/button.stories.tsx +++ b/components/shared/Button/button.stories.tsx @@ -2,7 +2,7 @@ import { ComponentStory } from "@storybook/react"; import Button from "./button"; const storyConfig = { - title: "Design System/Atoms/Button", + title: "Design System/Buttons/Button", argTypes: { disabled: { control: { type: "boolean" }, @@ -46,6 +46,12 @@ Link.args = { variant: "link" }; export const Destructive = ButtonTemplate.bind({}); Destructive.args = { variant: "destructive" }; +export const IsLoading = ButtonTemplate.bind({}); +IsLoading.args = { variant: "primary", loading: true }; + +export const IsLoadingCustomText = ButtonTemplate.bind({}); +IsLoadingCustomText.args = { variant: "primary", loading: true, loadingText: "Custom Loading Text..." }; + export const HasIcons: ComponentStory = (args) => (
    diff --git a/components/shared/Button/button.tsx b/components/shared/Button/button.tsx index c288c15221..c894bc3c96 100644 --- a/components/shared/Button/button.tsx +++ b/components/shared/Button/button.tsx @@ -8,10 +8,25 @@ export interface ButtonsProps extends React.ButtonHTMLAttributes( - ({ className, children, loading, disabled, variant, showLoadingText = true, onClick, href, ...props }, ref) => { + ( + { + className, + children, + loading, + disabled, + variant, + showLoadingText = true, + loadingText = "Loading...", + onClick, + href, + ...props + }, + ref + ) => { const styles: Record = { primary: `bg-light-orange-9 text-light-orange-2 border-light-orange-9 hover:bg-light-orange-10 ${ disabled ? "bg-light-orange-7 hover:bg-light-orange-7 pointer-events-none" : "" @@ -57,7 +72,7 @@ const Button = React.forwardRef( fill="currentColor" > - {showLoadingText && Loading...} + {showLoadingText && {loadingText}}
    ) : ( children diff --git a/components/shared/LimitPicker.tsx b/components/shared/LimitPicker.tsx new file mode 100644 index 0000000000..350c18c7a5 --- /dev/null +++ b/components/shared/LimitPicker.tsx @@ -0,0 +1,38 @@ +import { useRouter } from "next/router"; +import SingleSelect from "components/atoms/Select/single-select"; + +export type LimitOptions = 10 | 20 | 30 | 40 | 50; + +const limitOptions: { label: string; value: `${LimitOptions}` }[] = [ + { label: "10 per page", value: "10" }, + { label: "20 per page", value: "20" }, + { label: "30 per page", value: "30" }, + { label: "40 per page", value: "40" }, + { label: "50 per page", value: "50" }, +]; + +interface LimitPickerProps { + onLimitChanged?: (value: string) => void; +} + +export const LimitPicker = ({ onLimitChanged }: LimitPickerProps) => { + const router = useRouter(); + const limit = (Number(router.query.limit) || 10) as LimitOptions; + + const onDefaultLimitChanged = (value: string) => { + router.push({ query: { ...router.query, page: 1, limit: value } }); + onLimitChanged?.(value); + }; + + return ( + + ); +}; diff --git a/e2e/homepage.spec.ts b/e2e/homepage.spec.ts index b68dd79444..bf709a93f8 100644 --- a/e2e/homepage.spec.ts +++ b/e2e/homepage.spec.ts @@ -12,5 +12,7 @@ test("Loads home page (logged out user)", async ({ page }) => { await expect(page.getByRole("complementary", { name: "Repositories", exact: true })).toBeVisible(); await expect(page.getByRole("complementary", { name: "Featured Highlights", exact: true })).toBeVisible(); await expect(page.getByRole("complementary", { name: "Subscribe to our newsletter", exact: true })).toBeVisible(); - await expect(page.getByRole("complementary", { name: "#100DaysOfOSS 🚀", exact: true })).toBeVisible(); + await expect( + page.getByRole("complementary", { name: "Track your project with Workspaces!", exact: true }) + ).toBeVisible(); }); diff --git a/e2e/workspace-activity.spec.ts b/e2e/workspace-activity.spec.ts new file mode 100644 index 0000000000..f2e66fae7d --- /dev/null +++ b/e2e/workspace-activity.spec.ts @@ -0,0 +1,48 @@ +import { test, expect } from "@playwright/test"; + +const openSaucedWorkspaceId = "21c5e583-f1fd-4033-9ec9-7801f67ff727"; + +test("workspace activity page", async ({ page }) => { + await page.goto(`/workspaces/${openSaucedWorkspaceId}/activity`); + + await expect(page.getByRole("tab", { name: "Activity", exact: true })).toBeVisible(); + await expect(page.getByRole("combobox", { name: "Filter", exact: true })).toBeHidden(); + await expect(page.getByRole("combobox", { name: "Period:30d", exact: true })).toBeHidden(); + await expect(page.getByRole("combobox", { name: "Limit:10 per page", exact: true })).toBeHidden(); + + const table = page.getByRole("table", { name: "Pull Requests", exact: true }); + const thead = table.locator("thead"); + await expect(table).toBeVisible(); + await expect(thead).toBeVisible(); + + await expect(thead.getByText("State")).toBeVisible(); + await expect(thead.getByText("Pull Request")).toBeVisible(); + await expect(thead.getByText("Changed Files ")).toBeVisible(); + await expect(thead.getByText("Changes")).toBeVisible(); + await expect(thead.getByText("Updated At")).toBeVisible(); + await expect(thead.getByText("Created At")).toBeVisible(); + await expect(thead.getByText("Closed At")).toBeVisible(); + await expect(thead.getByText("Merged At")).toBeVisible(); + + await expect(table.locator("tbody").locator("tr")).toHaveCount(10); +}); + +test.describe("{ width: 640, height: 1136 }", () => { + test.use({ viewport: { width: 640, height: 1136 } }); + test("workspace activity page (small screen)", async ({ page }) => { + await page.goto(`/workspaces/${openSaucedWorkspaceId}/activity`); + + await expect(page.getByRole("tab", { name: "Activity", exact: true })).toBeVisible(); + await expect(page.getByRole("combobox", { name: "Filter", exact: true })).toBeHidden(); + await expect(page.getByRole("combobox", { name: "Period:30d", exact: true })).toBeHidden(); + await expect(page.getByRole("combobox", { name: "Limit:10 per page", exact: true })).toBeHidden(); + + const table = page.getByRole("table", { name: "Pull Requests", exact: true }); + const thead = table.locator("thead"); + await expect(table).toBeVisible(); + await expect(thead).toBeVisible(); + + await expect(thead.getByText("Pull Requests")).toBeVisible(); + await expect(table.locator("tbody").locator("tr")).toHaveCount(10); + }); +}); diff --git a/layouts/profile.tsx b/layouts/profile.tsx index ec9bdea90b..9035d354d2 100644 --- a/layouts/profile.tsx +++ b/layouts/profile.tsx @@ -7,7 +7,7 @@ const ProfileLayout = ({ children }: { children: React.ReactNode }) => { return (
    -
    +
    {children}
    diff --git a/lib/hooks/api/useWorkspacePullRequests.ts b/lib/hooks/api/useWorkspacePullRequests.ts new file mode 100644 index 0000000000..255fc3597d --- /dev/null +++ b/lib/hooks/api/useWorkspacePullRequests.ts @@ -0,0 +1,67 @@ +import useSWR, { Fetcher } from "swr"; + +import { publicApiFetcher } from "lib/utils/public-api-fetcher"; + +interface PaginatedResponse { + readonly data: DbRepoPREvents[]; + readonly meta: Meta; +} + +export type OrderPullRequestsBy = "created_at" | "closed_at" | "merged_at" | "updated_at"; + +export const useWorkspacePullRequests = ({ + workspaceId, + page, + limit, + orderDirection, + orderBy, + repoIds, + range, +}: { + workspaceId: string; + page: number; + limit: number; + orderDirection?: "ASC" | "DESC"; + orderBy?: OrderPullRequestsBy; + repoIds?: number[]; + range: number; +}) => { + const query = new URLSearchParams(); + + if (page) { + query.set("page", `${page}`); + } + + if (limit) { + query.set("limit", `${limit}`); + } + + if (orderDirection) { + query.set("orderDirection", orderDirection); + } + + if (orderBy) { + query.set("orderBy", orderBy); + } + + if (repoIds && repoIds.length > 0) { + query.set("repoIds", repoIds.join(",")); + } + + query.set("range", `${range}`); + + const endpointString = `workspaces/${workspaceId}/repos/prs?${query}`; + + const { data, error, mutate } = useSWR( + endpointString, + publicApiFetcher as Fetcher + ); + + return { + data: data?.data ?? [], + meta: data?.meta ?? { itemCount: 0, limit: 0, page: 0, hasNextPage: false, hasPreviousPage: false, pageCount: 0 }, + isLoading: !error && !data, + isError: !!error, + mutate, + }; +}; diff --git a/lib/utils/contributor-utils.test.ts b/lib/utils/contributor-utils.test.ts index 20f5ffcb58..d23d1668d9 100644 --- a/lib/utils/contributor-utils.test.ts +++ b/lib/utils/contributor-utils.test.ts @@ -50,7 +50,7 @@ describe("contributor utilities", () => { }, }) satisfies DbUser; - expect(getTopContributorLanguages(user)).toEqual(["go", "javascript"]); + expect(getTopContributorLanguages(user)).toEqual(["go", "rust"]); }); it("should get no languages when there are no languages", () => { diff --git a/lib/utils/contributor-utils.ts b/lib/utils/contributor-utils.ts index 91a5f29ddc..fa07b5c6ac 100644 --- a/lib/utils/contributor-utils.ts +++ b/lib/utils/contributor-utils.ts @@ -1,6 +1,14 @@ export function getTopContributorLanguages(contributor: DbUser) { // Note that it's possible for a user to have no languages - const languages = Object.entries(contributor.languages).map(([language]) => language); + const languages = Object.entries(contributor.languages).map(([language, percentageUsed]) => ({ + language, + percentageUsed: percentageUsed, + })); + const langArray = languages.slice().sort((a, b) => b.percentageUsed - a.percentageUsed); + const sortedLangArray = langArray + .sort((a, b) => (a.percentageUsed < b.percentageUsed ? 1 : -1)) + .slice(0, 2) + .map((lang) => lang.language); - return languages.sort((a, b) => (a < b ? -1 : 1)).slice(0, 2); + return sortedLangArray; } diff --git a/lib/utils/dev-to.test.ts b/lib/utils/dev-to.test.ts index b20ff25d51..d39e8004ff 100644 --- a/lib/utils/dev-to.test.ts +++ b/lib/utils/dev-to.test.ts @@ -1,8 +1,8 @@ -import { getBlogDetails, isValidBlogUrl } from "lib/utils/dev-to"; +import { getDevToBlogDetails, isValidDevToBlogUrl } from "lib/utils/dev-to"; describe("[lib] dev-to methods", () => { it("Should return the title and markdown", async () => { - const result = await getBlogDetails( + const result = await getDevToBlogDetails( "https://dev.to/opensauced/how-open-source-helped-me-get-a-github-octernship-4f69" ); expect(result).toEqual({ @@ -12,11 +12,13 @@ describe("[lib] dev-to methods", () => { }); it("Should return false", () => { - const result = isValidBlogUrl("https://gitub.com/open-sauced/hot/pull/448"); + const result = isValidDevToBlogUrl("https://gitub.com/open-sauced/hot/pull/448"); expect(result).toEqual(false); }); it("Should return true", () => { - const result = isValidBlogUrl("https://dev.to/opensauced/how-open-source-helped-me-get-a-github-octernship-4f69"); + const result = isValidDevToBlogUrl( + "https://dev.to/opensauced/how-open-source-helped-me-get-a-github-octernship-4f69" + ); expect(result).toEqual(true); }); }); diff --git a/lib/utils/dev-to.ts b/lib/utils/dev-to.ts index 2a78235db7..3786c995f7 100644 --- a/lib/utils/dev-to.ts +++ b/lib/utils/dev-to.ts @@ -1,4 +1,4 @@ -export const getBlogDetails = async (blogLink: string) => { +export const getDevToBlogDetails = async (blogLink: string) => { const trimmedUrl = blogLink.trim(); const devToUrl = new URL(trimmedUrl.includes("https://") ? trimmedUrl : `https://${trimmedUrl}`); const { pathname } = devToUrl; @@ -12,6 +12,6 @@ export const getBlogDetails = async (blogLink: string) => { }; }; -export const isValidBlogUrl = (url: string): boolean => { +export const isValidDevToBlogUrl = (url: string): boolean => { return url.match(/((https?:\/\/)?(www\.)?dev\.to\/[^\/]+\/[^\/]+)/) ? true : false; }; diff --git a/lib/utils/generate-blog-highlight-summary.ts b/lib/utils/generate-dev-to-blog-highlight-summary.ts similarity index 85% rename from lib/utils/generate-blog-highlight-summary.ts rename to lib/utils/generate-dev-to-blog-highlight-summary.ts index 768c70b14a..f5e87c1e53 100644 --- a/lib/utils/generate-blog-highlight-summary.ts +++ b/lib/utils/generate-dev-to-blog-highlight-summary.ts @@ -1,7 +1,7 @@ import { supabase } from "./supabase"; const baseUrl = process.env.NEXT_PUBLIC_API_URL; -const generateBlogHighlightSummary = async (blogTitle: string, blogMarkdown: string) => { +const generateDevToBlogHighlightSummary = async (blogTitle: string, blogMarkdown: string) => { const sessionResponse = await supabase.auth.getSession(); const sessionToken = sessionResponse?.data.session?.access_token; const payload = { @@ -37,4 +37,4 @@ const generateBlogHighlightSummary = async (blogTitle: string, blogMarkdown: str } }; -export default generateBlogHighlightSummary; +export default generateDevToBlogHighlightSummary; diff --git a/lib/utils/repo-page-utils.ts b/lib/utils/repo-page-utils.ts index 29da1efe88..68bbee9475 100644 --- a/lib/utils/repo-page-utils.ts +++ b/lib/utils/repo-page-utils.ts @@ -105,7 +105,7 @@ export function getDailyStarsHistogramToDays({ return result; } -export function getCumulativeStarsHistogramToDays({ +export function getHistoryStarsHistogramToDays({ stats, range, total, @@ -229,7 +229,7 @@ export function getDailyForksHistogramToDays({ return result; } -export function getCumulativeForksHistogramToDays({ +export function getHistoryForksHistogramToDays({ stats, range, total, diff --git a/lib/utils/urls.ts b/lib/utils/urls.ts index 9282d4af4c..4ef840899d 100644 --- a/lib/utils/urls.ts +++ b/lib/utils/urls.ts @@ -18,6 +18,10 @@ export const siteUrl = (path: string = "", params: { [key: string]: any } = {}) return url.toString(); }; +export const isValidUrl = (url: string) => { + return /^(http|https):\/\/[A-Za-z0-9.-]+(\/[A-Za-z0-9\/_.-]+)*$/.test(url); +}; + /** * ------------------------------------------------------------------------------- * DevCard URLs diff --git a/next-types.d.ts b/next-types.d.ts index d9404af7bb..2950a0efbe 100644 --- a/next-types.d.ts +++ b/next-types.d.ts @@ -93,7 +93,7 @@ interface DBListContributor { interface DbRepoPREvents { readonly event_id: number; readonly pr_number: number; - readonly pr_state: string; + readonly pr_state: "open" | "closed"; readonly pr_is_draft: bool; readonly pr_is_merged: bool; readonly pr_mergeable_state: string; @@ -275,7 +275,7 @@ interface DbUser { readonly discord_url: string; readonly notification_count: number; readonly insights_count: number; - readonly languages: { [lang]: number }; + readonly languages: { [lang: string]: number }; readonly first_opened_pr_at: string; readonly followers_count: number; readonly following_count: number; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 99786f940f..97ff55d163 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,15 +1,16 @@ { "name": "@open-sauced/app", - "version": "2.18.0", + "version": "2.19.0-beta.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@open-sauced/app", - "version": "2.18.0", + "version": "2.19.0-beta.16", "hasInstallScript": true, "license": "Apache 2.0", "dependencies": { + "@github/relative-time-element": "^4.4.0", "@headlessui/react": "^1.7.8", "@heroicons/react": "^2.0.14", "@nivo/bar": "^0.83.0", @@ -44,6 +45,7 @@ "@supabase/gotrue-js": "^1.22.22", "@supabase/supabase-js": "^2.26.0", "@supabase/ui": "^0.36.5", + "@tanstack/react-table": "^8.15.3", "@use-gesture/react": "^10.2.27", "@vercel/og": "^0.5.8", "clsx": "^1.2.1", @@ -55,6 +57,7 @@ "next": "^13.5.6", "nextjs-progressbar": "^0.0.16", "octokit": "^3.1.2", + "open-graph": "^0.2.6", "path-to-regexp": "^6.2.1", "posthog-js": "^1.104.0", "posthog-node": "^3.6.0", @@ -67,6 +70,7 @@ "react-hot-toast": "^2.4.0", "react-icons": "^5.0.0", "react-loading-skeleton": "^3.1.0", + "react-markdown": "^9.0.1", "react-parallax-tilt": "^1.7.151", "react-schemaorg": "^2.0.0", "react-use": "^17.4.0", @@ -2675,10 +2679,26 @@ "react": ">=16.8.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.9.tgz", - "integrity": "sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -2692,9 +2712,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz", - "integrity": "sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -2708,9 +2728,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.9.tgz", - "integrity": "sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -2740,9 +2760,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz", - "integrity": "sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -2756,9 +2776,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz", - "integrity": "sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -2772,9 +2792,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz", - "integrity": "sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -2788,9 +2808,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz", - "integrity": "sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -2804,9 +2824,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz", - "integrity": "sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -2820,9 +2840,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz", - "integrity": "sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -2836,9 +2856,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz", - "integrity": "sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -2852,9 +2872,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz", - "integrity": "sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -2868,9 +2888,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz", - "integrity": "sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -2884,9 +2904,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz", - "integrity": "sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -2900,9 +2920,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz", - "integrity": "sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -2916,9 +2936,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz", - "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -2932,9 +2952,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz", - "integrity": "sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -2948,9 +2968,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz", - "integrity": "sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -2964,9 +2984,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz", - "integrity": "sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -2980,9 +3000,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz", - "integrity": "sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -2996,9 +3016,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz", - "integrity": "sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -3012,9 +3032,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz", - "integrity": "sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -3161,6 +3181,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, + "node_modules/@github/relative-time-element": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.4.0.tgz", + "integrity": "sha512-CrI6oAecoahG7PF5dsgjdvlF5kCtusVMjg810EULD81TvnDsP+k/FRi/ClFubWLgBo4EGpr2EfvmumtqQFo7ow==" + }, "node_modules/@headlessui/react": { "version": "1.7.8", "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.8.tgz", @@ -8560,9 +8585,9 @@ "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz", - "integrity": "sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", + "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", "cpu": [ "arm" ], @@ -8573,9 +8598,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz", - "integrity": "sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", + "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", "cpu": [ "arm64" ], @@ -8586,9 +8611,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz", - "integrity": "sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", + "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", "cpu": [ "arm64" ], @@ -8599,9 +8624,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz", - "integrity": "sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", + "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", "cpu": [ "x64" ], @@ -8612,9 +8637,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz", - "integrity": "sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", + "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", "cpu": [ "arm" ], @@ -8625,9 +8650,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz", - "integrity": "sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", + "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", "cpu": [ "arm64" ], @@ -8638,9 +8663,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz", - "integrity": "sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", + "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", "cpu": [ "arm64" ], @@ -8651,9 +8676,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz", - "integrity": "sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", + "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", "cpu": [ "riscv64" ], @@ -8664,9 +8689,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz", - "integrity": "sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", + "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", "cpu": [ "x64" ], @@ -8677,9 +8702,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz", - "integrity": "sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", + "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", "cpu": [ "x64" ], @@ -8690,9 +8715,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz", - "integrity": "sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", + "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", "cpu": [ "arm64" ], @@ -8703,9 +8728,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz", - "integrity": "sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", + "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", "cpu": [ "ia32" ], @@ -8716,9 +8741,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz", - "integrity": "sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", + "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", "cpu": [ "x64" ], @@ -12569,6 +12594,37 @@ "tailwindcss": ">=3.0.0 || insiders" } }, + "node_modules/@tanstack/react-table": { + "version": "8.15.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.15.3.tgz", + "integrity": "sha512-aocQ4WpWiAh7R+yxNp+DGQYXeVACh5lv2kk96DjYgFiHDCB0cOFoYMT/pM6eDOzeMXR9AvPoLeumTgq8/0qX+w==", + "dependencies": { + "@tanstack/table-core": "8.15.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.15.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.15.3.tgz", + "integrity": "sha512-wOgV0HfEvuMOv8RlqdR9MdNNqq0uyvQtP39QOvGlggHvIObOE4exS+D5LGO8LZ3LUXxId2IlUKcHDHaGujWhUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz", @@ -13038,6 +13094,14 @@ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/detect-port": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", @@ -13093,6 +13157,14 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", @@ -13132,6 +13204,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -13199,6 +13279,14 @@ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mdx": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz", @@ -13217,6 +13305,11 @@ "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -13364,8 +13457,7 @@ "node_modules/@types/unist": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" }, "node_modules/@types/uuid": { "version": "9.0.7", @@ -13907,6 +13999,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, "node_modules/@use-gesture/core": { "version": "10.2.27", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz", @@ -13956,13 +14053,13 @@ } }, "node_modules/@vitest/expect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.0.4.tgz", - "integrity": "sha512-/NRN9N88qjg3dkhmFcCBwhn/Ie4h064pY3iv7WLRsDJW7dXnEgeoa8W9zy7gIPluhz6CkgqiB3HmpIXgmEY5dQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.2.2.tgz", + "integrity": "sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg==", "dev": true, "dependencies": { - "@vitest/spy": "1.0.4", - "@vitest/utils": "1.0.4", + "@vitest/spy": "1.2.2", + "@vitest/utils": "1.2.2", "chai": "^4.3.10" }, "funding": { @@ -13970,12 +14067,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.0.4.tgz", - "integrity": "sha512-rhOQ9FZTEkV41JWXozFM8YgOqaG9zA7QXbhg5gy6mFOVqh4PcupirIJ+wN7QjeJt8S8nJRYuZH1OjJjsbxAXTQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.2.2.tgz", + "integrity": "sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg==", "dev": true, "dependencies": { - "@vitest/utils": "1.0.4", + "@vitest/utils": "1.2.2", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -14011,9 +14108,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.0.4.tgz", - "integrity": "sha512-vkfXUrNyNRA/Gzsp2lpyJxh94vU2OHT1amoD6WuvUAA12n32xeVZQ0KjjQIf8F6u7bcq2A2k969fMVxEsxeKYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.2.2.tgz", + "integrity": "sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -14043,9 +14140,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.0.4.tgz", - "integrity": "sha512-9ojTFRL1AJVh0hvfzAQpm0QS6xIS+1HFIw94kl/1ucTfGCaj1LV/iuJU4Y6cdR03EzPDygxTHwE1JOm+5RCcvA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.2.2.tgz", + "integrity": "sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -14055,12 +14152,13 @@ } }, "node_modules/@vitest/utils": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.0.4.tgz", - "integrity": "sha512-gsswWDXxtt0QvtK/y/LWukN7sGMYmnCcv1qv05CsY6cU/Y1zpGX1QuvLs+GO1inczpE6Owixeel3ShkjhYtGfA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.2.2.tgz", + "integrity": "sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", "loupe": "^2.3.7", "pretty-format": "^29.7.0" }, @@ -14068,6 +14166,21 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", @@ -14435,7 +14548,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14730,6 +14842,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -14761,6 +14881,14 @@ "util": "^0.12.5" } }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -14869,6 +14997,19 @@ "node": ">=12.0.0" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, "node_modules/axe-core": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", @@ -14986,6 +15127,15 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -15011,6 +15161,14 @@ } ] }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", @@ -15099,8 +15257,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bottleneck": { "version": "2.19.5", @@ -15490,10 +15647,24 @@ "node": ">=4" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", @@ -15522,6 +15693,42 @@ "node": ">=4" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -15540,6 +15747,108 @@ "node": "*" } }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA==", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/cheerio/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -15914,6 +16223,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/command-score": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz", @@ -16236,10 +16554,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cosmiconfig": { "version": "7.0.1", @@ -16672,6 +16989,17 @@ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -16750,6 +17078,18 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -16965,7 +17305,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "engines": { "node": ">=6" } @@ -17088,6 +17427,18 @@ "node": ">=0.8.0" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -17324,6 +17675,15 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -18867,6 +19227,15 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -19051,8 +19420,7 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/external-editor": { "version": "3.1.0", @@ -19083,6 +19451,26 @@ "extract-zip": "cli.js" } }, + "node_modules/extract-zip/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -19139,8 +19527,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -19484,6 +19871,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -19905,6 +20300,14 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/giget": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.3.tgz", @@ -20220,6 +20623,27 @@ "uglify-js": "^3.1.4" } }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -20341,13 +20765,70 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" } }, "node_modules/hex-rgb": { @@ -20459,6 +20940,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/html-webpack-plugin": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", @@ -20565,6 +21055,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -20759,6 +21263,11 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + }, "node_modules/inline-style-prefixer": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", @@ -20962,6 +21471,28 @@ "node": ">=8" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -21091,6 +21622,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-deflate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", @@ -21178,6 +21718,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -21266,6 +21815,17 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -21481,6 +22041,11 @@ "node": ">=0.10.0" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -21674,6 +22239,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, "node_modules/jscodeshift": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.1.tgz", @@ -21948,11 +22518,15 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -21960,6 +22534,11 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -22027,6 +22606,20 @@ "node": ">=10" } }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -22561,6 +23154,16 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha512-lxdsn7xxlCymgLYo1gGvVrfHmkjDiyqVv62FAeF2i5ta72BipE1SLxw8hPEPLhD4/247Ijw07UQH7Hq/chT5LA==" + }, "node_modules/lodash.castarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", @@ -22572,11 +23175,26 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha512-pXYUy7PR8BCLwX5mgJ/aNtyOvuJTdZAo9EQFUvMIYugqmJxnrYaANvTbgndOzHSCSR0wnlBBfRXJL5SbWxo3FQ==" + }, "node_modules/lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -22610,20 +23228,38 @@ "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha512-qkTuvgEzYdyhiJBx42YPzPo71R1aEr0z79kAv7Ixg8wPFEjgRgJdUsGMG3Hf3OYSF/kHI79XhNlt+5Ar6OzwxQ==" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -22801,6 +23437,15 @@ "node": ">=0.10.0" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -22940,6 +23585,278 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-to-string": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", @@ -23021,6 +23938,448 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/micromark/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -23753,6 +25112,14 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -23981,6 +25348,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open-graph": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/open-graph/-/open-graph-0.2.6.tgz", + "integrity": "sha512-L4lTD3fcPkNclAZFukhr8ZAF8+kBqXJqUb/HNSdIoxVMTdaqSwSroYdBiFb56yPdr4GrltECiL5lRHYIJbpY/A==", + "dependencies": { + "cheerio": "^0.22.0", + "request": "^2.73.0" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -24233,6 +25609,25 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -24942,6 +26337,15 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -24963,8 +26367,7 @@ "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/public-encrypt": { "version": "4.0.3", @@ -25021,7 +26424,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -25477,6 +26879,75 @@ "react": ">=16.8.0" } }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/react-markdown/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/react-markdown/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/react-parallax-tilt": { "version": "1.7.151", "resolved": "https://registry.npmjs.org/react-parallax-tilt/-/react-parallax-tilt-1.7.151.tgz", @@ -25721,7 +27192,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -25961,6 +27431,37 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-slug": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", @@ -25989,6 +27490,79 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -26272,8 +27846,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/satori": { "version": "0.10.1", @@ -26803,6 +28376,30 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stack-generator": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", @@ -26946,7 +28543,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -26955,7 +28551,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -27089,6 +28684,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -27196,6 +28804,14 @@ "webpack": "^5.0.0" } }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -27275,15 +28891,12 @@ } }, "node_modules/swr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.0.3.tgz", - "integrity": "sha512-sGvQDok/AHEWTPfhUWXEHBVEXmgGnuahyhmRQbjl9XBYxT/MSlAzvXEKQpyM++bMPaI52vcWS2HiKNaW7+9OFw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.0.tgz", + "integrity": "sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==", "dependencies": { "use-sync-external-store": "^1.2.0" }, - "engines": { - "pnpm": "7" - }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0" } @@ -27764,9 +29377,9 @@ "dev": true }, "node_modules/tinypool": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz", - "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", + "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", "dev": true, "engines": { "node": ">=14.0.0" @@ -27869,6 +29482,24 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", @@ -28134,7 +29765,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -28142,6 +29772,11 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -28535,6 +30170,29 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", @@ -28557,6 +30215,97 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/unist-util-visit": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", @@ -28679,7 +30428,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -28833,8 +30581,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utila": { "version": "0.4.0", @@ -29250,6 +30997,56 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/victory-vendor": { "version": "36.9.2", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", @@ -29360,9 +31157,9 @@ } }, "node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", + "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", "dev": true, "dependencies": { "esbuild": "^0.19.3", @@ -29415,9 +31212,9 @@ } }, "node_modules/vite-node": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.0.4.tgz", - "integrity": "sha512-9xQQtHdsz5Qn8hqbV7UKqkm8YkJhzT/zr41Dmt5N7AlD8hJXw/Z7y0QiD5I8lnTthV9Rvcvi0QW7PI0Fq83ZPg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.2.2.tgz", + "integrity": "sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -29460,9 +31257,9 @@ "dev": true }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz", - "integrity": "sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -29475,10 +31272,16 @@ "node": ">=12" } }, + "node_modules/vite/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/vite/node_modules/esbuild": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz", - "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -29488,35 +31291,39 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.9", - "@esbuild/android-arm64": "0.19.9", - "@esbuild/android-x64": "0.19.9", - "@esbuild/darwin-arm64": "0.19.9", - "@esbuild/darwin-x64": "0.19.9", - "@esbuild/freebsd-arm64": "0.19.9", - "@esbuild/freebsd-x64": "0.19.9", - "@esbuild/linux-arm": "0.19.9", - "@esbuild/linux-arm64": "0.19.9", - "@esbuild/linux-ia32": "0.19.9", - "@esbuild/linux-loong64": "0.19.9", - "@esbuild/linux-mips64el": "0.19.9", - "@esbuild/linux-ppc64": "0.19.9", - "@esbuild/linux-riscv64": "0.19.9", - "@esbuild/linux-s390x": "0.19.9", - "@esbuild/linux-x64": "0.19.9", - "@esbuild/netbsd-x64": "0.19.9", - "@esbuild/openbsd-x64": "0.19.9", - "@esbuild/sunos-x64": "0.19.9", - "@esbuild/win32-arm64": "0.19.9", - "@esbuild/win32-ia32": "0.19.9", - "@esbuild/win32-x64": "0.19.9" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/vite/node_modules/rollup": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", - "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", + "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -29525,34 +31332,34 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.8.0", - "@rollup/rollup-android-arm64": "4.8.0", - "@rollup/rollup-darwin-arm64": "4.8.0", - "@rollup/rollup-darwin-x64": "4.8.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", - "@rollup/rollup-linux-arm64-gnu": "4.8.0", - "@rollup/rollup-linux-arm64-musl": "4.8.0", - "@rollup/rollup-linux-riscv64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-musl": "4.8.0", - "@rollup/rollup-win32-arm64-msvc": "4.8.0", - "@rollup/rollup-win32-ia32-msvc": "4.8.0", - "@rollup/rollup-win32-x64-msvc": "4.8.0", + "@rollup/rollup-android-arm-eabi": "4.9.6", + "@rollup/rollup-android-arm64": "4.9.6", + "@rollup/rollup-darwin-arm64": "4.9.6", + "@rollup/rollup-darwin-x64": "4.9.6", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", + "@rollup/rollup-linux-arm64-gnu": "4.9.6", + "@rollup/rollup-linux-arm64-musl": "4.9.6", + "@rollup/rollup-linux-riscv64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-gnu": "4.9.6", + "@rollup/rollup-linux-x64-musl": "4.9.6", + "@rollup/rollup-win32-arm64-msvc": "4.9.6", + "@rollup/rollup-win32-ia32-msvc": "4.9.6", + "@rollup/rollup-win32-x64-msvc": "4.9.6", "fsevents": "~2.3.2" } }, "node_modules/vitest": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.0.4.tgz", - "integrity": "sha512-s1GQHp/UOeWEo4+aXDOeFBJwFzL6mjycbQwwKWX2QcYfh/7tIerS59hWQ20mxzupTJluA2SdwiBuWwQHH67ckg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.2.2.tgz", + "integrity": "sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==", "dev": true, "dependencies": { - "@vitest/expect": "1.0.4", - "@vitest/runner": "1.0.4", - "@vitest/snapshot": "1.0.4", - "@vitest/spy": "1.0.4", - "@vitest/utils": "1.0.4", - "acorn-walk": "^8.3.0", + "@vitest/expect": "1.2.2", + "@vitest/runner": "1.2.2", + "@vitest/snapshot": "1.2.2", + "@vitest/spy": "1.2.2", + "@vitest/utils": "1.2.2", + "acorn-walk": "^8.3.2", "cac": "^6.7.14", "chai": "^4.3.10", "debug": "^4.3.4", @@ -29564,9 +31371,9 @@ "std-env": "^3.5.0", "strip-literal": "^1.3.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.1", + "tinypool": "^0.8.2", "vite": "^5.0.0", - "vite-node": "1.0.4", + "vite-node": "1.2.2", "why-is-node-running": "^2.2.2" }, "bin": { @@ -29614,9 +31421,9 @@ "dev": true }, "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -29726,9 +31533,9 @@ "dev": true }, "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -30480,6 +32287,15 @@ "optional": true } } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 0a90625d42..dc4d0c6083 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@open-sauced/app", "description": "🍕The dashboard for open source discovery.", "keywords": [], - "version": "2.18.0", + "version": "2.19.0-beta.16", "author": "Brian Douglas ", "private": true, "license": "Apache 2.0", @@ -43,6 +43,7 @@ "e2e:ui": "npm run e2e -- --ui" }, "dependencies": { + "@github/relative-time-element": "^4.4.0", "@headlessui/react": "^1.7.8", "@heroicons/react": "^2.0.14", "@nivo/bar": "^0.83.0", @@ -77,6 +78,7 @@ "@supabase/gotrue-js": "^1.22.22", "@supabase/supabase-js": "^2.26.0", "@supabase/ui": "^0.36.5", + "@tanstack/react-table": "^8.15.3", "@use-gesture/react": "^10.2.27", "@vercel/og": "^0.5.8", "clsx": "^1.2.1", @@ -88,6 +90,7 @@ "next": "^13.5.6", "nextjs-progressbar": "^0.0.16", "octokit": "^3.1.2", + "open-graph": "^0.2.6", "path-to-regexp": "^6.2.1", "posthog-js": "^1.104.0", "posthog-node": "^3.6.0", @@ -100,6 +103,7 @@ "react-hot-toast": "^2.4.0", "react-icons": "^5.0.0", "react-loading-skeleton": "^3.1.0", + "react-markdown": "^9.0.1", "react-parallax-tilt": "^1.7.151", "react-schemaorg": "^2.0.0", "react-use": "^17.4.0", diff --git a/pages/api/fetchOGData.ts b/pages/api/fetchOGData.ts new file mode 100644 index 0000000000..fb2c5d0115 --- /dev/null +++ b/pages/api/fetchOGData.ts @@ -0,0 +1,15 @@ +import { NextApiResponse, NextApiRequest } from "next"; +const og = require("open-graph"); + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const url = req.query.url; + if (req.method === "GET") { + og(url, (error: any, meta: {}) => { + if (!error) { + res.status(200).json({ response: meta }); + } else { + res.status(200).json({ response: {} }); + } + }); + } +} diff --git a/pages/feed/index.tsx b/pages/feed/index.tsx index cb1dec5cd7..616b801478 100644 --- a/pages/feed/index.tsx +++ b/pages/feed/index.tsx @@ -199,14 +199,13 @@ const Feeds: WithPageLayout = (props: HighlightSSRProps) => { /> )}
    diff --git a/pages/lists/[listId]/activity.tsx b/pages/lists/[listId]/activity.tsx deleted file mode 100644 index f6cf4260ca..0000000000 --- a/pages/lists/[listId]/activity.tsx +++ /dev/null @@ -1,252 +0,0 @@ -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; -import { GetServerSidePropsContext } from "next"; -import { useRouter } from "next/router"; -import { useState } from "react"; -import { NodeMouseEventHandler } from "@nivo/treemap"; -import { useRef } from "react"; -import ContributionsEvolutionByType from "components/molecules/ContributionsEvolutionByTypeCard/contributions-evolution-by-type-card"; -import { ContributionsTreemap } from "components/Graphs/ContributionsTreemap/contributions-treemap"; -import Error from "components/atoms/Error/Error"; -import { fetchApiData, validateListPath } from "helpers/fetchApiData"; -import ListPageLayout from "layouts/lists"; -import MostActiveContributorsCard from "components/molecules/MostActiveContributorsCard/most-active-contributors-card"; -import useMostActiveContributors from "lib/hooks/api/useMostActiveContributors"; -import { useContributorsByProject } from "lib/hooks/api/useContributorsByProject"; -import { useContributionsByProject } from "lib/hooks/api/useContributionsByProject"; -import { getGraphColorPalette } from "lib/utils/color-utils"; -import useContributionsEvolutionByType from "lib/hooks/api/useContributionsByEvolutionType"; -import { FeatureFlagged } from "components/shared/feature-flagged"; -import { FeatureFlag, getAllFeatureFlags } from "lib/utils/server/feature-flags"; -import { OnToggleResizeEventType } from "components/Graphs/shared/graph-resizer"; - -export interface ContributorListPageProps { - list?: DBList; - numberOfContributors: number; - isError: boolean; - isOwner: boolean; - featureFlags: Record; -} - -export type FilterParams = { - listId: string; - range?: string; - limit?: string; -}; - -export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { - const supabase = createPagesServerClient(ctx); - - const { - data: { session }, - } = await supabase.auth.getSession(); - const bearerToken = session ? session.access_token : ""; - const { listId, range: rawRange, limit: rawLimit } = ctx.params as FilterParams; - - const range = rawRange ? Number(rawRange) : 30; - const limit = rawLimit ? Number(rawLimit) : 20; - const [{ data, error: contributorListError }, { data: list, error }] = await Promise.all([ - fetchApiData>({ - path: `lists/${listId}/contributors?limit=1`, - bearerToken, - pathValidator: validateListPath, - }), - fetchApiData({ path: `lists/${listId}`, bearerToken, pathValidator: validateListPath }), - ]); - - if (error?.status === 404 || error?.status === 401) { - return { - notFound: true, - }; - } - - const userId = Number(session?.user.user_metadata.sub); - const featureFlags = await getAllFeatureFlags(userId); - - return { - props: { - list, - numberOfContributors: data?.meta.itemCount, - isError: error || contributorListError, - isOwner: list && list.user_id === userId, - featureFlags, - }, - }; -}; - -// if no repoName is set, want the id - -const getTreemapData = ({ - currentOrgName, - repoName, - projectData = [], - projectContributionsByUser = [], -}: { - currentOrgName: string | null; - repoName: string | null; - projectData: DbProjectContributions[]; - projectContributionsByUser: DBProjectContributor[] | undefined; -}) => { - let children; - - switch (true) { - case currentOrgName === null: - children = Object.values( - projectData.reduce((acc, { repo_name, total_contributions }) => { - const [orgName] = repo_name.split("/"); - - if (!acc[orgName]) { - acc[orgName] = { id: orgName, value: 0, orgName }; - } - acc[orgName].value += total_contributions; - return acc; - }, {} as any) - ); - break; - case currentOrgName !== null && repoName === null: - children = projectData - .filter(({ repo_name }) => { - const [org_id] = repo_name.split("/"); - - return org_id === currentOrgName; - }) - .map(({ repo_name, total_contributions }) => { - return { - id: repo_name, - value: total_contributions, - repoName: `${repo_name}`, - }; - }); - break; - - case repoName !== null: - children = projectContributionsByUser.map( - ({ login, commits, prs_created, prs_reviewed, issues_created, comments }) => { - return { - id: login, - value: commits + prs_created, // Coming soon + prs_reviewed + issues_created + comments, - }; - } - ); - break; - } - - return { - id: "root", - children, - }; -}; - -const ListActivityPage = ({ list, numberOfContributors, isError, isOwner, featureFlags }: ContributorListPageProps) => { - const router = useRouter(); - const range = router.query.range as string; - const { - data: contributorStats, - isLoading, - isError: isMostActiveError, - setContributorType, - contributorType, - } = useMostActiveContributors({ listId: list!.id }); - const [currentOrgName, setCurrentOrgName] = useState(null); - const { - setRepoName, - error, - data: projectContributionsByUser, - repoName, - isLoading: isLoadingProjectContributionsByUser, - } = useContributorsByProject(list!.id, Number(range ?? "30")); - const [projectId, setProjectId] = useState(null); - - const { - data: projectData = [], - error: projectDataError, - isLoading: isTreemapLoading, - } = useContributionsByProject({ - listId: list!.id, - range: Number(range ?? "30"), - }); - - const onDrillDown: NodeMouseEventHandler<{ orgName: null; repoName: null; id: string | null }> = (node) => { - if (currentOrgName === null) { - setCurrentOrgName(node.data.orgName); - return; - } else { - setRepoName(node.data.repoName); - setProjectId(node.data.id); - } - }; - - const onDrillUp = () => { - if (repoName !== null) { - setRepoName(null); - setProjectId(null); - } else { - setCurrentOrgName(null); - } - }; - - const treemapData = getTreemapData({ currentOrgName, repoName, projectData, projectContributionsByUser }); - - const { - data: evolutionData, - isError: evolutionError, - isLoading: isLoadingEvolution, - } = useContributionsEvolutionByType({ listId: list!.id, range: Number(range ?? "30") }); - const treemapRef = useRef(null); - const mostActiveRef = useRef(null); - const graphResizerLookup = new Map(); - - if (treemapRef.current) { - graphResizerLookup.set(treemapRef.current, true); - } - - if (mostActiveRef.current) { - graphResizerLookup.set(mostActiveRef.current, true); - } - - const onToggleResize: OnToggleResizeEventType = (checked) => { - const treemap = treemapRef.current; - - if (!treemap) { - return; - } - - treemap.style.gridColumn = checked ? "1 / span 2" : ""; - treemap.style.gridRow = checked ? "1 / span 2" : ""; - }; - - return ( - - {isError ? ( - - ) : ( -
    - - - } - onDrillUp={onDrillUp} - data={treemapData} - color={getGraphColorPalette()} - isLoading={isLoadingProjectContributionsByUser || isTreemapLoading} - onToggleResize={onToggleResize} - /> - - - - -
    - )} -
    - ); -}; - -export default ListActivityPage; diff --git a/pages/lists/[listId]/add-contributors.tsx b/pages/lists/[listId]/add-contributors.tsx deleted file mode 100644 index 05fbb1d163..0000000000 --- a/pages/lists/[listId]/add-contributors.tsx +++ /dev/null @@ -1,321 +0,0 @@ -import React, { useState } from "react"; -import { GetServerSidePropsContext } from "next"; -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; - -import Image from "next/image"; -import { FiAlertOctagon, FiCheckCircle } from "react-icons/fi"; -import useFetchAllContributors from "lib/hooks/useFetchAllContributors"; -import { fetchApiData, validateListPath } from "helpers/fetchApiData"; - -import ContributorListTableHeaders from "components/molecules/ContributorListTableHeader/contributor-list-table-header"; -import HubContributorsPageLayout from "layouts/hub-contributors"; -import ContributorTable from "components/organisms/ContributorsTable/contributors-table"; -import Header from "components/organisms/Header/header"; -import AddContributorsHeader from "components/AddContributorsHeader/add-contributors-header"; -import useSupabaseAuth from "lib/hooks/useSupabaseAuth"; -import { Dialog, DialogContent } from "components/molecules/Dialog/dialog"; -import Title from "components/atoms/Typography/title"; -import Text from "components/atoms/Typography/text"; -import Button from "components/shared/Button/button"; -import { searchUsers } from "lib/hooks/search-users"; - -// TODO: Move to a shared file -export function isListId(listId: string) { - const regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/; - - return regex.test(listId); -} - -interface AddContributorsPageProps { - list: DbUserList; - initialData: { - meta: Meta; - data: DbPRContributor[]; - }; - timezoneOption: { timezone: string }[]; -} - -export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { - const { listId } = ctx.params as { listId: string }; - const supabase = createPagesServerClient(ctx); - - const { - data: { session }, - } = await supabase.auth.getSession(); - const bearerToken = session ? session.access_token : ""; - const userId = Number(session?.user.user_metadata.sub); - - if (!isListId(listId)) { - return { - notFound: true, - }; - } - - const { data: list, error: listError } = await fetchApiData({ - path: `lists/${listId}`, - bearerToken, - // TODO: remove this in another PR for cleaning up fetchApiData - pathValidator: () => true, - }); - - // Only the list owner should be allowed to add contributors - if (listError?.status === 404 || (list && list.user_id !== userId)) { - return { - notFound: true, - }; - } - - return { - props: { - list, - }, - }; -}; - -interface ContributorsAddedModalProps { - list: DbUserList; - contributorCount: number; - isOpen: boolean; - onClose: () => void; -} - -interface ErrorModalProps { - list: DbUserList; - isOpen: boolean; - onRetry: () => void; - onClose: () => void; -} - -const ErrorModal = ({ list, isOpen, onRetry, onClose }: ErrorModalProps) => { - return ( - - onClose()} className="grid place-content-center"> -
    -
    - - - - - - - - Something went wrong - - - - We couldn't add the new contributors to your list. Please try again. - -
    -
    - - -
    -
    -
    -
    - ); -}; - -const ContributorsAddedModal = ({ list, contributorCount, isOpen, onClose }: ContributorsAddedModalProps) => { - return ( - - onClose()} className="grid place-content-center"> -
    -
    - - - - - - - - You've added {contributorCount} new {contributorCount > 1 ? "contributors" : "contributor"} - - - - You can now get insights into their activity from your list dashboard. - -
    -
    - - -
    -
    -
    -
    - ); -}; - -const useContributorSearch = (makeRequest: boolean) => { - const [contributorSearchTerm, setContributorSearchTerm] = useState(); - - const { data, meta, isLoading, setPage } = useFetchAllContributors( - { - contributor: contributorSearchTerm, - }, - { - revalidateOnFocus: false, - }, - makeRequest - ); - - return { - setContributorSearchTerm, - data, - meta, - isLoading, - setPage, - }; -}; - -const EmptyState = () => ( -
    - -

    Search for contributors to add to your list

    -
    -); - -const AddContributorsToList = ({ list, timezoneOption }: AddContributorsPageProps) => { - const [selectedContributors, setSelectedContributors] = useState([]); - - const { sessionToken, providerToken } = useSupabaseAuth(); - const [contributorsAdded, setContributorsAdded] = useState(false); - const [contributorsAddedError, setContributorsAddedError] = useState(false); - const [contributors, setContributors] = useState([]); - const [suggestions, setSuggestions] = useState([]); - const [searchResults, setSearchResults] = useState([]); - - const addContributorsToList = async () => { - const { error } = await fetchApiData({ - path: `lists/${list.id}/contributors`, - body: { - contributors: selectedContributors.map(({ user_id, author_login }) => ({ id: user_id, login: author_login })), - }, - method: "POST", - bearerToken: sessionToken!, - pathValidator: validateListPath, - }); - - if (error) { - setContributorsAddedError(true); - } else { - setContributorsAdded(true); - } - }; - - const onAllChecked = (state: boolean) => { - if (state) { - setSelectedContributors(contributors); - } else { - setSelectedContributors([]); - } - }; - - const onChecked = (state: boolean, contributor: DbPRContributor) => { - if (state) { - setSelectedContributors((prev) => [...prev, contributor]); - } else { - setSelectedContributors(selectedContributors.filter((selected) => selected.user_id !== contributor.user_id)); - } - }; - - async function onSearch(searchTerm: string | undefined) { - if (searchTerm && searchTerm.length >= 3) { - await updateSuggestions(searchTerm); - } - } - - async function updateSuggestions(contributor: string) { - setSuggestions([]); - - const response = await searchUsers(contributor, providerToken); - - if (response) { - const suggestions = response.data.map((item) => item.login); - setSuggestions(suggestions); - setSearchResults(response.data); - } - } - - const onSearchSelect = (username: string) => { - const contributorInfo = searchResults.find((item) => item.login === username); - - if (contributorInfo) { - const contributor: DbPRContributor = { - user_id: contributorInfo.id, - author_login: contributorInfo.login, - username: contributorInfo.login, - updated_at: "", - }; - onChecked(true, contributor); - - setContributors((prev) => [...prev, contributor]); - } - }; - - return ( - -
    -
    - user_id)} - onAddToList={addContributorsToList} - onSearch={onSearch} - searchSuggestions={suggestions} - onSearchSelect={onSearchSelect} - /> -
    - 0 && selectedContributors.length === contributors.length} - handleOnSelectAllContributor={onAllChecked} - /> - {contributors.length > 0 ? ( - - ) : ( - - )} -
    - {contributorsAdded && ( - { - setContributorsAdded(false); - setContributors([]); - setSelectedContributors([]); - }} - /> - )} - {contributorsAddedError && ( - { - setContributorsAddedError(false); - addContributorsToList(); - }} - onClose={() => { - setContributorsAddedError(false); - }} - /> - )} -
    - ); -}; - -export default AddContributorsToList; diff --git a/pages/lists/[listId]/edit.tsx b/pages/lists/[listId]/edit.tsx deleted file mode 100644 index f3eb2826d0..0000000000 --- a/pages/lists/[listId]/edit.tsx +++ /dev/null @@ -1,409 +0,0 @@ -import dynamic from "next/dynamic"; -import { useRouter } from "next/router"; - -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; -import { GetServerSidePropsContext } from "next"; -import { UserGroupIcon } from "@heroicons/react/24/solid"; -import { ComponentProps, useState } from "react"; -import { FaUserPlus } from "react-icons/fa6"; -import Link from "next/link"; -import { MdOutlineArrowBackIos } from "react-icons/md"; -import { fetchApiData } from "helpers/fetchApiData"; -import HubContributorsPageLayout from "layouts/hub-contributors"; -import Title from "components/atoms/Typography/title"; -import Text from "components/atoms/Typography/text"; -import ToggleSwitch from "components/atoms/ToggleSwitch/toggle-switch"; -import Button from "components/shared/Button/button"; -import TextInput from "components/atoms/TextInput/text-input"; -import useSupabaseAuth from "lib/hooks/useSupabaseAuth"; -import { useToast } from "lib/hooks/useToast"; -import Search from "components/atoms/Search/search"; -import Pagination from "components/molecules/Pagination/pagination"; -import { Avatar } from "components/atoms/Avatar/avatar-hover-card"; -import useFetchAllListContributors from "lib/hooks/useFetchAllListContributors"; - -const DeleteListPageModal = dynamic(() => import("components/organisms/ListPage/DeleteListPageModal")); - -// TODO: put into shared utilities once https://github.com/open-sauced/app/pull/2016 is merged -function isListId(listId: string) { - const regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/; - - return regex.test(listId); -} - -export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { - const { listId } = ctx.params as { listId: string }; - const supabase = createPagesServerClient(ctx); - - const { - data: { session }, - } = await supabase.auth.getSession(); - const bearerToken = session ? session.access_token : ""; - const userId = Number(session?.user.user_metadata.sub); - - if (!isListId(listId)) { - return { - notFound: true, - }; - } - - const [{ data: list, error }, { data: initialContributors, error: contributorsError }] = await Promise.all([ - fetchApiData({ - path: `lists/${listId}`, - bearerToken, - // TODO: remove this in another PR for cleaning up fetchApiData - pathValidator: () => true, - }), - fetchApiData({ - path: `lists/${listId}/contributors?limit=10`, - bearerToken, - // TODO: remove this in another PR for cleaning up fetchApiData - pathValidator: () => true, - }), - ]); - - // Only the list owner should be allowed to add contributors - if (error?.status === 404 || (list && list.user_id !== userId)) { - return { - notFound: true, - }; - } - - return { - props: { - list, - initialContributors, - }, - }; -}; - -interface EditListPageProps { - list: DBList; - initialContributors: PagedData; -} - -interface UpdateListPayload { - name: string; - is_public: boolean; - contributors: number[]; -} - -const ListContributors = ({ - contributors, - onRemoveContributor, -}: { - contributors: DbListContributor[]; - onRemoveContributor: ComponentProps["onClick"]; -}) => { - return ( -
      - {contributors?.map((contributor) => ( -
    • -
      - - {contributor.login} -
      - -
    • - ))} -
    - ); -}; - -export default function EditListPage({ list, initialContributors }: EditListPageProps) { - const router = useRouter(); - - const [isPublic, setIsPublic] = useState(list.is_public); - const { sessionToken } = useSupabaseAuth(); - const { toast } = useToast(); - async function updateList(payload: UpdateListPayload) { - const { data, error } = await fetchApiData({ - path: `lists/${list.id}`, - method: "PATCH", - body: payload, - bearerToken: sessionToken!, - // TODO: remove this in another PR for cleaning up fetchApiData - pathValidator: () => true, - }); - - return { data, error }; - } - const [contributorSearchTerm, setContributorSearchTerm] = useState(""); - const { - setPage, - meta, - data: contributors, - isLoading, - } = useFetchAllListContributors( - { - listId: list.id, - contributor: contributorSearchTerm, - }, - { - fallbackData: initialContributors, - revalidateOnFocus: false, - } - ); - - async function onRemoveContributor(event: React.MouseEvent) { - const { userId, userName } = (event.target as HTMLButtonElement).dataset; - const undoId = setTimeout(async () => { - const { error } = await fetchApiData({ - path: `lists/${list.id}/contributors/${userId}`, - method: "DELETE", - bearerToken: sessionToken!, - }); - - if (error) { - setRemovedContributorIds((prev) => prev.filter((id) => id !== userId)); - toast({ description: `Error removing ${userName} from your list`, variant: "danger" }); - } - }, 3000); - - setRemovedContributorIds((prev) => [...prev, userId!]); - - toast({ - description: ( -
    -

    - {userName} - was removed from your list -

    - -
    - ), - variant: "success", - }); - } - - const [removedContributorIds, setRemovedContributorIds] = useState([]); - - const GraphLoading = ({ rows = 10 }: { rows?: number }) => { - return ( -
    - {new Array(rows).fill(0).map((_, index) => ( - <> -
    -
    - - ))} -
    - ); - }; - - const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); - const [submitted, setSubmitted] = useState(false); - const [deleteLoading, setDeleteLoading] = useState(false); - - const handleOnDelete = () => { - setIsDeleteModalOpen(true); - }; - - const handleDeleteModalClose = () => { - setIsDeleteModalOpen(false); - }; - - const handleOnDeleteConfirm = async () => { - setSubmitted(true); - setDeleteLoading(true); - - const { error } = await fetchApiData({ - path: "lists/" + list.id, - method: "DELETE", - bearerToken: sessionToken as string, - pathValidator: () => true, - }); - - if (!error) { - setIsDeleteModalOpen(false); - setDeleteLoading(false); - toast({ description: "List deleted successfully", variant: "success" }); - router.push("/hub/lists"); - } else { - setIsDeleteModalOpen(false); - setDeleteLoading(false); - // eslint-disable-next-line no-console - console.log(error); - toast({ description: "An error occurred while deleting the list", variant: "danger" }); - } - }; - - return ( - <> - -
    -
    { - event.preventDefault(); - // FormData was being funky because of the way our ToggleSwitch works - // so went this way instead. - const form = event.target as HTMLFormElement; - const listUpdates = { - name: form["list_name"].value, - is_public: form["is_public"].checked, - contributors: [], - } satisfies UpdateListPayload; - - const { data, error } = await updateList(listUpdates); - - if (!error) { - toast({ description: "List updated successfully!", variant: "success" }); - router.push(`/lists/${list.id}/overview`); - } else { - toast({ description: "Error updating list. Please try again", variant: "danger" }); - } - }} - className="flex flex-col gap-8" - > -
    -

    - - - {" "} - Edit List -

    - -
    -

    - A list is a collection of contributors that you and your team can get insights for. -

    - -
    - -
    -
    - - - Make this page publicly visible - -
    -
    - Make Public - setIsPublic((isPublic: boolean) => !isPublic)} - /> -
    -
    -
    -
    -

    Add Contributors

    - -
    -
    -
    -

    Remove Contributors

    -
    - -
    - <> - {isLoading ? ( - - ) : ( - <> - {contributors && contributors.length > 0 ? ( - <> - { - return !removedContributorIds.includes(id); - })} - onRemoveContributor={onRemoveContributor} - /> -
    - index + 1)} - pageSize={5} - hasNextPage={meta.hasNextPage} - hasPreviousPage={meta.hasPreviousPage} - totalPage={meta.pageCount} - page={meta.page} - onPageChange={function (page: number): void { - setPage(page); - }} - showTotalPages={false} - /> -
    - - ) : ( -

    No contributors to remove found.

    - )} - - )} - -
    -
    - -
    - - Delete List - - Once you delete a list, you're past the point of no return. - - -
    -
    -
    - -
    - - ); -} diff --git a/pages/lists/[listId]/highlights.tsx b/pages/lists/[listId]/highlights.tsx deleted file mode 100644 index 3b6c35e78b..0000000000 --- a/pages/lists/[listId]/highlights.tsx +++ /dev/null @@ -1,262 +0,0 @@ -import React, { useEffect, useMemo, useRef, useState } from "react"; -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; -import { GetServerSidePropsContext } from "next"; -import { formatDistanceToNowStrict } from "date-fns"; -import Link from "next/link"; -import { useRouter } from "next/router"; -import ListPageLayout from "layouts/lists"; -import { fetchApiData, validateListPath } from "helpers/fetchApiData"; -import Search from "components/atoms/Search/search"; - -import ContributorHighlightCard from "components/molecules/ContributorHighlight/contributor-highlight-card"; -import Avatar from "components/atoms/Avatar/avatar"; -import ClientOnly from "components/atoms/ClientOnly/client-only"; -import useFetchAllEmojis from "lib/hooks/useFetchAllEmojis"; -import { - PaginatedListContributorsHighlightsResponse, - useFetchListContributorsHighlights, - useListHighlightsTaggedRepos, -} from "lib/hooks/useList"; -import useDebounceTerm from "lib/hooks/useDebounceTerm"; -import { setQueryParams } from "lib/utils/query-params"; - -import SkeletonWrapper from "components/atoms/SkeletonLoader/skeleton-wrapper"; -import DashContainer from "components/atoms/DashedContainer/DashContainer"; -import PaginationResults from "components/molecules/PaginationResults/pagination-result"; -import Pagination from "components/molecules/Pagination/pagination"; - -import Icon from "components/atoms/Icon/icon"; -import repoTofilterList from "lib/utils/repo-to-filter-list"; -import { ContributorListPageProps } from "./activity"; - -interface HighlightsPageProps extends ContributorListPageProps { - highlights: PaginatedListContributorsHighlightsResponse; -} - -export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { - const supabase = createPagesServerClient(ctx); - - const { - data: { session }, - } = await supabase.auth.getSession(); - const bearerToken = session ? session.access_token : ""; - - const { listId, repo } = ctx.params as { listId: string; repo?: string }; - const limit = 10; // Can pull this from the querystring in the future - - const query = new URLSearchParams(); - - if (repo) { - query.append("repo", repo); - } - query.append("limit", "10"); - - const [{ data, error: contributorListError }, { data: list, error }, { data: highlights, error: highlightError }] = - await Promise.all([ - fetchApiData>({ - path: `lists/${listId}/contributors?limit=${limit}`, - bearerToken, - pathValidator: validateListPath, - }), - fetchApiData({ path: `lists/${listId}`, bearerToken, pathValidator: validateListPath }), - fetchApiData>({ - path: `lists/${listId}/contributors/highlights?${query}`, - bearerToken, - pathValidator: validateListPath, - }), - ]); - - if (error?.status === 404) { - return { - notFound: true, - }; - } - - const userId = Number(session?.user.user_metadata.sub); - - return { - props: { - list, - numberOfContributors: data?.meta.itemCount || 0, - isOwner: list && list.user_id === userId, - highlights: { - data: highlights?.data || [], - meta: highlights?.meta || {}, - }, - }, - }; -}; - -const Highlights = ({ list, numberOfContributors, isOwner, highlights }: HighlightsPageProps) => { - const router = useRouter(); - const repo = router.query.repo as string; - - const { limit = 10, range = 30 } = router.query; - const topRef = useRef(null); - - const { data: emojis } = useFetchAllEmojis(); - const { data: taggedRepos } = useListHighlightsTaggedRepos(list?.id ?? ""); - const [selectedFilter, setSelectedFilter] = useState(null); - - const filterOptions = useMemo(() => { - return repoTofilterList(taggedRepos); - }, [taggedRepos]); - - const handleRepoFilter = (name: string) => { - setSelectedFilter(selectedFilter === name ? "" : name); - setQueryParams({ repo: name }); - }; - - const [contributor, setContributor] = useState(""); - const debouncedSearchTerm = useDebounceTerm(contributor, 300); - - const { data, isLoading, meta } = useFetchListContributorsHighlights({ - listId: list?.id ?? "", - initialData: highlights, - repo, - range: range as number, - contributor, - limit: limit as number, - }); - - function onSearch(searchTerm: string) { - if (!searchTerm || searchTerm.length >= 3) { - setContributor(searchTerm); - } - } - - useEffect(() => { - onSearch(contributor); - }, [debouncedSearchTerm]); - - return ( - -
    -
    -
    - { - onSearch(value); - }} - isDisabled={data.length === 0 && !contributor} - placeholder="Search contributors" - className="!w-full" - name="helo" - /> - - {taggedRepos && taggedRepos.length > 0 ? ( - -
    - Tagged Repositories - {filterOptions && - filterOptions.length > 0 && - filterOptions.map(({ full_name, repoIcon, repoName }) => ( -
    handleRepoFilter(full_name)} - key={full_name as string} - className={`${ - selectedFilter === full_name ? "border-orange-600 bg-orange-200" : "" - } flex hover:border-orange-600 hover:bg-orange-200 cursor-pointer gap-1 w-max p-1 pr-2 border-[1px] border-light-slate-6 rounded-lg text-light-slate-12`} - > - - {repoName} -
    - ))} -
    -
    - ) : null} -
    -
    -
    - {isLoading ? ( - -
    -
    - -
    - -
    -
    - ) : null} - - {!isLoading && data && data.length === 0 ? ( - -

    No highlights published in the past {range} days

    -
    - ) : null} - - {data && data.length > 0 - ? data.map(({ id, url, title, created_at, highlight, shipped_at, login, type, tagged_repos }) => ( -
    -
    - - - - {login} - - - - {formatDistanceToNowStrict(new Date(created_at), { addSuffix: true })} - - - -
    -
    - - - -
    -
    - )) - : null} - - {meta.pageCount > 1 && ( -
    -
    - -
    - -
    - )} -
    -
    -
    - ); -}; - -export default Highlights; diff --git a/pages/lists/[listId]/overview.tsx b/pages/lists/[listId]/overview.tsx deleted file mode 100644 index 67d16eeb5f..0000000000 --- a/pages/lists/[listId]/overview.tsx +++ /dev/null @@ -1,174 +0,0 @@ -import { useRouter } from "next/router"; -import { ErrorBoundary } from "react-error-boundary"; -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; -import { GetServerSidePropsContext } from "next"; -import ListPageLayout from "layouts/lists"; - -import Error from "components/atoms/Error/Error"; -import useListStats from "lib/hooks/useListStats"; -import HighlightCard from "components/molecules/HighlightCard/highlight-card"; -import { fetchApiData, validateListPath } from "helpers/fetchApiData"; -import ClientOnly from "components/atoms/ClientOnly/client-only"; -import { useContributorsList } from "lib/hooks/api/useContributorList"; -import ContributorsList from "components/organisms/ContributorsList/contributors-list"; - -interface ListsOverviewProps { - list: DBList; - numberOfContributors: number; - isOwner: boolean; - isError: boolean; -} - -export const getServerSideProps = async (ctx: GetServerSidePropsContext) => { - const supabase = createPagesServerClient(ctx); - - const { - data: { session }, - } = await supabase.auth.getSession(); - const bearerToken = session ? session.access_token : ""; - - const { listId } = ctx.params as { listId: string }; - const limit = 10; // Can pull this from the querystring in the future - const [{ data, error: contributorListError }, { data: list, error }] = await Promise.all([ - fetchApiData>({ - path: `lists/${listId}/contributors?limit=${limit}`, - bearerToken, - pathValidator: validateListPath, - }), - fetchApiData({ path: `lists/${listId}`, bearerToken, pathValidator: validateListPath }), - ]); - - if (error?.status === 404) { - return { - notFound: true, - }; - } - - const userId = Number(session?.user.user_metadata.sub); - - return { - props: { - list, - numberOfContributors: data?.meta.itemCount || 0, - isOwner: list && list.user_id === userId, - isError: error || contributorListError, - }, - }; -}; - -const ListsOverview = ({ list, numberOfContributors, isOwner, isError }: ListsOverviewProps): JSX.Element => { - const router = useRouter(); - const { listId, range, limit } = router.query; - - const { - isLoading, - setPage, - data: { data: contributors, meta }, - } = useContributorsList({ - listId: list?.id, - defaultRange: range ? (range as string) : "30", - defaultLimit: limit ? (limit as unknown as number) : 10, - }); - - const { - data: prevAllContributorStats, - meta: prevAllContributorMeta, - isLoading: prevAllContributorStatsLoading, - } = useListStats(listId as string, "all", 30); - const { - data: allContributorStats, - meta: allContributorMeta, - isLoading: allContributorStatsLoading, - } = useListStats(listId as string, "all"); - - const { meta: prevNewContributorMeta, isLoading: prevNewContributorStatsLoading } = useListStats( - listId as string, - "new", - 30 - ); - const { meta: newContributorMeta, isLoading: newContributorStatsLoading } = useListStats(listId as string, "new"); - - const { meta: prevAlumniContributorMeta, isLoading: prevAlumniContributorStatsLoading } = useListStats( - listId as string, - "alumni", - 30 - ); - const { meta: alumniContributorMeta, isLoading: alumniContributorStatsLoading } = useListStats( - listId as string, - "alumni" - ); - - const allContributorCommits = allContributorStats?.reduce((acc, curr) => acc + curr.commits, 0) || 0; - const prevAllContributorCommits = prevAllContributorStats?.reduce((acc, curr) => acc + curr.commits, 0) || 0; - - return ( - -
    - -
    - prevAllContributorCommits} - increased={allContributorCommits > prevAllContributorCommits} - value={allContributorCommits} - valueLabel="in the last 30d" - tooltip="" - /> - prevAllContributorMeta.itemCount} - increased={allContributorMeta.itemCount > prevAllContributorMeta.itemCount} - numChanged={allContributorMeta.itemCount - prevAllContributorMeta.itemCount} - value={allContributorMeta.itemCount} - isLoading={prevAllContributorStatsLoading || allContributorStatsLoading} - tooltip={`A contributor who has been active in the last ${range ?? 30} days`} - /> - prevNewContributorMeta.itemCount} - increased={newContributorMeta.itemCount > prevNewContributorMeta.itemCount} - numChanged={newContributorMeta.itemCount - prevNewContributorMeta.itemCount} - value={newContributorMeta.itemCount} - isLoading={prevNewContributorStatsLoading || newContributorStatsLoading} - tooltip="A contributor who has recently made their first contribution to a project." - /> - prevAlumniContributorMeta.itemCount} - increased={alumniContributorMeta.itemCount > prevAlumniContributorMeta.itemCount} - numChanged={alumniContributorMeta.itemCount - prevAlumniContributorMeta.itemCount} - value={alumniContributorMeta.itemCount} - isLoading={prevAlumniContributorStatsLoading || alumniContributorStatsLoading} - tooltip={`A contributor who has not been active on a project in the last ${range ?? 30} days.`} - /> -
    -
    -
    - {isError ? ( - - ) : ( - Error loading the list of contributors
    } - > - - - )} -
    - - -
    - - ); -}; - -export default ListsOverview; diff --git a/pages/lists/index.tsx b/pages/lists/index.tsx deleted file mode 100644 index ffc59e3a2d..0000000000 --- a/pages/lists/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -const ListsHub = () => { - return
    Redirect to Lists Overview
    ; -}; - -export default ListsHub; diff --git a/pages/s/[org]/[repo]/index.tsx b/pages/s/[org]/[repo]/index.tsx index d11823e45f..e9fa231a07 100644 --- a/pages/s/[org]/[repo]/index.tsx +++ b/pages/s/[org]/[repo]/index.tsx @@ -1,6 +1,7 @@ import { GetServerSidePropsContext } from "next"; import { useRouter } from "next/router"; import { ComponentProps } from "react"; +import { HiOutlineExternalLink } from "react-icons/hi"; import { fetchApiData } from "helpers/fetchApiData"; import { useFetchMetricStats } from "lib/hooks/api/useFetchMetricStats"; @@ -28,8 +29,10 @@ export async function getServerSideProps(context: GetServerSidePropsContext) { const { owner } = await response.json(); const range = (context.query.range ? Number(context.query.range) : 30) as Range; - const { NEXT_PUBLIC_BASE_URL = "http://localhost:3000" } = process.env; - const { href: ogImageUrl } = new URL(getRepositoryOgImage(repoData, range), NEXT_PUBLIC_BASE_URL); + const { href: ogImageUrl } = new URL( + getRepositoryOgImage(repoData, range), + process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000" + ); return { props: { repoData, image: owner?.avatar_url || "", ogImageUrl } }; } @@ -79,7 +82,14 @@ export default function RepoPage({ repoData, image, ogImageUrl }: RepoPageProps)
    -

    {repoData.full_name}

    + +

    {repoData.full_name}

    + +

    {repoData.description}

    diff --git a/pages/star-search.tsx b/pages/star-search.tsx new file mode 100644 index 0000000000..5527563bda --- /dev/null +++ b/pages/star-search.tsx @@ -0,0 +1,276 @@ +import { GetServerSidePropsContext } from "next"; +import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; +import { MdOutlineSubdirectoryArrowRight } from "react-icons/md"; +import { useEffect, useRef, useState } from "react"; +import Image from "next/image"; +import Markdown from "react-markdown"; +import { getAllFeatureFlags } from "lib/utils/server/feature-flags"; +import Card from "components/atoms/Card/card"; +import ProfileLayout from "layouts/profile"; +import { ScrollArea } from "components/atoms/ScrollArea/scroll-area"; +import { getAvatarById } from "lib/utils/github"; + +export async function getServerSideProps(context: GetServerSidePropsContext) { + const supabase = createPagesServerClient(context); + const { + data: { session }, + } = await supabase.auth.getSession(); + + const userId = Number(session?.user.user_metadata.sub); + if (!userId) { + return { notFound: true }; + } + + const featureFlags = await getAllFeatureFlags(userId); + if (!featureFlags["star_search"]) { + return { notFound: true }; + } + + return { props: { userId, bearerToken: session?.access_token } }; +} + +type StarSearchPageProps = { + userId: number; + bearerToken: string; +}; + +type StarSearchChat = { + author: "You" | "StarSearch"; + content: string; +}; + +export default function StarSearchPage({ userId, bearerToken }: StarSearchPageProps) { + const [starSearchState, setStarSearchState] = useState<"initial" | "chat">("initial"); + const [chat, setChat] = useState([]); + const [isRunning, setIsRunning] = useState(false); + + const submitPrompt = async (prompt: string) => { + if (isRunning) { + return; + } + if (starSearchState === "initial") { + setStarSearchState("chat"); + } + setIsRunning(true); // disables input + + // add user prompt to history + setChat((history) => { + const temp = history; + temp.push({ author: "You", content: prompt }); + return temp; + }); + + // get ReadableStream from API + const baseUrl = new URL(process.env.NEXT_PUBLIC_API_URL!); + const response = await fetch(`${baseUrl}/star-search/stream`, { + method: "POST", + body: JSON.stringify({ + query_text: prompt, + }), + headers: { + Accept: "*/*", + "Content-Type": "application/json", + Authorization: `Bearer ${bearerToken}`, + }, + }); + + if (response.status !== 200) { + setChat((history) => { + const temp = history; + temp.push({ author: "StarSearch", content: "There's been an error. Try again." }); + return temp; + }); + setIsRunning(false); // enables input + return; + } + + setChat((history) => { + const temp = history; + temp.push({ author: "StarSearch", content: "" }); + return temp; + }); + + const decoder = new TextDecoderStream(); + const reader = response.body?.pipeThrough(decoder).getReader(); + while (true) { + const { done, value } = await reader!.read(); + if (done) { + setIsRunning(false); // enables input + return; + } + const values = value.split("\n"); + values + .filter((v) => v.startsWith("data:")) + .forEach((v) => { + const matched = v.match(/data:\s(?.+)/); + if (!matched || !matched.groups) { + return; + } + const temp = [...chat]; + const changed = temp.at(temp.length - 1); + changed!.content += matched.groups.result; + setChat(temp); + }); + } + }; + + const renderState = () => { + switch (starSearchState) { + case "initial": + return
    ; + case "chat": + return ; + } + }; + + return ( + +
    +
    + {renderState()} + +
    +
    +
    +
    + ); +} + +function Header() { + return ( +
    +
    + Star Search Logo +

    + StarSearch +

    +
    +

    Ask questions about contributors

    + +
    + ); +} + +function SuggestionBoxes() { + const suggestions = [ + { + title: "Get information on contributor activity", + prompt: "What type of pull requests has brandonroberts worked on?", + }, + { + title: "Identify key contributors", + prompt: "Who are the most prevalent contributors to the Typescript ecosystem?", + }, + { + title: "Find contributors based on their work", + prompt: "Who are people making pull requests in vercel/turbo about css modules?", + }, + { + title: "Find experts", + prompt: "Who are the best developers that know Tailwind and are interested in Rust?", + }, + ]; + return ( + +
    + {suggestions.map((suggestion, i) => ( + + ))} +
    +
    + ); +} + +function ChatHistory({ userId, chat }: { userId: number; chat: StarSearchChat[] }) { + const scrollRef = useRef(null); + useEffect(() => { + scrollRef.current?.scrollIntoView({ behavior: "smooth" }); + }, [chat]); + return ( + + {chat.map((message, i) => ( + + ))} +
    + + ); +} + +function Chatbox({ author, content, userId }: StarSearchChat & { userId?: number }) { + const renderAvatar = () => { + switch (author) { + case "You": + return ( + Your profile picture + ); + case "StarSearch": + return ( +
    + StarSearch logo +
    + ); + } + }; + + return ( +
  • + {renderAvatar()} + +

    {author}

    + {content} +
    +
  • + ); +} + +function StarSearchInput({ + isRunning, + onSubmitPrompt, +}: { + isRunning: boolean; + onSubmitPrompt: (prompt: string) => void; +}) { + return ( +
    +
    { + event.preventDefault(); + const form = event.currentTarget; + const formData = new FormData(form); + onSubmitPrompt(formData.get("prompt") as string); + form.reset(); + }} + className="w-full bg-white h-fit flex justify-between rounded-lg" + > + + +
    +
    + ); +} diff --git a/pages/starsearch.tsx b/pages/starsearch.tsx deleted file mode 100644 index a414b955e2..0000000000 --- a/pages/starsearch.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import { GetServerSidePropsContext } from "next"; -import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; -import { MdOutlineSubdirectoryArrowRight } from "react-icons/md"; -import { useState } from "react"; -import { getAllFeatureFlags } from "lib/utils/server/feature-flags"; -import Card from "components/atoms/Card/card"; -import ProfileLayout from "layouts/profile"; -import { ScrollArea } from "components/atoms/ScrollArea/scroll-area"; -import { getAvatarById } from "lib/utils/github"; - -export async function getServerSideProps(context: GetServerSidePropsContext) { - const supabase = createPagesServerClient(context); - const { - data: { session }, - } = await supabase.auth.getSession(); - - const userId = Number(session?.user.user_metadata.sub); - if (!userId) { - return { notFound: true }; - } - - const featureFlags = await getAllFeatureFlags(userId); - if (!featureFlags["star_search"]) { - return { notFound: true }; - } - - return { props: { userId } }; -} - -type StarSearchPageProps = { - userId: number; -}; - -export default function StarSearchPage({ userId }: StarSearchPageProps) { - const [starSearchState, setStarSearchState] = useState<"initial" | "chat">("initial"); - const renderState = () => { - switch (starSearchState) { - case "initial": - return
    ; - case "chat": - return ; - } - }; - return ( - -
    - {renderState()} - setStarSearchState(starSearchState === "initial" ? "chat" : "initial")} /> -
    -
    -
    - ); -} - -function Header() { - return ( -
    -
    - Star Search Logo -

    - StarSearch -

    -
    -

    Ask questions about contributors

    - -
    - ); -} - -function SuggestionBoxes() { - const suggestions = [ - { - title: "Get information on contributor activity", - prompt: "What type of pull requests has brandonroberts worked on?", - }, - { - title: "Identify key contributors", - prompt: "Who are the most prevalent contributors to the Typescript ecosystem?", - }, - { - title: "Find contributors based on their work", - prompt: "Who are people making pull requests in vercel/turbo about css modules?", - }, - { - title: "Find experts", - prompt: "Who are the best developers that know Tailwind and are interested in Rust?", - }, - ]; - return ( -
    - {suggestions.map((suggestion, i) => ( - - ))} -
    - ); -} - -function ChatHistory({ userId }: { userId: number }) { - return ( - - - - - ); -} - -function Chatbox({ author, content, userId }: { author: "You" | "StarSearch"; content: string; userId?: number }) { - const renderAvatar = () => { - switch (author) { - case "You": - return ; - case "StarSearch": - return ( -
    - -
    - ); - } - }; - - return ( -
  • - {renderAvatar()} - -

    {author}

    -

    {content}

    -
    -
  • - ); -} - -function StarSearchInput({ onSubmit }: { onSubmit: () => void }) { - return ( -
    -
    - - -
    -
    - ); -} diff --git a/pages/workspaces/[workspaceId]/activity.tsx b/pages/workspaces/[workspaceId]/activity.tsx new file mode 100644 index 0000000000..5f68052f46 --- /dev/null +++ b/pages/workspaces/[workspaceId]/activity.tsx @@ -0,0 +1,116 @@ +import { createPagesServerClient } from "@supabase/auth-helpers-nextjs"; +import { GetServerSidePropsContext } from "next"; +import { useRouter } from "next/router"; +import { useState } from "react"; +import { WorkspaceLayout } from "components/Workspaces/WorkspaceLayout"; +import { fetchApiData } from "helpers/fetchApiData"; +import { WorkspacesTabList } from "components/Workspaces/WorkspacesTabList"; +import { deleteCookie, setCookie } from "lib/utils/server/cookies"; +import { WORKSPACE_ID_COOKIE_NAME } from "lib/utils/caching"; +import { WorkspaceHeader } from "components/Workspaces/WorkspaceHeader"; +import { DayRangePicker } from "components/shared/DayRangePicker"; +import { OrderPullRequestsBy, useWorkspacePullRequests } from "lib/hooks/api/useWorkspacePullRequests"; +import { WorkspacePullRequestTable } from "components/Workspaces/WorkspacePullRequestsTable"; +import { LimitPicker } from "components/shared/LimitPicker"; +import TrackedRepositoryFilter from "components/Workspaces/TrackedRepositoryFilter"; +import { OptionKeys } from "components/atoms/Select/multi-select"; +import { useGetWorkspaceRepositories } from "lib/hooks/api/useGetWorkspaceRepositories"; +import { setQueryParams } from "lib/utils/query-params"; +import ClientOnly from "components/atoms/ClientOnly/client-only"; + +export const getServerSideProps = async (context: GetServerSidePropsContext) => { + const supabase = createPagesServerClient(context); + const { + data: { session }, + } = await supabase.auth.getSession(); + const bearerToken = session ? session.access_token : ""; + const workspaceId = context.params?.workspaceId as string; + const { data, error } = await fetchApiData({ + path: `workspaces/${workspaceId}`, + bearerToken, + pathValidator: () => true, + }); + + if (error) { + deleteCookie({ response: context.res, name: WORKSPACE_ID_COOKIE_NAME }); + + if (error.status === 404 || error.status === 401) { + return { notFound: true }; + } + + throw new Error(`Error loading workspaces page with ID ${workspaceId}`); + } + + setCookie({ response: context.res, name: WORKSPACE_ID_COOKIE_NAME, value: workspaceId }); + + return { props: { workspace: data } }; +}; + +interface WorkspaceDashboardProps { + workspace: Workspace; +} + +type OrderDirection = "ASC" | "DESC"; + +const WorkspaceActivityPage = ({ workspace }: WorkspaceDashboardProps) => { + const router = useRouter(); + const { + limit = 10, + range: rawRange = 30, + page = 1, + orderDirection = "", + orderBy = "", + } = router.query as { limit: string; range: string; page: string; orderDirection: OrderDirection; orderBy: string }; + const range = Number(rawRange); + const { data: repositories, error: hasError } = useGetWorkspaceRepositories({ workspaceId: workspace.id, range }); + const [filteredRepositories, setFilteredRepositories] = useState([]); + const filterOptions = repositories + ? Array.from(repositories?.data!, (repo) => { + return { label: repo.repo.full_name, value: `${repo.repo_id}` }; + }) + : []; + const repoIds = filteredRepositories.map((option) => Number(option.value)); + const { + meta, + data: pullRequests, + isError, + isLoading, + } = useWorkspacePullRequests({ + workspaceId: workspace.id, + page: Number(page), + limit: Number(limit), + orderDirection: orderDirection as OrderDirection, + orderBy: orderBy as OrderPullRequestsBy, + range, + repoIds, + }); + + return ( + <> + + +
    + +
    +
    +
    + { + setFilteredRepositories(selected); + setQueryParams({ page: "1" }); + }} + /> + + +
    + + + +
    +
    + + ); +}; + +export default WorkspaceActivityPage; diff --git a/pages/workspaces/[workspaceId]/settings.tsx b/pages/workspaces/[workspaceId]/settings.tsx index d953ff541f..ee7b230870 100644 --- a/pages/workspaces/[workspaceId]/settings.tsx +++ b/pages/workspaces/[workspaceId]/settings.tsx @@ -110,7 +110,7 @@ const WorkspaceSettings = ({ workspace, canDeleteWorkspace }: WorkspaceSettingsP const initialTrackedRepos: string[] = data?.data?.map(({ repo }) => repo.full_name) ?? []; const [trackedRepos, setTrackedRepos] = useState>(new Map()); const [trackedReposPendingDeletion, setTrackedReposPendingDeletion] = useState>(new Set()); - + const [isSaving, setIsSaving] = useState(false); const { data: workspaceMembers, addMember, @@ -141,6 +141,7 @@ const WorkspaceSettings = ({ workspace, canDeleteWorkspace }: WorkspaceSettingsP }); const updateWorkspace: ComponentProps<"form">["onSubmit"] = async (event) => { + setIsSaving(true); event.preventDefault(); const form = event.target as HTMLFormElement; @@ -181,6 +182,8 @@ const WorkspaceSettings = ({ workspace, canDeleteWorkspace }: WorkspaceSettingsP router.push(`/workspaces/${workspace.id}`); toast({ description: `Workspace updated successfully`, variant: "success" }); } + + setIsSaving(false); }; const upgradeThisWorkspace = async () => { @@ -221,6 +224,8 @@ const WorkspaceSettings = ({ workspace, canDeleteWorkspace }: WorkspaceSettingsP variant="primary" className="flex gap-2.5 items-center cursor-pointer w-min sm:mt-0 self-end" form="update-workspace" + loading={isSaving} + loadingText={"Updating Workspace..."} > Update Workspace diff --git a/pages/workspaces/new.tsx b/pages/workspaces/new.tsx index 0011664ae0..3592bc4658 100644 --- a/pages/workspaces/new.tsx +++ b/pages/workspaces/new.tsx @@ -13,6 +13,8 @@ import { createWorkspace } from "lib/utils/workspace-utils"; import { WORKSPACE_UPDATED_EVENT } from "components/shared/AppSidebar/AppSidebar"; import AuthContentWrapper from "components/molecules/AuthContentWrapper/auth-content-wrapper"; +const WorkspaceWelcomeModal = dynamic(() => import("components/Workspaces/WorkspaceWelcomeModal")); + export const getServerSideProps = async (context: GetServerSidePropsContext) => { const supabase = createPagesServerClient(context); const { @@ -33,8 +35,11 @@ const NewWorkspace = () => { const nameQuery = router.query.name as string; const descriptionQuery = router.query.description as string; const reposQuery = router.query.repos as string; + const welcome = router.query.welcome as string; const [name, setName] = useState(""); const [description, setDescription] = useState(""); + const [isSaving, setIsSaving] = useState(false); + const [isWelcomeModalOpen, setIsWelcomeModalOpen] = useState(false); const [trackedReposModalOpen, setTrackedReposModalOpen] = useState(false); const [trackedRepos, setTrackedRepos] = useState>(new Map()); @@ -58,8 +63,15 @@ const NewWorkspace = () => { } }, [router.query]); + useEffect(() => { + if (welcome) { + setIsWelcomeModalOpen(true); + } + }, [welcome]); + const onCreateWorkspace: ComponentProps<"form">["onSubmit"] = async (event) => { event.preventDefault(); + setIsSaving(true); const form = event.target as HTMLFormElement; const formData = new FormData(form); const name = formData.get("name") as string; @@ -82,6 +94,7 @@ const NewWorkspace = () => { document.dispatchEvent(new CustomEvent(WORKSPACE_UPDATED_EVENT, { detail: workspace })); router.push(`/workspaces/${workspace.id}`); } + setIsSaving(false); }; const TrackedReposModal = dynamic(() => import("components/Workspaces/TrackedReposModal"), { @@ -103,6 +116,8 @@ const NewWorkspace = () => { form="new-workspace" variant="primary" className="flex gap-2.5 items-center cursor-pointer w-min mt-2 sm:mt-0 self-end" + loading={isSaving} + loadingText={"Creating Workspace..."} > Create Workspace @@ -185,6 +200,7 @@ const NewWorkspace = () => { setTrackedReposModalOpen(false); }} /> + setIsWelcomeModalOpen(false)} /> ); }; diff --git a/public/_headers b/public/_headers new file mode 100644 index 0000000000..3c7f8dd499 --- /dev/null +++ b/public/_headers @@ -0,0 +1,17 @@ +https://oss-insights.netlify.app/* + X-Robots-Tag: noindex + +http://oss-insights.netlify.app/* + X-Robots-Tag: noindex + +https://beta.app.opensauced.pizza/* + X-Robots-Tag: noindex + +http://beta.app.opensauced.pizza/* + X-Robots-Tag: noindex + +https://alpha.app.opensauced.pizza/* + X-Robots-Tag: noindex + +http://alpha.app.opensauced.pizza/* + X-Robots-Tag: noindex diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..f30ce23d9f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# Allow all crawlers +User-agent: * +Allow: / diff --git a/public/try-workspaces.png b/public/try-workspaces.png new file mode 100644 index 0000000000..4314c3965a Binary files /dev/null and b/public/try-workspaces.png differ diff --git a/sentry.client.config.ts b/sentry.client.config.ts index 20d5ea5a6f..bfff9d64b3 100644 --- a/sentry.client.config.ts +++ b/sentry.client.config.ts @@ -15,7 +15,7 @@ Sentry.init({ // Setting this option to true will print useful information to the console while you're setting up Sentry. debug: false, - replaysOnErrorSampleRate: 1.0, + replaysOnErrorSampleRate: 0.25, // This sets the sample rate to be 10%. You may want this to be 100% while // in development and sample at a lower rate in production