Compare commits

...

5 Commits

Author SHA1 Message Date
dependabot[bot]
5c9e3c7db3
chore(deps): bump react-day-picker from 8.10.1 to 9.5.1
Bumps [react-day-picker](https://github.com/gpbl/react-day-picker) from 8.10.1 to 9.5.1.
- [Release notes](https://github.com/gpbl/react-day-picker/releases)
- [Changelog](https://github.com/gpbl/react-day-picker/blob/main/CHANGELOG.md)
- [Commits](https://github.com/gpbl/react-day-picker/compare/v8.10.1...v9.5.1)

---
updated-dependencies:
- dependency-name: react-day-picker
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 16:34:14 +00:00
dvelo
d679e19b84 chore(next): move to Next.js 15 2025-03-01 10:31:11 -06:00
dvelo
2551dabf82 fix: add 404 page 2025-03-01 10:00:09 -06:00
dvelo
f000cdeaf9 fix: it was a good run, but I don't have the time for this anymore 😭 2025-03-01 08:58:45 -06:00
dvelo
98c834dad5
fix: what is this? 😭 2025-02-26 20:39:50 -06:00
15 changed files with 431 additions and 520 deletions

@ -46,7 +46,7 @@
"next": "15.1.6", "next": "15.1.6",
"next-themes": "^0.4.4", "next-themes": "^0.4.4",
"react": "^19.0.0", "react": "^19.0.0",
"react-day-picker": "8.10.1", "react-day-picker": "9.5.1",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-hook-form": "^7.54.2", "react-hook-form": "^7.54.2",
"react-resizable-panels": "^2.1.7", "react-resizable-panels": "^2.1.7",

@ -46,7 +46,7 @@
"next": "15.1.6", "next": "15.1.6",
"next-themes": "^0.4.4", "next-themes": "^0.4.4",
"react": "^19.0.0", "react": "^19.0.0",
"react-day-picker": "8.10.1", "react-day-picker": "9.5.1",
"react-dom": "^19.0.0", "react-dom": "^19.0.0",
"react-hook-form": "^7.54.2", "react-hook-form": "^7.54.2",
"react-resizable-panels": "^2.1.7", "react-resizable-panels": "^2.1.7",

@ -32,23 +32,29 @@ import { withContentlayer } from "next-contentlayer";
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
images: { images: {
remotePatterns: [ remotePatterns: [
{ {
protocol: "https", protocol: "https",
hostname: "img.clerk.com", hostname: "img.clerk.com",
}, },
], ],
}, },
async redirects() { async redirects() {
return [ return [
{ {
source: '/docs', source: "/docs",
destination: '/docs/getting-started', destination: "/docs/getting-started",
permanent: true, permanent: true,
}, },
] ];
}, },
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: true,
},
}; };
export default withContentlayer(nextConfig); export default withContentlayer(nextConfig);

@ -16,8 +16,9 @@
"dependencies": { "dependencies": {
"@babel/parser": "^7.24.7", "@babel/parser": "^7.24.7",
"@biomejs/biome": "^1.8.3", "@biomejs/biome": "^1.8.3",
"@clerk/elements": "^0.22.2", "@clerk/elements": "^0.23.0",
"@clerk/nextjs": "^6.9.2", "@clerk/nextjs": "^6.12.1",
"@clerk/themes": "^2.2.20",
"@emotion/is-prop-valid": "^1.3.0", "@emotion/is-prop-valid": "^1.3.0",
"@linear/sdk": "^31.0.0", "@linear/sdk": "^31.0.0",
"@monaco-editor/react": "^4.6.0", "@monaco-editor/react": "^4.6.0",
@ -46,7 +47,7 @@
"minimessage-2-html": "1.6.0", "minimessage-2-html": "1.6.0",
"minimessage-js": "^1.1.3", "minimessage-js": "^1.1.3",
"mongodb": "^6.8.0", "mongodb": "^6.8.0",
"next": "14.2.10", "next": "^15.2.0",
"next-contentlayer": "^0.3.4", "next-contentlayer": "^0.3.4",
"next-css-obfuscator": "^2.2.16", "next-css-obfuscator": "^2.2.16",
"next-sitemap": "^4.2.3", "next-sitemap": "^4.2.3",
@ -55,8 +56,8 @@
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"postcss-obfuscator": "^1.6.1", "postcss-obfuscator": "^1.6.1",
"prettier": "^3.3.1", "prettier": "^3.3.1",
"react": "^18", "react": "18.3.1",
"react-dom": "^18", "react-dom": "18.3.1",
"react-fade-in": "^2.0.1", "react-fade-in": "^2.0.1",
"react-fast-marquee": "^1.6.5", "react-fast-marquee": "^1.6.5",
"react-hot-toast": "^2.4.1", "react-hot-toast": "^2.4.1",
@ -92,8 +93,8 @@
"@types/canvas-confetti": "^1.6.4", "@types/canvas-confetti": "^1.6.4",
"@types/node": "^20", "@types/node": "^20",
"@types/nprogress": "^0.2.3", "@types/nprogress": "^0.2.3",
"@types/react": "^18", "@types/react": "19.0.10",
"@types/react-dom": "^18", "@types/react-dom": "19.0.4",
"@types/react-twemoji": "^0.4.3", "@types/react-twemoji": "^0.4.3",
"@unocss/eslint-config": "^0.61.5", "@unocss/eslint-config": "^0.61.5",
"@unocss/preset-uno": "^0.61.5", "@unocss/preset-uno": "^0.61.5",
@ -105,7 +106,7 @@
"clsx": "^2.1.1", "clsx": "^2.1.1",
"cmdk": "^1.0.0", "cmdk": "^1.0.0",
"eslint": "^8", "eslint": "^8",
"eslint-config-next": "14.2.3", "eslint-config-next": "15.2.0",
"framer-motion": "^11.3.8", "framer-motion": "^11.3.8",
"geist": "^1.3.0", "geist": "^1.3.0",
"mangle-css-class-webpack-plugin": "^5.1.0", "mangle-css-class-webpack-plugin": "^5.1.0",
@ -121,5 +122,9 @@
"typescript": "^5", "typescript": "^5",
"vaul": "^0.9.1", "vaul": "^0.9.1",
"zod": "^3.23.8" "zod": "^3.23.8"
},
"resolutions": {
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4"
} }
} }

