fix: uploadmentation

This commit is contained in:
dvelo 2025-05-12 20:00:12 -05:00
parent 7766ff4d32
commit 0ceb8de3b8
15 changed files with 3285 additions and 133 deletions

@ -11,30 +11,32 @@
}, },
"dependencies": { "dependencies": {
"@clerk/nextjs": "^6.10.3", "@clerk/nextjs": "^6.10.3",
"@fontsource/jetbrains-mono": "^5.2.5",
"@hookform/resolvers": "^3.10.0", "@hookform/resolvers": "^3.10.0",
"@radix-ui/react-aspect-ratio": "^1.1.1", "@radix-ui/react-aspect-ratio": "^1.1.1",
"@radix-ui/react-avatar": "^1.1.1", "@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-hover-card": "^1.1.1", "@radix-ui/react-collapsible": "^1.1.1",
"@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-context-menu": "^2.1.5",
"@radix-ui/react-menubar": "^1.1.1", "@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-primitive": "^2.0.0", "@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-select": "^2.1.2", "@radix-ui/react-hover-card": "^1.1.1",
"@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-context-menu": "^2.1.5", "@radix-ui/react-menubar": "^1.1.1",
"@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-navigation-menu": "^1.1.4",
"@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-label": "^2.1.0", "@radix-ui/react-primitive": "^2.0.0",
"@radix-ui/react-navigation-menu": "^1.1.4", "@radix-ui/react-radio-group": "^1.2.0",
"@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-scroll-area": "^1.1.0",
"@radix-ui/react-radio-group": "^1.2.0", "@radix-ui/react-select": "^2.1.2",
"@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-switch": "^1.1.0",
"@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.3",
"@types/jsonwebtoken": "^9.0.8", "@types/jsonwebtoken": "^9.0.8",
"@uiw/codemirror-theme-vscode": "^4.23.12",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"cmdk": "1.0.0", "cmdk": "1.0.0",

@ -56,6 +56,7 @@
"@unocss/postcss": "^0.61.5", "@unocss/postcss": "^0.61.5",
"@unocss/transformer-directives": "^0.61.5", "@unocss/transformer-directives": "^0.61.5",
"@unocss/webpack": "^0.61.5", "@unocss/webpack": "^0.61.5",
"@uploadthing/react": "^7.3.1",
"@vercel/functions": "^2.0.0", "@vercel/functions": "^2.0.0",
"@vercel/og": "^0.6.5", "@vercel/og": "^0.6.5",
"ag-grid-react": "^33.0.3", "ag-grid-react": "^33.0.3",
@ -108,6 +109,7 @@
"tailwindcss-patch": "^4.0.0", "tailwindcss-patch": "^4.0.0",
"turbo": "^2.4.0", "turbo": "^2.4.0",
"unplugin-tailwindcss-mangle": "^3.0.1", "unplugin-tailwindcss-mangle": "^3.0.1",
"uploadthing": "^7.7.2",
"vaul": "^1.1.2", "vaul": "^1.1.2",
"zod": "^3.24.2" "zod": "^3.24.2"
}, },

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url><loc>https://mhsf.app/waitlist</loc><lastmod>2025-05-10T18:03:30.182Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/support</loc><lastmod>2025-05-11T22:17:55.268Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/home</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/waitlist/oauth-need-discord</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/waitlist/oauth-need-discord</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/servers</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/servers/embedded/sl-modification-frame/files</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/waitlist/ref</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/support</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/settings</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/servers/embedded/sl-modification-frame</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/waitlist</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/settings</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/servers/embedded/sl-modification-frame</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/waitlist/ref</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/servers/embedded/sl-modification-frame/files</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://mhsf.app/servers</loc><lastmod>2025-05-10T18:03:30.186Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url> <url><loc>https://mhsf.app/home</loc><lastmod>2025-05-11T22:17:55.272Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
</urlset> </urlset>

File diff suppressed because one or more lines are too long

