From 3ae18723db9e6466a937c136faa3b7044d3ed721 Mon Sep 17 00:00:00 2001 From: Quentin Date: Tue, 13 Aug 2024 19:31:27 +0200 Subject: [PATCH 01/23] fix(errors + clean code) --- src/app/api/auth/[...nextauth]/route.js | 31 ---------------- src/app/api/auth/[...nextauth]/route.ts | 37 +++++++++++++++++++ src/app/user/me/page.tsx | 48 ++++++++++++++++++++----- src/components/auth/navbar.tsx | 17 ++++----- src/components/ui/side-bar.tsx | 5 --- src/components/ui/theme-provider.tsx | 14 -------- types/next-auth-d.ts | 1 + 7 files changed, 87 insertions(+), 66 deletions(-) delete mode 100644 src/app/api/auth/[...nextauth]/route.js create mode 100644 src/app/api/auth/[...nextauth]/route.ts diff --git a/src/app/api/auth/[...nextauth]/route.js b/src/app/api/auth/[...nextauth]/route.js deleted file mode 100644 index ba1e120..0000000 --- a/src/app/api/auth/[...nextauth]/route.js +++ /dev/null @@ -1,31 +0,0 @@ -import NextAuth from "next-auth/next" -import GitHubProvider from "next-auth/providers/github" - -export const authOptions = { - providers: [ - GitHubProvider({ - clientId: process.env.GITHUB_ID ?? "", - clientSecret: process.env.GITHUB_SECRET ?? "", - }), - ], - secret: process.env.JWT_SECRET, - callbacks: { - async jwt({ token, account, profile }) { - if (account) { - token.accessToken = account.access_token - token.id = profile.id - } - return token - }, - async session({ session, token, user }) { - session.accessToken = token.accessToken - session.user.id = token.id - - return session - } - } -} - -export const handler = NextAuth(authOptions) - -export { handler as GET, handler as POST } \ No newline at end of file diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts new file mode 100644 index 0000000..2e8b803 --- /dev/null +++ b/src/app/api/auth/[...nextauth]/route.ts @@ -0,0 +1,37 @@ +import NextAuth, { NextAuthOptions } from "next-auth" +import { JWT } from "next-auth/jwt" +import GitHubProvider from "next-auth/providers/github" +import { Account, Profile, Session, User } from "next-auth" + +export const authOptions: NextAuthOptions = { + providers: [ + GitHubProvider({ + clientId: process.env.GITHUB_ID ?? "", + clientSecret: process.env.GITHUB_SECRET ?? "", + }), + ], + callbacks: { + async jwt({ token, account, profile }: { token: JWT, account: Account | null, profile?: Profile}) + { + if (account && account.access_token) { + token.accessToken = account.access_token; + } + + if (profile && (profile as any).id) { + token.id = (profile as any).id as string; + } + + return token; + }, + async session({ session, token }: { session: Session, token: JWT }) { + session.accessToken = token.accessToken; + session.user.id = token.id as string; + + return session; + } + } +} + +export const handler = NextAuth(authOptions) + +export { handler as GET, handler as POST } diff --git a/src/app/user/me/page.tsx b/src/app/user/me/page.tsx index 53ea8e8..439579d 100644 --- a/src/app/user/me/page.tsx +++ b/src/app/user/me/page.tsx @@ -12,10 +12,42 @@ interface UserProps { }; } +interface UserData { + login: string; + avatar_url: string; + name: string; + bio: string; + location: string; + followers: number; + following: number; + public_repos: number; + total_private_repos: number; + plan: { + name: string; + collaborators: number; + private_repos: number; + storage: { + used: number; + total: number; + }; + }; +} + +interface UserContributions { + total: { + total: number; + year: number; + }; + contributions: { + date: string; + count: number; + }[]; +} + export default function UserPage({ params }: UserProps) { const { username } = params; - const [userData, setUserData] = useState(null); - const [userContributions, setUserContributions] = useState(null); + const [userData, setUserData] = useState(null); + const [userContributions, setUserContributions] = useState(null); const [loading, setLoading] = useState(true); const [contributionsLoading, setContributionsLoading] = useState(true); @@ -137,11 +169,11 @@ export default function UserPage({ params }: UserProps) {

TOTAL CONTRIBUTION

- {contributionsLoading ? ( + {contributionsLoading || !userContributions ? (
Loading contributions...
- ) : ( + ) : ( - )} + )}
@@ -208,11 +240,11 @@ export default function UserPage({ params }: UserProps) {

Github Contributions

- {contributionsLoading ? ( + {contributionsLoading || !userContributions ? (
Loading contributions...
- ) : ( + ) : ( - )} + )}
diff --git a/src/components/auth/navbar.tsx b/src/components/auth/navbar.tsx index dad278d..218f11d 100644 --- a/src/components/auth/navbar.tsx +++ b/src/components/auth/navbar.tsx @@ -3,14 +3,12 @@ import { Menu, X, Moon, Sun } from "lucide-react"; import { useState, useEffect } from "react"; import logo from "../../../assets/secure-CI.png"; -import { navItems } from "../../constants"; import Image from "next/image"; import { signIn } from "next-auth/react"; -import { boolean } from "zod"; const Navbar = () => { const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false); - const [darkMode, setDarkMode] = useState(false); + const [darkMode, setDarkMode] = useState(false); const toggleNavbar = () => { setMobileDrawerOpen(!mobileDrawerOpen); @@ -26,14 +24,17 @@ const Navbar = () => { }, [darkMode]); useEffect(() => { - const mode = localStorage.getItem("darkMode"); - if (mode === "true") { + const mode: string | null = localStorage.getItem("darkMode"); + const isDarkMode = mode === "true"; + + if (isDarkMode) { document.documentElement.classList.add("dark"); } else { document.documentElement.classList.remove("dark"); } - setDarkMode(mode); - } , []); + + setDarkMode(isDarkMode); + }, []); const toggleDarkMode = () => { setDarkMode(!darkMode); @@ -70,7 +71,7 @@ const Navbar = () => { Get started diff --git a/src/components/ui/side-bar.tsx b/src/components/ui/side-bar.tsx index 7875727..9923663 100644 --- a/src/components/ui/side-bar.tsx +++ b/src/components/ui/side-bar.tsx @@ -26,13 +26,8 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { const router = useRouter(); - const [mobileDrawerOpen, setMobileDrawerOpen] = useState(false); const [darkMode, setDarkMode] = useState(false); - const toggleNavbar = () => { - setMobileDrawerOpen(!mobileDrawerOpen); - }; - useEffect(() => { const isDarkMode = document.documentElement.classList.contains("dark"); setDarkMode(isDarkMode); diff --git a/src/components/ui/theme-provider.tsx b/src/components/ui/theme-provider.tsx index 7ee3d9c..455461f 100644 --- a/src/components/ui/theme-provider.tsx +++ b/src/components/ui/theme-provider.tsx @@ -3,30 +3,16 @@ import { Moon, Sun } from "lucide-react"; import { useEffect, useState } from "react"; export default function ThemeProvider({ children }: { children: React.ReactNode }) { - const [isDarkMode, setIsDarkMode] = useState(false); useEffect(() => { const mode = localStorage.getItem("darkMode"); if (mode === "true") { document.documentElement.classList.add("dark"); - setIsDarkMode(true); } else { document.documentElement.classList.remove("dark"); - setIsDarkMode(false); } }, []); - const toggleDarkMode = () => { - const newDarkMode = !isDarkMode; - localStorage.setItem("darkMode", newDarkMode ? "true" : "false"); - if (newDarkMode) { - document.documentElement.classList.add("dark"); - } else { - document.documentElement.classList.remove("dark"); - } - setIsDarkMode(newDarkMode); - }; - return ( <> {children} diff --git a/types/next-auth-d.ts b/types/next-auth-d.ts index fa42fa5..36b8c04 100644 --- a/types/next-auth-d.ts +++ b/types/next-auth-d.ts @@ -7,6 +7,7 @@ declare module "next-auth" { accessToken: string; user: { id: string; + name: string; } } From 32c9a6c23e7cb9e87b3b1b632a3663531e733d22 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:02:32 +0200 Subject: [PATCH 02/23] feat(api): fetch all the commits and not only the first 100 --- .../api/repos/[owner]/[repo]/commits/route.ts | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/src/app/api/repos/[owner]/[repo]/commits/route.ts b/src/app/api/repos/[owner]/[repo]/commits/route.ts index c1e3888..4779c9c 100644 --- a/src/app/api/repos/[owner]/[repo]/commits/route.ts +++ b/src/app/api/repos/[owner]/[repo]/commits/route.ts @@ -7,6 +7,8 @@ import fetchURL from "../../../../utils/utils"; const querySchema = z.object({ owner: z.string(), repo: z.string(), + per_page: z.string().optional(), + page: z.string().optional(), }); /** @@ -30,6 +32,18 @@ const querySchema = z.object({ * description: The name of the repository * schema: * type: string + * - name: per_page + * in: query + * required: false + * description: The number of commits per page (max 100) + * schema: + * type: integer + * - name: page + * in: query + * required: false + * description: The page number of the results to fetch + * schema: + * type: integer * produces: * - application/json * responses: @@ -75,7 +89,7 @@ const querySchema = z.object({ * description: Failed to fetch commits */ export async function GET( - req: NextRequest, {params}: any + req: NextRequest, { params }: any ) { try { const session = await getServerSession({ req, ...authOptions }); @@ -90,23 +104,46 @@ export async function GET( if (!result.success) { return NextResponse.json( - { message: "Invalid query parameters" }, - { status: 400 } - ) + { message: "Invalid query parameters" }, + { status: 400 } + ); } const { owner, repo } = result.data; + const per_page = result.data.per_page || "100"; + let page = result.data.page || "1"; + + const encodedOwner: string = encodeURIComponent(owner); + const encodedRepo: string = encodeURIComponent(repo); + + let allCommits: Array = []; + let hasMorePages = true; - const encodedOwner : string = encodeURIComponent(owner); - const encodedRepo : string = encodeURIComponent(repo); + while (hasMorePages) { + const apiUrl: string = `https://api.github.com/repos/${encodedOwner}/${encodedRepo}/commits?per_page=${per_page}&page=${page}`; + + const response = await fetchURL(req, apiUrl, "GET"); - const apiUrl : string = `https://api.github.com/repos/${encodedOwner}/${encodedRepo}/commits`; + if (!response.ok) { + return NextResponse.json( + { message: `Failed to fetch commits: ${response.statusText}` }, + { status: response.status } + ); + } - const response = await fetchURL(req, apiUrl, "GET"); + const commits: Array = await response.json(); + + allCommits = allCommits.concat(commits); + + if (commits.length < parseInt(per_page)) { + hasMorePages = false; + } else { + page = (parseInt(page) + 1).toString(); + } + } - const commits : Array = await response.json(); return NextResponse.json( - commits[0], + allCommits, { status: 200 } ); } catch (error) { From 4f532b781453bfd955ad62d4797570d60465f5fd Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:02:57 +0200 Subject: [PATCH 03/23] fix(api): fetch the array instead of the first element --- src/app/api/repos/repository/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/repos/repository/route.ts b/src/app/api/repos/repository/route.ts index f4c7d3c..243b673 100644 --- a/src/app/api/repos/repository/route.ts +++ b/src/app/api/repos/repository/route.ts @@ -60,7 +60,7 @@ export async function GET( const response = await fetchURL(req, apiUrl, "GET"); const repositories = await response.json(); - return NextResponse.json(repositories[0], { status: 200 }); + return NextResponse.json(repositories, { status: 200 }); } catch (error) { console.error('Error fetching repositories:', error); return NextResponse.json({ message: 'Failed to fetch repositories' }, { status: 500 }); From 98e85bf23fe5853add10fab104f8e54c61daa95d Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:03:32 +0200 Subject: [PATCH 04/23] feat(utils): change the Content Type to githubJSON --- src/app/api/utils/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/utils/utils.ts b/src/app/api/utils/utils.ts index afabb11..4e75d8b 100644 --- a/src/app/api/utils/utils.ts +++ b/src/app/api/utils/utils.ts @@ -11,7 +11,7 @@ const fetchURL = async (req: NextRequest, url: string, method: string) => { method: method, headers: { Authorization: `Bearer ${accessToken}`, - 'Content-Type': 'application/json', + 'Content-Type': 'application/vnd.github+json', }, }); From 25cedb65613bebe80fbcca7ef1604286dfd02bd4 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:03:55 +0200 Subject: [PATCH 05/23] feat(style): add new style for tailwind --- src/app/globals.css | 42 +++++++++++++++++++++++++++++++++++++++++- tailwind.config.ts | 7 +++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index cfc01cf..d0e119b 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -33,6 +33,23 @@ --ring: 222.2 84% 4.9%; --radius: 0.5rem; + + ::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-track { + background: #f1f1f1; + } + + ::-webkit-scrollbar-thumb { + background: #c5c5c58f; + border-radius: 5px; + } + + ::-webkit-scrollbar-thumb:hover { + background: #555; + } } .dark { @@ -63,6 +80,23 @@ --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 212.7 26.8% 83.9%; + + ::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-track { + background: #000000; + } + + ::-webkit-scrollbar-thumb { + background: #ffffff; + border-radius: 5px; + } + + ::-webkit-scrollbar-thumb:hover { + background: #555; + } } } @@ -73,4 +107,10 @@ body { @apply bg-background text-foreground; } - } \ No newline at end of file + } + + @layer components { + .max-h-transition { + transition: max-height 1s ease-out; + } + } diff --git a/tailwind.config.ts b/tailwind.config.ts index cec4214..4cb4c7a 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -29,6 +29,8 @@ const config = { 'collab-background': 'rgba(3, 137, 255, 0.37)', 'private-background': 'rgba(255, 3, 179, 0.28)', 'followers-background': 'rgba(3, 255, 58, 0.24)', + 'semi-light': 'rgba(233, 242, 253, 0.8)', + 'semi-dark': 'rgba(37, 37, 37, 0.77)', primary: { DEFAULT: "hsl(var(--primary))", foreground: "hsl(var(--primary-foreground))", @@ -77,6 +79,11 @@ const config = { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", }, + height: { + '110': '28rem', + '128': '32rem', + '144': '36rem', + }, }, }, plugins: [require("tailwindcss-animate")], From 041bc5db6fed85c10aed002823c730ef4c13afff Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:04:18 +0200 Subject: [PATCH 06/23] feat(api): new route for pull requests --- .../api/repos/[owner]/[repo]/pulls/route.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/app/api/repos/[owner]/[repo]/pulls/route.ts diff --git a/src/app/api/repos/[owner]/[repo]/pulls/route.ts b/src/app/api/repos/[owner]/[repo]/pulls/route.ts new file mode 100644 index 0000000..c72c777 --- /dev/null +++ b/src/app/api/repos/[owner]/[repo]/pulls/route.ts @@ -0,0 +1,51 @@ +import { getServerSession } from 'next-auth'; +import { z } from "zod"; +import fetchURL from "../../../../utils/utils"; +import { authOptions } from "../../../../../api/auth/[...nextauth]/route"; +import { NextRequest, NextResponse } from "next/server"; + +const querySchema = z.object({ + owner: z.string(), + repo: z.string(), +}); + +export async function GET( + req: NextRequest, { params }: any +) { + try { + const session = await getServerSession({ req, ...authOptions }); + if (!session) { + console.error('No valid access token found in session'); + return NextResponse.json({ message: 'Unauthorized' }, { status: 401 }); + } + + const result = querySchema.safeParse(params); + + if (!result.success) { + return NextResponse.json( + { message: "Invalid query parameters" }, + { status: 400 } + ); + } + + const { owner, repo } = result.data + + const encodedOwner : string = encodeURIComponent(owner); + const encodedRepo : string = encodeURIComponent(repo); + + const apiUrl : string = `https://api.github.com/repos/${encodedOwner}/${encodedRepo}/pulls`; + + const response = await fetchURL(req, apiUrl, "GET"); + + const pulls : object = await response.json(); + return NextResponse.json( + pulls, + { status: 200 } + ); + } catch (error) { + return NextResponse.json( + { message: 'Failed to fetch pulls' }, + { status: 500 } + ); + } +}; From 57a6264baa144ca521c79d37e601a178de6bfe00 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:04:38 +0200 Subject: [PATCH 07/23] feat(api): route to get info for a specific repos --- src/app/api/repos/[owner]/[repo]/route.ts | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/app/api/repos/[owner]/[repo]/route.ts diff --git a/src/app/api/repos/[owner]/[repo]/route.ts b/src/app/api/repos/[owner]/[repo]/route.ts new file mode 100644 index 0000000..77e04fe --- /dev/null +++ b/src/app/api/repos/[owner]/[repo]/route.ts @@ -0,0 +1,55 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth'; +import { authOptions } from '../../../../api/auth/[...nextauth]/route'; +import fetchURL from '../../../utils/utils'; +import { z } from 'zod'; + +const querySchema = z.object({ + owner: z.string(), + repo: z.string(), + }); + + +export async function GET( + req: NextRequest, {params}: any + ) { + try { + const session = await getServerSession({ req, ...authOptions }); + if (!session) { + return NextResponse.json( + { message: 'Unauthorized' }, + { status: 401 } + ); + } + + const result = querySchema.safeParse(params); + + if (!result.success) { + return NextResponse.json( + { message: "Invalid query parameters" }, + { status: 400 } + ) + } + + const { owner, repo } = result.data; + + const encodedOwner: string = encodeURIComponent(owner); + const encodedRepo: string = encodeURIComponent(repo); + + const apiUrl: string = `https://api.github.com/repos/${encodedOwner}/${encodedRepo}`; + + const response = await fetchURL(req, apiUrl, "GET"); + + const repository: object = await response.json(); + return NextResponse.json( + repository, + { status: 200 } + ); + } catch (error) { + return NextResponse.json( + { message: 'Failed to fetch repository' }, + { status: 500 } + ); + } + }; + \ No newline at end of file From 0b8c6436ca62ef999ff3432f65ab824290ab4da5 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:05:13 +0200 Subject: [PATCH 08/23] feat(repo-page): not done but start of the single repos page --- src/app/repository/[owner]/[repos]/page.tsx | 355 ++++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 src/app/repository/[owner]/[repos]/page.tsx diff --git a/src/app/repository/[owner]/[repos]/page.tsx b/src/app/repository/[owner]/[repos]/page.tsx new file mode 100644 index 0000000..e4240db --- /dev/null +++ b/src/app/repository/[owner]/[repos]/page.tsx @@ -0,0 +1,355 @@ +"use client"; + +import React, { useState, useEffect } from "react"; +import { CircleAlert, Logs, FolderKanban, Star, LineChart, ShieldAlert, Component, TriangleAlert, Eye, GitFork } from "lucide-react"; +import VulnerabilityCard from "../../../../../src/components/ui/card/vulnerability"; +import GithubCommits from "../../../../../src/components/charts/github-commits-repos"; +import GithubContributor from "../../../../../src/components/charts/github-contributors"; +import Loading from "../../../../../src/components/ui/loading"; + + +interface ReposProps { + params: { + repos: string; + owner: string; + }; +} + +interface Repository { + id: string; + name: string; + owner?: { + avatar_url: string; + login: string; + }; + version: string; + LastPush : string; + created_at: string; + stargazers_count: number; + forks_count: number; + watchers_count: number; +} + +interface Contributor { + login: string; + avatar_url: string; + contributions: number; +} + +interface CommitResponse { + sha: string; + node_id: string; + commit: CommitDetails; + url: string; + html_url: string; + comments_url: string; + author: User; + committer: User; + parents: Parent[]; +} + +interface CommitDetails { + author: AuthorCommitter; + committer: AuthorCommitter; + message: string; + tree: Tree; + url: string; + comment_count: number; + verification: Verification; +} + +interface AuthorCommitter { + name: string; + email: string; + date: string; +} + +interface Tree { + sha: string; + url: string; +} + +interface Verification { + verified: boolean; + reason: string; + signature: string | null; + payload: string | null; +} + +interface User { + login: string; + id: number; + node_id: string; + avatar_url: string; + gravatar_id: string; + url: string; + html_url: string; + followers_url: string; + following_url: string; + gists_url: string; + starred_url: string; + subscriptions_url: string; + organizations_url: string; + repos_url: string; + events_url: string; + received_events_url: string; + type: string; + site_admin: boolean; +} + +interface Parent { + sha: string; + url: string; + html_url: string; +} + + +export default function RepoPage( + { params }: ReposProps +) { + + const [repositories, setRepositories] = useState(); + const [contributors, setContributors] = useState(); + const [commits, setCommits] = useState(); + const [lastCommits, setLastCommits] = useState(); + + useEffect(() => { + const fetchRepositories = async () => { + try { + const response = await fetch(`/api/repos/${params.owner}/${params.repos}`); + + if (!response.ok) { + throw new Error('Failed to fetch repositories'); + } + + const data : Repository = await response.json(); + setRepositories(data); + } catch (err) { + console.log(err); + } + } + + const fetchContributors = async () => { + try { + const response = await fetch(`/api/repos/${params.owner}/${params.repos}/contributors`); + + if (!response.ok) { + throw new Error('Failed to fetch repositories'); + } + + const data : Contributor[] = await response.json(); + setContributors(data); + } catch (err) { + console.log(err); + } + } + + const fetchCommits = async () => { + try { + const response = await fetch(`/api/repos/${params.owner}/${params.repos}/commits`); + + if (!response.ok) { + throw new Error('Failed to fetch repositories'); + } + + const data : CommitResponse[] = await response.json(); + const topFiveCommits : CommitResponse[] = data.slice(0, 5).map(commit => commit); + setLastCommits(topFiveCommits); + setCommits(data.map(commit => commit)); + } catch (err) { + console.log(err); + } + } + + fetchRepositories().catch(console.error); + fetchContributors().catch(console.error); + fetchCommits().catch(console.error); + + } + , []); + + useEffect(() => { + }, [repositories, contributors, commits]); + + const formatDate = (isoDateString: string) => { + const date: Date = new Date(isoDateString); + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'short', + day: 'numeric', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + }; + + + return ( +
+
+

+ Dashboard +

+
+
+ +
+

+ {repositories?.name} +

+

+ {formatDate(repositories?.created_at)} +

+
+
+
+
+
+ +

+ {repositories?.stargazers_count} +

+

+ stars +

+
+
+ +

+ {repositories?.forks_count} +

+

+ forks +

+
+
+ +

+ {repositories?.watchers_count} +

+

+ watchers +

+
+
+
+
+
+
+ +

Commits History

+
+
+
+
+ { commits ? ( + + ) : ( +
+
+

Loading ...

+
+
+ +
+
+ )} +
+
+
+
+
+
+ +

Contributors

+
+
+ { contributors ? ( + + ) : ( +
+
+

Loading ...

+
+
+ +
+
+ )} +
+
+
+
+ +

Vulnerability History

+
+
+

Yo

+
+
+
+
+
+
+

+ Overview +

+
+ +

Vulnerability

+
+ + +
+
+ +

Logs -> Last Commits

+
+
+ {lastCommits ? ( + lastCommits.map((commit, index) => ( + +
+
+
+ User avatar +
+

{commit.author.login}

+

{commit.commit.message}

+

{formatDate(commit.commit.author.date)}

+
+
+
+
+ {index % 2 === 0 && ( + + )} +
+
+ {index < lastCommits.length - 1 && ( +
+ )} +
+ )) + ) : ( +
+
+

Loading ...

+
+
+ +
+
+ )} +
+
+
+
+
+ ); + +} \ No newline at end of file From 5804e97f51ea5564065c77d6137834a9822cd109 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:05:28 +0200 Subject: [PATCH 09/23] feat(charts): chart for the single repos page --- .../charts/github-commits-repos.jsx | 140 ++++++++++++++++++ src/components/charts/github-contributors.jsx | 129 ++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 src/components/charts/github-commits-repos.jsx create mode 100644 src/components/charts/github-contributors.jsx diff --git a/src/components/charts/github-commits-repos.jsx b/src/components/charts/github-commits-repos.jsx new file mode 100644 index 0000000..ff6cca3 --- /dev/null +++ b/src/components/charts/github-commits-repos.jsx @@ -0,0 +1,140 @@ +import { useEffect } from "react"; +import * as am5 from "@amcharts/amcharts5"; +import * as am5xy from "@amcharts/amcharts5/xy"; +import * as am5themes_Animated from "@amcharts/amcharts5/themes/Animated"; +import * as am5themes_Dark from "@amcharts/amcharts5/themes/Dark"; + +const ChartComponent = (props) => { + useEffect(() => { + if (!props.commits || props.commits.length === 0) { + return; + } + + let root = am5.Root.new("chartdiv4"); + + const isDarkMode = document.documentElement.classList.contains("dark"); + + root.setThemes([am5themes_Animated.default.new(root)]); + if (isDarkMode) { + root.setThemes([am5themes_Dark.default.new(root)]); + } + + let chart = root.container.children.push(am5xy.XYChart.new(root, { + panX: true, + panY: true, + wheelX: "panX", + wheelY: "zoomX", + pinchZoomX: true, + paddingLeft: 0 + })); + + let cursor = chart.set("cursor", am5xy.XYCursor.new(root, { + behavior: "none", + lineX: am5.Line.new(root, { visible: true, strokeDasharray: [3, 3] }), + lineY: am5.Line.new(root, { visible: true, strokeDasharray: [3, 3] }) + })); + + cursor.lineY.set("visible", true); // Affiche la ligne horizontale + cursor.lineX.set("visible", true); // Affiche la ligne verticale + + // Regrouper les commits par date + const commitsByDate = {}; + props.commits.forEach(commit => { + const date = new Date(commit.commit.author.date); + const dateString = date.toISOString().split('T')[0]; // Format 'YYYY-MM-DD' + if (!commitsByDate[dateString]) { + commitsByDate[dateString] = 0; + } + commitsByDate[dateString]++; + }); + + // Créer les données pour le graphique + const data = Object.keys(commitsByDate).map(date => ({ + date: new Date(date).getTime(), + value: commitsByDate[date] + })); + + let xAxis = chart.xAxes.push(am5xy.DateAxis.new(root, { + baseInterval: { timeUnit: "day", count: 1 }, + renderer: am5xy.AxisRendererX.new(root, { + minorGridEnabled: true + }), + tooltip: am5.Tooltip.new(root, {}) + })); + + let yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, { + renderer: am5xy.AxisRendererY.new(root, { + minGridDistance: 40 + }) + })); + + let series = chart.series.push(am5xy.LineSeries.new(root, { + name: "Series", + xAxis: xAxis, + yAxis: yAxis, + valueYField: "value", + valueXField: "date", + tooltip: am5.Tooltip.new(root, { + labelText: "{valueY} commits" + }) + })); + + let scrollbar = chart.set("scrollbarX", am5xy.XYChartScrollbar.new(root, { + orientation: "horizontal", + height: 60 + })); + + let sbDateAxis = scrollbar.chart.xAxes.push(am5xy.DateAxis.new(root, { + baseInterval: { timeUnit: "day", count: 1 }, + renderer: am5xy.AxisRendererX.new(root, { + minorGridEnabled: true, + minGridDistance: 70 + }) + })); + + let sbValueAxis = scrollbar.chart.yAxes.push(am5xy.ValueAxis.new(root, { + renderer: am5xy.AxisRendererY.new(root, { + minGridDistance: 40 + }) + })); + + let sbSeries = scrollbar.chart.series.push(am5xy.LineSeries.new(root, { + valueYField: "value", + valueXField: "date", + xAxis: sbDateAxis, + yAxis: sbValueAxis + })); + + // Remplacer les données en dur par les données des commits + series.data.setAll(data); + sbSeries.data.setAll(data); + + function createAxisRange(axis, startDate, endDate, chart) { + let dataItem = axis.makeDataItem({}); + dataItem.set("value", startDate.getTime()); + dataItem.set("endValue", endDate.getTime()); + + let range = axis.createAxisRange(dataItem); + range.get("axisFill").setAll({ + fill: chart.get("colors").getIndex(7), + fillOpacity: 0.4, + visible: true + }); + range.get("grid").set("forceHidden", true); + } + + createAxisRange(xAxis, new Date(2023, 4, 10), new Date(2023, 4, 11), chart); + createAxisRange(xAxis, new Date(2023, 4, 19), new Date(2023, 4, 20), chart); + + series.appear(1000); + chart.appear(1000, 100); + + return () => { + root.dispose(); + }; + }, [props.commits]); + + return
; +} + +export default ChartComponent; diff --git a/src/components/charts/github-contributors.jsx b/src/components/charts/github-contributors.jsx new file mode 100644 index 0000000..711a4c4 --- /dev/null +++ b/src/components/charts/github-contributors.jsx @@ -0,0 +1,129 @@ +import { useEffect } from "react"; +import * as am5 from "@amcharts/amcharts5"; +import * as am5xy from "@amcharts/amcharts5/xy"; +import * as am5themes_Animated from "@amcharts/amcharts5/themes/Animated"; +import * as am5themes_Dark from "@amcharts/amcharts5/themes/Dark"; + +const ChartComponent = (props) => { + + useEffect(() => { + + let root = am5.Root.new("chartdiv5"); + + const isDarkMode = document.documentElement.classList.contains("dark"); + + root.setThemes([am5themes_Animated.default.new(root)]); + + if (isDarkMode) { + root.setThemes([am5themes_Dark.default.new(root)]); + } + + let chart = root.container.children.push(am5xy.XYChart.new(root, { + panX: false, + panY: false, + wheelX: "none", + wheelY: "none", + paddingLeft: 0 + })); + + let cursor = chart.set("cursor", am5xy.XYCursor.new(root, {})); + cursor.lineY.set("visible", false); + + let xRenderer = am5xy.AxisRendererX.new(root, { + minGridDistance: 30, + minorGridEnabled: true + }); + + let xAxis = chart.xAxes.push(am5xy.CategoryAxis.new(root, { + maxDeviation: 0, + categoryField: "name", + renderer: xRenderer, + tooltip: am5.Tooltip.new(root, {}) + })); + + xRenderer.grid.template.set("visible", false); + + xRenderer.labels.template.set("visible", false); + + let yRenderer = am5xy.AxisRendererY.new(root, {}); + let yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, { + maxDeviation: 0, + min: 0, + extraMax: 0.1, + renderer: yRenderer + })); + + yRenderer.grid.template.setAll({ + strokeDasharray: [2, 2] + }); + + let series = chart.series.push(am5xy.ColumnSeries.new(root, { + name: "Series 1", + xAxis: xAxis, + yAxis: yAxis, + valueYField: "value", + sequencedInterpolation: true, + categoryXField: "name", + tooltip: am5.Tooltip.new(root, { dy: -25, labelText: "{valueY}" }) + })); + + series.columns.template.setAll({ + cornerRadiusTL: 5, + cornerRadiusTR: 5, + strokeOpacity: 0 + }); + + series.columns.template.adapters.add("fill", (fill, target) => { + return chart.get("colors").getIndex(series.columns.indexOf(target)); + }); + + series.columns.template.adapters.add("stroke", (stroke, target) => { + return chart.get("colors").getIndex(series.columns.indexOf(target)); + }); + + console.log(props.contributors); + + let data = []; + + if (props.contributors && props.contributors.length > 0) { + data = props.contributors.map(contributor => ({ + name: contributor.login, + value: contributor.contributions, + bulletSettings: { src: contributor.avatar_url } + })); + } + + series.bullets.push(function() { + return am5.Bullet.new(root, { + locationY: 1, + sprite: am5.Picture.new(root, { + templateField: "bulletSettings", + width: 50, + height: 50, + centerX: am5.p50, + centerY: am5.p50, + shadowColor: am5.color(0x000000), + shadowBlur: 4, + shadowOffsetX: 4, + shadowOffsetY: 4, + shadowOpacity: 0.6 + }) + }); + }); + + xAxis.data.setAll(data); + series.data.setAll(data); + + series.appear(1000); + chart.appear(1000, 100); + + return () => { + root.dispose(); + } + + }, [props.contributors]); + + return
; +}; + +export default ChartComponent; From 8cf451a9599d2cfa4a044392a53d403b7fa66ff8 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:05:50 +0200 Subject: [PATCH 10/23] feat(components): new components for UI style --- src/components/ui/card/vulnerability.tsx | 54 ++++++++++++++++++++++++ src/components/ui/loading.tsx | 16 +++++++ 2 files changed, 70 insertions(+) create mode 100644 src/components/ui/card/vulnerability.tsx create mode 100644 src/components/ui/loading.tsx diff --git a/src/components/ui/card/vulnerability.tsx b/src/components/ui/card/vulnerability.tsx new file mode 100644 index 0000000..ced6f97 --- /dev/null +++ b/src/components/ui/card/vulnerability.tsx @@ -0,0 +1,54 @@ +"use client"; + +import React, { useState } from "react"; +import { TriangleAlert, ChevronDown, Dot } from "lucide-react"; + +const Vulnerability = () => { + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + const toggleDropdown = () => { + setIsDropdownOpen(!isDropdownOpen); + }; + + return ( +
+
+
+ +

Potential SQL Injection

+ +
+
+
+

Yesterday

+
+
+

Severity: High

+

Location:

+
+ +

File: src/db/query.js

+
+
+ +

Line: 27

+
+
+
+
+
+
+
+ ); +} + +export default Vulnerability; diff --git a/src/components/ui/loading.tsx b/src/components/ui/loading.tsx new file mode 100644 index 0000000..e75a9e2 --- /dev/null +++ b/src/components/ui/loading.tsx @@ -0,0 +1,16 @@ +import { useEffect } from "react"; + +const Loading = () => { + + return ( +
+ + Loading... +
+ ) +}; + +export default Loading; \ No newline at end of file From 5c6b5388aa9ab95ced4ba3c9d50420dca9a13adb Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 02:07:49 +0200 Subject: [PATCH 11/23] fix(security): fix Server-Side Request Forgery in axios --- package-lock.json | 1446 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 1331 insertions(+), 115 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77f4657..fede85d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "my-app", "version": "0.1.0", "dependencies": { + "@amcharts/amcharts5": "^5.10.1", + "@amcharts/amcharts5-fonts": "^5.0.1", + "@amcharts/amcharts5-geodata": "^5.1.4", "@emotion/react": "^11.11.4", "@emotion/styled": "^11.11.5", "@mui/material": "^5.15.19", @@ -27,6 +30,7 @@ "next": "14.2.3", "next-auth": "^4.24.7", "next-plugin-yaml": "^1.0.1", + "next-swagger-doc": "^0.4.0", "passport": "^0.7.0", "passport-github2": "^0.1.12", "react": "^18", @@ -46,10 +50,10 @@ "@types/react-dom": "^18", "@types/swagger-ui-react": "^4.18.3", "eslint": "^8", - "eslint-config-next": "14.2.3", + "eslint-config-next": "14.2.4", "file-loader": "^6.2.0", "postcss": "^8", - "tailwindcss": "^3.4.4", + "tailwindcss": "^3.4.1", "typescript": "^5" } }, @@ -64,6 +68,91 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@amcharts/amcharts5": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.10.1.tgz", + "integrity": "sha512-oGTZ7QJ/AEiMgJ6W3xzX7dSTK47Zl4j44ZsHiWbdAU0BKSQPmzw/jGgj806/ki2Ym4wuxWvE8dCg6josmNnVDg==", + "dependencies": { + "@types/d3": "^7.0.0", + "@types/d3-chord": "^3.0.0", + "@types/d3-hierarchy": "3.1.1", + "@types/d3-sankey": "^0.11.1", + "@types/d3-shape": "^3.0.0", + "@types/geojson": "^7946.0.8", + "@types/polylabel": "^1.0.5", + "@types/svg-arc-to-cubic-bezier": "^3.2.0", + "d3": "^7.0.0", + "d3-chord": "^3.0.0", + "d3-force": "^3.0.0", + "d3-geo": "^3.0.0", + "d3-hierarchy": "^3.0.0", + "d3-sankey": "^0.12.3", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "d3-transition": "^3.0.0", + "d3-voronoi-treemap": "^1.1.2", + "flatpickr": "^4.6.9", + "markerjs2": "^2.29.4", + "pdfmake": "^0.2.2", + "polylabel": "^1.1.0", + "seedrandom": "^3.0.5", + "svg-arc-to-cubic-bezier": "^3.2.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@amcharts/amcharts5-fonts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5-fonts/-/amcharts5-fonts-5.0.1.tgz", + "integrity": "sha512-mNcGSywcAlztle5kT9u95UFit6tmgD6P6x8G954FiBwk207DJBVoB+uTUc4RH94vli5OyhWjMGNPAip6Lq6g2A==" + }, + "node_modules/@amcharts/amcharts5-geodata": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5-geodata/-/amcharts5-geodata-5.1.4.tgz", + "integrity": "sha512-M3Rhaef675mHZ6gillSlDfu31ZNUgsaoLpYubRfGRKM7mb//vewtvv8q91zljhE1za5h5NnXmHXCQfmbVo5f9w==", + "dependencies": { + "@types/geojson": "^7946.0.8" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", + "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.6", + "call-me-maybe": "^1.0.1", + "js-yaml": "^4.1.0" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^9.0.6", + "@apidevtools/openapi-schemas": "^2.0.4", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "z-schema": "^5.0.1" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -557,6 +646,70 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.4.tgz", "integrity": "sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==" }, + "node_modules/@foliojs-fork/fontkit": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", + "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", + "dependencies": { + "@foliojs-fork/restructure": "^2.0.2", + "brotli": "^1.2.0", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/fontkit/node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@foliojs-fork/linebreak": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", + "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", + "dependencies": { + "base64-js": "1.3.1", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak/node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/@foliojs-fork/pdfkit": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.14.0.tgz", + "integrity": "sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==", + "dependencies": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.2.0", + "png-js": "^1.0.0" + } + }, + "node_modules/@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -687,6 +840,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, "node_modules/@mui/core-downloads-tracker": { "version": "5.16.4", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.4.tgz", @@ -927,9 +1085,9 @@ "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz", - "integrity": "sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz", + "integrity": "sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA==", "dev": true, "dependencies": { "glob": "10.3.10" @@ -2110,6 +2268,249 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "node_modules/@types/d3-sankey": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz", + "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==", + "dependencies": { + "@types/d3-shape": "^1" + } + }, + "node_modules/@types/d3-sankey/node_modules/@types/d3-path": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" + }, + "node_modules/@types/d3-sankey/node_modules/@types/d3-shape": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", + "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -2139,6 +2540,11 @@ "dev": true, "peer": true }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, "node_modules/@types/hast": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", @@ -2150,8 +2556,7 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2173,6 +2578,11 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, + "node_modules/@types/polylabel": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.1.3.tgz", + "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==" + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -2212,6 +2622,16 @@ "@types/react": "*" } }, + "node_modules/@types/svg-arc-to-cubic-bezier": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.2.tgz", + "integrity": "sha512-XQtKy9lmkKlV+c3Jelo7kxNPw7qOqIq3GcnOhywGZHF7zw5D5m+Ssigbmf3Turbe/A8Ur+lRh8TYjuxXKvyivw==" + }, + "node_modules/@types/swagger-jsdoc": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.1.tgz", + "integrity": "sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w==" + }, "node_modules/@types/swagger-ui-react": { "version": "4.18.3", "resolved": "https://registry.npmjs.org/@types/swagger-ui-react/-/swagger-ui-react-4.18.3.tgz", @@ -2901,9 +3321,9 @@ } }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -3035,7 +3455,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3052,6 +3471,14 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.23.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", @@ -3153,6 +3580,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3305,11 +3737,31 @@ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" }, + "node_modules/cleye": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/cleye/-/cleye-1.3.2.tgz", + "integrity": "sha512-MngIC2izcCz07iRKr3Pe8Z6ZBv4zbKFl/YnQEN/aMHis6PpH+MxI2e6n0bMUAmSVlMoAyQkdBCSTbfDmtcSovQ==", + "dependencies": { + "terminal-columns": "^1.4.1", + "type-flag": "^3.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/cleye?sponsor=1" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -3365,8 +3817,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/connect-flash": { "version": "0.1.1", @@ -3419,109 +3870,599 @@ "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.10" + } + }, + "node_modules/cookie-session/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js-pure": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", + "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/cookie-session/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" }, "engines": { - "node": ">= 0.8" + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "node_modules/d3-voronoi-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-voronoi-map/-/d3-voronoi-map-2.1.1.tgz", + "integrity": "sha512-mCXfz/kD9IQxjHaU2IMjkO8fSo4J6oysPR2iL+omDsCy1i1Qn6BQ/e4hEAW8C6ms2kfuHwqtbNom80Hih94YsA==", "dependencies": { - "toggle-selection": "^1.0.6" + "d3-dispatch": "2.*", + "d3-polygon": "2.*", + "d3-timer": "2.*", + "d3-weighted-voronoi": "1.*" } }, - "node_modules/core-js-pure": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.37.1.tgz", - "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } + "node_modules/d3-voronoi-map/node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/d3-voronoi-map/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + }, + "node_modules/d3-voronoi-map/node_modules/d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "node_modules/d3-voronoi-treemap": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi-treemap/-/d3-voronoi-treemap-1.1.2.tgz", + "integrity": "sha512-7odu9HdG/yLPWwzDteJq4yd9Q/NwgQV7IE/u36VQtcCK7k1sZwDqbkHCeMKNTBsq5mQjDwolTsrXcU0j8ZEMCA==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" + "d3-voronoi-map": "2.*" } }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" + "node_modules/d3-weighted-voronoi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/d3-weighted-voronoi/-/d3-weighted-voronoi-1.1.3.tgz", + "integrity": "sha512-C3WdvSKl9aqhAy+f3QT3PPsQG6V+ajDfYO3BSclQDSD+araW2xDBFIH67aKzsSuuuKaX8K2y2dGq1fq/dWTVig==", + "dependencies": { + "d3-array": "2", + "d3-polygon": "2" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/d3-weighted-voronoi/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "internmap": "^1.0.0" } }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + "node_modules/d3-weighted-voronoi/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" }, - "node_modules/cssesc": { + "node_modules/d3-weighted-voronoi/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -3684,7 +4625,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -3697,6 +4637,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3736,6 +4684,11 @@ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -3762,7 +4715,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -4125,12 +5077,12 @@ } }, "node_modules/eslint-config-next": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.3.tgz", - "integrity": "sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.4.tgz", + "integrity": "sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "14.2.3", + "@next/eslint-plugin-next": "14.2.4", "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", "eslint-import-resolver-node": "^0.3.6", @@ -4488,7 +5440,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4803,6 +5754,11 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" + }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -4911,8 +5867,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -4957,7 +5912,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5212,7 +6166,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -5366,7 +6319,6 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -5397,6 +6349,14 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -5439,7 +6399,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5571,7 +6530,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -5714,7 +6672,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -5841,8 +6798,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -6175,12 +7131,27 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "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 }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6221,6 +7192,11 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/markerjs2": { + "version": "2.32.1", + "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.32.1.tgz", + "integrity": "sha512-OGBINMGhXwTXZF/k0ky9vciPm8C3/bsDZUJroZrIvoX0xv3OWYBEDiUSmgRpiLkCv5Z4Q7RaYxhza/iafc25zw==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -6326,7 +7302,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6505,6 +7480,26 @@ "js-yaml-loader": "^1.2.2" } }, + "node_modules/next-swagger-doc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/next-swagger-doc/-/next-swagger-doc-0.4.0.tgz", + "integrity": "sha512-5Wt19Av4tOHVdXPJ7xTVvDJuiWuP5OYnY13BSq5SIjMtktFfhX4/9yZyaMCXImbUECu26PALn9CpRQRplIXJ3w==", + "dependencies": { + "@types/swagger-jsdoc": "6.0.1", + "cleye": "1.3.2", + "isarray": "2.0.5", + "swagger-jsdoc": "6.2.8" + }, + "bin": { + "next-swagger-doc-cli": "dist/cli.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "next": ">=9" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -6634,7 +7629,6 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -6650,7 +7644,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -6784,7 +7777,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, "dependencies": { "wrappy": "1" } @@ -6811,6 +7803,12 @@ "node": ">=12.20.0" } }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "peer": true + }, "node_modules/openid-client": { "version": "5.6.5", "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.5.tgz", @@ -6891,6 +7889,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7017,7 +8020,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7068,6 +8070,31 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/pdfmake": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.11.tgz", + "integrity": "sha512-Ig9LBhIYWW8t0/MiXQPYOQdMgwjg+f3JS2iWA7q94Ftc4wSDO5VZP+a1+QN7uz3FbA7+vB4EEYfg3xU0wRPk8w==", + "dependencies": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.14.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pdfmake/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -7100,6 +8127,19 @@ "node": ">= 6" } }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" + }, + "node_modules/polylabel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", + "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", + "dependencies": { + "tinyqueue": "^2.0.3" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -7848,7 +8888,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -7990,6 +9029,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8012,6 +9056,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -8071,6 +9120,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -8097,6 +9151,11 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -8208,7 +9267,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -8694,6 +9752,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + }, "node_modules/swagger-client": { "version": "3.28.2", "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.28.2.tgz", @@ -8726,6 +9789,72 @@ "node": ">= 0.6" } }, + "node_modules/swagger-jsdoc": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", + "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", + "dependencies": { + "commander": "6.2.0", + "doctrine": "3.0.0", + "glob": "7.1.6", + "lodash.mergewith": "^4.6.2", + "swagger-parser": "^10.0.3", + "yaml": "2.0.0-1" + }, + "bin": { + "swagger-jsdoc": "bin/swagger-jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/swagger-jsdoc/node_modules/commander": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", + "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-jsdoc/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/swagger-jsdoc/node_modules/yaml": { + "version": "2.0.0-1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", + "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/swagger-parser": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", + "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", + "dependencies": { + "@apidevtools/swagger-parser": "10.0.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/swagger-ui-dist": { "version": "5.17.14", "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", @@ -8894,6 +10023,14 @@ "node": ">=6" } }, + "node_modules/terminal-columns": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terminal-columns/-/terminal-columns-1.4.1.tgz", + "integrity": "sha512-IKVL/itiMy947XWVv4IHV7a0KQXvKjj4ptbi7Ew9MPMcOLzkiQeyx3Gyvh62hKrfJ0RZc4M1nbhzjNM39Kyujw==", + "funding": { + "url": "https://github.com/privatenumber/terminal-columns?sponsor=1" + } + }, "node_modules/terser": { "version": "5.31.3", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", @@ -8980,6 +10117,16 @@ "node": ">=0.8" } }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -9141,6 +10288,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-flag/-/type-flag-3.0.0.tgz", + "integrity": "sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA==", + "funding": { + "url": "https://github.com/privatenumber/type-flag?sponsor=1" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -9289,6 +10444,24 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9421,6 +10594,14 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9731,8 +10912,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xml": { "version": "1.0.1", @@ -9747,6 +10927,14 @@ "repeat-string": "^1.5.2" } }, + "node_modules/xmldoc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", + "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", + "dependencies": { + "sax": "^1.2.4" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9783,6 +10971,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/zenscroll": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", From 7a255344c24aa19d21d2632fde8e701f1e94d867 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:15:01 +0200 Subject: [PATCH 12/23] feat(package): new packages --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2bf477e..bd22fc5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@mui/material-nextjs": "^5.15.11", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", - "axios": "^1.7.2", + "axios": "^1.7.4", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "connect-flash": "^0.1.1", From 6cf9252ab24d13c375606856b3a54ca95659de0d Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:15:37 +0200 Subject: [PATCH 13/23] feat(syntax): new type added --- src/app/api/repos/[owner]/[repo]/commits/route.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/api/repos/[owner]/[repo]/commits/route.ts b/src/app/api/repos/[owner]/[repo]/commits/route.ts index 4779c9c..84881b9 100644 --- a/src/app/api/repos/[owner]/[repo]/commits/route.ts +++ b/src/app/api/repos/[owner]/[repo]/commits/route.ts @@ -110,14 +110,14 @@ export async function GET( } const { owner, repo } = result.data; - const per_page = result.data.per_page || "100"; - let page = result.data.page || "1"; + const per_page: string = result.data.per_page || "100"; + let page: string = result.data.page || "1"; const encodedOwner: string = encodeURIComponent(owner); const encodedRepo: string = encodeURIComponent(repo); let allCommits: Array = []; - let hasMorePages = true; + let hasMorePages: boolean = true; while (hasMorePages) { const apiUrl: string = `https://api.github.com/repos/${encodedOwner}/${encodedRepo}/commits?per_page=${per_page}&page=${page}`; From 13cb73859b74baab77a4e6c9fba4776046f40035 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:15:52 +0200 Subject: [PATCH 14/23] feat(style): new colors and style --- src/app/globals.css | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index d0e119b..e82d12d 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -53,7 +53,7 @@ } .dark { - --background: 222.2 100% 0%; + --background: #001229; --foreground: 210 40% 98%; --card: 222.2 84% 4.9%; @@ -114,3 +114,11 @@ transition: max-height 1s ease-out; } } + + .truncate-text { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 200px; + } \ No newline at end of file From 073573e1f08b09e141b8f1e334ffe6f97b54ecfc Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:16:21 +0200 Subject: [PATCH 15/23] feat(repo-page): single repo page done (miss the real data for vulnerability) --- src/app/repository/[owner]/[repos]/page.tsx | 86 ++++++++++++++++++--- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/src/app/repository/[owner]/[repos]/page.tsx b/src/app/repository/[owner]/[repos]/page.tsx index e4240db..42faf71 100644 --- a/src/app/repository/[owner]/[repos]/page.tsx +++ b/src/app/repository/[owner]/[repos]/page.tsx @@ -1,7 +1,7 @@ "use client"; import React, { useState, useEffect } from "react"; -import { CircleAlert, Logs, FolderKanban, Star, LineChart, ShieldAlert, Component, TriangleAlert, Eye, GitFork } from "lucide-react"; +import { CircleAlert, Logs, FolderKanban, ShieldCheck, ShieldX, FileWarning, Star, LineChart, ShieldAlert, Component, TriangleAlert, Eye, GitFork } from "lucide-react"; import VulnerabilityCard from "../../../../../src/components/ui/card/vulnerability"; import GithubCommits from "../../../../../src/components/charts/github-commits-repos"; import GithubContributor from "../../../../../src/components/charts/github-contributors"; @@ -183,13 +183,13 @@ export default function RepoPage( }); }; - return ( -
-
-

+
+
+

Dashboard

+
@@ -198,7 +198,7 @@ export default function RepoPage( {repositories?.name}

- {formatDate(repositories?.created_at)} + {repositories?.created_at ? formatDate(repositories.created_at) : 'Loading ...'}

@@ -241,7 +241,7 @@ export default function RepoPage(
-
+
{ commits ? ( ) : ( @@ -263,7 +263,7 @@ export default function RepoPage(

Contributors

-
+
{ contributors ? ( ) : ( @@ -283,17 +283,78 @@ export default function RepoPage(

Vulnerability History

-
-

Yo

+
+
+
+
+ +
+

Potential Sql Injection

+

Yesterday

+
+
+
+
+

High

+
+
+
+
+
+
+ +
+

Token Leak

+

Jun 23, 2024, 11:30:00PM

+
+
+
+
+

Very High

+
+
+
+
+
+
+ +
+

Cross-Site Scripting

+

Jun 16, 2024, 11:30:00PM

+
+
+
+
+

Low

+
+
+
+
+
+
+ +
+

Cross-Site Scripting

+

Jun 16, 2024, 11:30:00PM

+
+
+
+
+

Low

+
+
+
+
-
+

Overview

+

Vulnerability

@@ -305,7 +366,7 @@ export default function RepoPage(

Logs -> Last Commits

-
+
{lastCommits ? ( lastCommits.map((commit, index) => ( @@ -347,6 +408,7 @@ export default function RepoPage( )}
+
From a1363c3c7b9109b3801e6aa1ac22b9979aa5d2d9 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:16:42 +0200 Subject: [PATCH 16/23] feat(style): better style for user page --- src/app/user/me/page.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/user/me/page.tsx b/src/app/user/me/page.tsx index 439579d..9ed1cc1 100644 --- a/src/app/user/me/page.tsx +++ b/src/app/user/me/page.tsx @@ -124,7 +124,7 @@ export default function UserPage({ params }: UserProps) {
-
+

FOLLOWERS

{userData.followers}

@@ -133,7 +133,7 @@ export default function UserPage({ params }: UserProps) {
-
+

FOLLOWING

{userData.following}

@@ -142,7 +142,7 @@ export default function UserPage({ params }: UserProps) {
-
+

PUBLIC REPOS

{userData.public_repos}

@@ -151,7 +151,7 @@ export default function UserPage({ params }: UserProps) {
-
+

PRIVATE REPOS

{userData.total_private_repos}

@@ -164,7 +164,7 @@ export default function UserPage({ params }: UserProps) {
-
+

TOTAL CONTRIBUTION

@@ -176,7 +176,7 @@ export default function UserPage({ params }: UserProps) { )}
-
+

PLAN

From 67810afbe12d0f6faca43ee69b869732b3220bd8 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:16:58 +0200 Subject: [PATCH 17/23] feat(charts): fill charts for better look --- src/components/charts/github-commits-repos.jsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/charts/github-commits-repos.jsx b/src/components/charts/github-commits-repos.jsx index ff6cca3..a3f59f5 100644 --- a/src/components/charts/github-commits-repos.jsx +++ b/src/components/charts/github-commits-repos.jsx @@ -34,21 +34,19 @@ const ChartComponent = (props) => { lineY: am5.Line.new(root, { visible: true, strokeDasharray: [3, 3] }) })); - cursor.lineY.set("visible", true); // Affiche la ligne horizontale - cursor.lineX.set("visible", true); // Affiche la ligne verticale + cursor.lineY.set("visible", true); + cursor.lineX.set("visible", true); - // Regrouper les commits par date const commitsByDate = {}; props.commits.forEach(commit => { const date = new Date(commit.commit.author.date); - const dateString = date.toISOString().split('T')[0]; // Format 'YYYY-MM-DD' + const dateString = date.toISOString().split('T')[0]; if (!commitsByDate[dateString]) { commitsByDate[dateString] = 0; } commitsByDate[dateString]++; }); - // Créer les données pour le graphique const data = Object.keys(commitsByDate).map(date => ({ date: new Date(date).getTime(), value: commitsByDate[date] @@ -105,7 +103,11 @@ const ChartComponent = (props) => { yAxis: sbValueAxis })); - // Remplacer les données en dur par les données des commits + series.fills.template.setAll({ + fillOpacity: 0.2, + visible: true + }); + series.data.setAll(data); sbSeries.data.setAll(data); From 5f57bf4e73fade790e6f5a16f24243e58c4edb10 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:17:40 +0200 Subject: [PATCH 18/23] feat(style): better style for card --- src/components/ui/card/vulnerability.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/ui/card/vulnerability.tsx b/src/components/ui/card/vulnerability.tsx index ced6f97..3ae5171 100644 --- a/src/components/ui/card/vulnerability.tsx +++ b/src/components/ui/card/vulnerability.tsx @@ -11,7 +11,7 @@ const Vulnerability = () => { }; return ( -
+
@@ -32,7 +32,13 @@ const Vulnerability = () => {

Yesterday

-

Severity: High

+
+

Severity:

+

High

+
+
+
+

Location:

From 28a502c84c796bf908fe27a25d2425d41d5829f6 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:18:02 +0200 Subject: [PATCH 19/23] feat(sidebar): improve style + add new buttons in the sidebar --- src/components/ui/side-bar.tsx | 178 ++++++++++++++++++++++----------- 1 file changed, 121 insertions(+), 57 deletions(-) diff --git a/src/components/ui/side-bar.tsx b/src/components/ui/side-bar.tsx index 9923663..ccb6d08 100644 --- a/src/components/ui/side-bar.tsx +++ b/src/components/ui/side-bar.tsx @@ -1,7 +1,9 @@ "use client"; -import { LogOut, Plus, User, Moon, Sun } from "lucide-react"; +import { LogOut, Plus, User, FolderKanban, ChevronRight, Moon, Sun, House, LayoutDashboard, Building } from "lucide-react"; import { useEffect, useState } from "react"; +import logo from "../../../assets/secure-CI.png"; +import Image from "next/image"; import { DropdownMenu, DropdownMenuContent, @@ -21,7 +23,23 @@ interface SideBarChildrenProps { currentOrg: Organization; } +interface Repository { + name: string; + owner: { + login: string; + }; +} + const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { + + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + const [Repos, setRepos] = useState([]); + + const toggleDropdown = () => { + setIsDropdownOpen(!isDropdownOpen); + }; + const { data: session } = useSession(); const router = useRouter(); @@ -33,6 +51,26 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { setDarkMode(isDarkMode); }, []); + useEffect(() => { + const fetchRepos = async () => { + try { + const response = await fetch("/api/repos/repository") + + if (!response.ok) { + throw new Error('Failed to fetch repositories'); + } + + const data: Repository[] = await response.json(); + setRepos(data); + + } catch (err) { + console.error(err); + } + } + + fetchRepos().catch(console.error); + }, []); + const toggleDarkMode = () => { setDarkMode((prevDarkMode) => { const newDarkMode = !prevDarkMode; @@ -57,67 +95,93 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { aria-label="Sidebar" >
-
- - - - - - - - - - - - - {currentOrg.name} - - - {organizations?.map((org) => ( - - {org.name} +
+
+ Secure-CI +

Secure-CI

+
+
+
+ +
+ + + {currentOrg.name} + + + {organizations?.map((org) => ( + + {org.name} + + ))} + + + Add org + + + + + router.replace('/user/me')}> + {session?.user?.name} + + + + {darkMode ? : } + + {darkMode ? "Dark mode" : "Light mode"} + - ))} - - - Add org - - - - - router.replace('/user/me')}> - {session?.user?.name} - - - - {darkMode ? : } - - {darkMode ? "Dark mode" : "Light mode"} - - - - - signOut({callbackUrl: '/'})}>Log out - - - + + + signOut({callbackUrl: '/'})}>Log out + + + +
+
+
+
router.replace('/dashboard')} className="ml-2 mt-5 p-2 flex w-11/12 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700"> + + +
+
+
+ + +
+
+ +
+
+
+
+ {Repos.map((repo) => ( +
+ + +
+ ))} +
+
+
router.replace('/user/me')} className="ml-2 p-2 flex w-11/12 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700"> + +
- ); + ); }; export { SideBar }; From 2dea7a2037a61e461b3767f2732654cbedd0e0d3 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:18:22 +0200 Subject: [PATCH 20/23] feat(tailwing/config): better colors --- tailwind.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tailwind.config.ts b/tailwind.config.ts index 4cb4c7a..246032d 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -22,7 +22,7 @@ const config = { border: "hsl(var(--border))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", - background: "hsl(var(--background))", + background: "var(--background)", foreground: "hsl(var(--foreground))", 'dark-background': 'rgba(25, 25, 25, 0.83)', 'plan-background': 'rgba(255, 3, 41, 0.37)', From f5adec82bae40f0e5813663145f7222cf71f7656 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:42:57 +0200 Subject: [PATCH 21/23] feat(style): better style for components --- src/components/auth/testimonials.tsx | 2 +- src/components/ui/side-bar.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/auth/testimonials.tsx b/src/components/auth/testimonials.tsx index b668684..1397307 100644 --- a/src/components/auth/testimonials.tsx +++ b/src/components/auth/testimonials.tsx @@ -10,7 +10,7 @@ const Testimonials = () => {
{testimonials.map((testimonial, index) => (
-
+

{testimonial.text}

diff --git a/src/components/ui/side-bar.tsx b/src/components/ui/side-bar.tsx index ccb6d08..9968464 100644 --- a/src/components/ui/side-bar.tsx +++ b/src/components/ui/side-bar.tsx @@ -94,14 +94,14 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { className="fixed left-0 top-0 z-40 h-screen w-64 transition-transform" aria-label="Sidebar" > -
+
Secure-CI

Secure-CI

-
+
@@ -174,6 +174,7 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => { ))}
+
router.replace('/user/me')} className="ml-2 p-2 flex w-11/12 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700"> From 4e2d8dabd2ce2029e76db7b7b316c0bfb1917807 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:48:07 +0200 Subject: [PATCH 22/23] feat(style): change icons by user avatar --- src/components/ui/side-bar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ui/side-bar.tsx b/src/components/ui/side-bar.tsx index 9968464..0860a7c 100644 --- a/src/components/ui/side-bar.tsx +++ b/src/components/ui/side-bar.tsx @@ -176,8 +176,8 @@ const SideBar = ({ organizations, currentOrg }: SideBarChildrenProps) => {
router.replace('/user/me')} className="ml-2 p-2 flex w-11/12 rounded-md hover:bg-slate-100 dark:hover:bg-slate-700"> - - + User avatar +
From b782ce119abdbf9508417a5a4f4ae8ddf899cdf4 Mon Sep 17 00:00:00 2001 From: Quentin Date: Sat, 17 Aug 2024 18:48:24 +0200 Subject: [PATCH 23/23] feat(style): add border for better look --- src/app/repository/[owner]/[repos]/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/repository/[owner]/[repos]/page.tsx b/src/app/repository/[owner]/[repos]/page.tsx index 42faf71..a922281 100644 --- a/src/app/repository/[owner]/[repos]/page.tsx +++ b/src/app/repository/[owner]/[repos]/page.tsx @@ -185,7 +185,7 @@ export default function RepoPage( return (
-
+

Dashboard

@@ -351,7 +351,7 @@ export default function RepoPage(
-

+

Overview