@ -1,3 +1,4 @@
import { use } from "react";
/* /*
* MHSF, Minehut Server List * MHSF, Minehut Server List
* All external content is rather licensed under the ECA Agreement * All external content is rather licensed under the ECA Agreement
@ -41,28 +42,30 @@ import { notFound } from "next/navigation";
export const generateStaticParams = async () => export const generateStaticParams = async () =>
allDocs.map((post) => ({ slug: [post._raw.flattenedPath] })); allDocs.map((post) => ({ slug: [post._raw.flattenedPath] }));
export const generateMetadata = ({ export const generateMetadata = async (
params, props: {
}: { params: Promise<{ slug: string[] }>;
params: { slug: string[] }; }
}) => { ) => {
const post = allDocs.find( const params = await props.params;
const post = allDocs.find(
(post) => post._raw.flattenedPath === params.slug.join("/"), (post) => post._raw.flattenedPath === params.slug.join("/"),
); );
if (!post) notFound(); if (!post) notFound();
return { title: post.title + " | MHSF Docs", themeColor: "#000000" }; return { title: post.title + " | MHSF Docs", themeColor: "#000000" };
}; };
const PostLayout = ({ params }: { params: { slug: string[] } }) => { const PostLayout = (props0: { params: Promise<{ slug: string[] }> }) => {
const doc = allDocs.find( const params = use(props0.params);
const doc = allDocs.find(
(post) => post._raw.flattenedPath === params.slug.join("/"), (post) => post._raw.flattenedPath === params.slug.join("/"),
); );
if (!doc) notFound(); if (!doc) notFound();
console.log(doc); console.log(doc);
const MDXContent = useMDXComponent(doc.body.code); const MDXContent = useMDXComponent(doc.body.code);
return ( return (
<main className="relative py-6 lg:gap-10 lg:py-8 xl:grid xl:grid-cols-[1fr_300px]"> <main className="relative py-6 lg:gap-10 lg:py-8 xl:grid xl:grid-cols-[1fr_300px]">
<div className="mx-auto w-full min-w-0"> <div className="mx-auto w-full min-w-0">
<div className="pb-12 pt-8 prose dark:prose-invert"> <div className="pb-12 pt-8 prose dark:prose-invert">

@ -30,10 +30,11 @@
import Embed from "@/components/feat/Embed"; import Embed from "@/components/feat/Embed";
export default function EmbedPage({ export default async function EmbedPage(
params, props: {
}: { params: Promise<{ server: string }>;
params: { server: string }; }
}) { ) {
return <Embed params={params} />; const params = await props.params;
return <Embed params={params} />;
} }

@ -32,13 +32,11 @@ import type { Metadata, ResolvingMetadata } from "next";
import CustomizeRoot from "@/components/CustomizeRoot"; import CustomizeRoot from "@/components/CustomizeRoot";
type Props = { type Props = {
params: { server: string }; params: Promise<{ server: string }>;
}; };
export async function generateMetadata( export async function generateMetadata(props: Props, parent: ResolvingMetadata): Promise<Metadata> {
{ params }: Props, const params = await props.params;
parent: ResolvingMetadata
): Promise<Metadata> {
// read route params // read route params
const { server } = params; const { server } = params;
const json = await ( const json = await (
@ -89,7 +87,8 @@ export async function generateMetadata(
}; };
} }
export default function ServerPage({ params }: { params: { server: string } }) { export default async function ServerPage(props: { params: Promise<{ server: string }> }) {
const params = await props.params;
return ( return (
<main> <main>
<CustomizeRoot params={params} /> <CustomizeRoot params={params} />

@ -28,19 +28,25 @@
* OTHER DEALINGS IN THE SOFTWARE. * OTHER DEALINGS IN THE SOFTWARE.
*/ */
"use client"; "use client";;
import { use } from "react";
import { LoadingSpinner } from "@/components/ui/loading-spinner"; import { LoadingSpinner } from "@/components/ui/loading-spinner";
import { useServerExists } from "@/lib/hooks/use-server-exists"; import { useServerExists } from "@/lib/hooks/use-server-exists";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
export default function ServerLayout({ export default function ServerLayout(
params, props: {
children, params: Promise<{ server: string }>;
}: { children: React.ReactNode;
params: { server: string }; }
children: React.ReactNode; ) {
}) { const params = use(props.params);
const {
children
} = props;
const { serverExists, loading } = useServerExists(params.server); const { serverExists, loading } = useServerExists(params.server);
if (loading) return <LoadingSpinner />; if (loading) return <LoadingSpinner />;

@ -37,13 +37,11 @@ import TabServer from "@/components/misc/TabServer";
import type { Metadata, ResolvingMetadata } from "next"; import type { Metadata, ResolvingMetadata } from "next";
type Props = { type Props = {
params: { server: string }; params: Promise<{ server: string }>;
}; };
export async function generateMetadata( export async function generateMetadata(props: Props, parent: ResolvingMetadata): Promise<Metadata> {
{ params }: Props, const params = await props.params;
parent: ResolvingMetadata
): Promise<Metadata> {
// read route params // read route params
const { server } = params; const { server } = params;
const json = await ( const json = await (
@ -126,7 +124,8 @@ export async function generateMetadata(
}; };
} }
export default function ServerPage({ params }: { params: { server: string } }) { export default async function ServerPage(props: { params: Promise<{ server: string }> }) {
const params = await props.params;
return ( return (
<main style={{ "color-scheme": "dark" } as React.CSSProperties}> <main style={{ "color-scheme": "dark" } as React.CSSProperties}>
<ColorProvider server={params.server}> <ColorProvider server={params.server}>

@ -40,13 +40,11 @@ import { MonthlyChart } from "@/components/charts/MonthlyChart";
import { DailyChart } from "@/components/charts/DailyChart"; import { DailyChart } from "@/components/charts/DailyChart";
type Props = { type Props = {
params: { server: string }; params: Promise<{ server: string }>;
}; };
export async function generateMetadata( export async function generateMetadata(props: Props, parent: ResolvingMetadata): Promise<Metadata> {
{ params }: Props, const params = await props.params;
parent: ResolvingMetadata
): Promise<Metadata> {
// read route params // read route params
const { server } = params; const { server } = params;
const json = await ( const json = await (
@ -97,7 +95,8 @@ export async function generateMetadata(
}; };
} }
export default function ServerPage({ params }: { params: { server: string } }) { export default async function ServerPage(props: { params: Promise<{ server: string }> }) {
const params = await props.params;
return ( return (
<main style={{ "color-scheme": "dark" } as React.CSSProperties}> <main style={{ "color-scheme": "dark" } as React.CSSProperties}>
<ColorProvider server={params.server}> <ColorProvider server={params.server}>

@ -28,53 +28,18 @@
* OTHER DEALINGS IN THE SOFTWARE. * OTHER DEALINGS IN THE SOFTWARE.
*/ */
import { Sidebar } from "@/components/docs/Sidebar"; import "./globals.css";
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
import { Separator } from "@/components/ui/separator";
import {
SidebarInset,
SidebarProvider,
SidebarTrigger,
} from "@/components/ui/sidebar";
export default function Page() { export default function RootLayout({
return ( children,
<SidebarProvider> }: {
<Sidebar /> children: React.ReactNode;
<SidebarInset> }) {
<header className="flex sticky top-0 bg-background h-16 shrink-0 items-center gap-2 border-b px-4"> return (
<SidebarTrigger className="-ml-1" /> <html lang="en">
<Separator orientation="vertical" className="mr-2 h-4" /> <body>
<Breadcrumb> <main>{children}</main>
<BreadcrumbList> </body>
<BreadcrumbItem className="hidden md:block"> </html>
<BreadcrumbLink href="#"> );
Building Your Application
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</header>
<div className="flex flex-1 flex-col gap-4 p-4">
{Array.from({ length: 24 }).map((_, index) => (
<div
key={index}
className="aspect-video h-12 w-full rounded-lg bg-muted/50"
/>
))}
</div>
</SidebarInset>
</SidebarProvider>
);
} }

@ -0,0 +1,16 @@
import Footer from "@/components/misc/Footer";
import Link from "next/link";
export default function NotFound() {
return (
<>
<span className="flex justify-center items-center text-center min-h-screen h-max">
<div className="block">
That page couldn't be found <br />
<Link href="/">Go home</Link>
</div>
</span>
<Footer />
</>
);
}

@ -1,34 +1,45 @@
{ {
"compilerOptions": { "compilerOptions": {
"lib": ["dom", "dom.iterable", "esnext"], "lib": [
"allowJs": true, "dom",
"skipLibCheck": true, "dom.iterable",
"strict": true, "esnext"
"noEmit": true, ],
"esModuleInterop": true, "allowJs": true,
"module": "esnext", "skipLibCheck": true,
"moduleResolution": "bundler", "strict": true,
"resolveJsonModule": true, "noEmit": true,
"isolatedModules": true, "esModuleInterop": true,
"jsx": "preserve", "module": "esnext",
"incremental": true, "moduleResolution": "bundler",
"plugins": [ "resolveJsonModule": true,
{ "isolatedModules": true,
"name": "next" "jsx": "preserve",
} "incremental": true,
], "plugins": [
"paths": { {
"contentlayer/generated": ["./.contentlayer/generated"], "name": "next"
"@/*": ["./src/*"] }
} ],
}, "paths": {
"include": [ "contentlayer/generated": [
"next-env.d.ts", "./.contentlayer/generated"
"**/*.ts", ],
"**/*.tsx", "@/*": [
".next/types/**/*.ts", "./src/*"
".contentlayer/generated", ]
"docs/legal/external-content-agreement.mdx" },
], "target": "ES2017"
"exclude": ["node_modules"] },
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".contentlayer/generated",
"docs/legal/external-content-agreement.mdx"
],
"exclude": [
"node_modules"
]
} }

@ -1,23 +1,23 @@
{ {
"name": "MHSF-Modern", "name": "MHSF-Modern",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "turbo build", "build": "turbo build",
"dev": "turbo dev --filter=!cron", "dev": "turbo dev --filter=!cron",
"lint": "turbo lint", "lint": "turbo lint",
"format": "prettier --write \"**/*.{ts,tsx,md}\"" "format": "prettier --write \"**/*.{ts,tsx,md}\""
}, },
"devDependencies": { "devDependencies": {
"prettier": "^3.5.0", "prettier": "^3.5.0",
"turbo": "^2.4.2", "turbo": "^2.4.4",
"typescript": "5.7.3" "typescript": "5.7.3"
}, },
"engines": { "engines": {
"node": ">=18" "node": ">=18"
}, },
"packageManager": "yarn@1.22.22", "packageManager": "yarn@1.22.22",
"workspaces": [ "workspaces": [
"apps/*", "apps/*",
"packages/*" "packages/*"
] ]
} }

593
yarn.lock

File diff suppressed because it is too large Load Diff