@ -1,36 +0,0 @@
/*
* MHSF, Minehut Server List
* All external content is rather licensed under the ECA Agreement
* located here: https://mhsf.app/docs/legal/external-content-agreement
*
* All code under MHSF is licensed under the MIT License
* by open source contributors
*
* Copyright (c) 2025 dvelo
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
import '@milkdown/crepe/theme/nord-dark.css';
import type { ReactNode } from 'react';
export function ServerDescriptionDarkProvider({children}: {children: ReactNode}) {
return children;
}

@ -31,23 +31,26 @@
import { listenerCtx } from "@milkdown/kit/plugin/listener"; import { listenerCtx } from "@milkdown/kit/plugin/listener";
import { Crepe } from "@milkdown/crepe"; import { Crepe } from "@milkdown/crepe";
import { useEditor, type EditorInfoCtx, Milkdown } from "@milkdown/react"; import { useEditor, type EditorInfoCtx, Milkdown } from "@milkdown/react";
import { vscodeDark, vscodeDarkInit } from '@uiw/codemirror-theme-vscode';
import "@milkdown/crepe/theme/common/style.css"; import "@milkdown/crepe/theme/common/style.css";
import "@fontsource/jetbrains-mono";
import { createContext } from "react"; import { createContext } from "react";
import { Spinner } from "@/components/ui/spinner"; import { Spinner } from "@/components/ui/spinner";
import { ServerDescriptionLightProvider } from "./server-light-provider";
import { useTheme } from "@/lib/hooks/use-theme"; import { useTheme } from "@/lib/hooks/use-theme";
import { ServerDescriptionDarkProvider } from "./server-dark-provider";
export function ServerEditorDescription({ export function ServerEditorDescription({
defaultMarkdown, defaultMarkdown,
onUpdate, onUpdate,
}: { defaultMarkdown: string; onUpdate?: (update: string) => void }) { }: { defaultMarkdown: string; onUpdate?: (update: string) => void }) {
const { resolvedTheme } = useTheme();
const { loading } = useEditor((root) => { const { loading } = useEditor((root) => {
const crepe = new Crepe({ const crepe = new Crepe({
root, root,
defaultValue: defaultMarkdown, defaultValue: defaultMarkdown,
featureConfigs: { [Crepe.Feature.Toolbar]: {
latexIcon: undefined
}, [Crepe.Feature.CodeMirror]: {
theme: vscodeDark
}}
}); });
crepe.editor.config(async (ctx) => { crepe.editor.config(async (ctx) => {
ctx.get(listenerCtx).markdownUpdated((_, markdown) => { ctx.get(listenerCtx).markdownUpdated((_, markdown) => {
@ -58,7 +61,7 @@ export function ServerEditorDescription({
}, []); }, []);
return ( return (
<div className="h-[500px] max-h-[500px]"> <div>
{loading && ( {loading && (
<div> <div>
<span className="flex items-center justify-center w-full"> <span className="flex items-center justify-center w-full">
@ -69,15 +72,7 @@ export function ServerEditorDescription({
</span> </span>
</div> </div>
)} )}
{resolvedTheme === "dark" ? ( <Milkdown />
<ServerDescriptionLightProvider>
<Milkdown />
</ServerDescriptionLightProvider>
) : (
<ServerDescriptionDarkProvider>
<Milkdown />
</ServerDescriptionDarkProvider>
)}
</div> </div>
); );
} }

@ -20,6 +20,11 @@ import type { OnlineServer, ServerResponse } from "@/lib/types/mh-server";
import { useServers } from "@/lib/hooks/use-servers"; import { useServers } from "@/lib/hooks/use-servers";
import { Alert } from "@/components/ui/alert"; import { Alert } from "@/components/ui/alert";
import { toast } from "sonner"; import { toast } from "sonner";
import { BannerUploaderRouter } from "@/pages/api/v1/server/get/[server]/settings/upload-banner";
import {
generateUploadButton,
generateUploadDropzone,
} from "@uploadthing/react";
const successClasses = const successClasses =
"bg-green-200 border-green-400 dark:bg-green-800 dark:border-green-600"; "bg-green-200 border-green-400 dark:bg-green-800 dark:border-green-600";
@ -53,7 +58,7 @@ export function ServerEditorProvider({
setOnlineData(server); setOnlineData(server);
} }
} }
}, [open, loading]); }, [open, loading, servers, minehutData.name]);
useEffect(() => { useEffect(() => {
(async () => { (async () => {
@ -68,13 +73,16 @@ export function ServerEditorProvider({
const requirementTwo = onlineData !== null; const requirementTwo = onlineData !== null;
const requirementThree = claimedUser === onlineData?.author; const requirementThree = claimedUser === onlineData?.author;
const requirementFour = claimedUser !== null; const requirementFour = claimedUser !== null;
const UploadDropzone = generateUploadDropzone<BannerUploaderRouter>({
url: `/api/v1/server/get/${minehutData._id}/settings/upload-banner`,
});
return ( return (
<> <>
{children} {children}
<MilkdownProvider> <MilkdownProvider>
<Drawer open={open} onOpenChange={setOpen}> <Drawer open={open} onOpenChange={setOpen}>
<DrawerContent className="p-4 "> <DrawerContent className="p-4 !max-h-[700px] !h-[700px]">
<br /> <br />
{!serverData.server?.customizationData.isOwned ? ( {!serverData.server?.customizationData.isOwned ? (
<div className="h-full overflow-y-scroll"> <div className="h-full overflow-y-scroll">
@ -219,7 +227,7 @@ export function ServerEditorProvider({
) : ( ) : (
<> <>
{serverData.server?.customizationData.isOwnedByUser ? ( {serverData.server?.customizationData.isOwnedByUser ? (
<div className="max-h-[400px] overflow-y-scroll"> <div className="!max-h-[700px] !h-[700px] overflow-y-scroll">
<DrawerTitle className="scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-4xl mb-3"> <DrawerTitle className="scroll-m-20 text-2xl font-extrabold tracking-tight lg:text-4xl mb-3">
Server Settings Server Settings
</DrawerTitle> </DrawerTitle>
@ -235,13 +243,34 @@ export function ServerEditorProvider({
<ServerEditorDescription <ServerEditorDescription
defaultMarkdown={ defaultMarkdown={
serverData.server?.customizationData.description ?? serverData.server?.customizationData.description ??
"" `# ${minehutData.name}`
} }
onUpdate={(content) => console.log(content)} onUpdate={(content) => console.log(content)}
/> />
)} )}
</Material> </Material>
<Material className="grid gap-1 mt-2 max-h-[700px]">
<strong>Server Banner</strong>
<p className="mb-3">
Pick out whatever represents your server best! Images
have a limit of 4.5MB, and the prefered aspect ratio for
the banner should be 10:4 to look the best on MHSF.
</p>
<UploadDropzone
endpoint="imageUploader"
className="uploadthing-dropzone"
onClientUploadComplete={(res) => {
console.log("Upload complete response:", res);
// Refresh the server data
serverData.refresh();
toast.success("Banner uploaded successfully!");
}}
onUploadError={(error: Error) => {
console.error("Upload error:", error);
toast.error(`Upload failed: ${error.message}`);
}}
/>
</Material>
</div> </div>
) : ( ) : (
<Placeholder <Placeholder

@ -1,36 +0,0 @@
/*
* MHSF, Minehut Server List
* All external content is rather licensed under the ECA Agreement
* located here: https://mhsf.app/docs/legal/external-content-agreement
*
* All code under MHSF is licensed under the MIT License
* by open source contributors
*
* Copyright (c) 2025 dvelo
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
import '@milkdown/crepe/theme/frame.css';
import type { ReactNode } from 'react';
export function ServerDescriptionLightProvider({children}: {children: ReactNode}) {
return children;
}

@ -77,13 +77,13 @@ export function useFilters(data: OnlineServer[]) {
if (filteredData.length === 0 || data.length === 0) { if (filteredData.length === 0 || data.length === 0) {
window.dispatchEvent(new Event("update-modification-stack")); window.dispatchEvent(new Event("update-modification-stack"));
} else setLoading(false); } else setLoading(false);
}, [data, filteredData.length]); }, [data, filteredData, loading]);
useEffect(() => { useEffect(() => {
if (data.length === 0) { if (data.length === 0) {
window.dispatchEvent(new Event("update-modification-stack")); window.dispatchEvent(new Event("update-modification-stack"));
} else setLoading(false); } else setLoading(false);
}, [data, filteredData.length]); }, [data, filteredData, loading]);
const testModeInit = (type: "filter" | "sort") => { const testModeInit = (type: "filter" | "sort") => {
window.dispatchEvent(new Event("test-mode.enabled")); window.dispatchEvent(new Event("test-mode.enabled"));

@ -53,6 +53,12 @@ export function useMHSFServer(id: string) {
setServer(json.server); setServer(json.server);
}, },
refresh: async () => {
const response = await fetch("/api/v1/server/get/" + id);
const json = await response.json();
setServer(json.server);
},
favoriteServer: async () => { favoriteServer: async () => {
if (!server) if (!server)
throw new Error("Server hasn't initialized, cannot continue."); throw new Error("Server hasn't initialized, cannot continue.");

@ -47,6 +47,8 @@ const isWaitlistPage = createRouteMatcher(["/waitlist", "/waitlist(.*)"]);
const apiWaitlistPage = createRouteMatcher([ const apiWaitlistPage = createRouteMatcher([
"/api/v1/user/waitlist(.*)", "/api/v1/user/waitlist(.*)",
"/api/v1/get-status", "/api/v1/get-status",
// Required by UploadThing (okay fine Theo!)
"/api/v1/server/get/:serverId/settings/upload-banner"
]); ]);
export default process.env.NEXT_PUBLIC_IS_AUTH === "true" export default process.env.NEXT_PUBLIC_IS_AUTH === "true"

@ -275,7 +275,7 @@ async function fetchHistoryData(
return await cursor.toArray(); return await cursor.toArray();
} }
async function findServerData( export async function findServerData(
server: string, server: string,
): Promise<{ exists: boolean; name: string }> { ): Promise<{ exists: boolean; name: string }> {
try { try {

@ -0,0 +1,125 @@
/*
* MHSF, Minehut Server List
* All external content is rather licensed under the ECA Agreement
* located here: https://mhsf.app/docs/legal/external-content-agreement
*
* All code under MHSF is licensed under the MIT License
* by open source contributors
*
* Copyright (c) 2025 dvelo
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
import { getAuth } from "@clerk/nextjs/server";
import {
createRouteHandler,
createUploadthing,
type FileRouter,
} from "uploadthing/next-legacy";
import { UploadThingError } from "uploadthing/server";
import { findServerData } from "..";
import { MongoClient } from "mongodb";
import type { FileRoute } from "uploadthing/types";
import type { Json } from "@uploadthing/shared";
const f = createUploadthing();
export default createRouteHandler({
router: {
imageUploader: f({
image: {
maxFileSize: "4MB",
maxFileCount: 1,
},
})
// Set permissions and file types for this FileRoute
.middleware(async ({ req, res }) => {
// Step 1: Check authentication
const { userId } = getAuth(req);
if (!userId) throw new UploadThingError("Unauthorized");
// Step 2: Check server
const { server } = req.query;
const serverData = await findServerData(server as string);
const mongoClient = new MongoClient(process.env.MONGO_DB as string);
try {
if (!serverData.exists) throw new UploadThingError("Server doesn't exist");
await mongoClient.connect();
const db = mongoClient.db(process.env.CUSTOM_MONGO_DB ?? "mhsf");
const ownedServer = await db.collection("owned-servers").findOne({ $or: [{ serverId: server }, { server: serverData.name }] });
if (!ownedServer) throw new UploadThingError("Server not linked");
if (ownedServer.author !== userId) throw new UploadThingError("You don't own this server.");
return {
userId,
ownedServer,
serverId: server,
serverName: serverData.name
};
} finally {
await mongoClient.close();
}
})
.onUploadComplete(async ({ metadata, file }) => {
// This code RUNS ON YOUR SERVER after upload
console.log("Upload complete for userId:", metadata.userId);
console.log("file url", file.ufsUrl);
console.log("metadata:", metadata);
// Update the server's customization data with the new banner URL
const mongoClient = new MongoClient(process.env.MONGO_DB as string);
try {
await mongoClient.connect();
const db = mongoClient.db(process.env.CUSTOM_MONGO_DB ?? "mhsf");
// Update or insert the customization data
const result = await db.collection("customization").updateOne(
{ $or: [{ serverId: metadata.serverId }, { server: metadata.serverName }] },
{ $set: { banner: file.ufsUrl } },
{ upsert: true }
);
console.log("Database update result:", result);
// !!! Whatever is returned here is sent to the clientside `onClientUploadComplete` callback
return { uploadedBy: metadata.userId };
} catch (error) {
console.error("Error updating database:", error);
throw error;
} finally {
await mongoClient.close();
}
}),
},
});
export type BannerUploaderRouter = {
imageUploader: FileRoute<{
input: undefined;
output: {
uploadedBy: string;
};
errorShape: Json;
}>;
}

178
yarn.lock

@ -825,6 +825,15 @@
resolved "https://registry.yarnpkg.com/@effect-ts/system/-/system-0.57.5.tgz#921e9b39dcea2d1728e0f49a0af233472efdc6cb" resolved "https://registry.yarnpkg.com/@effect-ts/system/-/system-0.57.5.tgz#921e9b39dcea2d1728e0f49a0af233472efdc6cb"
integrity sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g== integrity sha512-/crHGujo0xnuHIYNc1VgP0HGJGFSoSqq88JFXe6FmFyXPpWt8Xu39LyLg7rchsxfXFeEdA9CrIZvLV5eswXV5g==
"@effect/platform@0.81.0":
version "0.81.0"
resolved "https://registry.yarnpkg.com/@effect/platform/-/platform-0.81.0.tgz#da91e8ecaa157e02383dba9b97b1a592a7d3b485"
integrity sha512-RZ0pqpSUET0Ab3CBjOhJ12C2/vWLQsy+SLJbGNxjcOm9xZAwQowggWCs4S3ZXhdnNTR5WJHH02WlAWHJDaMKhA==
dependencies:
find-my-way-ts "^0.1.5"
msgpackr "^1.11.2"
multipasta "^0.2.5"
"@emnapi/core@^1.4.0": "@emnapi/core@^1.4.0":
version "1.4.3" version "1.4.3"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6" resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6"
@ -1357,6 +1366,11 @@
resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429" resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.9.tgz#50dea3616bc8191fb8e112283b49eaff03e78429"
integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==
"@fontsource/jetbrains-mono@^5.2.5":
version "5.2.5"
resolved "https://registry.yarnpkg.com/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.5.tgz#c3e9931ae7ebd70b25b6aaf98caf5c2720aaffb3"
integrity sha512-TPZ9b/uq38RMdrlZZkl0RwN8Ju9JxuqMETrw76pUQFbGtE1QbwQaNsLlnUrACNNBNbd0NZRXiJJSkC8ajPgbew==
"@graphql-typed-document-node/core@^3.1.0": "@graphql-typed-document-node/core@^3.1.0":
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861"
@ -2704,6 +2718,36 @@
dependencies: dependencies:
sparse-bitfield "^3.0.3" sparse-bitfield "^3.0.3"
"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz#9edec61b22c3082018a79f6d1c30289ddf3d9d11"
integrity sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==
"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz#33677a275204898ad8acbf62734fc4dc0b6a4855"
integrity sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==
"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz#19edf7cdc2e7063ee328403c1d895a86dd28f4bb"
integrity sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==
"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz#94fb0543ba2e28766c3fc439cabbe0440ae70159"
integrity sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==
"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz#4a0609ab5fe44d07c9c60a11e4484d3c38bbd6e3"
integrity sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==
"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz#0aa5502d547b57abfc4ac492de68e2006e417242"
integrity sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==
"@napi-rs/wasm-runtime@^0.2.8", "@napi-rs/wasm-runtime@^0.2.9": "@napi-rs/wasm-runtime@^0.2.8", "@napi-rs/wasm-runtime@^0.2.9":
version "0.2.9" version "0.2.9"
resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz#7278122cf94f3b36d8170a8eee7d85356dfa6a96" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz#7278122cf94f3b36d8170a8eee7d85356dfa6a96"
@ -4280,6 +4324,16 @@
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2"
integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==
"@standard-schema/spec@1.0.0-beta.4":
version "1.0.0-beta.4"
resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0-beta.4.tgz#62f520109add3eb016004098363bfee0678dd1ec"
integrity sha512-d3IxtzLo7P1oZ8s8YNvxzBUXRXojSut8pbPrTYtzsc5sn4+53jVqbk66pQerSZbZSJZQux6LkclB/+8IDordHg==
"@standard-schema/spec@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.0.0.tgz#f193b73dc316c4170f2e82a881da0f550d551b9c"
integrity sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==
"@stoplight/better-ajv-errors@1.0.3": "@stoplight/better-ajv-errors@1.0.3":
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz#d74a5c4da5d786c17188d7f4edec505f089885fa" resolved "https://registry.yarnpkg.com/@stoplight/better-ajv-errors/-/better-ajv-errors-1.0.3.tgz#d74a5c4da5d786c17188d7f4edec505f089885fa"
@ -5179,6 +5233,22 @@
"@typescript-eslint/types" "8.31.0" "@typescript-eslint/types" "8.31.0"
eslint-visitor-keys "^4.2.0" eslint-visitor-keys "^4.2.0"
"@uiw/codemirror-theme-vscode@^4.23.12":
version "4.23.12"
resolved "https://registry.yarnpkg.com/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.23.12.tgz#564bd3d39743d370d0f0513b6e14e87bf48c724f"
integrity sha512-ePBaUQiixrpmSoZJWCGXUStKmcM8G0VBv3UqwPR+kNGBjqDife76Gbhv77izSeEI3zRPzL+683BOdclkvWnsMg==
dependencies:
"@uiw/codemirror-themes" "4.23.12"
"@uiw/codemirror-themes@4.23.12":
version "4.23.12"
resolved "https://registry.yarnpkg.com/@uiw/codemirror-themes/-/codemirror-themes-4.23.12.tgz#9afbf8b3f7c403fa06cbd264762fd267f982548b"
integrity sha512-8etEByfS9yttFZW0rcWhdZc7/JXJKRWlU5lHmJCI3GydZNGCzydNA+HtK9nWKpJUndVc58Q2sqSC5OIcwq8y6A==
dependencies:
"@codemirror/language" "^6.0.0"
"@codemirror/state" "^6.0.0"
"@codemirror/view" "^6.0.0"
"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0":
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8"
@ -5384,6 +5454,28 @@
resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.6.3.tgz#841f71e6d01b4439f88178c0f571be46c0138620" resolved "https://registry.yarnpkg.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.6.3.tgz#841f71e6d01b4439f88178c0f571be46c0138620"
integrity sha512-n33drkd84G5Mu2BkUGawZXmm+IFPuRv7GpODfwEBs/CzZq2+BIZyAZmb03H9IgNbd7xaohZbtZ4/9Gb0xo5ssw== integrity sha512-n33drkd84G5Mu2BkUGawZXmm+IFPuRv7GpODfwEBs/CzZq2+BIZyAZmb03H9IgNbd7xaohZbtZ4/9Gb0xo5ssw==
"@uploadthing/mime-types@0.3.5":
version "0.3.5"
resolved "https://registry.yarnpkg.com/@uploadthing/mime-types/-/mime-types-0.3.5.tgz#6a4ed43ff9ac42d10203b15ea6d4090f0a87d413"
integrity sha512-iYOmod80XXOSe4NVvaUG9FsS91YGPUaJMTBj52Nwu0G2aTzEN6Xcl0mG1rWqXJ4NUH8MzjVqg+tQND5TPkJWhg==
"@uploadthing/react@^7.3.1":
version "7.3.1"
resolved "https://registry.yarnpkg.com/@uploadthing/react/-/react-7.3.1.tgz#c720dd1cb9210427fde9280d59456079e8fbfe3a"
integrity sha512-yIAFw46ZO/NPb74zpomwn6Hf2ZX/Ws+vNlR4oKNLJ7YtJ+/bqERclzC3xnRVi/pT47ctISlqXQFGiXUn85wg5Q==
dependencies:
"@uploadthing/shared" "7.1.8"
file-selector "0.6.0"
"@uploadthing/shared@7.1.8":
version "7.1.8"
resolved "https://registry.yarnpkg.com/@uploadthing/shared/-/shared-7.1.8.tgz#5e34a270285badf6f53f4d9c033854eae2df0a18"
integrity sha512-OA9ZrTfILOCt1G93wOD7dZmS653z99Nr3isZpIxzBO3y4B2geKFmPjJUZClig2RrAWLKr2VUYToXKfd9D/wP9w==
dependencies:
"@uploadthing/mime-types" "0.3.5"
effect "3.14.21"
sqids "^0.3.0"
"@vercel/analytics@^1.3.1": "@vercel/analytics@^1.3.1":
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-1.5.0.tgz#073f93694897414b21a8495e2619bbf64447dcaa" resolved "https://registry.yarnpkg.com/@vercel/analytics/-/analytics-1.5.0.tgz#073f93694897414b21a8495e2619bbf64447dcaa"
@ -6831,6 +6923,11 @@ destroy@1.2.0:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
detect-libc@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==
detect-libc@^2.0.3: detect-libc@^2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
@ -7018,6 +7115,14 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
effect@3.14.21:
version "3.14.21"
resolved "https://registry.yarnpkg.com/effect/-/effect-3.14.21.tgz#140ebc4ee99aa14cefe11e3aadcff66a12d1692f"
integrity sha512-TKR7zfWcuZgEdWd+oIGA8LdREj/c+1Q0wz4pWqQtYT7VHnkW/QQEYCXgrDI5dT6lJgRTgyQAC1bAnpAf6MdjIA==
dependencies:
"@standard-schema/spec" "^1.0.0"
fast-check "^3.23.1"
embla-carousel-react@^8.5.2: embla-carousel-react@^8.5.2:
version "8.6.0" version "8.6.0"
resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz#b737042a32761c38d6614593653b3ac619477bd1" resolved "https://registry.yarnpkg.com/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz#b737042a32761c38d6614593653b3ac619477bd1"
@ -7896,6 +8001,13 @@ extract-zip@^2.0.1:
optionalDependencies: optionalDependencies:
"@types/yauzl" "^2.9.1" "@types/yauzl" "^2.9.1"
fast-check@^3.23.1:
version "3.23.2"
resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.23.2.tgz#0129f1eb7e4f500f58e8290edc83c670e4a574a2"
integrity sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==
dependencies:
pure-rand "^6.1.0"
fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: fast-deep-equal@3.1.3, fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@ -8020,6 +8132,13 @@ file-entry-cache@^8.0.0:
dependencies: dependencies:
flat-cache "^4.0.0" flat-cache "^4.0.0"
file-selector@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.6.0.tgz#fa0a8d9007b829504db4d07dd4de0310b65287dc"
integrity sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==
dependencies:
tslib "^2.4.0"
fill-range@^7.1.1: fill-range@^7.1.1:
version "7.1.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
@ -8040,6 +8159,11 @@ finalhandler@1.3.1:
statuses "2.0.1" statuses "2.0.1"
unpipe "~1.0.0" unpipe "~1.0.0"
find-my-way-ts@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/find-my-way-ts/-/find-my-way-ts-0.1.5.tgz#9de9494f19e0319d4f6366bb91d6bf7952af7874"
integrity sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A==
find-up@^5.0.0: find-up@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@ -11277,6 +11401,32 @@ ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
msgpackr-extract@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz#e9d87023de39ce714872f9e9504e3c1996d61012"
integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==
dependencies:
node-gyp-build-optional-packages "5.2.2"
optionalDependencies:
"@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3"
"@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3"
"@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.3"
"@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3"
"@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3"
"@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3"
msgpackr@^1.11.2:
version "1.11.2"
resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.11.2.tgz#4463b7f7d68f2e24865c395664973562ad24473d"
integrity sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==
optionalDependencies:
msgpackr-extract "^3.0.2"
multipasta@^0.2.5:
version "0.2.5"
resolved "https://registry.yarnpkg.com/multipasta/-/multipasta-0.2.5.tgz#fb3564c4c619b73f98e72e2a4bbd4f7fba153edf"
integrity sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A==
mute-stream@^2.0.0: mute-stream@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b"
@ -11491,6 +11641,13 @@ node-fetch@^3.0.0:
fetch-blob "^3.1.4" fetch-blob "^3.1.4"
formdata-polyfill "^4.0.10" formdata-polyfill "^4.0.10"
node-gyp-build-optional-packages@5.2.2:
version "5.2.2"
resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4"
integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==
dependencies:
detect-libc "^2.0.1"
normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@ -12301,6 +12458,11 @@ puppeteer@^22.14.0:
devtools-protocol "0.0.1312386" devtools-protocol "0.0.1312386"
puppeteer-core "22.15.0" puppeteer-core "22.15.0"
pure-rand@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2"
integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
qr.js@0.0.0: qr.js@0.0.0:
version "0.0.0" version "0.0.0"
resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f" resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f"
@ -13512,6 +13674,11 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
sqids@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/sqids/-/sqids-0.3.0.tgz#969eabe54a362682e44cb73fce2bfea84e504dec"
integrity sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==
stable-hash@^0.0.5: stable-hash@^0.0.5:
version "0.0.5" version "0.0.5"
resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269" resolved "https://registry.yarnpkg.com/stable-hash/-/stable-hash-0.0.5.tgz#94e8837aaeac5b4d0f631d2972adef2924b40269"
@ -14564,6 +14731,17 @@ unrs-resolver@^1.6.2:
"@unrs/resolver-binding-win32-ia32-msvc" "1.6.3" "@unrs/resolver-binding-win32-ia32-msvc" "1.6.3"
"@unrs/resolver-binding-win32-x64-msvc" "1.6.3" "@unrs/resolver-binding-win32-x64-msvc" "1.6.3"
uploadthing@^7.7.2:
version "7.7.2"
resolved "https://registry.yarnpkg.com/uploadthing/-/uploadthing-7.7.2.tgz#4a72ceb3eaa53564046e1831d626406fafb6a14c"
integrity sha512-Q8rp40vnh8g4+OHvocmf+YVoSi+6RWTKmemo5BgW7R8iFU2O2EYH/n+CIxPzxhYyH/QjhRF/pHoIMcUL/8OtSg==
dependencies:
"@effect/platform" "0.81.0"
"@standard-schema/spec" "1.0.0-beta.4"
"@uploadthing/mime-types" "0.3.5"
"@uploadthing/shared" "7.1.8"
effect "3.14.21"
uri-js@^4.2.2: uri-js@^4.2.2:
version "4.4.1" version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"