The weeb for the next gen discord boat - Wamellow wamellow.com
bot discord

new eslint rules

shi.gg fc1ea6ae fe794589

verified
+808 -527
-132
.eslintrc.json
··· 1 - { 2 - "extends": [ 3 - "next/core-web-vitals", 4 - "eslint:recommended", 5 - "plugin:@typescript-eslint/recommended", 6 - "plugin:react/recommended" 7 - ], 8 - "overrides": [], 9 - "parser": "@typescript-eslint/parser", 10 - "parserOptions": { 11 - "ecmaVersion": "latest" 12 - }, 13 - "plugins": [ 14 - "@typescript-eslint", 15 - "simple-import-sort", 16 - "unused-imports", 17 - "react-compiler" 18 - ], 19 - "rules": { 20 - "react-compiler/react-compiler": "error", 21 - "react-hooks/exhaustive-deps": "off", 22 - "react/react-in-jsx-scope": "off", 23 - "@typescript-eslint/ban-ts-comment": "error", 24 - "@typescript-eslint/no-explicit-any": "error", 25 - "consistent-return": "off", 26 - "quotes": [ 27 - "error", 28 - "double", 29 - { 30 - "avoidEscape": true 31 - } 32 - ], 33 - "no-mixed-spaces-and-tabs": "error", 34 - "indent": [ 35 - "error", 36 - 4, 37 - { 38 - "SwitchCase": 1 39 - } 40 - ], 41 - "arrow-parens": [ 42 - "error", 43 - "always" 44 - ], 45 - "eol-last": [ 46 - "error", 47 - "never" 48 - ], 49 - "func-call-spacing": [ 50 - "error", 51 - "never" 52 - ], 53 - "no-multi-spaces": "error", 54 - "no-trailing-spaces": "error", 55 - "comma-dangle": [ 56 - "error", 57 - "never" 58 - ], 59 - "no-whitespace-before-property": "off", 60 - "semi": [ 61 - "error", 62 - "always" 63 - ], 64 - "semi-style": [ 65 - "error", 66 - "last" 67 - ], 68 - "space-in-parens": [ 69 - "error", 70 - "never" 71 - ], 72 - "block-spacing": [ 73 - "error", 74 - "always" 75 - ], 76 - "object-curly-spacing": [ 77 - "error", 78 - "always" 79 - ], 80 - "eqeqeq": [ 81 - "error", 82 - "always", 83 - { 84 - "null": "ignore" 85 - } 86 - ], 87 - "spaced-comment": [ 88 - "error", 89 - "always", 90 - { 91 - "markers": [ 92 - "!" 93 - ] 94 - } 95 - ], 96 - "yoda": "error", 97 - "prefer-destructuring": [ 98 - "error", 99 - { 100 - "object": true, 101 - "array": false 102 - } 103 - ], 104 - "operator-assignment": [ 105 - "error", 106 - "always" 107 - ], 108 - "no-useless-computed-key": "error", 109 - "no-unneeded-ternary": [ 110 - "error", 111 - { 112 - "defaultAssignment": false 113 - } 114 - ], 115 - "no-invalid-regexp": "error", 116 - "no-constant-condition": [ 117 - "error", 118 - { 119 - "checkLoops": false 120 - } 121 - ], 122 - "no-duplicate-imports": "error", 123 - "no-extra-semi": "error", 124 - "dot-notation": "error", 125 - "no-useless-escape": [ 126 - "error" 127 - ], 128 - "simple-import-sort/imports": "error", 129 - "simple-import-sort/exports": "error", 130 - "unused-imports/no-unused-imports": "error" 131 - } 132 - }
···
+2 -2
app/(dynamic-assets)/sitemap.xml/route.ts
··· 2 import { getCanonicalUrl } from "@/utils/urls"; 3 4 interface Sitemap { 5 - url: string 6 - priority: number 7 } 8 9 export const revalidate = 691200; // 8 days
··· 2 import { getCanonicalUrl } from "@/utils/urls"; 3 4 interface Sitemap { 5 + url: string; 6 + priority: number; 7 } 8 9 export const revalidate = 691200; // 8 days
+2 -2
app/(home)/bot/pronouns/genders/page.tsx
··· 1 - import { Metadata } from "next"; 2 3 - import { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
··· 1 + import type { Metadata } from "next"; 2 3 + import type { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
+3 -3
app/(home)/bot/pronouns/layout.tsx
··· 1 - import { Metadata } from "next"; 2 import { Montserrat, Patrick_Hand } from "next/font/google"; 3 import Image from "next/image"; 4 import Link from "next/link"; ··· 10 import ImageGrid from "@/components/image-grid"; 11 import { defaultFetchOptions } from "@/lib/api"; 12 import ArrowPic from "@/public/icons/arroww.webp"; 13 - import { ApiV1TopguildsGetResponse } from "@/typings"; 14 import { cn } from "@/utils/cn"; 15 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 16 ··· 51 export default async function RootLayout({ 52 children 53 }: { 54 - children: React.ReactNode 55 }) { 56 const topGuilds = await fetch(`${process.env.NEXT_PUBLIC_API}/top-guilds`, defaultFetchOptions) 57 .then((res) => res.json())
··· 1 + import type { Metadata } from "next"; 2 import { Montserrat, Patrick_Hand } from "next/font/google"; 3 import Image from "next/image"; 4 import Link from "next/link"; ··· 10 import ImageGrid from "@/components/image-grid"; 11 import { defaultFetchOptions } from "@/lib/api"; 12 import ArrowPic from "@/public/icons/arroww.webp"; 13 + import type { ApiV1TopguildsGetResponse } from "@/typings"; 14 import { cn } from "@/utils/cn"; 15 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 16 ··· 51 export default async function RootLayout({ 52 children 53 }: { 54 + children: React.ReactNode; 55 }) { 56 const topGuilds = await fetch(`${process.env.NEXT_PUBLIC_API}/top-guilds`, defaultFetchOptions) 57 .then((res) => res.json())
+2 -3
app/(home)/bot/pronouns/list.component.tsx
··· 2 import { HiAcademicCap } from "react-icons/hi"; 3 4 import Ad from "@/components/ad"; 5 - import { PronounsResponse } from "@/typings"; 6 7 interface Props { 8 res: PronounsResponse; 9 type: string; 10 } 11 12 - export default async function List({ res, type }: Props) { 13 - 14 return ( 15 <div> 16 <div className="w-full flex items-center justify-between mb-2">
··· 2 import { HiAcademicCap } from "react-icons/hi"; 3 4 import Ad from "@/components/ad"; 5 + import type { PronounsResponse } from "@/typings"; 6 7 interface Props { 8 res: PronounsResponse; 9 type: string; 10 } 11 12 + export default function List({ res, type }: Props) { 13 return ( 14 <div> 15 <div className="w-full flex items-center justify-between mb-2">
+1 -1
app/(home)/bot/pronouns/page.tsx
··· 11 12 const montserrat = Montserrat({ subsets: ["latin"] }); 13 14 - export default async function Home() { 15 16 const styles = { 17 h2: cn(montserrat.className, "lg:text-5xl text-4xl bg-gradient-to-b bg-clip-text text-transparent from-neutral-200 from-40% to-violet-300 font-bold underline decoration-violet-400"),
··· 11 12 const montserrat = Montserrat({ subsets: ["latin"] }); 13 14 + export default function Home() { 15 16 const styles = { 17 h2: cn(montserrat.className, "lg:text-5xl text-4xl bg-gradient-to-b bg-clip-text text-transparent from-neutral-200 from-40% to-violet-300 font-bold underline decoration-violet-400"),
+2 -2
app/(home)/bot/pronouns/pronouns/page.tsx
··· 1 - import { Metadata } from "next"; 2 3 - import { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
··· 1 + import type { Metadata } from "next"; 2 3 + import type { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
+2 -2
app/(home)/bot/pronouns/sexualities/page.tsx
··· 1 - import { Metadata } from "next"; 2 3 - import { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
··· 1 + import type { Metadata } from "next"; 2 3 + import type { PronounsResponse } from "@/typings"; 4 import { getCanonicalUrl } from "@/utils/urls"; 5 6 import List from "../list.component";
+3 -3
app/(home)/debug/page.tsx
··· 1 - import { Metadata } from "next"; 2 import { cookies, headers } from "next/headers"; 3 import Link from "next/link"; 4 import { HiTrash } from "react-icons/hi"; ··· 10 11 import Panel from "./panel.component"; 12 13 - export const generateMetadata = async (): Promise<Metadata> => { 14 const title = "Shiggy"; 15 const description = ""; 16 const url = getCanonicalUrl("debug"); ··· 44 }; 45 46 export default async function Home() { 47 - const headerList: { name: string, value: string }[] = []; 48 for (const [key, value] of (await headers()).entries()) { 49 headerList.push({ name: key, value }); 50 }
··· 1 + import type { Metadata } from "next"; 2 import { cookies, headers } from "next/headers"; 3 import Link from "next/link"; 4 import { HiTrash } from "react-icons/hi"; ··· 10 11 import Panel from "./panel.component"; 12 13 + export const generateMetadata = (): Metadata => { 14 const title = "Shiggy"; 15 const description = ""; 16 const url = getCanonicalUrl("debug"); ··· 44 }; 45 46 export default async function Home() { 47 + const headerList: { name: string; value: string; }[] = []; 48 for (const [key, value] of (await headers()).entries()) { 49 headerList.push({ name: key, value }); 50 }
+1 -1
app/(home)/debug/panel.component.tsx
··· 12 children 13 }: { 14 name: string; 15 - items: Item[], 16 action?: (item: Item) => React.ReactNode; 17 children?: React.ReactNode; 18 }) {
··· 12 children 13 }: { 14 name: string; 15 + items: Item[]; 16 action?: (item: Item) => React.ReactNode; 17 children?: React.ReactNode; 18 }) {
+7 -7
app/(home)/faq.component.tsx
··· 22 Open Discord{"'"}s add-app flow at <LinkTag href="/login?invite=true">wamellow.com/invite</LinkTag>. 23 </li> 24 <li> 25 - Select a server and click on {'"'}Continue{'"'}. 26 </li> 27 <li> 28 - Do <span className="font-semibold">not uncheck</span> any permissions and click on {'"'}Authorize{'"'}. 29 </li> 30 <li> 31 <span className="font-semibold">Done!</span> 🎉 You should now find yourself on the Dashboard for your server! ··· 52 <LinkTag href="/login?invite=true">Invite Wamellow</LinkTag> to your Server. If you do not own it, ask the server Administrators to add Wamellow. 53 </li> 54 <li> 55 - Go to the <LinkTag href="/login?invite=true">Dashboard on wamellow.com/dashboard</LinkTag>, find your server and click {'"'}manage{'"'}. 56 </li> 57 <li> 58 - Select a channel to be used in the {'"'}Text to Speech{'"'} section. 59 </li> 60 <li> 61 Join any voice channel in your Server (be sure Wamellow can join it too). ··· 86 <div> 87 <ol className="list-decimal list-inside marker:text-neutral-500 mb-4"> 88 <li> 89 - In the Discord App, click on your servers&apos; name and click {'"'}Settings{'"'} 90 </li> 91 <li> 92 - Then go to the tab {'"'}Integrations{'"'} in the {'"'}Apps{'"'} category. 93 </li> 94 <li> 95 - In the {'"'}Bots and Apps{'"'} list, find Wamellow and click on {'"'}Manage{'"'}. 96 </li> 97 <li> 98 You can choose to disable commands for everyone by their roles, or only in certain channels.
··· 22 Open Discord{"'"}s add-app flow at <LinkTag href="/login?invite=true">wamellow.com/invite</LinkTag>. 23 </li> 24 <li> 25 + Select a server and click on {"\""}Continue{"\""}. 26 </li> 27 <li> 28 + Do <span className="font-semibold">not uncheck</span> any permissions and click on {"\""}Authorize{"\""}. 29 </li> 30 <li> 31 <span className="font-semibold">Done!</span> 🎉 You should now find yourself on the Dashboard for your server! ··· 52 <LinkTag href="/login?invite=true">Invite Wamellow</LinkTag> to your Server. If you do not own it, ask the server Administrators to add Wamellow. 53 </li> 54 <li> 55 + Go to the <LinkTag href="/login?invite=true">Dashboard on wamellow.com/dashboard</LinkTag>, find your server and click {"\""}manage{"\""}. 56 </li> 57 <li> 58 + Select a channel to be used in the {"\""}Text to Speech{"\""} section. 59 </li> 60 <li> 61 Join any voice channel in your Server (be sure Wamellow can join it too). ··· 86 <div> 87 <ol className="list-decimal list-inside marker:text-neutral-500 mb-4"> 88 <li> 89 + In the Discord App, click on your servers&apos; name and click {"\""}Settings{"\""} 90 </li> 91 <li> 92 + Then go to the tab {"\""}Integrations{"\""} in the {"\""}Apps{"\""} category. 93 </li> 94 <li> 95 + In the {"\""}Bots and Apps{"\""} list, find Wamellow and click on {"\""}Manage{"\""}. 96 </li> 97 <li> 98 You can choose to disable commands for everyone by their roles, or only in certain channels.
+2 -2
app/(home)/layout.tsx
··· 2 3 export const revalidate = 43200; 4 5 - export default async function RootLayout({ 6 children 7 }: { 8 - children: React.ReactNode 9 }) { 10 return ( 11 <div className="w-full">
··· 2 3 export const revalidate = 43200; 4 5 + export default function RootLayout({ 6 children 7 }: { 8 + children: React.ReactNode; 9 }) { 10 return ( 11 <div className="w-full">
+2 -2
app/(home)/page.tsx
··· 26 import SpacePic from "@/public/space.webp"; 27 import WaifuPic from "@/public/waifu.webp"; 28 import WelcomePic from "@/public/welcome.webp"; 29 - import { ApiV1TopguildsGetResponse } from "@/typings"; 30 import { cn } from "@/utils/cn"; 31 import { toFixedArrayLength } from "@/utils/fixed-array-length"; 32 import { actor } from "@/utils/tts"; ··· 81 </ClientButton> 82 ); 83 84 - async function renderCount() { 85 "use server"; 86 return <span>trust us!</span>; 87 }
··· 26 import SpacePic from "@/public/space.webp"; 27 import WaifuPic from "@/public/waifu.webp"; 28 import WelcomePic from "@/public/welcome.webp"; 29 + import type { ApiV1TopguildsGetResponse } from "@/typings"; 30 import { cn } from "@/utils/cn"; 31 import { toFixedArrayLength } from "@/utils/fixed-array-length"; 32 import { actor } from "@/utils/tts"; ··· 81 </ClientButton> 82 ); 83 84 + function renderCount() { 85 "use server"; 86 return <span>trust us!</span>; 87 }
+2 -2
app/(home)/privacy/page.tsx
··· 1 import { readFile } from "fs/promises"; 2 - import { Metadata } from "next"; 3 4 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 5 import BeautifyMarkdown from "@/components/markdown"; ··· 7 8 export const revalidate = false; 9 10 - export const generateMetadata = async (): Promise<Metadata> => { 11 12 const title = "Privacy"; 13 const description = "We take your privacy seriously. Read about Wamellow's Privacy Policy to learn how.";
··· 1 import { readFile } from "fs/promises"; 2 + import type { Metadata } from "next"; 3 4 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 5 import BeautifyMarkdown from "@/components/markdown"; ··· 7 8 export const revalidate = false; 9 10 + export const generateMetadata = (): Metadata => { 11 12 const title = "Privacy"; 13 const description = "We take your privacy seriously. Read about Wamellow's Privacy Policy to learn how.";
+5 -5
app/(home)/pro/page.tsx
··· 1 import { Button, Chip } from "@nextui-org/react"; 2 - import { Metadata } from "next"; 3 import { Montserrat } from "next/font/google"; 4 import Link from "next/link"; 5 import { BsQuestionLg } from "react-icons/bs"; ··· 8 9 import Comment from "@/components/comment"; 10 import ImageGrid from "@/components/image-grid"; 11 - import { ApiV1TopguildsGetResponse } from "@/typings"; 12 import { cn } from "@/utils/cn"; 13 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 14 ··· 19 20 const fetchOptions = { headers: { Authorization: process.env.API_SECRET as string }, next: { revalidate: 60 * 60 } }; 21 22 - export const generateMetadata = async (): Promise<Metadata> => { 23 24 const title = "Professional experience"; 25 const description = "Get epic Pro+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features."; ··· 59 prefetch={false} 60 startContent={<HiUserAdd />} 61 > 62 - Get started 63 </Button> 64 <Button 65 as={Link} ··· 68 href="https://lunish.nl/kofi" 69 startContent={<HiLightningBolt />} 70 > 71 - Subscribe 72 </Button> 73 </>); 74
··· 1 import { Button, Chip } from "@nextui-org/react"; 2 + import type { Metadata } from "next"; 3 import { Montserrat } from "next/font/google"; 4 import Link from "next/link"; 5 import { BsQuestionLg } from "react-icons/bs"; ··· 8 9 import Comment from "@/components/comment"; 10 import ImageGrid from "@/components/image-grid"; 11 + import type { ApiV1TopguildsGetResponse } from "@/typings"; 12 import { cn } from "@/utils/cn"; 13 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 14 ··· 19 20 const fetchOptions = { headers: { Authorization: process.env.API_SECRET as string }, next: { revalidate: 60 * 60 } }; 21 22 + export const generateMetadata = (): Metadata => { 23 24 const title = "Professional experience"; 25 const description = "Get epic Pro+ ULTRA HD features for wamellow to upgrade your servers to a whole new experience and unlock tons of premium features."; ··· 59 prefetch={false} 60 startContent={<HiUserAdd />} 61 > 62 + Get started 63 </Button> 64 <Button 65 as={Link} ··· 68 href="https://lunish.nl/kofi" 69 startContent={<HiLightningBolt />} 70 > 71 + Subscribe 72 </Button> 73 </>); 74
+1 -1
app/(home)/status/api.ts
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 - import { ApiError } from "@/typings"; 3 4 export interface ApiCluster { 5 id: number;
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 + import type { ApiError } from "@/typings"; 3 4 export interface ApiCluster { 5 id: number;
+1 -1
app/(home)/status/cluster.component.tsx
··· 6 import { cn } from "@/utils/cn"; 7 import { intl } from "@/utils/numbers"; 8 9 - import { ApiCluster } from "./api"; 10 11 export function Cluster(cluster: ApiCluster) { 12 return (
··· 6 import { cn } from "@/utils/cn"; 7 import { intl } from "@/utils/numbers"; 8 9 + import type { ApiCluster } from "./api"; 10 11 export function Cluster(cluster: ApiCluster) { 12 return (
+4 -4
app/(home)/status/layout.tsx
··· 1 - import { Metadata } from "next"; 2 import { Montserrat } from "next/font/google"; 3 - import { ReactNode } from "react"; 4 5 import { Section } from "@/components/section"; 6 import { cn } from "@/utils/cn"; ··· 11 const montserrat = Montserrat({ subsets: ["latin"] }); 12 13 interface Props { 14 - children: ReactNode 15 } 16 17 - export const generateMetadata = async (): Promise<Metadata> => { 18 const title = "Status"; 19 const description = "Check the status of all clusters and voice chat nodes, double check if we screwed something up - again!"; 20 const url = getCanonicalUrl("status");
··· 1 + import type { Metadata } from "next"; 2 import { Montserrat } from "next/font/google"; 3 + import type { ReactNode } from "react"; 4 5 import { Section } from "@/components/section"; 6 import { cn } from "@/utils/cn"; ··· 11 const montserrat = Montserrat({ subsets: ["latin"] }); 12 13 interface Props { 14 + children: ReactNode; 15 } 16 17 + export const generateMetadata = (): Metadata => { 18 const title = "Status"; 19 const description = "Check the status of all clusters and voice chat nodes, double check if we screwed something up - again!"; 20 const url = getCanonicalUrl("status");
+4 -4
app/(home)/status/node.component.tsx
··· 1 import { Chip } from "@nextui-org/react"; 2 import Image from "next/image"; 3 - import { ReactNode } from "react"; 4 import { FaCrown } from "react-icons/fa"; 5 6 - import { ApiNode } from "./api"; 7 8 - export function Node({ index, node }: { index: number; node: ApiNode }) { 9 return ( 10 <div 11 className="p-4 bg-wamellow rounded-lg space-y-2 outline-violet-400 duration-200 h-fit" ··· 51 ); 52 } 53 54 - function Icon({ id }: { id: string }) { 55 return ( 56 <Image 57 alt={`${id} country flag`}
··· 1 import { Chip } from "@nextui-org/react"; 2 import Image from "next/image"; 3 + import type { ReactNode } from "react"; 4 import { FaCrown } from "react-icons/fa"; 5 6 + import type { ApiNode } from "./api"; 7 8 + export function Node({ index, node }: { index: number; node: ApiNode; }) { 9 return ( 10 <div 11 className="p-4 bg-wamellow rounded-lg space-y-2 outline-violet-400 duration-200 h-fit" ··· 51 ); 52 } 53 54 + function Icon({ id }: { id: string; }) { 55 return ( 56 <Image 57 alt={`${id} country flag`}
+2 -2
app/(home)/status/side.component.tsx
··· 2 3 import { Accordion, AccordionItem, Chip } from "@nextui-org/react"; 4 import { useCookies } from "next-client-cookies"; 5 - import { ReactNode, useEffect, useMemo, useState } from "react"; 6 7 import DumbTextInput from "@/components/inputs/dumb-text-input"; 8 import { intl } from "@/utils/numbers"; 9 10 - import { ApiV1StatusGetResponse } from "./api"; 11 12 export function Side({ 13 status
··· 2 3 import { Accordion, AccordionItem, Chip } from "@nextui-org/react"; 4 import { useCookies } from "next-client-cookies"; 5 + import { type ReactNode, useEffect, useMemo, useState } from "react"; 6 7 import DumbTextInput from "@/components/inputs/dumb-text-input"; 8 import { intl } from "@/utils/numbers"; 9 10 + import type { ApiV1StatusGetResponse } from "./api"; 11 12 export function Side({ 13 status
+3 -3
app/(home)/team/page.tsx
··· 1 - import { Metadata } from "next"; 2 import Image from "next/image"; 3 import { BsDiscord, BsGithub } from "react-icons/bs"; 4 ··· 13 14 export const revalidate = 3600; 15 16 - export const generateMetadata = async (): Promise<Metadata> => { 17 const title = "Team"; 18 const description = "Meet the creators of Wamellow and its products. Our dedicated team, including developers and donors, drives innovation and community growth."; 19 const url = getCanonicalUrl("team"); ··· 46 }; 47 }; 48 49 - export default async function Home() { 50 return ( 51 <div> 52 <h2 className="text-2xl font-medium text-neutral-200">Team 🍪</h2>
··· 1 + import type { Metadata } from "next"; 2 import Image from "next/image"; 3 import { BsDiscord, BsGithub } from "react-icons/bs"; 4 ··· 13 14 export const revalidate = 3600; 15 16 + export const generateMetadata = (): Metadata => { 17 const title = "Team"; 18 const description = "Meet the creators of Wamellow and its products. Our dedicated team, including developers and donors, drives innovation and community growth."; 19 const url = getCanonicalUrl("team"); ··· 46 }; 47 }; 48 49 + export default function Home() { 50 return ( 51 <div> 52 <h2 className="text-2xl font-medium text-neutral-200">Team 🍪</h2>
+1 -1
app/(home)/team/person.component.tsx
··· 1 import Image from "next/image"; 2 import Link from "next/link"; 3 - import { AnchorHTMLAttributes, DetailedHTMLProps, HTMLAttributes } from "react"; 4 import { HiExternalLink } from "react-icons/hi"; 5 6 import { getUser } from "@/lib/discord/user";
··· 1 import Image from "next/image"; 2 import Link from "next/link"; 3 + import type { AnchorHTMLAttributes, DetailedHTMLProps, HTMLAttributes } from "react"; 4 import { HiExternalLink } from "react-icons/hi"; 5 6 import { getUser } from "@/lib/discord/user";
+2 -2
app/(home)/terms/page.tsx
··· 1 import { readFile } from "fs/promises"; 2 - import { Metadata } from "next"; 3 4 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 5 import BeautifyMarkdown from "@/components/markdown"; ··· 7 8 export const revalidate = false; 9 10 - export const generateMetadata = async (): Promise<Metadata> => { 11 12 const title = "Terms of Service"; 13 const description = "Read about Wamellow's Terms of Service.";
··· 1 import { readFile } from "fs/promises"; 2 + import type { Metadata } from "next"; 3 4 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 5 import BeautifyMarkdown from "@/components/markdown"; ··· 7 8 export const revalidate = false; 9 10 + export const generateMetadata = (): Metadata => { 11 12 const title = "Terms of Service"; 13 const description = "Read about Wamellow's Terms of Service.";
+2 -2
app/[pathname]/page.tsx
··· 1 import { notFound, redirect } from "next/navigation"; 2 3 interface Props { 4 - params: Promise<{ pathname: string }> 5 } 6 7 const fetchOptions = { next: { revalidate: 60 * 60 } }; ··· 26 case "youtube": { 27 const res = await fetch("http://100.65.0.1:5001/?channel_id=UClWBeVcz5LUmcCN1gHG_GCg", fetchOptions) 28 .then((res) => res.json()) 29 - .catch(() => null) as { videoUrl: string } | null; 30 31 return redirect(res?.videoUrl || "https://www.youtube.com/channel/UClWBeVcz5LUmcCN1gHG_GCg"); 32 }
··· 1 import { notFound, redirect } from "next/navigation"; 2 3 interface Props { 4 + params: Promise<{ pathname: string; }>; 5 } 6 7 const fetchOptions = { next: { revalidate: 60 * 60 } }; ··· 26 case "youtube": { 27 const res = await fetch("http://100.65.0.1:5001/?channel_id=UClWBeVcz5LUmcCN1gHG_GCg", fetchOptions) 28 .then((res) => res.json()) 29 + .catch(() => null) as { videoUrl: string; } | null; 30 31 return redirect(res?.videoUrl || "https://www.youtube.com/channel/UClWBeVcz5LUmcCN1gHG_GCg"); 32 }
+1 -1
app/ai-gallery/(home)/filter.component.tsx
··· 14 searchParams: { 15 page: string; 16 model: string; 17 - nsfw: string 18 }; 19 } 20 ) {
··· 14 searchParams: { 15 page: string; 16 model: string; 17 + nsfw: string; 18 }; 19 } 20 ) {
+2 -2
app/ai-gallery/(home)/layout.tsx
··· 1 - import { Metadata } from "next"; 2 import { Montserrat } from "next/font/google"; 3 import Image from "next/image"; 4 import Link from "next/link"; ··· 20 21 export const revalidate = 3600; 22 23 - export const generateMetadata = async (): Promise<Metadata> => { 24 25 const title = "Free /image Ai for Discord"; 26 const description = "Summon the enchantment of AI generated images to your Discord server with our versatile /image command, featuring over 40+ distinct SD and 10+ SDXL models.";
··· 1 + import type { Metadata } from "next"; 2 import { Montserrat } from "next/font/google"; 3 import Image from "next/image"; 4 import Link from "next/link"; ··· 20 21 export const revalidate = 3600; 22 23 + export const generateMetadata = (): Metadata => { 24 25 const title = "Free /image Ai for Discord"; 26 const description = "Summon the enchantment of AI generated images to your Discord server with our versatile /image command, featuring over 40+ distinct SD and 10+ SDXL models.";
+1 -1
app/ai-gallery/(home)/page.tsx
··· 14 searchParams: Promise<{ 15 page: string; 16 model: string; 17 - nsfw: string 18 }>; 19 } 20
··· 14 searchParams: Promise<{ 15 page: string; 16 model: string; 17 + nsfw: string; 18 }>; 19 } 20
+1 -1
app/ai-gallery/(home)/pagination.component.tsx
··· 8 searchParams, 9 pages 10 }: { 11 - searchParams: { page: string, model: string }; 12 pages: number; 13 } 14 ) {
··· 8 searchParams, 9 pages 10 }: { 11 + searchParams: { page: string; model: string; }; 12 pages: number; 13 } 14 ) {
+2 -2
app/ai-gallery/[uploadId]/layout.tsx
··· 1 import { Button } from "@nextui-org/react"; 2 - import { Metadata } from "next"; 3 import NextImage from "next/image"; 4 import Link from "next/link"; 5 import { HiArrowLeft, HiHome, HiPlus } from "react-icons/hi"; ··· 18 import Side from "./side.component"; 19 20 export interface Props { 21 - params: Promise<{ uploadId: string }>; 22 children: React.ReactNode; 23 } 24
··· 1 import { Button } from "@nextui-org/react"; 2 + import type { Metadata } from "next"; 3 import NextImage from "next/image"; 4 import Link from "next/link"; 5 import { HiArrowLeft, HiHome, HiPlus } from "react-icons/hi"; ··· 18 import Side from "./side.component"; 19 20 export interface Props { 21 + params: Promise<{ uploadId: string; }>; 22 children: React.ReactNode; 23 } 24
+1 -2
app/ai-gallery/[uploadId]/page.tsx
··· 6 import { getUpload } from "../api"; 7 8 export interface Props { 9 - params: Promise<{ uploadId: string }>; 10 } 11 12 export const revalidate = 3600; ··· 49 </div> 50 </div> 51 </div> 52 - 53 54 55 <Link
··· 6 import { getUpload } from "../api"; 7 8 export interface Props { 9 + params: Promise<{ uploadId: string; }>; 10 } 11 12 export const revalidate = 3600; ··· 49 </div> 50 </div> 51 </div> 52 53 54 <Link
+3 -3
app/ai-gallery/[uploadId]/side.component.tsx
··· 10 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 11 import ImageReduceMotion from "@/components/image-reduce-motion"; 12 import { formatDate } from "@/components/time"; 13 - import { AnalyticsError, AnalyticsResponse } from "@/lib/analytics"; 14 - import { ApiError, ApiV1GuildsGetResponse, ApiV1UploadGetResponse } from "@/typings"; 15 import { truncate } from "@/utils/truncate"; 16 import { getCanonicalUrl } from "@/utils/urls"; 17 ··· 22 }: { 23 upload: ApiV1UploadGetResponse | ApiError; 24 guild: ApiV1GuildsGetResponse | ApiError | undefined; 25 - analytics: { results: AnalyticsResponse[] } | AnalyticsError | undefined; 26 }) { 27 const cookies = useCookies(); 28
··· 10 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 11 import ImageReduceMotion from "@/components/image-reduce-motion"; 12 import { formatDate } from "@/components/time"; 13 + import type { AnalyticsError, AnalyticsResponse } from "@/lib/analytics"; 14 + import type { ApiError, ApiV1GuildsGetResponse, ApiV1UploadGetResponse } from "@/typings"; 15 import { truncate } from "@/utils/truncate"; 16 import { getCanonicalUrl } from "@/utils/urls"; 17 ··· 22 }: { 23 upload: ApiV1UploadGetResponse | ApiError; 24 guild: ApiV1GuildsGetResponse | ApiError | undefined; 25 + analytics: { results: AnalyticsResponse[]; } | AnalyticsError | undefined; 26 }) { 27 const cookies = useCookies(); 28
+1 -1
app/ai-gallery/api.ts
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 - import { 3 ApiError, 4 ApiV1UploadGetResponse, 5 ApiV1UploadsGetResponse
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 + import type { 3 ApiError, 4 ApiV1UploadGetResponse, 5 ApiV1UploadsGetResponse
+3 -3
app/ai-gallery/generate/layout.tsx
··· 1 import { Button } from "@nextui-org/react"; 2 - import { Metadata } from "next"; 3 import Link from "next/link"; 4 import { HiArrowLeft } from "react-icons/hi"; 5 ··· 7 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 8 9 export interface Props { 10 - params: Promise<{ uploadId: string }>; 11 children: React.ReactNode; 12 } 13 ··· 44 }; 45 }; 46 47 - export default async function RootLayout({ 48 children 49 }: Props) { 50
··· 1 import { Button } from "@nextui-org/react"; 2 + import type { Metadata } from "next"; 3 import Link from "next/link"; 4 import { HiArrowLeft } from "react-icons/hi"; 5 ··· 7 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 8 9 export interface Props { 10 + params: Promise<{ uploadId: string; }>; 11 children: React.ReactNode; 12 } 13 ··· 44 }; 45 }; 46 47 + export default function RootLayout({ 48 children 49 }: Props) { 50
+2 -2
app/ai-gallery/generate/page.tsx
··· 38 39 useEffect(() => { 40 fetch(baseUrl) 41 - .then((res) => res.json() as Promise<{ gpu: string }>) 42 .then((res) => { 43 setError(null); 44 setGpu(res.gpu || null); ··· 60 }); 61 62 const res = await fetch(`${baseUrl}/generate/image/${model}?${reqparams.toString()}`) 63 - .then((res) => res.json()) as { url: string, duration: number }; 64 65 params = new URLSearchParams(); 66 params.delete("image_url");
··· 38 39 useEffect(() => { 40 fetch(baseUrl) 41 + .then((res) => res.json() as Promise<{ gpu: string; }>) 42 .then((res) => { 43 setError(null); 44 setGpu(res.gpu || null); ··· 60 }); 61 62 const res = await fetch(`${baseUrl}/generate/image/${model}?${reqparams.toString()}`) 63 + .then((res) => res.json()) as { url: string; duration: number; }; 64 65 params = new URLSearchParams(); 66 params.delete("image_url");
+1 -1
app/ai-gallery/generate/upload.component.tsx
··· 6 import { useEffect, useState } from "react"; 7 import { HiCloudUpload } from "react-icons/hi"; 8 9 - import { ApiV1UploadGetResponse } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 enum State {
··· 6 import { useEffect, useState } from "react"; 7 import { HiCloudUpload } from "react-icons/hi"; 8 9 + import type { ApiV1UploadGetResponse } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 enum State {
+1 -1
app/dashboard/[guildId]/custom-commands/create.component.tsx
··· 6 7 import DumbTextInput from "@/components/inputs/dumb-text-input"; 8 import Modal from "@/components/modal"; 9 - import { ApiV1GuildsModulesTagsGetResponse } from "@/typings"; 10 11 export enum Style { 12 Compact = 1,
··· 6 7 import DumbTextInput from "@/components/inputs/dumb-text-input"; 8 import Modal from "@/components/modal"; 9 + import type { ApiV1GuildsModulesTagsGetResponse } from "@/typings"; 10 11 export enum Style { 12 Compact = 1,
+1 -1
app/dashboard/[guildId]/custom-commands/delete.component.tsx
··· 48 if (id) removeTag(id); 49 }} 50 > 51 - Are you sure you want to delete the {'"'}{name}{'"'} tag? It will be gone forever, probably, who knows. 52 </Modal> 53 </> 54 );
··· 48 if (id) removeTag(id); 49 }} 50 > 51 + Are you sure you want to delete the {"\""}{name}{"\""} tag? It will be gone forever, probably, who knows. 52 </Modal> 53 </> 54 );
+1 -1
app/dashboard/[guildId]/custom-commands/page.tsx
··· 16 import { cacheOptions, getData } from "@/lib/api"; 17 import { Permissions } from "@/lib/discord/enum/permissions"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 - import { ApiV1GuildsModulesTagsGetResponse } from "@/typings"; 20 21 import CreateTag, { Style } from "./create.component"; 22 import DeleteTag from "./delete.component";
··· 16 import { cacheOptions, getData } from "@/lib/api"; 17 import { Permissions } from "@/lib/discord/enum/permissions"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 + import type { ApiV1GuildsModulesTagsGetResponse } from "@/typings"; 20 21 import CreateTag, { Style } from "./create.component"; 22 import DeleteTag from "./delete.component";
+1 -1
app/dashboard/[guildId]/dailyposts/create.component.tsx
··· 8 import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 9 import SelectMenu from "@/components/inputs/select-menu"; 10 import Modal from "@/components/modal"; 11 - import { ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 import { generateHourArray, typeToName } from "./util";
··· 8 import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 9 import SelectMenu from "@/components/inputs/select-menu"; 10 import Modal from "@/components/modal"; 11 + import { type ApiV1GuildsModulesDailypostsGetResponse, DailypostType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 import { generateHourArray, typeToName } from "./util";
+1 -1
app/dashboard/[guildId]/dailyposts/delete.component.tsx
··· 58 if (id) remove(id); 59 }} 60 > 61 - Are you sure you want to delete the {'"'}{name}{'"'} dailypost? It will be gone forever, probably, who knows. 62 </Modal> 63 </>); 64 }
··· 58 if (id) remove(id); 59 }} 60 > 61 + Are you sure you want to delete the {"\""}{name}{"\""} dailypost? It will be gone forever, probably, who knows. 62 </Modal> 63 </>); 64 }
+1 -1
app/dashboard/[guildId]/dailyposts/page.tsx
··· 14 import SelectMenu from "@/components/inputs/select-menu"; 15 import { ScreenMessage } from "@/components/screen-message"; 16 import SadWumpusPic from "@/public/sad-wumpus.gif"; 17 - import { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings"; 18 import { createSelectableItems } from "@/utils/create-selectable-items"; 19 20 import CreateNotification, { Style } from "./create.component";
··· 14 import SelectMenu from "@/components/inputs/select-menu"; 15 import { ScreenMessage } from "@/components/screen-message"; 16 import SadWumpusPic from "@/public/sad-wumpus.gif"; 17 + import type { ApiV1GuildsModulesDailypostsGetResponse } from "@/typings"; 18 import { createSelectableItems } from "@/utils/create-selectable-items"; 19 20 import CreateNotification, { Style } from "./create.component";
+1 -1
app/dashboard/[guildId]/greeting/farewell/page.tsx
··· 15 import SelectMenu from "@/components/inputs/select-menu"; 16 import Switch from "@/components/inputs/switch"; 17 import Notice from "@/components/notice"; 18 - import { ApiError,ApiV1GuildsModulesByeGetResponse } from "@/typings"; 19 import { createSelectableItems } from "@/utils/create-selectable-items"; 20 21 export default function Home() {
··· 15 import SelectMenu from "@/components/inputs/select-menu"; 16 import Switch from "@/components/inputs/switch"; 17 import Notice from "@/components/notice"; 18 + import type { ApiError, ApiV1GuildsModulesByeGetResponse } from "@/typings"; 19 import { createSelectableItems } from "@/utils/create-selectable-items"; 20 21 export default function Home() {
+3 -3
app/dashboard/[guildId]/greeting/passport/complete-setup.tsx
··· 1 import React, { useEffect, useState } from "react"; 2 3 - import { Guild } from "@/common/guilds"; 4 import SelectMenu from "@/components/inputs/select-menu"; 5 import Modal from "@/components/modal"; 6 - import { ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 7 import { createSelectableItems } from "@/utils/create-selectable-items"; 8 9 enum ModalType { 10 None = 0, 11 VerifiedRole = 1, 12 - PunishmentRole = 2, 13 } 14 15 interface Props {
··· 1 import React, { useEffect, useState } from "react"; 2 3 + import type { Guild } from "@/common/guilds"; 4 import SelectMenu from "@/components/inputs/select-menu"; 5 import Modal from "@/components/modal"; 6 + import type { ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 7 import { createSelectableItems } from "@/utils/create-selectable-items"; 8 9 enum ModalType { 10 None = 0, 11 VerifiedRole = 1, 12 + PunishmentRole = 2 13 } 14 15 interface Props {
+1 -2
app/dashboard/[guildId]/greeting/passport/page.tsx
··· 1 - 2 "use client"; 3 import { Button } from "@nextui-org/react"; 4 import Link from "next/link"; ··· 12 import Switch from "@/components/inputs/switch"; 13 import Notice from "@/components/notice"; 14 import { OverviewLink } from "@/components/overview-link"; 15 - import { ApiError,ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 16 import { createSelectableItems } from "@/utils/create-selectable-items"; 17 import { getCanonicalUrl } from "@/utils/urls"; 18
··· 1 "use client"; 2 import { Button } from "@nextui-org/react"; 3 import Link from "next/link"; ··· 11 import Switch from "@/components/inputs/switch"; 12 import Notice from "@/components/notice"; 13 import { OverviewLink } from "@/components/overview-link"; 14 + import type { ApiError, ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 15 import { createSelectableItems } from "@/utils/create-selectable-items"; 16 import { getCanonicalUrl } from "@/utils/urls"; 17
+1 -1
app/dashboard/[guildId]/greeting/welcome/page.tsx
··· 17 import Switch from "@/components/inputs/switch"; 18 import Notice from "@/components/notice"; 19 import { Section } from "@/components/section"; 20 - import { ApiError,ApiV1GuildsModulesWelcomeGetResponse } from "@/typings"; 21 import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items"; 22 23 export default function Home() {
··· 17 import Switch from "@/components/inputs/switch"; 18 import Notice from "@/components/notice"; 19 import { Section } from "@/components/section"; 20 + import type { ApiError, ApiV1GuildsModulesWelcomeGetResponse } from "@/typings"; 21 import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items"; 22 23 export default function Home() {
+2 -2
app/dashboard/[guildId]/layout.tsx
··· 18 import { ScreenMessage, SupportButton } from "@/components/screen-message"; 19 import { cacheOptions, getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 - import { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings"; 22 import { intl } from "@/utils/numbers"; 23 import { getCanonicalUrl } from "@/utils/urls"; 24 ··· 43 export default function RootLayout({ 44 children 45 }: { 46 - children: React.ReactNode 47 }) { 48 const cookies = useCookies(); 49 const params = useParams();
··· 18 import { ScreenMessage, SupportButton } from "@/components/screen-message"; 19 import { cacheOptions, getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 + import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings"; 22 import { intl } from "@/utils/numbers"; 23 import { getCanonicalUrl } from "@/utils/urls"; 24 ··· 43 export default function RootLayout({ 44 children 45 }: { 46 + children: React.ReactNode; 47 }) { 48 const cookies = useCookies(); 49 const params = useParams();
+2 -2
app/dashboard/[guildId]/leaderboards/page.tsx
··· 5 import { HiChartBar, HiViewGridAdd } from "react-icons/hi"; 6 import { useQuery } from "react-query"; 7 8 - import { Guild, guildStore } from "@/common/guilds"; 9 import ImageUrlInput from "@/components/inputs/image-url-input"; 10 import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 11 import { ScreenMessage } from "@/components/screen-message"; 12 import { Section, SubSection } from "@/components/section"; 13 import { cacheOptions, getData } from "@/lib/api"; 14 import SadWumpusPic from "@/public/sad-wumpus.gif"; 15 - import { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings"; 16 import { createSelectableItems } from "@/utils/create-selectable-items"; 17 18 import { OverviewLink } from "../../../../components/overview-link";
··· 5 import { HiChartBar, HiViewGridAdd } from "react-icons/hi"; 6 import { useQuery } from "react-query"; 7 8 + import { type Guild, guildStore } from "@/common/guilds"; 9 import ImageUrlInput from "@/components/inputs/image-url-input"; 10 import MultiSelectMenu from "@/components/inputs/multi-select-menu"; 11 import { ScreenMessage } from "@/components/screen-message"; 12 import { Section, SubSection } from "@/components/section"; 13 import { cacheOptions, getData } from "@/lib/api"; 14 import SadWumpusPic from "@/public/sad-wumpus.gif"; 15 + import type { ApiV1GuildsModulesLeaderboardGetResponse } from "@/typings"; 16 import { createSelectableItems } from "@/utils/create-selectable-items"; 17 18 import { OverviewLink } from "../../../../components/overview-link";
+3 -3
app/dashboard/[guildId]/leaderboards/permissions.component.tsx
··· 3 import { useMemo } from "react"; 4 import { HiExclamation } from "react-icons/hi"; 5 6 - import { Guild } from "@/common/guilds"; 7 import DiscordChannel from "@/components/discord/channel"; 8 - import { ApiV1GuildsChannelsGetResponse } from "@/typings"; 9 import { cn } from "@/utils/cn"; 10 11 interface Props { ··· 46 }) { 47 return (<> 48 <p className="text-sm opacity-75 mb-3"> 49 - Wammellow cannot track acivity in {channels.length} channels as it is missing permissions. 50 </p> 51 52 <div className="flex flex-col gap-1">
··· 3 import { useMemo } from "react"; 4 import { HiExclamation } from "react-icons/hi"; 5 6 + import type { Guild } from "@/common/guilds"; 7 import DiscordChannel from "@/components/discord/channel"; 8 + import type { ApiV1GuildsChannelsGetResponse } from "@/typings"; 9 import { cn } from "@/utils/cn"; 10 11 interface Props { ··· 46 }) { 47 return (<> 48 <p className="text-sm opacity-75 mb-3"> 49 + Wammellow cannot track acivity in {channels.length} channels as it is missing permissions. 50 </p> 51 52 <div className="flex flex-col gap-1">
+2 -2
app/dashboard/[guildId]/leaderboards/reset.component.tsx
··· 2 import { useState } from "react"; 3 import { HiTrash, HiUsers } from "react-icons/hi"; 4 5 - import { Guild } from "@/common/guilds"; 6 import ImageReduceMotion from "@/components/image-reduce-motion"; 7 import Modal from "@/components/modal"; 8 import Notice, { NoticeType } from "@/components/notice"; ··· 13 } 14 15 enum ModalType { 16 - Delete = 1, 17 } 18 19 export default function ResetLeaderboard({ guild }: Props) {
··· 2 import { useState } from "react"; 3 import { HiTrash, HiUsers } from "react-icons/hi"; 4 5 + import type { Guild } from "@/common/guilds"; 6 import ImageReduceMotion from "@/components/image-reduce-motion"; 7 import Modal from "@/components/modal"; 8 import Notice, { NoticeType } from "@/components/notice"; ··· 13 } 14 15 enum ModalType { 16 + Delete = 1 17 } 18 19 export default function ResetLeaderboard({ guild }: Props) {
+2 -2
app/dashboard/[guildId]/leaderboards/updating.component.tsx
··· 6 import { useState } from "react"; 7 import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi"; 8 9 - import { Guild } from "@/common/guilds"; 10 import SelectInput from "@/components/inputs/select-menu"; 11 import Switch from "@/components/inputs/switch"; 12 import TextInput from "@/components/inputs/text-input"; 13 import Modal from "@/components/modal"; 14 - import { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings"; 15 import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items"; 16 17 interface Props {
··· 6 import { useState } from "react"; 7 import { HiExternalLink, HiPencil, HiTrash } from "react-icons/hi"; 8 9 + import type { Guild } from "@/common/guilds"; 10 import SelectInput from "@/components/inputs/select-menu"; 11 import Switch from "@/components/inputs/switch"; 12 import TextInput from "@/components/inputs/text-input"; 13 import Modal from "@/components/modal"; 14 + import type { ApiV1GuildsModulesLeaderboardUpdatingPostResponse } from "@/typings"; 15 import { createSelectableEmojiItems, createSelectableItems } from "@/utils/create-selectable-items"; 16 17 interface Props {
+1 -3
app/dashboard/[guildId]/leaderboards/widget-button.component.tsx
··· 1 - 2 import { Button } from "@nextui-org/react"; 3 import React, { useState } from "react"; 4 import { HiEmojiHappy, HiLockClosed } from "react-icons/hi"; ··· 39 if (res.status === 429) { 40 setState(State.Ratelimited); 41 setTimeout(() => setState(State.Idle), 6 * 1000); 42 - } 43 - else setState(State.Idle); 44 45 if (res.ok) { 46 setEnabled(!isEnabled);
··· 1 import { Button } from "@nextui-org/react"; 2 import React, { useState } from "react"; 3 import { HiEmojiHappy, HiLockClosed } from "react-icons/hi"; ··· 38 if (res.status === 429) { 39 setState(State.Ratelimited); 40 setTimeout(() => setState(State.Idle), 6 * 1000); 41 + } else setState(State.Idle); 42 43 if (res.ok) { 44 setEnabled(!isEnabled);
+2 -3
app/dashboard/[guildId]/leaderboards/widget.component.tsx
··· 1 - 2 import { Skeleton } from "@nextui-org/react"; 3 - import { RESTError, RESTGetAPIGuildWidgetJSONResult } from "discord-api-types/v10"; 4 import { useState } from "react"; 5 import { HiEmojiHappy, HiLockClosed } from "react-icons/hi"; 6 import { useQuery } from "react-query"; 7 8 - import { Guild } from "@/common/guilds"; 9 import Notice from "@/components/notice"; 10 import { cacheOptions } from "@/lib/api"; 11 import { cn } from "@/utils/cn";
··· 1 import { Skeleton } from "@nextui-org/react"; 2 + import type { RESTError, RESTGetAPIGuildWidgetJSONResult } from "discord-api-types/v10"; 3 import { useState } from "react"; 4 import { HiEmojiHappy, HiLockClosed } from "react-icons/hi"; 5 import { useQuery } from "react-query"; 6 7 + import type { Guild } from "@/common/guilds"; 8 import Notice from "@/components/notice"; 9 import { cacheOptions } from "@/lib/api"; 10 import { cn } from "@/utils/cn";
+1 -1
app/dashboard/[guildId]/notifications/create-twitch.component.tsx
··· 8 import SelectMenu from "@/components/inputs/select-menu"; 9 import Modal from "@/components/modal"; 10 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; 11 - import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([a-zA-Z0-9_-]{1,32})$/;
··· 8 import SelectMenu from "@/components/inputs/select-menu"; 9 import Modal from "@/components/modal"; 10 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; 11 + import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?twitch\.tv\/([a-zA-Z0-9_-]{1,32})$/;
+1 -1
app/dashboard/[guildId]/notifications/create-youtube.component.tsx
··· 8 import SelectMenu from "@/components/inputs/select-menu"; 9 import Modal from "@/components/modal"; 10 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; 11 - import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([a-zA-Z0-9_-]{16,32})$/;
··· 8 import SelectMenu from "@/components/inputs/select-menu"; 9 import Modal from "@/components/modal"; 10 import TutorialPic from "@/public/docs-assets/notifications-channel-urls.webp"; 11 + import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 12 import { createSelectableItems } from "@/utils/create-selectable-items"; 13 14 const URL_CHANNEL_REGEX = /^https?:\/\/((www|m)\.)?youtube\.com\/channel\/UC([a-zA-Z0-9_-]{16,32})$/;
+1 -1
app/dashboard/[guildId]/notifications/delete.component.tsx
··· 58 if (id) remove(id); 59 }} 60 > 61 - Are you sure you want to delete the {'"'}{name}{'"'} channel from posting notifications? It will be gone forever, probably, who knows. 62 </Modal> 63 </>); 64 }
··· 58 if (id) remove(id); 59 }} 60 > 61 + Are you sure you want to delete the {"\""}{name}{"\""} channel from posting notifications? It will be gone forever, probably, who knows. 62 </Modal> 63 </>); 64 }
+2 -2
app/dashboard/[guildId]/notifications/page.tsx
··· 16 import SelectMenu from "@/components/inputs/select-menu"; 17 import { ScreenMessage } from "@/components/screen-message"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 - import { ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 20 import { cn } from "@/utils/cn"; 21 import { createSelectableItems } from "@/utils/create-selectable-items"; 22 ··· 199 className 200 }: { 201 type: NotificationType; 202 - className?: string; 203 }) { 204 switch (type) { 205 case NotificationType.YouTube: return <BsYoutube className={cn("text-red-500", className)} />;
··· 16 import SelectMenu from "@/components/inputs/select-menu"; 17 import { ScreenMessage } from "@/components/screen-message"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 + import { type ApiV1GuildsModulesNotificationsGetResponse, NotificationType } from "@/typings"; 20 import { cn } from "@/utils/cn"; 21 import { createSelectableItems } from "@/utils/create-selectable-items"; 22 ··· 199 className 200 }: { 201 type: NotificationType; 202 + className?: string; 203 }) { 204 switch (type) { 205 case NotificationType.YouTube: return <BsYoutube className={cn("text-red-500", className)} />;
+5 -4
app/dashboard/[guildId]/notifications/select.component.tsx
··· 6 import { Button } from "@/components/ui/button"; 7 import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, DrawerTrigger } from "@/components/ui/drawer"; 8 import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; 9 - import { ApiV1GuildsModulesNotificationsGetResponse } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 import { TwitchNotificationModal } from "./create-twitch.component"; ··· 69 Create new Notification 70 </Button> 71 } 72 - children={(platform) => ( 73 <Button 74 className="w-full" 75 onClick={() => setPlatform(Platform[platform.name])} ··· 78 {platform.name} 79 </Button> 80 )} 81 - style={style} 82 - /> 83 84 <YoutubeNotificationModal add={add} set={set} isOpen={platform === Platform.YouTube} onClose={() => setPlatform(null)} /> 85 <TwitchNotificationModal add={add} set={set} isOpen={platform === Platform.Twitch} onClose={() => setPlatform(null)} />
··· 6 import { Button } from "@/components/ui/button"; 7 import { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, DrawerTrigger } from "@/components/ui/drawer"; 8 import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; 9 + import type { ApiV1GuildsModulesNotificationsGetResponse } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 import { TwitchNotificationModal } from "./create-twitch.component"; ··· 69 Create new Notification 70 </Button> 71 } 72 + style={style} 73 + > 74 + {(platform) => ( 75 <Button 76 className="w-full" 77 onClick={() => setPlatform(Platform[platform.name])} ··· 80 {platform.name} 81 </Button> 82 )} 83 + </Wrapper> 84 85 <YoutubeNotificationModal add={add} set={set} isOpen={platform === Platform.YouTube} onClose={() => setPlatform(null)} /> 86 <TwitchNotificationModal add={add} set={set} isOpen={platform === Platform.Twitch} onClose={() => setPlatform(null)} />
+1 -2
app/dashboard/[guildId]/nsfw-image-scanning/page.tsx
··· 16 import { ScreenMessage } from "@/components/screen-message"; 17 import { cacheOptions, getData } from "@/lib/api"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 - import { ApiError,ApiV1GuildsModulesNsfwModerationGetResponse } from "@/typings"; 20 import { createSelectableItems } from "@/utils/create-selectable-items"; 21 22 export default function Home() { ··· 119 /> 120 </div> 121 </div> 122 - 123 124 125 <div className="lg:flex gap-3">
··· 16 import { ScreenMessage } from "@/components/screen-message"; 17 import { cacheOptions, getData } from "@/lib/api"; 18 import SadWumpusPic from "@/public/sad-wumpus.gif"; 19 + import type { ApiError, ApiV1GuildsModulesNsfwModerationGetResponse } from "@/typings"; 20 import { createSelectableItems } from "@/utils/create-selectable-items"; 21 22 export default function Home() { ··· 119 /> 120 </div> 121 </div> 122 123 124 <div className="lg:flex gap-3">
+2 -2
app/dashboard/[guildId]/starboard/page.tsx
··· 18 import { ScreenMessage } from "@/components/screen-message"; 19 import { getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 - import { ApiError,ApiV1GuildsModulesStarboardGetResponse } from "@/typings"; 22 import { createSelectableItems } from "@/utils/create-selectable-items"; 23 24 export default function Home() { ··· 344 </>); 345 } 346 347 - function Emoji({ emoji }: { emoji: string }) { 348 if (!/\d{15,20}/.test(emoji)) { 349 return emoji; 350 }
··· 18 import { ScreenMessage } from "@/components/screen-message"; 19 import { getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 + import type { ApiError, ApiV1GuildsModulesStarboardGetResponse } from "@/typings"; 22 import { createSelectableItems } from "@/utils/create-selectable-items"; 23 24 export default function Home() { ··· 344 </>); 345 } 346 347 + function Emoji({ emoji }: { emoji: string; }) { 348 if (!/\d{15,20}/.test(emoji)) { 349 return emoji; 350 }
+3 -3
app/docs/[...pathname]/layout.tsx
··· 1 - import { Metadata } from "next"; 2 import Link from "next/link"; 3 import { BsDiscord, BsGithub } from "react-icons/bs"; 4 import { HiUserAdd, HiViewGridAdd } from "react-icons/hi"; ··· 10 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 11 12 interface Props { 13 - params: Promise<{ pathname: string[] }>; 14 children: React.ReactNode; 15 } 16 ··· 137 function NavButton({ 138 page 139 }: { 140 - page: typeof metadata.pages[0] 141 }) { 142 const file = page.file.replace(/\.md$/, ""); 143 const icon = page.name.split(" ").shift() || "";
··· 1 + import type { Metadata } from "next"; 2 import Link from "next/link"; 3 import { BsDiscord, BsGithub } from "react-icons/bs"; 4 import { HiUserAdd, HiViewGridAdd } from "react-icons/hi"; ··· 10 import { getBaseUrl, getCanonicalUrl } from "@/utils/urls"; 11 12 interface Props { 13 + params: Promise<{ pathname: string[]; }>; 14 children: React.ReactNode; 15 } 16 ··· 137 function NavButton({ 138 page 139 }: { 140 + page: typeof metadata.pages[0]; 141 }) { 142 const file = page.file.replace(/\.md$/, ""); 143 const icon = page.name.split(" ").shift() || "";
+1 -1
app/docs/[...pathname]/page.tsx
··· 10 import SadWumpusPic from "@/public/sad-wumpus.gif"; 11 12 interface Props { 13 - params: Promise<{ pathname: string[] }>; 14 } 15 16 const PATH = `${process.cwd()}/public/docs` as const;
··· 10 import SadWumpusPic from "@/public/sad-wumpus.gif"; 11 12 interface Props { 13 + params: Promise<{ pathname: string[]; }>; 14 } 15 16 const PATH = `${process.cwd()}/public/docs` as const;
+62 -6
app/layout.tsx
··· 1 import "./globals.css"; 2 3 import { Divider } from "@nextui-org/react"; 4 - import { Metadata, Viewport } from "next"; 5 import { Montserrat, Outfit } from "next/font/google"; 6 import { cookies } from "next/headers"; 7 import Image from "next/image"; ··· 27 initialScale: 0.85 28 }; 29 30 - export const generateMetadata = async (): Promise<Metadata> => { 31 32 const title = "Wamellow: Next-gen of Discord Bots & Apps"; 33 const description = "Engage with leaderboards, starboards, and welcoming atmosphere. Dive into anime discussions, enjoy free /image AI and unleash the power of Text-To-Speech."; ··· 50 51 description, 52 keywords: [ 53 - "discord", "bot", "app", "intefration", "discord bot", "discord app", "discord application", "app list", "waya", "waya bot", "waya.one", "mwya", "mellow", "wamellow", "mwlica", "lunish", "Luna-devv", "mee6 alternative", 54 - "arcane alternative", "dyno alternative", "starboard", "ranks", "leaderboard", "lb", "leaderboards", "text to speech", "captcha", "passport", "verification", "verify", 55 - "captcha.bot", "security", "tts", "text to speech", "free", "customizable", "next-gen", "next generation", "ai", "ai images", "nsfw detection", "moderation", "anime", 56 - "nekos", "waifus", "chat to speech", "accessibility", "aphonia", "dysphonia", "mute", "liapew", "wumpus", "wumpus store", "wumpus bots", "youtube notifications", "youtube notifis", "youtube to discord" 57 ], 58 59 alternates: {
··· 1 import "./globals.css"; 2 3 import { Divider } from "@nextui-org/react"; 4 + import type { Metadata, Viewport } from "next"; 5 import { Montserrat, Outfit } from "next/font/google"; 6 import { cookies } from "next/headers"; 7 import Image from "next/image"; ··· 27 initialScale: 0.85 28 }; 29 30 + export const generateMetadata = (): Metadata => { 31 32 const title = "Wamellow: Next-gen of Discord Bots & Apps"; 33 const description = "Engage with leaderboards, starboards, and welcoming atmosphere. Dive into anime discussions, enjoy free /image AI and unleash the power of Text-To-Speech."; ··· 50 51 description, 52 keywords: [ 53 + "discord", 54 + "bot", 55 + "app", 56 + "intefration", 57 + "discord bot", 58 + "discord app", 59 + "discord application", 60 + "app list", 61 + "waya", 62 + "waya bot", 63 + "waya.one", 64 + "mwya", 65 + "mellow", 66 + "wamellow", 67 + "mwlica", 68 + "lunish", 69 + "Luna-devv", 70 + "mee6 alternative", 71 + "arcane alternative", 72 + "dyno alternative", 73 + "starboard", 74 + "ranks", 75 + "leaderboard", 76 + "lb", 77 + "leaderboards", 78 + "text to speech", 79 + "captcha", 80 + "passport", 81 + "verification", 82 + "verify", 83 + "captcha.bot", 84 + "security", 85 + "tts", 86 + "text to speech", 87 + "free", 88 + "customizable", 89 + "next-gen", 90 + "next generation", 91 + "ai", 92 + "ai images", 93 + "nsfw detection", 94 + "moderation", 95 + "anime", 96 + "nekos", 97 + "waifus", 98 + "chat to speech", 99 + "accessibility", 100 + "aphonia", 101 + "dysphonia", 102 + "mute", 103 + "liapew", 104 + "wumpus", 105 + "wumpus store", 106 + "wumpus bots", 107 + "youtube notifications", 108 + "youtube notifis", 109 + "youtube to discord", 110 + "twitch notifications", 111 + "twitch notifis", 112 + "twitch to discord" 113 ], 114 115 alternates: {
+3 -4
app/leaderboard/[guildId]/api.ts
··· 1 - import { ApiRequestOptions, defaultFetchOptions } from "@/lib/api"; 2 - import { 3 - ApiError, 4 ApiV1GuildsModulesLeaderboardGetResponse, 5 ApiV1GuildsTopmembersGetResponse, 6 ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; ··· 14 return res.json(); 15 } 16 17 - export async function getTopMembers(guildId: string, params: { page: number, type: string }, options?: ApiRequestOptions): Promise<ApiV1GuildsTopmembersGetResponse[] | ApiError | undefined> { 18 if (params.type !== "messages" && params.type !== "voiceminutes" && params.type !== "invites") return []; 19 20 const res = await fetch(
··· 1 + import { type ApiRequestOptions, defaultFetchOptions } from "@/lib/api"; 2 + import type { ApiError, 3 ApiV1GuildsModulesLeaderboardGetResponse, 4 ApiV1GuildsTopmembersGetResponse, 5 ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; ··· 13 return res.json(); 14 } 15 16 + export async function getTopMembers(guildId: string, params: { page: number; type: string; }, options?: ApiRequestOptions): Promise<ApiV1GuildsTopmembersGetResponse[] | ApiError | undefined> { 17 if (params.type !== "messages" && params.type !== "voiceminutes" && params.type !== "invites") return []; 18 19 const res = await fetch(
+3 -3
app/leaderboard/[guildId]/icon.component.tsx
··· 1 - import { SVGProps } from "react"; 2 3 import InvitesIcon from "@/components/icons/invites"; 4 import MessagesIcon from "@/components/icons/messages"; ··· 6 import { cn } from "@/utils/cn"; 7 8 type Props = SVGProps<SVGSVGElement> & { 9 - type: "messages" | "voiceminutes" | "invites" 10 - } 11 12 export default function Icon({ 13 type,
··· 1 + import type { SVGProps } from "react"; 2 3 import InvitesIcon from "@/components/icons/invites"; 4 import MessagesIcon from "@/components/icons/messages"; ··· 6 import { cn } from "@/utils/cn"; 7 8 type Props = SVGProps<SVGSVGElement> & { 9 + type: "messages" | "voiceminutes" | "invites"; 10 + }; 11 12 export default function Icon({ 13 type,
+2 -2
app/leaderboard/[guildId]/layout.tsx
··· 1 - import { Metadata } from "next"; 2 import Image from "next/image"; 3 import { HiAnnotation, HiLink, HiUsers, HiVolumeUp } from "react-icons/hi"; 4 ··· 15 import Side from "./side.component"; 16 17 export interface Props { 18 - params: Promise<{ guildId: string }>; 19 children: React.ReactNode; 20 } 21
··· 1 + import type { Metadata } from "next"; 2 import Image from "next/image"; 3 import { HiAnnotation, HiLink, HiUsers, HiVolumeUp } from "react-icons/hi"; 4 ··· 15 import Side from "./side.component"; 16 17 export interface Props { 18 + params: Promise<{ guildId: string; }>; 19 children: React.ReactNode; 20 } 21
+7 -7
app/leaderboard/[guildId]/member.component.tsx
··· 6 import { ClientBadge, ClientChip, ClientCircularProgress } from "@/components/client"; 7 import DiscordAppBadge from "@/components/discord/app-badge"; 8 import ImageReduceMotion from "@/components/image-reduce-motion"; 9 - import { ApiV1GuildsTopmembersGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; 10 import getAverageColor from "@/utils/average-color"; 11 import { cn } from "@/utils/cn"; 12 import { intl } from "@/utils/numbers"; ··· 21 members, 22 pagination 23 }: { 24 - index: number, 25 - type: "messages" | "voiceminutes" | "invites", 26 - member: ApiV1GuildsTopmembersGetResponse, 27 - members: ApiV1GuildsTopmembersGetResponse[], 28 - pagination: ApiV1GuildsTopmembersPaginationGetResponse, 29 } 30 ) { 31 const emojiUrl = `https://r2.wamellow.com/emoji/${member.emoji}`; ··· 162 function UserBadge({ 163 children 164 }: { 165 - children: React.ReactNode 166 }) { 167 return ( 168 <ClientChip
··· 6 import { ClientBadge, ClientChip, ClientCircularProgress } from "@/components/client"; 7 import DiscordAppBadge from "@/components/discord/app-badge"; 8 import ImageReduceMotion from "@/components/image-reduce-motion"; 9 + import type { ApiV1GuildsTopmembersGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; 10 import getAverageColor from "@/utils/average-color"; 11 import { cn } from "@/utils/cn"; 12 import { intl } from "@/utils/numbers"; ··· 21 members, 22 pagination 23 }: { 24 + index: number; 25 + type: "messages" | "voiceminutes" | "invites"; 26 + member: ApiV1GuildsTopmembersGetResponse; 27 + members: ApiV1GuildsTopmembersGetResponse[]; 28 + pagination: ApiV1GuildsTopmembersPaginationGetResponse; 29 } 30 ) { 31 const emojiUrl = `https://r2.wamellow.com/emoji/${member.emoji}`; ··· 162 function UserBadge({ 163 children 164 }: { 165 + children: React.ReactNode; 166 }) { 167 return ( 168 <ClientChip
+2 -2
app/leaderboard/[guildId]/open-graph.png/route.tsx
··· 3 4 import { readFile } from "fs/promises"; 5 import { ImageResponse } from "next/og"; 6 - import { NextRequest } from "next/server"; 7 8 import { getGuild } from "@/lib/api"; 9 import { intl } from "@/utils/numbers"; ··· 12 13 import { getTopMembers } from "../api"; 14 import Icon from "../icon.component"; 15 - import { Props } from "../layout"; 16 17 export const revalidate = 3600; // 1 hour 18
··· 3 4 import { readFile } from "fs/promises"; 5 import { ImageResponse } from "next/og"; 6 + import type { NextRequest } from "next/server"; 7 8 import { getGuild } from "@/lib/api"; 9 import { intl } from "@/utils/numbers"; ··· 12 13 import { getTopMembers } from "../api"; 14 import Icon from "../icon.component"; 15 + import type { Props } from "../layout"; 16 17 export const revalidate = 3600; // 1 hour 18
+1 -1
app/leaderboard/[guildId]/page.tsx
··· 13 export const revalidate = 3600; 14 15 interface Props { 16 - params: Promise<{ guildId: string }>; 17 searchParams: Promise<{ 18 page: string; 19 type: "messages" | "voiceminutes" | "invites";
··· 13 export const revalidate = 3600; 14 15 interface Props { 16 + params: Promise<{ guildId: string; }>; 17 searchParams: Promise<{ 18 page: string; 19 type: "messages" | "voiceminutes" | "invites";
+1 -1
app/leaderboard/[guildId]/side.component.tsx
··· 13 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 14 import Modal from "@/components/modal"; 15 import Notice, { NoticeType } from "@/components/notice"; 16 - import { ApiError, ApiV1GuildsGetResponse, ApiV1GuildsModulesLeaderboardGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; 17 import { intl } from "@/utils/numbers"; 18 import { getCanonicalUrl } from "@/utils/urls"; 19
··· 13 import { CopyToClipboardButton } from "@/components/copy-to-clipboard"; 14 import Modal from "@/components/modal"; 15 import Notice, { NoticeType } from "@/components/notice"; 16 + import type { ApiError, ApiV1GuildsGetResponse, ApiV1GuildsModulesLeaderboardGetResponse, ApiV1GuildsTopmembersPaginationGetResponse } from "@/typings"; 17 import { intl } from "@/utils/numbers"; 18 import { getCanonicalUrl } from "@/utils/urls"; 19
+2 -2
app/login/api.ts
··· 1 - import { User } from "@/common/user"; 2 - import { ApiError } from "@/typings"; 3 4 interface UserSessionCreate extends User { 5 session: string;
··· 1 + import type { User } from "@/common/user"; 2 + import type { ApiError } from "@/typings"; 3 4 interface UserSessionCreate extends User { 5 session: string;
+2 -2
app/login/open-graph/page.tsx
··· 1 - import { Metadata } from "next"; 2 import { headers } from "next/headers"; 3 import { redirect } from "next/navigation"; 4 5 import { getCanonicalUrl } from "@/utils/urls"; 6 7 - export const generateMetadata = async (): Promise<Metadata> => { 8 const title = "Login with Discord"; 9 const description = "Start customising your profile and managing servers."; 10 const url = getCanonicalUrl("login");
··· 1 + import type { Metadata } from "next"; 2 import { headers } from "next/headers"; 3 import { redirect } from "next/navigation"; 4 5 import { getCanonicalUrl } from "@/utils/urls"; 6 7 + export const generateMetadata = (): Metadata => { 8 const title = "Login with Discord"; 9 const description = "Start customising your profile and managing servers."; 10 const url = getCanonicalUrl("login");
+3 -3
app/login/spotify/api.ts
··· 1 - import { ApiError } from "@/typings"; 2 3 export async function connectSpotify(code: string, session: string): Promise<true | ApiError> { 4 const res = await fetch(`${process.env.NEXT_PUBLIC_API}/users/@me/connections/spotify`, { 5 method: "PUT", 6 headers: { 7 "Content-Type": "application/json", 8 - "Cookie": `session=${session}`, 9 authorization: process.env.API_SECRET as string 10 }, 11 body: JSON.stringify({ ··· 21 method: "DELETE", 22 headers: { 23 "Content-Type": "application/json", 24 - "Cookie": `session=${session}`, 25 authorization: process.env.API_SECRET as string 26 } 27 });
··· 1 + import type { ApiError } from "@/typings"; 2 3 export async function connectSpotify(code: string, session: string): Promise<true | ApiError> { 4 const res = await fetch(`${process.env.NEXT_PUBLIC_API}/users/@me/connections/spotify`, { 5 method: "PUT", 6 headers: { 7 "Content-Type": "application/json", 8 + Cookie: `session=${session}`, 9 authorization: process.env.API_SECRET as string 10 }, 11 body: JSON.stringify({ ··· 21 method: "DELETE", 22 headers: { 23 "Content-Type": "application/json", 24 + Cookie: `session=${session}`, 25 authorization: process.env.API_SECRET as string 26 } 27 });
+1 -1
app/passport/[guildId]/api.ts
··· 1 - import { ApiError, ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 2 3 export async function getPassport(guildId: string): Promise<ApiV1GuildsModulesPassportGetResponse | true | ApiError | undefined> { 4 const res = await fetch(`${process.env.NEXT_PUBLIC_API}/guilds/${guildId}/passport-verification`, {
··· 1 + import type { ApiError, ApiV1GuildsModulesPassportGetResponse } from "@/typings"; 2 3 export async function getPassport(guildId: string): Promise<ApiV1GuildsModulesPassportGetResponse | true | ApiError | undefined> { 4 const res = await fetch(`${process.env.NEXT_PUBLIC_API}/guilds/${guildId}/passport-verification`, {
+3 -3
app/passport/[guildId]/page.tsx
··· 1 - import { Metadata } from "next"; 2 import Image from "next/image"; 3 import Link from "next/link"; 4 import { BsDiscord } from "react-icons/bs"; ··· 19 import Verify from "./verify.component"; 20 21 interface Props { 22 - params: Promise<{ guildId: string }>; 23 - searchParams: Promise<{ page: string, type: string }>; 24 } 25 26 export const revalidate = 60;
··· 1 + import type { Metadata } from "next"; 2 import Image from "next/image"; 3 import Link from "next/link"; 4 import { BsDiscord } from "react-icons/bs"; ··· 19 import Verify from "./verify.component"; 20 21 interface Props { 22 + params: Promise<{ guildId: string; }>; 23 + searchParams: Promise<{ page: string; type: string; }>; 24 } 25 26 export const revalidate = 60;
+3 -3
app/passport/[guildId]/verify.component.tsx
··· 8 import { userStore } from "@/common/user"; 9 import ImageReduceMotion from "@/components/image-reduce-motion"; 10 import { GT4Init } from "@/lib/gt4"; 11 - import { ApiV1GuildsGetResponse } from "@/typings"; 12 import { cn } from "@/utils/cn"; 13 14 enum State { 15 Idle = 0, 16 Loading = 1, 17 - Success = 2, 18 } 19 20 interface Props { ··· 47 }, [user]); 48 49 // @ts-expect-error GeeTest types suck 50 - async function handlerForBind(c) { 51 52 const button = btnRef.current; 53 let isReady = false;
··· 8 import { userStore } from "@/common/user"; 9 import ImageReduceMotion from "@/components/image-reduce-motion"; 10 import { GT4Init } from "@/lib/gt4"; 11 + import type { ApiV1GuildsGetResponse } from "@/typings"; 12 import { cn } from "@/utils/cn"; 13 14 enum State { 15 Idle = 0, 16 Loading = 1, 17 + Success = 2 18 } 19 20 interface Props { ··· 47 }, [user]); 48 49 // @ts-expect-error GeeTest types suck 50 + function handlerForBind(c) { 51 52 const button = btnRef.current; 53 let isReady = false;
+8 -10
app/profile/analytics/page.tsx
··· 9 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 10 import { cacheOptions, getData } from "@/lib/api"; 11 import SadWumpusPic from "@/public/sad-wumpus.gif"; 12 - import { NekosticResponse } from "@/typings"; 13 import { convertMonthToName } from "@/utils/time"; 14 15 interface CalcUses { 16 snapshot: string; 17 uses: number; 18 - users: number 19 } 20 21 interface CalcNames { ··· 90 ); 91 } 92 93 - function ChartArea(options: { name: string; data: NekosticResponse[]; dataKey: keyof NekosticResponse }) { 94 return ( 95 <Box none className="dark:bg-wamellow bg-wamellow-100 w-full rounded-md"> 96 ··· 147 ); 148 } 149 150 - function ChartBar(options: { name: string; data: NekosticResponse[]; dataKey: keyof CalcNames }) { 151 const data = calcNameOccurrences(options.data) 152 .filter((entry) => 153 entry.name !== "eval" && ··· 236 ); 237 } 238 239 - interface SnapshotData { 240 - [snapshot: string]: { 241 - uses: number; 242 - users: number; 243 - }; 244 - } 245 246 function calcUses(data: NekosticResponse[]): CalcUses[] { 247 const snapshotData: SnapshotData = {};
··· 9 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 10 import { cacheOptions, getData } from "@/lib/api"; 11 import SadWumpusPic from "@/public/sad-wumpus.gif"; 12 + import type { NekosticResponse } from "@/typings"; 13 import { convertMonthToName } from "@/utils/time"; 14 15 interface CalcUses { 16 snapshot: string; 17 uses: number; 18 + users: number; 19 } 20 21 interface CalcNames { ··· 90 ); 91 } 92 93 + function ChartArea(options: { name: string; data: NekosticResponse[]; dataKey: keyof NekosticResponse; }) { 94 return ( 95 <Box none className="dark:bg-wamellow bg-wamellow-100 w-full rounded-md"> 96 ··· 147 ); 148 } 149 150 + function ChartBar(options: { name: string; data: NekosticResponse[]; dataKey: keyof CalcNames; }) { 151 const data = calcNameOccurrences(options.data) 152 .filter((entry) => 153 entry.name !== "eval" && ··· 236 ); 237 } 238 239 + type SnapshotData = Record<string, { 240 + uses: number; 241 + users: number; 242 + }>; 243 244 function calcUses(data: NekosticResponse[]): CalcUses[] { 245 const snapshotData: SnapshotData = {};
+2 -2
app/profile/layout.tsx
··· 18 import { Skeleton } from "@/components/ui/skeleton"; 19 import { cacheOptions, getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 - import { ApiV1UsersMeGetResponse } from "@/typings"; 22 23 export default function RootLayout({ 24 children 25 }: { 26 - children: React.ReactNode 27 }) { 28 const cookies = useCookies(); 29 const session = cookies.get("session");
··· 18 import { Skeleton } from "@/components/ui/skeleton"; 19 import { cacheOptions, getData } from "@/lib/api"; 20 import SadWumpusPic from "@/public/sad-wumpus.gif"; 21 + import type { ApiV1UsersMeGetResponse } from "@/typings"; 22 23 export default function RootLayout({ 24 children 25 }: { 26 + children: React.ReactNode; 27 }) { 28 const cookies = useCookies(); 29 const session = cookies.get("session");
+4 -4
app/profile/page.tsx
··· 14 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 15 import { useApi } from "@/lib/api/hook"; 16 import SadWumpusPic from "@/public/sad-wumpus.gif"; 17 - import { ApiV1UsersMeGuildsGetResponse } from "@/typings"; 18 import { cn } from "@/utils/cn"; 19 20 const MAX_GUILDS = 200 as const; ··· 188 ); 189 } 190 191 - function InviteButton({ guildId }: { guildId: string }) { 192 return ( 193 <Button 194 as={Link} ··· 202 ); 203 } 204 205 - function ManageButton({ guildId }: { guildId: string }) { 206 const searchParams = useSearchParams(); 207 208 return ( ··· 217 ); 218 } 219 220 - function LeaderboardButton({ guildId }: { guildId: string }) { 221 return ( 222 <Button 223 as={Link}
··· 14 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 15 import { useApi } from "@/lib/api/hook"; 16 import SadWumpusPic from "@/public/sad-wumpus.gif"; 17 + import type { ApiV1UsersMeGuildsGetResponse } from "@/typings"; 18 import { cn } from "@/utils/cn"; 19 20 const MAX_GUILDS = 200 as const; ··· 188 ); 189 } 190 191 + function InviteButton({ guildId }: { guildId: string; }) { 192 return ( 193 <Button 194 as={Link} ··· 202 ); 203 } 204 205 + function ManageButton({ guildId }: { guildId: string; }) { 206 const searchParams = useSearchParams(); 207 208 return ( ··· 217 ); 218 } 219 220 + function LeaderboardButton({ guildId }: { guildId: string; }) { 221 return ( 222 <Button 223 as={Link}
+6 -6
app/profile/rank/card-style.component.tsx
··· 1 import { Button } from "@nextui-org/react"; 2 - import { ApiError } from "next/dist/server/api-utils"; 3 import Image from "next/image"; 4 - import { ChangeEvent, useRef, useState } from "react"; 5 import { HiUpload } from "react-icons/hi"; 6 7 - import { User, userStore } from "@/common/user"; 8 import Box from "@/components/box"; 9 import { Shiggy } from "@/components/shiggy"; 10 - import { ApiV1UsersMeRankEmojiDeleteResponse, ApiV1UsersMeRankEmojiPutResponse } from "@/typings"; 11 import { cn } from "@/utils/cn"; 12 import { deepMerge } from "@/utils/deepMerge"; 13 import sleep from "@/utils/sleep"; ··· 171 index, 172 emojiId 173 }: { 174 - index: number, 175 - emojiId: string | null 176 }) { 177 const classNames = "rounded-xl relative size-12 aspect-square"; 178 const style = {
··· 1 import { Button } from "@nextui-org/react"; 2 + import type { ApiError } from "next/dist/server/api-utils"; 3 import Image from "next/image"; 4 + import { type ChangeEvent, useRef, useState } from "react"; 5 import { HiUpload } from "react-icons/hi"; 6 7 + import { type User, userStore } from "@/common/user"; 8 import Box from "@/components/box"; 9 import { Shiggy } from "@/components/shiggy"; 10 + import type { ApiV1UsersMeRankEmojiDeleteResponse, ApiV1UsersMeRankEmojiPutResponse } from "@/typings"; 11 import { cn } from "@/utils/cn"; 12 import { deepMerge } from "@/utils/deepMerge"; 13 import sleep from "@/utils/sleep"; ··· 171 index, 172 emojiId 173 }: { 174 + index: number; 175 + emojiId: string | null; 176 }) { 177 const classNames = "rounded-xl relative size-12 aspect-square"; 178 const style = {
+2 -2
app/profile/rank/leaderboard-style.component.tsx
··· 1 import { useState } from "react"; 2 3 - import { User, userStore } from "@/common/user"; 4 - import { ApiError,ApiV1UsersMeGetResponse } from "@/typings"; 5 import { cn } from "@/utils/cn"; 6 import { deepMerge } from "@/utils/deepMerge"; 7
··· 1 import { useState } from "react"; 2 3 + import { type User, userStore } from "@/common/user"; 4 + import type { ApiError, ApiV1UsersMeGetResponse } from "@/typings"; 5 import { cn } from "@/utils/cn"; 6 import { deepMerge } from "@/utils/deepMerge"; 7
+1 -1
app/profile/rank/page.tsx
··· 1 "use client"; 2 3 - import { User, userStore } from "@/common/user"; 4 import ImageUrlInput from "@/components/inputs/image-url-input"; 5 import SelectInput from "@/components/inputs/select-menu"; 6 import TextInput from "@/components/inputs/text-input";
··· 1 "use client"; 2 3 + import { type User, userStore } from "@/common/user"; 4 import ImageUrlInput from "@/components/inputs/image-url-input"; 5 import SelectInput from "@/components/inputs/select-menu"; 6 import TextInput from "@/components/inputs/text-input";
+2 -2
app/profile/spotify/page.tsx
··· 13 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 14 import { cacheOptions, getData } from "@/lib/api"; 15 import SadWumpusPic from "@/public/sad-wumpus.gif"; 16 - import { ApiV1UsersMeConnectionsSpotifyGetResponse } from "@/typings"; 17 18 interface Props { 19 - searchParams: Promise<{ spotify_login_success?: string }> 20 } 21 22 export default function Home({ searchParams }: Props) {
··· 13 import { HomeButton, ScreenMessage, SupportButton } from "@/components/screen-message"; 14 import { cacheOptions, getData } from "@/lib/api"; 15 import SadWumpusPic from "@/public/sad-wumpus.gif"; 16 + import type { ApiV1UsersMeConnectionsSpotifyGetResponse } from "@/typings"; 17 18 interface Props { 19 + searchParams: Promise<{ spotify_login_success?: string; }>; 20 } 21 22 export default function Home({ searchParams }: Props) {
+2 -2
app/profile/text-to-speech/page.tsx
··· 1 "use client"; 2 3 - import { User, userStore } from "@/common/user"; 4 import SelectInput from "@/components/inputs/select-menu"; 5 import { deepMerge } from "@/utils/deepMerge"; 6 - import { actor, getVoices, voices } from "@/utils/tts"; 7 8 export default function Home() { 9 const user = userStore((s) => s);
··· 1 "use client"; 2 3 + import { type User, userStore } from "@/common/user"; 4 import SelectInput from "@/components/inputs/select-menu"; 5 import { deepMerge } from "@/utils/deepMerge"; 6 + import { type actor, getVoices, voices } from "@/utils/tts"; 7 8 export default function Home() { 9 const user = userStore((s) => s);
+1 -1
app/user/[userId]/api.ts
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 - import { ApiError,ApiV1UsersGetResponse } from "@/typings"; 3 4 export async function getUser(userId: string): Promise<ApiV1UsersGetResponse | ApiError | undefined> { 5 const res = await fetch(
··· 1 import { defaultFetchOptions } from "@/lib/api"; 2 + import type { ApiError, ApiV1UsersGetResponse } from "@/typings"; 3 4 export async function getUser(userId: string): Promise<ApiV1UsersGetResponse | ApiError | undefined> { 5 const res = await fetch(
+1 -1
app/user/[userId]/layout.tsx
··· 7 import Side from "./side.component"; 8 9 interface Props { 10 - params: Promise<{ userId: string }>; 11 children: React.ReactNode; 12 } 13
··· 7 import Side from "./side.component"; 8 9 interface Props { 10 + params: Promise<{ userId: string; }>; 11 children: React.ReactNode; 12 } 13
+1 -1
app/user/[userId]/page.tsx
··· 1 export const revalidate = 3600; 2 3 - export default async function Home() { 4 return ( 5 <> 6 <i>User has no bio yet</i>
··· 1 export const revalidate = 3600; 2 3 + export default function Home() { 4 return ( 5 <> 6 <i>User has no bio yet</i>
+1 -1
app/user/[userId]/side.component.tsx
··· 5 import { HiAnnotation, HiLink, HiVolumeUp } from "react-icons/hi"; 6 7 import { ClientCountUp } from "@/components/counter"; 8 - import { ApiError,ApiV1UsersGetResponse } from "@/typings"; 9 10 export default function Side({ 11 user
··· 5 import { HiAnnotation, HiLink, HiVolumeUp } from "react-icons/hi"; 6 7 import { ClientCountUp } from "@/components/counter"; 8 + import type { ApiError, ApiV1UsersGetResponse } from "@/typings"; 9 10 export default function Side({ 11 user
+1 -1
common/guilds.ts
··· 1 import { create } from "zustand"; 2 3 - import { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings"; 4 5 export interface Guild extends ApiV1GuildsGetResponse { 6 channels?: ApiV1GuildsChannelsGetResponse[];
··· 1 import { create } from "zustand"; 2 3 + import type { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsGetResponse, ApiV1GuildsRolesGetResponse } from "@/typings"; 4 5 export interface Guild extends ApiV1GuildsGetResponse { 6 channels?: ApiV1GuildsChannelsGetResponse[];
+1 -1
common/user.ts
··· 1 import { create } from "zustand"; 2 3 - import { ApiV1UsersMeGetResponse } from "@/typings"; 4 5 export interface User { 6 HELLO_AND_WELCOME_TO_THE_DEV_TOOLS__PLEASE_GO_AWAY?: true;
··· 1 import { create } from "zustand"; 2 3 + import type { ApiV1UsersMeGetResponse } from "@/typings"; 4 5 export interface User { 6 HELLO_AND_WELCOME_TO_THE_DEV_TOOLS__PLEASE_GO_AWAY?: true;
+1 -1
components/ad.tsx
··· 3 import { Button } from "@nextui-org/react"; 4 import { Poppins } from "next/font/google"; 5 import Link from "next/link"; 6 - import { FunctionComponent } from "react"; 7 import { HiArrowNarrowRight } from "react-icons/hi"; 8 9 import { cn } from "@/utils/cn";
··· 3 import { Button } from "@nextui-org/react"; 4 import { Poppins } from "next/font/google"; 5 import Link from "next/link"; 6 + import type { FunctionComponent } from "react"; 7 import { HiArrowNarrowRight } from "react-icons/hi"; 8 9 import { cn } from "@/utils/cn";
+3 -3
components/avatar.tsx
··· 1 "use client"; 2 3 - import { AvatarIcon, AvatarProps as BaseAvatarProps, useAvatar } from "@nextui-org/react"; 4 import Image from "next/image"; 5 import { forwardRef, useMemo } from "react"; 6 7 - export type AvatarProps = BaseAvatarProps 8 9 - export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(({ src: source,...props }, ref) => { 10 const { 11 src, 12 icon = <AvatarIcon />,
··· 1 "use client"; 2 3 + import { AvatarIcon, type AvatarProps as BaseAvatarProps, useAvatar } from "@nextui-org/react"; 4 import Image from "next/image"; 5 import { forwardRef, useMemo } from "react"; 6 7 + export type AvatarProps = BaseAvatarProps; 8 9 + export const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(({ src: source, ...props }, ref) => { 10 const { 11 src, 12 icon = <AvatarIcon />,
+3 -2
components/box.tsx
··· 8 small?: boolean; 9 none?: boolean; 10 border?: boolean; 11 - } 12 13 export default function Box({ 14 children, ··· 24 "bg-wamellow rounded-lg", 25 !none && "py-6 px-8 md:py-10 md:px-16", 26 small && "py-4 px-6 md:py-8 md:px-10", 27 - border && "", className // border-wamellow-alpha border 28 )} 29 {...props} 30 >
··· 8 small?: boolean; 9 none?: boolean; 10 border?: boolean; 11 + }; 12 13 export default function Box({ 14 children, ··· 24 "bg-wamellow rounded-lg", 25 !none && "py-6 px-8 md:py-10 md:px-16", 26 small && "py-4 px-6 md:py-8 md:px-10", 27 + border && "", 28 + className // border-wamellow-alpha border 29 )} 30 {...props} 31 >
-1
components/button-fetch.tsx
··· 1 - 2 import { Button } from "@nextui-org/react"; 3 import React, { useState } from "react"; 4
··· 1 import { Button } from "@nextui-org/react"; 2 import React, { useState } from "react"; 3
+1 -1
components/click-outside.tsx
··· 14 const handleDocumentClick = (event: MouseEvent): void => { 15 16 // @ts-expect-error -- It think's closest doesn't exist, but it does 17 - // eslint-disable-next-line @typescript-eslint/no-unsafe-call -- It think's closest doesn't exist, but it does 18 if (!event.target?.closest(".wamellow-modal")) { 19 onClose(); 20 }
··· 14 const handleDocumentClick = (event: MouseEvent): void => { 15 16 // @ts-expect-error -- It think's closest doesn't exist, but it does 17 + 18 if (!event.target?.closest(".wamellow-modal")) { 19 onClose(); 20 }
+2 -2
components/comment.tsx
··· 1 import { Patrick_Hand } from "next/font/google"; 2 - import Image, { StaticImageData } from "next/image"; 3 import { HiChevronRight } from "react-icons/hi"; 4 5 import { cn } from "@/utils/cn"; ··· 13 content: string | React.ReactNode; 14 } 15 16 - export default async function Comment({ 17 username, 18 bio, 19 avatar,
··· 1 import { Patrick_Hand } from "next/font/google"; 2 + import Image, { type StaticImageData } from "next/image"; 3 import { HiChevronRight } from "react-icons/hi"; 4 5 import { cn } from "@/utils/cn"; ··· 13 content: string | React.ReactNode; 14 } 15 16 + export default function Comment({ 17 username, 18 bio, 19 avatar,
+1 -1
components/copy-to-clipboard.tsx
··· 9 text: string; 10 title?: string; 11 className?: string; 12 - items?: { icon?: React.ReactNode, name: string, description?: string, text: string }[]; 13 needsWait?: boolean; 14 } 15
··· 9 text: string; 10 title?: string; 11 className?: string; 12 + items?: { icon?: React.ReactNode; name: string; description?: string; text: string; }[]; 13 needsWait?: boolean; 14 } 15
+3 -3
components/counter.tsx
··· 41 name: string; 42 number: number; 43 gained: number | string | React.ReactNode; 44 - append?: string 45 - info?: string 46 - }[] 47 } 48 49 export function StatsBar(options: Options) {
··· 41 name: string; 42 number: number; 43 gained: number | string | React.ReactNode; 44 + append?: string; 45 + info?: string; 46 + }[]; 47 } 48 49 export function StatsBar(options: Options) {
+1 -1
components/dashboard/lists/create-splash.tsx
··· 5 }: { 6 name: string; 7 description: string; 8 - children: React.ReactNode 9 }) { 10 return ( 11 <div
··· 5 }: { 6 name: string; 7 description: string; 8 + children: React.ReactNode; 9 }) { 10 return ( 11 <div
+1 -1
components/dashboard/lists/selector.tsx
··· 4 import Link from "next/link"; 5 import { HiExternalLink, HiPencil } from "react-icons/hi"; 6 7 - import { Guild, guildStore } from "@/common/guilds"; 8 import { cn } from "@/utils/cn"; 9 10 interface TBase {
··· 4 import Link from "next/link"; 5 import { HiExternalLink, HiPencil } from "react-icons/hi"; 6 7 + import { type Guild, guildStore } from "@/common/guilds"; 8 import { cn } from "@/utils/cn"; 9 10 interface TBase {
+1 -1
components/discord/app-badge.tsx
··· 1 - import { HTMLProps } from "react"; 2 import { HiCheck } from "react-icons/hi"; 3 4 import { cn } from "@/utils/cn";
··· 1 + import type { HTMLProps } from "react"; 2 import { HiCheck } from "react-icons/hi"; 3 4 import { cn } from "@/utils/cn";
+2 -2
components/discord/message.tsx
··· 16 username: string; 17 avatar: string; 18 bot: boolean; 19 - } 20 21 user: { 22 username: string; 23 avatar: string; 24 bot: boolean; 25 - } 26 } 27 28 export default function DiscordMessage({
··· 16 username: string; 17 avatar: string; 18 bot: boolean; 19 + }; 20 21 user: { 22 username: string; 23 avatar: string; 24 bot: boolean; 25 + }; 26 } 27 28 export default function DiscordMessage({
+1 -1
components/discord/user.tsx
··· 9 username: string; 10 avatar: string; 11 isBot?: boolean; 12 - isTalking?: boolean 13 } 14 15 export default function DiscordUser({
··· 9 username: string; 10 avatar: string; 11 isBot?: boolean; 12 + isTalking?: boolean; 13 } 14 15 export default function DiscordUser({
+4 -4
components/embed-creator.tsx
··· 4 import { FaFloppyDisk } from "react-icons/fa6"; 5 import { HiChevronDown, HiChevronUp } from "react-icons/hi"; 6 7 - import { GuildEmbed } from "@/typings"; 8 import { cn } from "@/utils/cn"; 9 10 import { DiscordMarkdown } from "./discord/markdown"; ··· 20 } 21 22 interface Props { 23 - children?: React.ReactNode 24 25 name: string; 26 url: string; 27 dataName: string; 28 29 - defaultMessage?: { content?: string | null, embed?: GuildEmbed }; 30 isCollapseable?: boolean; 31 32 messageAttachmentComponent?: React.ReactNode; 33 showMessageAttachmentComponentInEmbed?: boolean; 34 35 disabled?: boolean; 36 - onSave?: (state: { content?: string | null, embed?: GuildEmbed }) => void; 37 } 38 39 export default function MessageCreatorEmbed({
··· 4 import { FaFloppyDisk } from "react-icons/fa6"; 5 import { HiChevronDown, HiChevronUp } from "react-icons/hi"; 6 7 + import type { GuildEmbed } from "@/typings"; 8 import { cn } from "@/utils/cn"; 9 10 import { DiscordMarkdown } from "./discord/markdown"; ··· 20 } 21 22 interface Props { 23 + children?: React.ReactNode; 24 25 name: string; 26 url: string; 27 dataName: string; 28 29 + defaultMessage?: { content?: string | null; embed?: GuildEmbed; }; 30 isCollapseable?: boolean; 31 32 messageAttachmentComponent?: React.ReactNode; 33 showMessageAttachmentComponentInEmbed?: boolean; 34 35 disabled?: boolean; 36 + onSave?: (state: { content?: string | null; embed?: GuildEmbed; }) => void; 37 } 38 39 export default function MessageCreatorEmbed({
+1 -1
components/footer.tsx
··· 1 import Image from "next/image"; 2 import Link from "next/link"; 3 - import { HTMLProps } from "react"; 4 import { BiCopyright, BiLogoGithub, BiLogoGmail, BiLogoTiktok, BiLogoTwitter, BiLogoYoutube } from "react-icons/bi"; 5 import { BsDiscord } from "react-icons/bs"; 6 import { HiBookOpen, HiCloud, HiCube, HiHand, HiLibrary, HiUserAdd } from "react-icons/hi";
··· 1 import Image from "next/image"; 2 import Link from "next/link"; 3 + import type { HTMLProps } from "react"; 4 import { BiCopyright, BiLogoGithub, BiLogoGmail, BiLogoTiktok, BiLogoTwitter, BiLogoYoutube } from "react-icons/bi"; 5 import { BsDiscord } from "react-icons/bs"; 6 import { HiBookOpen, HiCloud, HiCube, HiHand, HiLibrary, HiUserAdd } from "react-icons/hi";
+1 -1
components/icons/invites.tsx
··· 1 - import { SVGProps } from "react"; 2 3 export default function InvitesIcon(props: SVGProps<SVGSVGElement>) { 4 return (
··· 1 + import type { SVGProps } from "react"; 2 3 export default function InvitesIcon(props: SVGProps<SVGSVGElement>) { 4 return (
+1 -1
components/icons/messages.tsx
··· 1 - import { SVGProps } from "react"; 2 3 export default function MessagesIcon(props: SVGProps<SVGSVGElement>) { 4 return (
··· 1 + import type { SVGProps } from "react"; 2 3 export default function MessagesIcon(props: SVGProps<SVGSVGElement>) { 4 return (
+1 -1
components/icons/star.tsx
··· 1 - import { SVGProps } from "react"; 2 3 export default function StarIcon(props: SVGProps<SVGSVGElement>) { 4 return (
··· 1 + import type { SVGProps } from "react"; 2 3 export default function StarIcon(props: SVGProps<SVGSVGElement>) { 4 return (
+1 -1
components/icons/topgg.tsx
··· 1 - import { SVGProps } from "react"; 2 3 export default function TopggIcon(props: SVGProps<SVGSVGElement>) { 4 return (
··· 1 + import type { SVGProps } from "react"; 2 3 export default function TopggIcon(props: SVGProps<SVGSVGElement>) { 4 return (
+1 -1
components/icons/voice.tsx
··· 1 - import { SVGProps } from "react"; 2 3 export default function VoiceIcon(props: SVGProps<SVGSVGElement>) { 4 return (
··· 1 + import type { SVGProps } from "react"; 2 3 export default function VoiceIcon(props: SVGProps<SVGSVGElement>) { 4 return (
+1 -1
components/image-grid.tsx
··· 10 id: string; 11 url: string; 12 link?: string; 13 - }[] 14 } 15 16 export default function ImageGrid({ images }: Props) {
··· 10 id: string; 11 url: string; 12 link?: string; 13 + }[]; 14 } 15 16 export default function ImageGrid({ images }: Props) {
+1 -1
components/image-reduce-motion.tsx
··· 8 size: number; 9 alt: string; 10 className?: string; 11 - forceStatic?: boolean 12 } 13 14 export default function ImageReduceMotion({
··· 8 size: number; 9 alt: string; 10 className?: string; 11 + forceStatic?: boolean; 12 } 13 14 export default function ImageReduceMotion({
+3 -3
components/inputs/color-input.tsx
··· 1 import { useEffect, useState } from "react"; 2 import { TailSpin } from "react-loading-icons"; 3 4 - import { ApiError } from "@/typings"; 5 6 import { useStateDebounced } from "../../utils/useDebounce"; 7 import DumbColorInput from "./dumb-color-input"; ··· 12 Success = 2 13 } 14 15 - type Props = { 16 name: string; 17 url: string; 18 dataName: string; ··· 24 placeholder?: string; 25 26 onSave?: (value: string | number) => void; 27 - }; 28 29 30 export default function ColorInput({
··· 1 import { useEffect, useState } from "react"; 2 import { TailSpin } from "react-loading-icons"; 3 4 + import type { ApiError } from "@/typings"; 5 6 import { useStateDebounced } from "../../utils/useDebounce"; 7 import DumbColorInput from "./dumb-color-input"; ··· 12 Success = 2 13 } 14 15 + interface Props { 16 name: string; 17 url: string; 18 dataName: string; ··· 24 placeholder?: string; 25 26 onSave?: (value: string | number) => void; 27 + } 28 29 30 export default function ColorInput({
+2 -2
components/inputs/dumb-color-input.tsx
··· 4 5 import { cn } from "@/utils/cn"; 6 7 - type Props = { 8 name?: string; 9 placeholder?: string; 10 ··· 16 thin?: boolean; 17 18 dataName?: string; 19 - }; 20 21 export default function DumbColorInput({ 22 name,
··· 4 5 import { cn } from "@/utils/cn"; 6 7 + interface Props { 8 name?: string; 9 placeholder?: string; 10 ··· 16 thin?: boolean; 17 18 dataName?: string; 19 + } 20 21 export default function DumbColorInput({ 22 name,
+2 -2
components/inputs/dumb-text-input.tsx
··· 2 3 import { cn } from "@/utils/cn"; 4 5 - type Props = { 6 name?: string; 7 placeholder?: string; 8 ··· 16 type?: string; 17 18 dataName?: string; 19 - }; 20 21 export default function DumbTextInput({ 22 name,
··· 2 3 import { cn } from "@/utils/cn"; 4 5 + interface Props { 6 name?: string; 7 placeholder?: string; 8 ··· 16 type?: string; 17 18 dataName?: string; 19 + } 20 21 export default function DumbTextInput({ 22 name,
+4 -4
components/inputs/image-url-input.tsx
··· 1 import { useEffect, useState } from "react"; 2 import { TailSpin } from "react-loading-icons"; 3 4 - import { ApiError } from "@/typings"; 5 import { cn } from "@/utils/cn"; 6 7 import DumbTextInput from "./dumb-text-input"; ··· 12 Success = 2 13 } 14 15 - type Props = { 16 name: string; 17 url: string; 18 dataName: string; 19 disabled?: boolean; 20 description?: string; 21 defaultState: string; 22 - ratio: `aspect-[${number}/${number}]` 23 24 onSave?: (value: string) => void; 25 - }; 26 27 export default function ImageUrlInput({ 28 name,
··· 1 import { useEffect, useState } from "react"; 2 import { TailSpin } from "react-loading-icons"; 3 4 + import type { ApiError } from "@/typings"; 5 import { cn } from "@/utils/cn"; 6 7 import DumbTextInput from "./dumb-text-input"; ··· 12 Success = 2 13 } 14 15 + interface Props { 16 name: string; 17 url: string; 18 dataName: string; 19 disabled?: boolean; 20 description?: string; 21 defaultState: string; 22 + ratio: `aspect-[${number}/${number}]`; 23 24 onSave?: (value: string) => void; 25 + } 26 27 export default function ImageUrlInput({ 28 name,
+4 -4
components/inputs/multi-select-menu.tsx
··· 2 import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 3 import { TailSpin } from "react-loading-icons"; 4 5 - import { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 import { ClickOutside } from "../click-outside"; ··· 21 color?: number; 22 } 23 24 - type Props = { 25 className?: string; 26 27 name: string; ··· 33 description?: string; 34 defaultState?: (string | number)[]; 35 36 - onSave?: (options: { name: string; value: string | number | null; error?: string }[]) => void; 37 - }; 38 39 export default function MultiSelectMenu({ 40 className,
··· 2 import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 3 import { TailSpin } from "react-loading-icons"; 4 5 + import type { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 import { ClickOutside } from "../click-outside"; ··· 21 color?: number; 22 } 23 24 + interface Props { 25 className?: string; 26 27 name: string; ··· 33 description?: string; 34 defaultState?: (string | number)[]; 35 36 + onSave?: (options: { name: string; value: string | number | null; error?: string; }[]) => void; 37 + } 38 39 export default function MultiSelectMenu({ 40 className,
+3 -3
components/inputs/number-input.tsx
··· 4 import { TailSpin } from "react-loading-icons"; 5 6 import { webStore } from "@/common/webstore"; 7 - import { ApiError } from "@/typings"; 8 import { cn } from "@/utils/cn"; 9 10 enum State { ··· 13 Success = 2 14 } 15 16 - type Props = { 17 className?: string; 18 19 name: string; ··· 25 26 min?: number; 27 max?: number; 28 - }; 29 30 export default function NumberInput({ 31 className,
··· 4 import { TailSpin } from "react-loading-icons"; 5 6 import { webStore } from "@/common/webstore"; 7 + import type { ApiError } from "@/typings"; 8 import { cn } from "@/utils/cn"; 9 10 enum State { ··· 13 Success = 2 14 } 15 16 + interface Props { 17 className?: string; 18 19 name: string; ··· 25 26 min?: number; 27 max?: number; 28 + } 29 30 export default function NumberInput({ 31 className,
+1 -1
components/inputs/request.ts
··· 1 - import { ApiError } from "@/typings"; 2 3 interface Props { 4 key: string;
··· 1 + import type { ApiError } from "@/typings"; 2 3 interface Props { 4 key: string;
+2 -2
components/inputs/select-menu.tsx
··· 2 import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 3 import { TailSpin } from "react-loading-icons"; 4 5 - import { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 import { ClickOutside } from "../click-outside"; ··· 33 defaultState?: string | number | null; 34 showClear?: boolean; 35 36 - onSave?: (options: { name: string; value: string | number | null; error?: string }) => void; 37 } 38 39 export default function SelectMenu({
··· 2 import { HiCheck, HiChevronDown, HiExclamationCircle, HiX } from "react-icons/hi"; 3 import { TailSpin } from "react-loading-icons"; 4 5 + import type { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 import { ClickOutside } from "../click-outside"; ··· 33 defaultState?: string | number | null; 34 showClear?: boolean; 35 36 + onSave?: (options: { name: string; value: string | number | null; error?: string; }) => void; 37 } 38 39 export default function SelectMenu({
+2 -2
components/inputs/slider-input.tsx
··· 20 disabled?: boolean; 21 description?: string; 22 23 - minValue?: number 24 maxValue?: number; 25 steps?: number; 26 27 - url: string 28 dataName: string; 29 defaultState: number; 30 }
··· 20 disabled?: boolean; 21 description?: string; 22 23 + minValue?: number; 24 maxValue?: number; 25 steps?: number; 26 27 + url: string; 28 dataName: string; 29 defaultState: number; 30 }
+1 -1
components/inputs/switch.tsx
··· 2 import { useEffect, useState } from "react"; 3 import { TailSpin } from "react-loading-icons"; 4 5 - import { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 enum State {
··· 2 import { useEffect, useState } from "react"; 3 import { TailSpin } from "react-loading-icons"; 4 5 + import type { ApiError } from "@/typings"; 6 import { cn } from "@/utils/cn"; 7 8 enum State {
+1 -1
components/inputs/text-input.tsx
··· 3 import { useEffect, useState } from "react"; 4 import { TailSpin } from "react-loading-icons"; 5 6 - import { ApiError } from "@/typings"; 7 import { cn } from "@/utils/cn"; 8 9 import { useStateDebounced } from "../../utils/useDebounce";
··· 3 import { useEffect, useState } from "react"; 4 import { TailSpin } from "react-loading-icons"; 5 6 + import type { ApiError } from "@/typings"; 7 import { cn } from "@/utils/cn"; 8 9 import { useStateDebounced } from "../../utils/useDebounce";
+2 -2
components/list.tsx
··· 17 searchParamName?: string; 18 disabled: boolean; 19 20 - children?: React.ReactNode 21 } 22 23 export function ListTab({ tabs, url, searchParamName, disabled }: ListProps) { ··· 134 description: string; 135 icon: React.ReactNode; 136 color: number; 137 - }[] 138 } 139 140 export function ListFeature({ items }: FeatureProps) {
··· 17 searchParamName?: string; 18 disabled: boolean; 19 20 + children?: React.ReactNode; 21 } 22 23 export function ListTab({ tabs, url, searchParamName, disabled }: ListProps) { ··· 134 description: string; 135 icon: React.ReactNode; 136 color: number; 137 + }[]; 138 } 139 140 export function ListFeature({ items }: FeatureProps) {
+2 -2
components/login-button.tsx
··· 18 19 interface Props { 20 state?: State; 21 - message?: string 22 className?: string; 23 addClassName?: string; // idk why that name 24 } ··· 50 startContent={<Icon />} 51 > 52 {!state ? 53 - <span className={cn(montserrat.className,"font-semibold")}> 54 {message || 55 <> 56 <span className="hidden md:block">Login with Discord</span>
··· 18 19 interface Props { 20 state?: State; 21 + message?: string; 22 className?: string; 23 addClassName?: string; // idk why that name 24 } ··· 50 startContent={<Icon />} 51 > 52 {!state ? 53 + <span className={cn(montserrat.className, "font-semibold")}> 54 {message || 55 <> 56 <span className="hidden md:block">Login with Discord</span>
+4 -3
components/markdown/index.tsx
··· 1 /* eslint-disable @typescript-eslint/no-unused-vars */ 2 - /* eslint-disable react/prop-types */ 3 import { Code } from "@nextui-org/react"; 4 import Link from "next/link"; 5 - import { ReactNode } from "react"; 6 import { HiExternalLink } from "react-icons/hi"; 7 import ReactMarkdown from "react-markdown"; 8 import rehypeRaw from "rehype-raw"; ··· 27 export default async function BeautifyMarkdown({ 28 markdown 29 }: { 30 - markdown: string 31 }) { 32 const { renderToString } = await import("react-dom/server"); 33 ··· 113 del: (props) => <span className="line-through" {...props} />, 114 ins: (props) => <span className="underline" {...props} />, 115 116 code: ({ ref, color, ...props }) => { 117 return <Code color="secondary" {...props} />; 118 },
··· 1 /* eslint-disable @typescript-eslint/no-unused-vars */ 2 + 3 import { Code } from "@nextui-org/react"; 4 import Link from "next/link"; 5 + import type { ReactNode } from "react"; 6 import { HiExternalLink } from "react-icons/hi"; 7 import ReactMarkdown from "react-markdown"; 8 import rehypeRaw from "rehype-raw"; ··· 27 export default async function BeautifyMarkdown({ 28 markdown 29 }: { 30 + markdown: string; 31 }) { 32 const { renderToString } = await import("react-dom/server"); 33 ··· 113 del: (props) => <span className="line-through" {...props} />, 114 ins: (props) => <span className="underline" {...props} />, 115 116 + // eslint-disable-next-line unused-imports/no-unused-vars 117 code: ({ ref, color, ...props }) => { 118 return <Code color="secondary" {...props} />; 119 },
+2 -2
components/modal.tsx
··· 6 import { useEffect, useState } from "react"; 7 import { HiX } from "react-icons/hi"; 8 9 - import { ApiError } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 import { ClickOutside } from "./click-outside"; ··· 20 21 interface Props<T> { 22 className?: string; 23 - variant?:"secondary" | "default" | "destructive"; 24 25 title: string; 26 children: React.ReactNode;
··· 6 import { useEffect, useState } from "react"; 7 import { HiX } from "react-icons/hi"; 8 9 + import type { ApiError } from "@/typings"; 10 import { cn } from "@/utils/cn"; 11 12 import { ClickOutside } from "./click-outside"; ··· 20 21 interface Props<T> { 22 className?: string; 23 + variant?: "secondary" | "default" | "destructive"; 24 25 title: string; 26 children: React.ReactNode;
+1 -1
components/screen-message.tsx
··· 1 - import { Button } from "@nextui-org/react"; 2 import Link from "next/link"; 3 import { BsDiscord } from "react-icons/bs"; 4 import { HiHome } from "react-icons/hi";
··· 1 + import type { Button } from "@nextui-org/react"; 2 import Link from "next/link"; 3 import { BsDiscord } from "react-icons/bs"; 4 import { HiHome } from "react-icons/hi";
+2 -4
components/ui/button.tsx
··· 36 extends React.ButtonHTMLAttributes<HTMLButtonElement>, 37 VariantProps<typeof buttonVariants> { 38 asChild?: boolean; 39 - startContent?: React.ReactNode; 40 - endContent?: React.ReactNode; 41 } 42 43 const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( 44 - ({ className, variant, size, asChild = false, startContent, endContent, ...props }, ref) => { 45 const Comp = asChild ? Slot : "button"; 46 47 return ( ··· 84 85 LinkButton.displayName = "LinkButton"; 86 87 - export { Button, buttonVariants,LinkButton };
··· 36 extends React.ButtonHTMLAttributes<HTMLButtonElement>, 37 VariantProps<typeof buttonVariants> { 38 asChild?: boolean; 39 } 40 41 const Button = React.forwardRef<HTMLButtonElement, ButtonProps>( 42 + ({ className, variant, size, asChild = false, ...props }, ref) => { 43 const Comp = asChild ? Slot : "button"; 44 45 return ( ··· 82 83 LinkButton.displayName = "LinkButton"; 84 85 + export { Button, buttonVariants, LinkButton };
+8 -8
components/ui/drawer.tsx
··· 23 const DrawerClose = DrawerPrimitive.Close; 24 25 const DrawerOverlay = React.forwardRef< 26 - React.ElementRef<typeof DrawerPrimitive.Overlay>, 27 - React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay> 28 >(({ className, ...props }, ref) => ( 29 <DrawerPrimitive.Overlay 30 ref={ref} ··· 35 DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName; 36 37 const DrawerContent = React.forwardRef< 38 - React.ElementRef<typeof DrawerPrimitive.Content>, 39 - React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content> 40 >(({ className, children, ...props }, ref) => ( 41 <DrawerPortal> 42 <DrawerOverlay /> ··· 78 DrawerFooter.displayName = "DrawerFooter"; 79 80 const DrawerTitle = React.forwardRef< 81 - React.ElementRef<typeof DrawerPrimitive.Title>, 82 - React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title> 83 >(({ className, ...props }, ref) => ( 84 <DrawerPrimitive.Title 85 ref={ref} ··· 93 DrawerTitle.displayName = DrawerPrimitive.Title.displayName; 94 95 const DrawerDescription = React.forwardRef< 96 - React.ElementRef<typeof DrawerPrimitive.Description>, 97 - React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description> 98 >(({ className, ...props }, ref) => ( 99 <DrawerPrimitive.Description 100 ref={ref}
··· 23 const DrawerClose = DrawerPrimitive.Close; 24 25 const DrawerOverlay = React.forwardRef< 26 + React.ElementRef<typeof DrawerPrimitive.Overlay>, 27 + React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay> 28 >(({ className, ...props }, ref) => ( 29 <DrawerPrimitive.Overlay 30 ref={ref} ··· 35 DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName; 36 37 const DrawerContent = React.forwardRef< 38 + React.ElementRef<typeof DrawerPrimitive.Content>, 39 + React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content> 40 >(({ className, children, ...props }, ref) => ( 41 <DrawerPortal> 42 <DrawerOverlay /> ··· 78 DrawerFooter.displayName = "DrawerFooter"; 79 80 const DrawerTitle = React.forwardRef< 81 + React.ElementRef<typeof DrawerPrimitive.Title>, 82 + React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title> 83 >(({ className, ...props }, ref) => ( 84 <DrawerPrimitive.Title 85 ref={ref} ··· 93 DrawerTitle.displayName = DrawerPrimitive.Title.displayName; 94 95 const DrawerDescription = React.forwardRef< 96 + React.ElementRef<typeof DrawerPrimitive.Description>, 97 + React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description> 98 >(({ className, ...props }, ref) => ( 99 <DrawerPrimitive.Description 100 ref={ref}
+1 -1
components/ui/popover.tsx
··· 28 )); 29 PopoverContent.displayName = PopoverPrimitive.Content.displayName; 30 31 - export { Popover, PopoverContent,PopoverTrigger };
··· 28 )); 29 PopoverContent.displayName = PopoverPrimitive.Content.displayName; 30 31 + export { Popover, PopoverContent, PopoverTrigger };
+166
eslint.config.mjs
···
··· 1 + import tseslint from "typescript-eslint"; 2 + import react from "eslint-plugin-react"; 3 + import reactHooks from "eslint-plugin-react-hooks"; 4 + import next from "@next/eslint-plugin-next"; 5 + import reactCompiler from "eslint-plugin-react-compiler"; 6 + import pathAlias from "eslint-plugin-path-alias"; 7 + import simpleImportSort from "eslint-plugin-simple-import-sort"; 8 + import unusedImports from "eslint-plugin-unused-imports"; 9 + import stylistic from "@stylistic/eslint-plugin"; 10 + 11 + export default tseslint.config( 12 + ...tseslint.configs.recommended, 13 + { 14 + files: ["**/*.ts", "**/*.tsx"], 15 + ignores: ["node_modules", ".next"], 16 + languageOptions: { 17 + parser: tseslint.parser, 18 + parserOptions: { 19 + project: "./tsconfig.json", 20 + tsconfigRootDir: import.meta.dirname, 21 + warnOnUnsupportedTypeScriptVersion: false 22 + } 23 + }, 24 + plugins: { 25 + react, 26 + "react-hooks": reactHooks, 27 + "@next/next": next, 28 + "react-compiler": reactCompiler, 29 + "path-alias": pathAlias, 30 + "simple-import-sort": simpleImportSort, 31 + "unused-imports": unusedImports, 32 + "@stylistic": stylistic, 33 + }, 34 + rules: { 35 + ...react.configs.recommended.rules, 36 + ...react.configs['jsx-runtime'].rules, 37 + ...reactHooks.configs.recommended.rules, 38 + ...next.configs.recommended.rules, 39 + ...next.configs["core-web-vitals"].rules, 40 + 41 + // Fixes 42 + "react/prop-types": "off", 43 + "react-hooks/exhaustive-deps": "off", 44 + 45 + // stylistic Rules 46 + "@stylistic/array-bracket-newline": ["error", "consistent"], 47 + "@stylistic/array-bracket-spacing": "error", 48 + "@stylistic/array-element-newline": ["error", "consistent"], 49 + "@stylistic/arrow-parens": ["error", "always"], 50 + "@stylistic/block-spacing": "error", 51 + "@stylistic/brace-style": "error", 52 + "@stylistic/comma-dangle": ["error"], 53 + "@stylistic/comma-spacing": "error", 54 + "@stylistic/comma-style": "error", 55 + "@stylistic/computed-property-spacing": "error", 56 + "@stylistic/dot-location": ["error", "property"], 57 + "@stylistic/eol-last": ["error", "never"], 58 + "@stylistic/function-call-argument-newline": ["error", "consistent"], 59 + "@stylistic/function-call-spacing": "error", 60 + "@stylistic/indent": "error", 61 + "@stylistic/key-spacing": "error", 62 + "@stylistic/keyword-spacing": "error", 63 + "@stylistic/member-delimiter-style": ["error", { singleline: { requireLast: true } }], 64 + "@stylistic/new-parens": "error", 65 + "@stylistic/no-extra-semi": "error", 66 + "@stylistic/no-floating-decimal": "error", 67 + "@stylistic/no-multi-spaces": "error", 68 + "@stylistic/no-multiple-empty-lines": ["error", { max: 2, maxBOF: 0, maxEOF: 0 }], 69 + "@stylistic/no-trailing-spaces": "error", 70 + "@stylistic/no-whitespace-before-property": "error", 71 + "@stylistic/object-curly-newline": "error", 72 + "@stylistic/object-curly-spacing": ["error", "always"], 73 + "@stylistic/rest-spread-spacing": "error", 74 + "@stylistic/quote-props": ["error", "as-needed"], 75 + "@stylistic/quotes": "error", 76 + "@stylistic/semi": "error", 77 + "@stylistic/semi-spacing": "error", 78 + "@stylistic/semi-style": "error", 79 + "@stylistic/space-before-blocks": "error", 80 + "@stylistic/space-before-function-paren": ["error", { named: "never" }], 81 + "@stylistic/space-in-parens": "error", 82 + "@stylistic/space-infix-ops": "error", 83 + "@stylistic/space-unary-ops": "error", 84 + "@stylistic/spaced-comment": "error", 85 + "@stylistic/switch-colon-spacing": "error", 86 + "@stylistic/template-curly-spacing": "error", 87 + "@stylistic/template-tag-spacing": "error", 88 + "@stylistic/type-annotation-spacing": "error", 89 + "@stylistic/type-generic-spacing": "error", 90 + "@stylistic/type-named-tuple-spacing": "error", 91 + "@typescript-eslint/no-explicit-any": "error", 92 + "@typescript-eslint/adjacent-overload-signatures": "error", 93 + "@typescript-eslint/array-type": "error", 94 + "@typescript-eslint/ban-ts-comment": "error", 95 + "@typescript-eslint/no-wrapper-object-types": "error", 96 + "@typescript-eslint/no-empty-object-type": "error", 97 + "@typescript-eslint/no-unsafe-function-type": "error", 98 + "@typescript-eslint/class-literal-property-style": "error", 99 + "@typescript-eslint/consistent-type-definitions": "error", 100 + "@typescript-eslint/consistent-type-exports": ["error", { fixMixedExportsWithInlineTypeSpecifier: true }], 101 + "@typescript-eslint/consistent-type-imports": ["error", { fixStyle: "inline-type-imports" }], 102 + // "@typescript-eslint/member-ordering": ["error", { 103 + // default: { 104 + // memberTypes: [ 105 + // "call-signature", 106 + // "signature", 107 + // "constructor", 108 + // ["static-accessor", "static-field", "static-get", "static-method", "static-set"], 109 + // ["accessor", "get", "method", "set"], 110 + // "field" 111 + // ], 112 + // order: "alphabetically-case-insensitive" 113 + // } 114 + // }], 115 + "@typescript-eslint/method-signature-style": "error", 116 + "@typescript-eslint/naming-convention": ["error", { selector: "typeLike", format: ["PascalCase"] }], 117 + "@typescript-eslint/no-duplicate-enum-values": "error", 118 + "@typescript-eslint/no-duplicate-type-constituents": "error", 119 + "@typescript-eslint/no-empty-interface": "error", 120 + "@typescript-eslint/no-import-type-side-effects": "error", 121 + "@typescript-eslint/no-invalid-void-type": "error", 122 + "@typescript-eslint/no-misused-new": "error", 123 + "@typescript-eslint/no-redundant-type-constituents": "error", 124 + "@typescript-eslint/no-require-imports": "error", 125 + "@typescript-eslint/no-unnecessary-qualifier": "error", 126 + "@typescript-eslint/no-unnecessary-type-arguments": "error", 127 + "@typescript-eslint/no-unnecessary-type-constraint": "error", 128 + "@typescript-eslint/no-unsafe-declaration-merging": "error", 129 + "@typescript-eslint/no-unused-vars": ["error", { 130 + args: "all", 131 + argsIgnorePattern: "^_", 132 + destructuredArrayIgnorePattern: "^_", 133 + varsIgnorePattern: "^_" 134 + }], 135 + "@typescript-eslint/no-useless-empty-export": "error", 136 + "@typescript-eslint/prefer-enum-initializers": "error", 137 + "@typescript-eslint/prefer-function-type": "error", 138 + "@typescript-eslint/triple-slash-reference": "error", 139 + "@typescript-eslint/unified-signatures": "error", 140 + "@typescript-eslint/consistent-generic-constructors": "error", 141 + "@typescript-eslint/consistent-indexed-object-style": "error", 142 + "@typescript-eslint/no-unused-expressions": "error", 143 + "@typescript-eslint/require-await": "error", 144 + "@typescript-eslint/no-non-null-asserted-nullish-coalescing": "error", 145 + 146 + // Import Sorting Rules 147 + "simple-import-sort/imports": "error", 148 + "simple-import-sort/exports": "error", 149 + 150 + // Unused Imports Rules 151 + "unused-imports/no-unused-imports": "error", 152 + "unused-imports/no-unused-vars": [ 153 + "warn", 154 + { vars: "all", varsIgnorePattern: "^_", args: "after-used", argsIgnorePattern: "^_" }, 155 + ], 156 + }, 157 + settings: { 158 + react: { 159 + version: "detect", // Automatically detects the React version 160 + }, 161 + } 162 + }, 163 + { 164 + ignores: ["node_modules", ".next", "**/gt4.ts", "next-env.d.ts", "typings.ts"] 165 + } 166 + )
+1 -1
lib/analytics.ts
··· 7 error: string; 8 } 9 10 - export async function getPageAnalytics(page: string): Promise<{ results: AnalyticsResponse[] } | AnalyticsError | undefined> { 11 12 const params = { 13 site_id: process.env.PLAUSIBLE_DOMAIN as string,
··· 7 error: string; 8 } 9 10 + export async function getPageAnalytics(page: string): Promise<{ results: AnalyticsResponse[]; } | AnalyticsError | undefined> { 11 12 const params = { 13 site_id: process.env.PLAUSIBLE_DOMAIN as string,
+1 -1
lib/api/index.ts
··· 1 - import { ApiError, ApiV1GuildsGetResponse } from "@/typings"; 2 3 export interface ApiRequestOptions { 4 force?: boolean;
··· 1 + import type { ApiError, ApiV1GuildsGetResponse } from "@/typings"; 2 3 export interface ApiRequestOptions { 4 force?: boolean;
+1 -1
lib/discord/guild.ts
··· 1 import { Collection } from "@discordjs/collection"; 2 - import { APIGuild, RESTError, RESTGetAPIGuildResult, Routes } from "discord-api-types/v10"; 3 4 import { rest } from "./index"; 5 import { fetchWidget } from "./widget";
··· 1 import { Collection } from "@discordjs/collection"; 2 + import { type APIGuild, type RESTError, type RESTGetAPIGuildResult, Routes } from "discord-api-types/v10"; 3 4 import { rest } from "./index"; 5 import { fetchWidget } from "./widget";
+1 -1
lib/discord/user.ts
··· 1 import { Collection } from "@discordjs/collection"; 2 - import { APIUser, RESTError, RESTGetAPIUserResult, Routes } from "discord-api-types/v10"; 3 4 import { rest } from "./index"; 5
··· 1 import { Collection } from "@discordjs/collection"; 2 + import { type APIUser, type RESTError, type RESTGetAPIUserResult, Routes } from "discord-api-types/v10"; 3 4 import { rest } from "./index"; 5
+1 -1
lib/discord/widget.ts
··· 1 - import { RESTError, RESTGetAPIGuildWidgetJSONResult, Routes } from "discord-api-types/v10"; 2 3 import { rest } from "."; 4
··· 1 + import { type RESTError, type RESTGetAPIGuildWidgetJSONResult, Routes } from "discord-api-types/v10"; 2 3 import { rest } from "."; 4
+1 -1
lib/github/index.ts
··· 1 - import { Endpoints } from "@octokit/types"; 2 3 export async function getRepository(fullname: string) { 4 const res = await request<Endpoints["GET /repos/{owner}/{repo}"]["response"]["data"]>("GET", `/repos/${fullname}`);
··· 1 + import type { Endpoints } from "@octokit/types"; 2 3 export async function getRepository(fullname: string) { 4 const res = await request<Endpoints["GET /repos/{owner}/{repo}"]["response"]["data"]>("GET", `/repos/${fullname}`);
+6 -4
package.json
··· 44 "zustand": "^5.0.1" 45 }, 46 "devDependencies": { 47 "@octokit/types": "^13.6.1", 48 "@types/node": "^22.9.0", 49 "@types/react": "^18.3.12", 50 "@types/react-dom": "^18.3.1", 51 - "@typescript-eslint/eslint-plugin": "^8.13.0", 52 - "@typescript-eslint/parser": "^8.13.0", 53 - "eslint": "^9.14.0", 54 "eslint-config-next": "^15.0.3", 55 "eslint-plugin-path-alias": "^2.1.0", 56 "eslint-plugin-react": "^7.37.2", 57 "eslint-plugin-react-compiler": "19.0.0-beta-63b359f-20241101", 58 "eslint-plugin-simple-import-sort": "^12.1.1", 59 - "eslint-plugin-unused-imports": "^4.1.4" 60 } 61 }
··· 44 "zustand": "^5.0.1" 45 }, 46 "devDependencies": { 47 + "@next/eslint-plugin-next": "^15.0.3", 48 "@octokit/types": "^13.6.1", 49 + "@stylistic/eslint-plugin": "^2.11.0", 50 "@types/node": "^22.9.0", 51 "@types/react": "^18.3.12", 52 "@types/react-dom": "^18.3.1", 53 + "eslint": "^9.15.0", 54 "eslint-config-next": "^15.0.3", 55 "eslint-plugin-path-alias": "^2.1.0", 56 "eslint-plugin-react": "^7.37.2", 57 "eslint-plugin-react-compiler": "19.0.0-beta-63b359f-20241101", 58 + "eslint-plugin-react-hooks": "^5.0.0", 59 "eslint-plugin-simple-import-sort": "^12.1.1", 60 + "eslint-plugin-unused-imports": "^4.1.4", 61 + "typescript-eslint": "^8.15.0" 62 } 63 }
+297 -99
pnpm-lock.yaml
··· 108 specifier: ^5.0.1 109 version: 5.0.1(@types/react@18.3.12)(react@19.0.0-rc-5c56b873-20241107)(use-sync-external-store@1.2.0(react@19.0.0-rc-5c56b873-20241107)) 110 devDependencies: 111 '@octokit/types': 112 specifier: ^13.6.1 113 version: 13.6.1 114 '@types/node': 115 specifier: ^22.9.0 116 version: 22.9.0 ··· 120 '@types/react-dom': 121 specifier: ^18.3.1 122 version: 18.3.1 123 - '@typescript-eslint/eslint-plugin': 124 - specifier: ^8.13.0 125 - version: 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 126 - '@typescript-eslint/parser': 127 - specifier: ^8.13.0 128 - version: 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 129 eslint: 130 - specifier: ^9.14.0 131 - version: 9.14.0(jiti@1.21.6) 132 eslint-config-next: 133 specifier: ^15.0.3 134 - version: 15.0.3(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 135 eslint-plugin-path-alias: 136 specifier: ^2.1.0 137 - version: 2.1.0(eslint@9.14.0(jiti@1.21.6)) 138 eslint-plugin-react: 139 specifier: ^7.37.2 140 - version: 7.37.2(eslint@9.14.0(jiti@1.21.6)) 141 eslint-plugin-react-compiler: 142 specifier: 19.0.0-beta-63b359f-20241101 143 - version: 19.0.0-beta-63b359f-20241101(eslint@9.14.0(jiti@1.21.6)) 144 eslint-plugin-simple-import-sort: 145 specifier: ^12.1.1 146 - version: 12.1.1(eslint@9.14.0(jiti@1.21.6)) 147 eslint-plugin-unused-imports: 148 specifier: ^4.1.4 149 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6)) 150 151 packages: 152 ··· 301 resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 302 engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 303 304 - '@eslint/config-array@0.18.0': 305 - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} 306 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 307 308 - '@eslint/core@0.7.0': 309 - resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} 310 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 311 312 - '@eslint/eslintrc@3.1.0': 313 - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 314 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 315 316 - '@eslint/js@9.14.0': 317 - resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} 318 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 319 320 '@eslint/object-schema@2.1.4': 321 resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 322 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 323 324 - '@eslint/plugin-kit@0.2.2': 325 - resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} 326 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 327 328 '@floating-ui/core@1.6.8': ··· 1901 resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} 1902 engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 1903 1904 '@swc/counter@0.1.3': 1905 resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 1906 ··· 1993 typescript: 1994 optional: true 1995 1996 '@typescript-eslint/parser@8.13.0': 1997 resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} 1998 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 2003 typescript: 2004 optional: true 2005 2006 '@typescript-eslint/scope-manager@8.13.0': 2007 resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} 2008 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2009 2010 '@typescript-eslint/type-utils@8.13.0': ··· 2016 typescript: 2017 optional: true 2018 2019 '@typescript-eslint/types@8.13.0': 2020 resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} 2021 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2022 2023 '@typescript-eslint/typescript-estree@8.13.0': ··· 2029 typescript: 2030 optional: true 2031 2032 '@typescript-eslint/utils@8.13.0': 2033 resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} 2034 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2035 peerDependencies: 2036 eslint: ^8.57.0 || ^9.0.0 2037 2038 '@typescript-eslint/visitor-keys@8.13.0': 2039 resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} 2040 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2041 2042 '@ungap/structured-clone@1.2.0': ··· 2340 resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 2341 engines: {node: '>= 8'} 2342 2343 cssesc@3.0.0: 2344 resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 2345 engines: {node: '>=4'} ··· 2694 resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 2695 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2696 2697 - eslint@9.14.0: 2698 - resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} 2699 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2700 hasBin: true 2701 peerDependencies: ··· 3668 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 3669 engines: {node: '>=8.6'} 3670 3671 pify@2.3.0: 3672 resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 3673 engines: {node: '>=0.10.0'} ··· 4123 tapable@2.2.1: 4124 resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 4125 engines: {node: '>=6'} 4126 - 4127 - text-table@0.2.0: 4128 - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 4129 4130 thenify-all@1.6.0: 4131 resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} ··· 4194 resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} 4195 engines: {node: '>= 0.4'} 4196 4197 typescript@5.6.3: 4198 resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 4199 engines: {node: '>=14.17'} ··· 4608 tslib: 2.6.3 4609 optional: true 4610 4611 - '@eslint-community/eslint-utils@4.4.0(eslint@9.14.0(jiti@1.21.6))': 4612 dependencies: 4613 - eslint: 9.14.0(jiti@1.21.6) 4614 eslint-visitor-keys: 3.4.3 4615 4616 '@eslint-community/regexpp@4.11.0': {} 4617 4618 '@eslint-community/regexpp@4.12.1': {} 4619 4620 - '@eslint/config-array@0.18.0': 4621 dependencies: 4622 '@eslint/object-schema': 2.1.4 4623 debug: 4.3.6 ··· 4625 transitivePeerDependencies: 4626 - supports-color 4627 4628 - '@eslint/core@0.7.0': {} 4629 4630 - '@eslint/eslintrc@3.1.0': 4631 dependencies: 4632 ajv: 6.12.6 4633 debug: 4.3.6 ··· 4641 transitivePeerDependencies: 4642 - supports-color 4643 4644 - '@eslint/js@9.14.0': {} 4645 4646 '@eslint/object-schema@2.1.4': {} 4647 4648 - '@eslint/plugin-kit@0.2.2': 4649 dependencies: 4650 levn: 0.4.1 4651 ··· 7028 7029 '@sapphire/snowflake@3.5.3': {} 7030 7031 '@swc/counter@0.1.3': {} 7032 7033 '@swc/helpers@0.5.13': ··· 7107 7108 '@types/unist@3.0.2': {} 7109 7110 - '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': 7111 dependencies: 7112 '@eslint-community/regexpp': 4.11.0 7113 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7114 '@typescript-eslint/scope-manager': 8.13.0 7115 - '@typescript-eslint/type-utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7116 - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7117 '@typescript-eslint/visitor-keys': 8.13.0 7118 - eslint: 9.14.0(jiti@1.21.6) 7119 graphemer: 1.4.0 7120 ignore: 5.3.1 7121 natural-compare: 1.4.0 ··· 7125 transitivePeerDependencies: 7126 - supports-color 7127 7128 - '@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': 7129 dependencies: 7130 '@typescript-eslint/scope-manager': 8.13.0 7131 '@typescript-eslint/types': 8.13.0 7132 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7133 '@typescript-eslint/visitor-keys': 8.13.0 7134 debug: 4.3.6 7135 - eslint: 9.14.0(jiti@1.21.6) 7136 optionalDependencies: 7137 typescript: 5.6.3 7138 transitivePeerDependencies: ··· 7143 '@typescript-eslint/types': 8.13.0 7144 '@typescript-eslint/visitor-keys': 8.13.0 7145 7146 - '@typescript-eslint/type-utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': 7147 dependencies: 7148 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7149 - '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7150 debug: 4.3.6 7151 ts-api-utils: 1.4.0(typescript@5.6.3) 7152 optionalDependencies: ··· 7155 - eslint 7156 - supports-color 7157 7158 '@typescript-eslint/types@8.13.0': {} 7159 7160 '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': 7161 dependencies: ··· 7172 transitivePeerDependencies: 7173 - supports-color 7174 7175 - '@typescript-eslint/utils@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3)': 7176 dependencies: 7177 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6)) 7178 '@typescript-eslint/scope-manager': 8.13.0 7179 '@typescript-eslint/types': 8.13.0 7180 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7181 - eslint: 9.14.0(jiti@1.21.6) 7182 transitivePeerDependencies: 7183 - supports-color 7184 - typescript 7185 7186 '@typescript-eslint/visitor-keys@8.13.0': 7187 dependencies: 7188 '@typescript-eslint/types': 8.13.0 7189 eslint-visitor-keys: 3.4.3 7190 7191 '@ungap/structured-clone@1.2.0': {} 7192 ··· 7513 shebang-command: 2.0.0 7514 which: 2.0.2 7515 7516 cssesc@3.0.0: {} 7517 7518 csstype@3.1.3: {} ··· 7767 7768 escape-string-regexp@4.0.0: {} 7769 7770 - eslint-config-next@15.0.3(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3): 7771 dependencies: 7772 '@next/eslint-plugin-next': 15.0.3 7773 '@rushstack/eslint-patch': 1.10.4 7774 - '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7775 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7776 - eslint: 9.14.0(jiti@1.21.6) 7777 eslint-import-resolver-node: 0.3.9 7778 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@1.21.6)) 7779 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)) 7780 - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0(jiti@1.21.6)) 7781 - eslint-plugin-react: 7.37.2(eslint@9.14.0(jiti@1.21.6)) 7782 - eslint-plugin-react-hooks: 5.0.0(eslint@9.14.0(jiti@1.21.6)) 7783 optionalDependencies: 7784 typescript: 5.6.3 7785 transitivePeerDependencies: ··· 7794 transitivePeerDependencies: 7795 - supports-color 7796 7797 - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@1.21.6)): 7798 dependencies: 7799 debug: 4.3.6 7800 enhanced-resolve: 5.17.1 7801 - eslint: 9.14.0(jiti@1.21.6) 7802 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)) 7803 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)) 7804 fast-glob: 3.3.2 7805 get-tsconfig: 4.7.6 7806 is-core-module: 2.15.0 ··· 7811 - eslint-import-resolver-webpack 7812 - supports-color 7813 7814 - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)): 7815 dependencies: 7816 debug: 3.2.7 7817 optionalDependencies: 7818 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7819 - eslint: 9.14.0(jiti@1.21.6) 7820 eslint-import-resolver-node: 0.3.9 7821 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@1.21.6)) 7822 transitivePeerDependencies: 7823 - supports-color 7824 7825 - eslint-module-utils@2.8.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)): 7826 dependencies: 7827 debug: 3.2.7 7828 optionalDependencies: 7829 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7830 - eslint: 9.14.0(jiti@1.21.6) 7831 eslint-import-resolver-node: 0.3.9 7832 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.14.0(jiti@1.21.6)) 7833 transitivePeerDependencies: 7834 - supports-color 7835 7836 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)): 7837 dependencies: 7838 '@rtsao/scc': 1.1.0 7839 array-includes: 3.1.8 ··· 7842 array.prototype.flatmap: 1.3.2 7843 debug: 3.2.7 7844 doctrine: 2.1.0 7845 - eslint: 9.14.0(jiti@1.21.6) 7846 eslint-import-resolver-node: 0.3.9 7847 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.14.0(jiti@1.21.6)) 7848 hasown: 2.0.2 7849 is-core-module: 2.15.1 7850 is-glob: 4.0.3 ··· 7856 string.prototype.trimend: 1.0.8 7857 tsconfig-paths: 3.15.0 7858 optionalDependencies: 7859 - '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7860 transitivePeerDependencies: 7861 - eslint-import-resolver-typescript 7862 - eslint-import-resolver-webpack 7863 - supports-color 7864 7865 - eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0(jiti@1.21.6)): 7866 dependencies: 7867 aria-query: 5.3.2 7868 array-includes: 3.1.8 ··· 7872 axobject-query: 4.1.0 7873 damerau-levenshtein: 1.0.8 7874 emoji-regex: 9.2.2 7875 - eslint: 9.14.0(jiti@1.21.6) 7876 hasown: 2.0.2 7877 jsx-ast-utils: 3.3.5 7878 language-tags: 1.0.9 ··· 7881 safe-regex-test: 1.0.3 7882 string.prototype.includes: 2.0.1 7883 7884 - eslint-plugin-path-alias@2.1.0(eslint@9.14.0(jiti@1.21.6)): 7885 dependencies: 7886 - eslint: 9.14.0(jiti@1.21.6) 7887 find-pkg: 2.0.0 7888 get-tsconfig: 4.7.6 7889 nanomatch: 1.2.13 7890 transitivePeerDependencies: 7891 - supports-color 7892 7893 - eslint-plugin-react-compiler@19.0.0-beta-63b359f-20241101(eslint@9.14.0(jiti@1.21.6)): 7894 dependencies: 7895 '@babel/core': 7.25.2 7896 '@babel/parser': 7.25.3 7897 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) 7898 - eslint: 9.14.0(jiti@1.21.6) 7899 hermes-parser: 0.20.1 7900 zod: 3.23.8 7901 zod-validation-error: 3.3.1(zod@3.23.8) 7902 transitivePeerDependencies: 7903 - supports-color 7904 7905 - eslint-plugin-react-hooks@5.0.0(eslint@9.14.0(jiti@1.21.6)): 7906 dependencies: 7907 - eslint: 9.14.0(jiti@1.21.6) 7908 7909 - eslint-plugin-react@7.37.2(eslint@9.14.0(jiti@1.21.6)): 7910 dependencies: 7911 array-includes: 3.1.8 7912 array.prototype.findlast: 1.2.5 ··· 7914 array.prototype.tosorted: 1.1.4 7915 doctrine: 2.1.0 7916 es-iterator-helpers: 1.2.0 7917 - eslint: 9.14.0(jiti@1.21.6) 7918 estraverse: 5.3.0 7919 hasown: 2.0.2 7920 jsx-ast-utils: 3.3.5 ··· 7928 string.prototype.matchall: 4.0.11 7929 string.prototype.repeat: 1.0.0 7930 7931 - eslint-plugin-simple-import-sort@12.1.1(eslint@9.14.0(jiti@1.21.6)): 7932 dependencies: 7933 - eslint: 9.14.0(jiti@1.21.6) 7934 7935 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6)): 7936 dependencies: 7937 - eslint: 9.14.0(jiti@1.21.6) 7938 optionalDependencies: 7939 - '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) 7940 7941 eslint-scope@8.2.0: 7942 dependencies: ··· 7947 7948 eslint-visitor-keys@4.2.0: {} 7949 7950 - eslint@9.14.0(jiti@1.21.6): 7951 dependencies: 7952 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.14.0(jiti@1.21.6)) 7953 '@eslint-community/regexpp': 4.12.1 7954 - '@eslint/config-array': 0.18.0 7955 - '@eslint/core': 0.7.0 7956 - '@eslint/eslintrc': 3.1.0 7957 - '@eslint/js': 9.14.0 7958 - '@eslint/plugin-kit': 0.2.2 7959 '@humanfs/node': 0.16.6 7960 '@humanwhocodes/module-importer': 1.0.1 7961 '@humanwhocodes/retry': 0.4.1 ··· 7963 '@types/json-schema': 7.0.15 7964 ajv: 6.12.6 7965 chalk: 4.1.2 7966 - cross-spawn: 7.0.3 7967 debug: 4.3.6 7968 escape-string-regexp: 4.0.0 7969 eslint-scope: 8.2.0 ··· 7983 minimatch: 3.1.2 7984 natural-compare: 1.4.0 7985 optionator: 0.9.4 7986 - text-table: 0.2.0 7987 optionalDependencies: 7988 jiti: 1.21.6 7989 transitivePeerDependencies: ··· 9101 9102 picomatch@2.3.1: {} 9103 9104 pify@2.3.0: {} 9105 9106 pirates@4.0.6: {} ··· 9657 9658 tapable@2.2.1: {} 9659 9660 - text-table@0.2.0: {} 9661 - 9662 thenify-all@1.6.0: 9663 dependencies: 9664 thenify: 3.3.1 ··· 9740 has-proto: 1.0.3 9741 is-typed-array: 1.1.13 9742 possible-typed-array-names: 1.0.0 9743 9744 typescript@5.6.3: {} 9745
··· 108 specifier: ^5.0.1 109 version: 5.0.1(@types/react@18.3.12)(react@19.0.0-rc-5c56b873-20241107)(use-sync-external-store@1.2.0(react@19.0.0-rc-5c56b873-20241107)) 110 devDependencies: 111 + '@next/eslint-plugin-next': 112 + specifier: ^15.0.3 113 + version: 15.0.3 114 '@octokit/types': 115 specifier: ^13.6.1 116 version: 13.6.1 117 + '@stylistic/eslint-plugin': 118 + specifier: ^2.11.0 119 + version: 2.11.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 120 '@types/node': 121 specifier: ^22.9.0 122 version: 22.9.0 ··· 126 '@types/react-dom': 127 specifier: ^18.3.1 128 version: 18.3.1 129 eslint: 130 + specifier: ^9.15.0 131 + version: 9.15.0(jiti@1.21.6) 132 eslint-config-next: 133 specifier: ^15.0.3 134 + version: 15.0.3(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 135 eslint-plugin-path-alias: 136 specifier: ^2.1.0 137 + version: 2.1.0(eslint@9.15.0(jiti@1.21.6)) 138 eslint-plugin-react: 139 specifier: ^7.37.2 140 + version: 7.37.2(eslint@9.15.0(jiti@1.21.6)) 141 eslint-plugin-react-compiler: 142 specifier: 19.0.0-beta-63b359f-20241101 143 + version: 19.0.0-beta-63b359f-20241101(eslint@9.15.0(jiti@1.21.6)) 144 + eslint-plugin-react-hooks: 145 + specifier: ^5.0.0 146 + version: 5.0.0(eslint@9.15.0(jiti@1.21.6)) 147 eslint-plugin-simple-import-sort: 148 specifier: ^12.1.1 149 + version: 12.1.1(eslint@9.15.0(jiti@1.21.6)) 150 eslint-plugin-unused-imports: 151 specifier: ^4.1.4 152 + version: 4.1.4(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)) 153 + typescript-eslint: 154 + specifier: ^8.15.0 155 + version: 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 156 157 packages: 158 ··· 307 resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 308 engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 309 310 + '@eslint/config-array@0.19.0': 311 + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} 312 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 313 314 + '@eslint/core@0.9.0': 315 + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} 316 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 317 318 + '@eslint/eslintrc@3.2.0': 319 + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 320 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 321 322 + '@eslint/js@9.15.0': 323 + resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} 324 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 325 326 '@eslint/object-schema@2.1.4': 327 resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 328 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 329 330 + '@eslint/plugin-kit@0.2.3': 331 + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} 332 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 333 334 '@floating-ui/core@1.6.8': ··· 1907 resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} 1908 engines: {node: '>=v14.0.0', npm: '>=7.0.0'} 1909 1910 + '@stylistic/eslint-plugin@2.11.0': 1911 + resolution: {integrity: sha512-PNRHbydNG5EH8NK4c+izdJlxajIR6GxcUhzsYNRsn6Myep4dsZt0qFCz3rCPnkvgO5FYibDcMqgNHUT+zvjYZw==} 1912 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1913 + peerDependencies: 1914 + eslint: '>=8.40.0' 1915 + 1916 '@swc/counter@0.1.3': 1917 resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 1918 ··· 2005 typescript: 2006 optional: true 2007 2008 + '@typescript-eslint/eslint-plugin@8.15.0': 2009 + resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} 2010 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2011 + peerDependencies: 2012 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 2013 + eslint: ^8.57.0 || ^9.0.0 2014 + typescript: '*' 2015 + peerDependenciesMeta: 2016 + typescript: 2017 + optional: true 2018 + 2019 '@typescript-eslint/parser@8.13.0': 2020 resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} 2021 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 2026 typescript: 2027 optional: true 2028 2029 + '@typescript-eslint/parser@8.15.0': 2030 + resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} 2031 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2032 + peerDependencies: 2033 + eslint: ^8.57.0 || ^9.0.0 2034 + typescript: '*' 2035 + peerDependenciesMeta: 2036 + typescript: 2037 + optional: true 2038 + 2039 '@typescript-eslint/scope-manager@8.13.0': 2040 resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} 2041 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2042 + 2043 + '@typescript-eslint/scope-manager@8.15.0': 2044 + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} 2045 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2046 2047 '@typescript-eslint/type-utils@8.13.0': ··· 2053 typescript: 2054 optional: true 2055 2056 + '@typescript-eslint/type-utils@8.15.0': 2057 + resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} 2058 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2059 + peerDependencies: 2060 + eslint: ^8.57.0 || ^9.0.0 2061 + typescript: '*' 2062 + peerDependenciesMeta: 2063 + typescript: 2064 + optional: true 2065 + 2066 '@typescript-eslint/types@8.13.0': 2067 resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} 2068 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2069 + 2070 + '@typescript-eslint/types@8.15.0': 2071 + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} 2072 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2073 2074 '@typescript-eslint/typescript-estree@8.13.0': ··· 2080 typescript: 2081 optional: true 2082 2083 + '@typescript-eslint/typescript-estree@8.15.0': 2084 + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} 2085 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2086 + peerDependencies: 2087 + typescript: '*' 2088 + peerDependenciesMeta: 2089 + typescript: 2090 + optional: true 2091 + 2092 '@typescript-eslint/utils@8.13.0': 2093 resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} 2094 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2095 peerDependencies: 2096 eslint: ^8.57.0 || ^9.0.0 2097 2098 + '@typescript-eslint/utils@8.15.0': 2099 + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} 2100 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2101 + peerDependencies: 2102 + eslint: ^8.57.0 || ^9.0.0 2103 + typescript: '*' 2104 + peerDependenciesMeta: 2105 + typescript: 2106 + optional: true 2107 + 2108 '@typescript-eslint/visitor-keys@8.13.0': 2109 resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} 2110 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2111 + 2112 + '@typescript-eslint/visitor-keys@8.15.0': 2113 + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} 2114 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2115 2116 '@ungap/structured-clone@1.2.0': ··· 2414 resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 2415 engines: {node: '>= 8'} 2416 2417 + cross-spawn@7.0.6: 2418 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 2419 + engines: {node: '>= 8'} 2420 + 2421 cssesc@3.0.0: 2422 resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 2423 engines: {node: '>=4'} ··· 2772 resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 2773 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2774 2775 + eslint@9.15.0: 2776 + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} 2777 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2778 hasBin: true 2779 peerDependencies: ··· 3746 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 3747 engines: {node: '>=8.6'} 3748 3749 + picomatch@4.0.2: 3750 + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 3751 + engines: {node: '>=12'} 3752 + 3753 pify@2.3.0: 3754 resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 3755 engines: {node: '>=0.10.0'} ··· 4205 tapable@2.2.1: 4206 resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 4207 engines: {node: '>=6'} 4208 4209 thenify-all@1.6.0: 4210 resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} ··· 4273 resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} 4274 engines: {node: '>= 0.4'} 4275 4276 + typescript-eslint@8.15.0: 4277 + resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} 4278 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 4279 + peerDependencies: 4280 + eslint: ^8.57.0 || ^9.0.0 4281 + typescript: '*' 4282 + peerDependenciesMeta: 4283 + typescript: 4284 + optional: true 4285 + 4286 typescript@5.6.3: 4287 resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 4288 engines: {node: '>=14.17'} ··· 4697 tslib: 2.6.3 4698 optional: true 4699 4700 + '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0(jiti@1.21.6))': 4701 dependencies: 4702 + eslint: 9.15.0(jiti@1.21.6) 4703 eslint-visitor-keys: 3.4.3 4704 4705 '@eslint-community/regexpp@4.11.0': {} 4706 4707 '@eslint-community/regexpp@4.12.1': {} 4708 4709 + '@eslint/config-array@0.19.0': 4710 dependencies: 4711 '@eslint/object-schema': 2.1.4 4712 debug: 4.3.6 ··· 4714 transitivePeerDependencies: 4715 - supports-color 4716 4717 + '@eslint/core@0.9.0': {} 4718 4719 + '@eslint/eslintrc@3.2.0': 4720 dependencies: 4721 ajv: 6.12.6 4722 debug: 4.3.6 ··· 4730 transitivePeerDependencies: 4731 - supports-color 4732 4733 + '@eslint/js@9.15.0': {} 4734 4735 '@eslint/object-schema@2.1.4': {} 4736 4737 + '@eslint/plugin-kit@0.2.3': 4738 dependencies: 4739 levn: 0.4.1 4740 ··· 7117 7118 '@sapphire/snowflake@3.5.3': {} 7119 7120 + '@stylistic/eslint-plugin@2.11.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7121 + dependencies: 7122 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7123 + eslint: 9.15.0(jiti@1.21.6) 7124 + eslint-visitor-keys: 4.2.0 7125 + espree: 10.3.0 7126 + estraverse: 5.3.0 7127 + picomatch: 4.0.2 7128 + transitivePeerDependencies: 7129 + - supports-color 7130 + - typescript 7131 + 7132 '@swc/counter@0.1.3': {} 7133 7134 '@swc/helpers@0.5.13': ··· 7208 7209 '@types/unist@3.0.2': {} 7210 7211 + '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7212 dependencies: 7213 '@eslint-community/regexpp': 4.11.0 7214 + '@typescript-eslint/parser': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7215 '@typescript-eslint/scope-manager': 8.13.0 7216 + '@typescript-eslint/type-utils': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7217 + '@typescript-eslint/utils': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7218 '@typescript-eslint/visitor-keys': 8.13.0 7219 + eslint: 9.15.0(jiti@1.21.6) 7220 graphemer: 1.4.0 7221 ignore: 5.3.1 7222 natural-compare: 1.4.0 ··· 7226 transitivePeerDependencies: 7227 - supports-color 7228 7229 + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7230 + dependencies: 7231 + '@eslint-community/regexpp': 4.12.1 7232 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7233 + '@typescript-eslint/scope-manager': 8.15.0 7234 + '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7235 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7236 + '@typescript-eslint/visitor-keys': 8.15.0 7237 + eslint: 9.15.0(jiti@1.21.6) 7238 + graphemer: 1.4.0 7239 + ignore: 5.3.1 7240 + natural-compare: 1.4.0 7241 + ts-api-utils: 1.4.0(typescript@5.6.3) 7242 + optionalDependencies: 7243 + typescript: 5.6.3 7244 + transitivePeerDependencies: 7245 + - supports-color 7246 + 7247 + '@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7248 dependencies: 7249 '@typescript-eslint/scope-manager': 8.13.0 7250 '@typescript-eslint/types': 8.13.0 7251 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7252 '@typescript-eslint/visitor-keys': 8.13.0 7253 debug: 4.3.6 7254 + eslint: 9.15.0(jiti@1.21.6) 7255 + optionalDependencies: 7256 + typescript: 5.6.3 7257 + transitivePeerDependencies: 7258 + - supports-color 7259 + 7260 + '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7261 + dependencies: 7262 + '@typescript-eslint/scope-manager': 8.15.0 7263 + '@typescript-eslint/types': 8.15.0 7264 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) 7265 + '@typescript-eslint/visitor-keys': 8.15.0 7266 + debug: 4.3.6 7267 + eslint: 9.15.0(jiti@1.21.6) 7268 optionalDependencies: 7269 typescript: 5.6.3 7270 transitivePeerDependencies: ··· 7275 '@typescript-eslint/types': 8.13.0 7276 '@typescript-eslint/visitor-keys': 8.13.0 7277 7278 + '@typescript-eslint/scope-manager@8.15.0': 7279 + dependencies: 7280 + '@typescript-eslint/types': 8.15.0 7281 + '@typescript-eslint/visitor-keys': 8.15.0 7282 + 7283 + '@typescript-eslint/type-utils@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7284 dependencies: 7285 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7286 + '@typescript-eslint/utils': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7287 debug: 4.3.6 7288 ts-api-utils: 1.4.0(typescript@5.6.3) 7289 optionalDependencies: ··· 7292 - eslint 7293 - supports-color 7294 7295 + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7296 + dependencies: 7297 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) 7298 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7299 + debug: 4.3.6 7300 + eslint: 9.15.0(jiti@1.21.6) 7301 + ts-api-utils: 1.4.0(typescript@5.6.3) 7302 + optionalDependencies: 7303 + typescript: 5.6.3 7304 + transitivePeerDependencies: 7305 + - supports-color 7306 + 7307 '@typescript-eslint/types@8.13.0': {} 7308 + 7309 + '@typescript-eslint/types@8.15.0': {} 7310 7311 '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': 7312 dependencies: ··· 7323 transitivePeerDependencies: 7324 - supports-color 7325 7326 + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': 7327 + dependencies: 7328 + '@typescript-eslint/types': 8.15.0 7329 + '@typescript-eslint/visitor-keys': 8.15.0 7330 + debug: 4.3.6 7331 + fast-glob: 3.3.2 7332 + is-glob: 4.0.3 7333 + minimatch: 9.0.5 7334 + semver: 7.6.3 7335 + ts-api-utils: 1.4.0(typescript@5.6.3) 7336 + optionalDependencies: 7337 + typescript: 5.6.3 7338 + transitivePeerDependencies: 7339 + - supports-color 7340 + 7341 + '@typescript-eslint/utils@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7342 dependencies: 7343 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) 7344 '@typescript-eslint/scope-manager': 8.13.0 7345 '@typescript-eslint/types': 8.13.0 7346 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) 7347 + eslint: 9.15.0(jiti@1.21.6) 7348 transitivePeerDependencies: 7349 - supports-color 7350 - typescript 7351 7352 + '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': 7353 + dependencies: 7354 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) 7355 + '@typescript-eslint/scope-manager': 8.15.0 7356 + '@typescript-eslint/types': 8.15.0 7357 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) 7358 + eslint: 9.15.0(jiti@1.21.6) 7359 + optionalDependencies: 7360 + typescript: 5.6.3 7361 + transitivePeerDependencies: 7362 + - supports-color 7363 + 7364 '@typescript-eslint/visitor-keys@8.13.0': 7365 dependencies: 7366 '@typescript-eslint/types': 8.13.0 7367 eslint-visitor-keys: 3.4.3 7368 + 7369 + '@typescript-eslint/visitor-keys@8.15.0': 7370 + dependencies: 7371 + '@typescript-eslint/types': 8.15.0 7372 + eslint-visitor-keys: 4.2.0 7373 7374 '@ungap/structured-clone@1.2.0': {} 7375 ··· 7696 shebang-command: 2.0.0 7697 which: 2.0.2 7698 7699 + cross-spawn@7.0.6: 7700 + dependencies: 7701 + path-key: 3.1.1 7702 + shebang-command: 2.0.0 7703 + which: 2.0.2 7704 + 7705 cssesc@3.0.0: {} 7706 7707 csstype@3.1.3: {} ··· 7956 7957 escape-string-regexp@4.0.0: {} 7958 7959 + eslint-config-next@15.0.3(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3): 7960 dependencies: 7961 '@next/eslint-plugin-next': 15.0.3 7962 '@rushstack/eslint-patch': 1.10.4 7963 + '@typescript-eslint/eslint-plugin': 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7964 + '@typescript-eslint/parser': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 7965 + eslint: 9.15.0(jiti@1.21.6) 7966 eslint-import-resolver-node: 0.3.9 7967 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@1.21.6)) 7968 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)) 7969 + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.15.0(jiti@1.21.6)) 7970 + eslint-plugin-react: 7.37.2(eslint@9.15.0(jiti@1.21.6)) 7971 + eslint-plugin-react-hooks: 5.0.0(eslint@9.15.0(jiti@1.21.6)) 7972 optionalDependencies: 7973 typescript: 5.6.3 7974 transitivePeerDependencies: ··· 7983 transitivePeerDependencies: 7984 - supports-color 7985 7986 + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@1.21.6)): 7987 dependencies: 7988 debug: 4.3.6 7989 enhanced-resolve: 5.17.1 7990 + eslint: 9.15.0(jiti@1.21.6) 7991 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.15.0(jiti@1.21.6)) 7992 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)) 7993 fast-glob: 3.3.2 7994 get-tsconfig: 4.7.6 7995 is-core-module: 2.15.0 ··· 8000 - eslint-import-resolver-webpack 8001 - supports-color 8002 8003 + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.15.0(jiti@1.21.6)): 8004 dependencies: 8005 debug: 3.2.7 8006 optionalDependencies: 8007 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 8008 + eslint: 9.15.0(jiti@1.21.6) 8009 eslint-import-resolver-node: 0.3.9 8010 transitivePeerDependencies: 8011 - supports-color 8012 8013 + eslint-module-utils@2.8.1(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.15.0(jiti@1.21.6)): 8014 dependencies: 8015 debug: 3.2.7 8016 optionalDependencies: 8017 + '@typescript-eslint/parser': 8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 8018 + eslint: 9.15.0(jiti@1.21.6) 8019 eslint-import-resolver-node: 0.3.9 8020 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@8.13.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@1.21.6)) 8021 transitivePeerDependencies: 8022 - supports-color 8023 8024 + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)): 8025 dependencies: 8026 '@rtsao/scc': 1.1.0 8027 array-includes: 3.1.8 ··· 8030 array.prototype.flatmap: 1.3.2 8031 debug: 3.2.7 8032 doctrine: 2.1.0 8033 + eslint: 9.15.0(jiti@1.21.6) 8034 eslint-import-resolver-node: 0.3.9 8035 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.15.0(jiti@1.21.6)) 8036 hasown: 2.0.2 8037 is-core-module: 2.15.1 8038 is-glob: 4.0.3 ··· 8044 string.prototype.trimend: 1.0.8 8045 tsconfig-paths: 3.15.0 8046 optionalDependencies: 8047 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 8048 transitivePeerDependencies: 8049 - eslint-import-resolver-typescript 8050 - eslint-import-resolver-webpack 8051 - supports-color 8052 8053 + eslint-plugin-jsx-a11y@6.10.2(eslint@9.15.0(jiti@1.21.6)): 8054 dependencies: 8055 aria-query: 5.3.2 8056 array-includes: 3.1.8 ··· 8060 axobject-query: 4.1.0 8061 damerau-levenshtein: 1.0.8 8062 emoji-regex: 9.2.2 8063 + eslint: 9.15.0(jiti@1.21.6) 8064 hasown: 2.0.2 8065 jsx-ast-utils: 3.3.5 8066 language-tags: 1.0.9 ··· 8069 safe-regex-test: 1.0.3 8070 string.prototype.includes: 2.0.1 8071 8072 + eslint-plugin-path-alias@2.1.0(eslint@9.15.0(jiti@1.21.6)): 8073 dependencies: 8074 + eslint: 9.15.0(jiti@1.21.6) 8075 find-pkg: 2.0.0 8076 get-tsconfig: 4.7.6 8077 nanomatch: 1.2.13 8078 transitivePeerDependencies: 8079 - supports-color 8080 8081 + eslint-plugin-react-compiler@19.0.0-beta-63b359f-20241101(eslint@9.15.0(jiti@1.21.6)): 8082 dependencies: 8083 '@babel/core': 7.25.2 8084 '@babel/parser': 7.25.3 8085 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.25.2) 8086 + eslint: 9.15.0(jiti@1.21.6) 8087 hermes-parser: 0.20.1 8088 zod: 3.23.8 8089 zod-validation-error: 3.3.1(zod@3.23.8) 8090 transitivePeerDependencies: 8091 - supports-color 8092 8093 + eslint-plugin-react-hooks@5.0.0(eslint@9.15.0(jiti@1.21.6)): 8094 dependencies: 8095 + eslint: 9.15.0(jiti@1.21.6) 8096 8097 + eslint-plugin-react@7.37.2(eslint@9.15.0(jiti@1.21.6)): 8098 dependencies: 8099 array-includes: 3.1.8 8100 array.prototype.findlast: 1.2.5 ··· 8102 array.prototype.tosorted: 1.1.4 8103 doctrine: 2.1.0 8104 es-iterator-helpers: 1.2.0 8105 + eslint: 9.15.0(jiti@1.21.6) 8106 estraverse: 5.3.0 8107 hasown: 2.0.2 8108 jsx-ast-utils: 3.3.5 ··· 8116 string.prototype.matchall: 4.0.11 8117 string.prototype.repeat: 1.0.0 8118 8119 + eslint-plugin-simple-import-sort@12.1.1(eslint@9.15.0(jiti@1.21.6)): 8120 dependencies: 8121 + eslint: 9.15.0(jiti@1.21.6) 8122 8123 + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6)): 8124 dependencies: 8125 + eslint: 9.15.0(jiti@1.21.6) 8126 optionalDependencies: 8127 + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 8128 8129 eslint-scope@8.2.0: 8130 dependencies: ··· 8135 8136 eslint-visitor-keys@4.2.0: {} 8137 8138 + eslint@9.15.0(jiti@1.21.6): 8139 dependencies: 8140 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0(jiti@1.21.6)) 8141 '@eslint-community/regexpp': 4.12.1 8142 + '@eslint/config-array': 0.19.0 8143 + '@eslint/core': 0.9.0 8144 + '@eslint/eslintrc': 3.2.0 8145 + '@eslint/js': 9.15.0 8146 + '@eslint/plugin-kit': 0.2.3 8147 '@humanfs/node': 0.16.6 8148 '@humanwhocodes/module-importer': 1.0.1 8149 '@humanwhocodes/retry': 0.4.1 ··· 8151 '@types/json-schema': 7.0.15 8152 ajv: 6.12.6 8153 chalk: 4.1.2 8154 + cross-spawn: 7.0.6 8155 debug: 4.3.6 8156 escape-string-regexp: 4.0.0 8157 eslint-scope: 8.2.0 ··· 8171 minimatch: 3.1.2 8172 natural-compare: 1.4.0 8173 optionator: 0.9.4 8174 optionalDependencies: 8175 jiti: 1.21.6 8176 transitivePeerDependencies: ··· 9288 9289 picomatch@2.3.1: {} 9290 9291 + picomatch@4.0.2: {} 9292 + 9293 pify@2.3.0: {} 9294 9295 pirates@4.0.6: {} ··· 9846 9847 tapable@2.2.1: {} 9848 9849 thenify-all@1.6.0: 9850 dependencies: 9851 thenify: 3.3.1 ··· 9927 has-proto: 1.0.3 9928 is-typed-array: 1.1.13 9929 possible-typed-array-names: 1.0.0 9930 + 9931 + typescript-eslint@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3): 9932 + dependencies: 9933 + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 9934 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 9935 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) 9936 + eslint: 9.15.0(jiti@1.21.6) 9937 + optionalDependencies: 9938 + typescript: 5.6.3 9939 + transitivePeerDependencies: 9940 + - supports-color 9941 9942 typescript@5.6.3: {} 9943
+3 -3
utils/authorize-user.ts
··· 1 - import React from "react"; 2 3 - import { User } from "@/common/user"; 4 - import { ApiError } from "@/typings"; 5 6 enum State { 7 Idle = 0,
··· 1 + import type React from "react"; 2 3 + import type { User } from "@/common/user"; 4 + import type { ApiError } from "@/typings"; 5 6 enum State { 7 Idle = 0,
+1 -1
utils/cn.ts
··· 1 - import { ClassValue, clsx } from "clsx"; 2 import { twMerge } from "tailwind-merge"; 3 4 export function cn(...inputs: ClassValue[]) {
··· 1 + import { type ClassValue, clsx } from "clsx"; 2 import { twMerge } from "tailwind-merge"; 3 4 export function cn(...inputs: ClassValue[]) {
+4 -3
utils/create-selectable-items.tsx
··· 1 - import { ApiV1GuildsChannelsGetResponse, ApiV1GuildsEmojisGetResponse, ApiV1GuildsRolesGetResponse, PermissionFlagsBits } from "@/typings"; 2 import Image from "next/image"; 3 4 type Item = ApiV1GuildsChannelsGetResponse | ApiV1GuildsRolesGetResponse; 5 - type PermissionNames = keyof typeof PermissionFlagsBits | "RoleHirachy" 6 7 function parsePermissions(permissions: number, required: PermissionNames[]) { 8 if (permissions === -1 && required.includes("RoleHirachy")) return ["Role is above Wamellow"]; ··· 49 name: c.name.replace(/-|_/g, " "), 50 value: c.id 51 })) 52 - ] 53 }
··· 1 import Image from "next/image"; 2 + 3 + import { type ApiV1GuildsChannelsGetResponse, type ApiV1GuildsEmojisGetResponse, type ApiV1GuildsRolesGetResponse, PermissionFlagsBits } from "@/typings"; 4 5 type Item = ApiV1GuildsChannelsGetResponse | ApiV1GuildsRolesGetResponse; 6 + type PermissionNames = keyof typeof PermissionFlagsBits | "RoleHirachy"; 7 8 function parsePermissions(permissions: number, required: PermissionNames[]) { 9 if (permissions === -1 && required.includes("RoleHirachy")) return ["Role is above Wamellow"]; ··· 50 name: c.name.replace(/-|_/g, " "), 51 value: c.id 52 })) 53 + ]; 54 }
+1 -1
utils/filter-duplicates.ts
··· 1 - export const filterDuplicates = (strings: string[]) => [...new Set(strings)]
··· 1 + export const filterDuplicates = (strings: string[]) => [...new Set(strings)];