diff --git a/apps/admin/package.json b/apps/admin/package.json index 52f61f81b8..ad4ca6f0bf 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -6,9 +6,9 @@ "private": true, "type": "module", "scripts": { - "dev": "cross-env NODE_ENV=development PORT=3001 node server.mjs", + "dev": "react-router dev --port 3001", "build": "react-router build", - "preview": "react-router build && cross-env NODE_ENV=production PORT=3001 node server.mjs", + "preview": "react-router build && serve -s build/client -l 3001", "start": "serve -s build/client -l 3001", "clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist && rm -rf build", "check:lint": "eslint . --max-warnings 19", @@ -27,23 +27,17 @@ "@plane/types": "workspace:*", "@plane/ui": "workspace:*", "@plane/utils": "workspace:*", - "@react-router/express": "^7.9.3", "@react-router/node": "^7.9.3", "@tanstack/react-virtual": "^3.13.12", "@tanstack/virtual-core": "^3.13.12", "@vercel/edge": "1.2.2", "axios": "catalog:", - "compression": "^1.8.1", - "cross-env": "^7.0.3", "dotenv": "^16.4.5", - "express": "^5.1.0", - "http-proxy-middleware": "^3.0.5", "isbot": "^5.1.31", "lodash-es": "catalog:", "lucide-react": "catalog:", "mobx": "catalog:", "mobx-react": "catalog:", - "morgan": "^1.10.1", "next-themes": "^0.2.1", "react": "catalog:", "react-dom": "catalog:", @@ -59,10 +53,7 @@ "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", "@react-router/dev": "^7.9.1", - "@types/compression": "^1.8.1", - "@types/express": "4.17.23", "@types/lodash-es": "catalog:", - "@types/morgan": "^1.9.10", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", diff --git a/apps/admin/react-router.config.ts b/apps/admin/react-router.config.ts index aaeca700bf..1f7815ab36 100644 --- a/apps/admin/react-router.config.ts +++ b/apps/admin/react-router.config.ts @@ -1,8 +1,11 @@ import type { Config } from "@react-router/dev/config"; +import { joinUrlPath } from "@plane/utils"; + +const basePath = joinUrlPath(process.env.NEXT_PUBLIC_ADMIN_BASE_PATH ?? "", "/") ?? "/"; export default { appDirectory: "app", - basename: process.env.NEXT_PUBLIC_ADMIN_BASE_PATH, + basename: basePath, // Admin runs as a client-side app; build a static client bundle only ssr: false, } satisfies Config; diff --git a/apps/admin/server.mjs b/apps/admin/server.mjs deleted file mode 100644 index 90f17cf689..0000000000 --- a/apps/admin/server.mjs +++ /dev/null @@ -1,76 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import compression from "compression"; -import dotenv from "dotenv"; -import express from "express"; -import morgan from "morgan"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -dotenv.config({ path: path.resolve(__dirname, ".env") }); - -const BUILD_PATH = "./build/server/index.js"; -const DEVELOPMENT = process.env.NODE_ENV !== "production"; - -// Derive the port from NEXT_PUBLIC_ADMIN_BASE_URL when available, otherwise -// default to http://localhost:3001 and fall back to PORT env if explicitly set. -const DEFAULT_BASE_URL = "http://localhost:3001"; -const ADMIN_BASE_URL = process.env.NEXT_PUBLIC_ADMIN_BASE_URL || DEFAULT_BASE_URL; -let parsedBaseUrl; -try { - parsedBaseUrl = new URL(ADMIN_BASE_URL); -} catch { - parsedBaseUrl = new URL(DEFAULT_BASE_URL); -} - -const PORT = Number.parseInt(parsedBaseUrl.port, 10); - -async function start() { - const app = express(); - - app.use(compression()); - app.disable("x-powered-by"); - - if (DEVELOPMENT) { - console.log("Starting development server"); - - const vite = await import("vite").then((vite) => - vite.createServer({ - server: { middlewareMode: true }, - appType: "custom", - }) - ); - - app.use(vite.middlewares); - - app.use(async (req, res, next) => { - try { - const source = await vite.ssrLoadModule("./server/app.ts"); - return source.app(req, res, next); - } catch (error) { - if (error instanceof Error) { - vite.ssrFixStacktrace(error); - } - - next(error); - } - }); - } else { - console.log("Starting production server"); - - app.use("/assets", express.static("build/client/assets", { immutable: true, maxAge: "1y" })); - app.use(morgan("tiny")); - app.use(express.static("build/client", { maxAge: "1h" })); - app.use(await import(BUILD_PATH).then((mod) => mod.app)); - } - - app.listen(PORT, () => { - const origin = `${parsedBaseUrl.protocol}//${parsedBaseUrl.hostname}:${PORT}`; - console.log(`Server is running on ${origin}`); - }); -} - -start().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/apps/admin/server/app.ts b/apps/admin/server/app.ts deleted file mode 100644 index 70a61c3852..0000000000 --- a/apps/admin/server/app.ts +++ /dev/null @@ -1,46 +0,0 @@ -import "react-router"; -import { createRequestHandler } from "@react-router/express"; -import express from "express"; -import type { Express } from "express"; -import { createProxyMiddleware } from "http-proxy-middleware"; - -const NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL - ? process.env.NEXT_PUBLIC_API_BASE_URL.replace(/\/$/, "") - : "http://127.0.0.1:8000"; -const NEXT_PUBLIC_API_BASE_PATH = process.env.NEXT_PUBLIC_API_BASE_PATH - ? process.env.NEXT_PUBLIC_API_BASE_PATH.replace(/\/+$/, "") - : "/api"; -const NORMALIZED_API_BASE_PATH = NEXT_PUBLIC_API_BASE_PATH.startsWith("/") - ? NEXT_PUBLIC_API_BASE_PATH - : `/${NEXT_PUBLIC_API_BASE_PATH}`; -const NEXT_PUBLIC_ADMIN_BASE_PATH = process.env.NEXT_PUBLIC_ADMIN_BASE_PATH - ? process.env.NEXT_PUBLIC_ADMIN_BASE_PATH.replace(/\/$/, "") - : "/"; - -export const app: Express = express(); - -// Ensure proxy-aware hostname/URL handling (e.g., X-Forwarded-Host/Proto) -// so generated URLs/redirects reflect the public host when behind Nginx. -// See related fix in Remix Express adapter. -app.set("trust proxy", true); - -app.use( - "/api", - createProxyMiddleware({ - target: NEXT_PUBLIC_API_BASE_URL, - changeOrigin: true, - secure: false, - pathRewrite: (path: string) => - NORMALIZED_API_BASE_PATH === "/api" ? path : path.replace(/^\/api/, NORMALIZED_API_BASE_PATH), - }) -); - -const router = express.Router(); - -router.use( - createRequestHandler({ - build: () => import("virtual:react-router/server-build"), - }) -); - -app.use(NEXT_PUBLIC_ADMIN_BASE_PATH, router); diff --git a/apps/admin/vite.config.ts b/apps/admin/vite.config.ts index 30b2be3da9..b343ee347e 100644 --- a/apps/admin/vite.config.ts +++ b/apps/admin/vite.config.ts @@ -1,59 +1,39 @@ import path from "node:path"; import { reactRouter } from "@react-router/dev/vite"; +import dotenv from "dotenv"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import { joinUrlPath } from "@plane/utils"; -const PUBLIC_ENV_KEYS = [ - "NEXT_PUBLIC_API_BASE_URL", - "NEXT_PUBLIC_API_BASE_PATH", - "NEXT_PUBLIC_ADMIN_BASE_URL", - "NEXT_PUBLIC_ADMIN_BASE_PATH", - "NEXT_PUBLIC_SPACE_BASE_URL", - "NEXT_PUBLIC_SPACE_BASE_PATH", - "NEXT_PUBLIC_LIVE_BASE_URL", - "NEXT_PUBLIC_LIVE_BASE_PATH", - "NEXT_PUBLIC_WEB_BASE_URL", - "NEXT_PUBLIC_WEB_BASE_PATH", - "NEXT_PUBLIC_WEBSITE_URL", - "NEXT_PUBLIC_SUPPORT_EMAIL", -]; +dotenv.config({ path: path.resolve(__dirname, ".env") }); -const publicEnv = PUBLIC_ENV_KEYS.reduce>((acc, key) => { - acc[key] = process.env[key] ?? ""; - return acc; -}, {}); +// Automatically expose all environment variables prefixed with NEXT_PUBLIC_ +const publicEnv = Object.keys(process.env) + .filter((key) => key.startsWith("NEXT_PUBLIC_")) + .reduce>((acc, key) => { + acc[key] = process.env[key] ?? ""; + return acc; + }, {}); -export default defineConfig(({ isSsrBuild }) => { - // Only produce an SSR bundle when explicitly enabled. - // For static deployments (default), we skip the server build entirely. - const enableSsrBuild = process.env.ADMIN_ENABLE_SSR_BUILD === "true"; - const basePath = joinUrlPath(process.env.NEXT_PUBLIC_ADMIN_BASE_PATH ?? "", "/") ?? "/"; +const basePath = joinUrlPath(process.env.NEXT_PUBLIC_ADMIN_BASE_PATH ?? "", "/") ?? "/"; - return { - base: basePath, - define: { - "process.env": JSON.stringify(publicEnv), +export default defineConfig(() => ({ + base: basePath, + define: { + "process.env": JSON.stringify(publicEnv), + }, + build: { + assetsInlineLimit: 0, + }, + plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], + resolve: { + alias: { + // Next.js compatibility shims used within admin + "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), + "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), + "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), }, - build: { - assetsInlineLimit: 0, - rollupOptions: - isSsrBuild && enableSsrBuild - ? { - input: path.resolve(__dirname, "server/app.ts"), - } - : undefined, - }, - plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], - resolve: { - alias: { - // Next.js compatibility shims used within admin - "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), - "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), - "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), - }, - dedupe: ["react", "react-dom"], - }, - // No SSR-specific overrides needed; alias resolves to ESM build - }; -}); + dedupe: ["react", "react-dom"], + }, + // No SSR-specific overrides needed; alias resolves to ESM build +})); diff --git a/apps/space/Dockerfile.space b/apps/space/Dockerfile.space index 3fcffa76f4..f6787619ec 100644 --- a/apps/space/Dockerfile.space +++ b/apps/space/Dockerfile.space @@ -73,14 +73,17 @@ RUN pnpm turbo run build --filter=space # =========================================================================== # -FROM nginx:1.27-alpine AS production +FROM base AS runner -COPY apps/space/nginx/nginx.conf /etc/nginx/nginx.conf -COPY --from=installer /app/apps/space/build/client /usr/share/nginx/html/spaces +COPY --from=installer /app/apps/space/build ./apps/space/build +COPY --from=installer /app/apps/space/node_modules ./apps/space/node_modules +COPY --from=installer /app/node_modules ./node_modules + +WORKDIR /app/apps/space EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD curl -fsS http://127.0.0.1:3000/ >/dev/null || exit 1 -CMD ["nginx", "-g", "daemon off;"] +CMD ["npx", "react-router-serve", "./build/server/index.js"] diff --git a/apps/space/app/issues/[anchor]/client-layout.tsx b/apps/space/app/issues/[anchor]/client-layout.tsx deleted file mode 100644 index 3b96abcab7..0000000000 --- a/apps/space/app/issues/[anchor]/client-layout.tsx +++ /dev/null @@ -1,66 +0,0 @@ -"use client"; - -import { observer } from "mobx-react"; -import { Outlet } from "react-router"; -import useSWR from "swr"; -// components -import { LogoSpinner } from "@/components/common/logo-spinner"; -import { PoweredBy } from "@/components/common/powered-by"; -import { SomethingWentWrongError } from "@/components/issues/issue-layouts/error"; -import { IssuesNavbarRoot } from "@/components/issues/navbar"; -// hooks -import { usePublish, usePublishList } from "@/hooks/store/publish"; -import { useIssueFilter } from "@/hooks/store/use-issue-filter"; -import type { Route } from "./+types/client-layout"; - -const IssuesClientLayout = observer((props: Route.ComponentProps) => { - const { anchor } = props.params; - // store hooks - const { fetchPublishSettings } = usePublishList(); - const publishSettings = usePublish(anchor); - const { updateLayoutOptions } = useIssueFilter(); - // fetch publish settings - const { error } = useSWR( - anchor ? `PUBLISH_SETTINGS_${anchor}` : null, - anchor - ? async () => { - const response = await fetchPublishSettings(anchor); - if (response.view_props) { - updateLayoutOptions({ - list: !!response.view_props.list, - kanban: !!response.view_props.kanban, - calendar: !!response.view_props.calendar, - gantt: !!response.view_props.gantt, - spreadsheet: !!response.view_props.spreadsheet, - }); - } - } - : null - ); - - if (!publishSettings && !error) { - return ( -
- -
- ); - } - - if (error) return ; - - return ( - <> -
-
- -
-
- -
-
- - - ); -}); - -export default IssuesClientLayout; diff --git a/apps/space/app/issues/[anchor]/layout.tsx b/apps/space/app/issues/[anchor]/layout.tsx index 1ed4004f1e..a37c8b23f6 100644 --- a/apps/space/app/issues/[anchor]/layout.tsx +++ b/apps/space/app/issues/[anchor]/layout.tsx @@ -1,54 +1,142 @@ -"use server"; +import { observer } from "mobx-react"; +import { Outlet } from "react-router"; +import type { ShouldRevalidateFunctionArgs } from "react-router"; +import useSWR from "swr"; +// components +import { LogoSpinner } from "@/components/common/logo-spinner"; +import { PoweredBy } from "@/components/common/powered-by"; +import { SomethingWentWrongError } from "@/components/issues/issue-layouts/error"; +import { IssuesNavbarRoot } from "@/components/issues/navbar"; +// hooks +import { PageNotFound } from "@/components/ui/not-found"; +import { usePublish, usePublishList } from "@/hooks/store/publish"; +import { useIssueFilter } from "@/hooks/store/use-issue-filter"; +import type { Route } from "./+types/layout"; -type Props = { - children: React.ReactNode; - params: { - anchor: string; - }; -}; +const DEFAULT_TITLE = "Plane"; +const DEFAULT_DESCRIPTION = "Made with Plane, an AI-powered work management platform with publishing capabilities."; -// TODO: Convert into SSR in order to generate metadata -export async function generateMetadata({ params }: Props) { +interface IssueMetadata { + name?: string; + description?: string; + cover_image?: string; +} + +// Loader function runs on the server and fetches metadata +export async function loader({ params }: Route.LoaderArgs) { const { anchor } = params; - const DEFAULT_TITLE = "Plane"; - const DEFAULT_DESCRIPTION = "Made with Plane, an AI-powered work management platform with publishing capabilities."; + // Validate anchor before using in request (only allow alphanumeric, -, _) const ANCHOR_REGEX = /^[a-zA-Z0-9_-]+$/; if (!ANCHOR_REGEX.test(anchor)) { - return { title: DEFAULT_TITLE, description: DEFAULT_DESCRIPTION }; + return { metadata: null }; } + try { const response = await fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/public/anchor/${anchor}/meta/`); - const data = await response.json(); - return { - title: data?.name || DEFAULT_TITLE, - description: data?.description || DEFAULT_DESCRIPTION, - openGraph: { - title: data?.name || DEFAULT_TITLE, - description: data?.description || DEFAULT_DESCRIPTION, - type: "website", - images: [ - { - url: data?.cover_image, - width: 800, - height: 600, - alt: data?.name || DEFAULT_TITLE, - }, - ], - }, - twitter: { - card: "summary_large_image", - title: data?.name || DEFAULT_TITLE, - description: data?.description || DEFAULT_DESCRIPTION, - images: [data?.cover_image], - }, - }; - } catch { - return { title: DEFAULT_TITLE, description: DEFAULT_DESCRIPTION }; + + if (!response.ok) { + return { metadata: null }; + } + + const metadata: IssueMetadata = await response.json(); + return { metadata }; + } catch (error) { + console.error("Error fetching issue metadata:", error); + return { metadata: null }; } } -export default async function IssuesLayout(_props: Props) { - // return {children}; - return null; +// Meta function uses the loader data to generate metadata +export function meta({ loaderData }: Route.MetaArgs) { + const metadata = loaderData?.metadata; + + const title = metadata?.name || DEFAULT_TITLE; + const description = metadata?.description || DEFAULT_DESCRIPTION; + const coverImage = metadata?.cover_image; + + const metaTags = [ + { title }, + { name: "description", content: description }, + // OpenGraph metadata + { property: "og:title", content: title }, + { property: "og:description", content: description }, + { property: "og:type", content: "website" }, + // Twitter metadata + { name: "twitter:card", content: "summary_large_image" }, + { name: "twitter:title", content: title }, + { name: "twitter:description", content: description }, + ]; + + // Add images if cover image exists + if (coverImage) { + metaTags.push( + { property: "og:image", content: coverImage }, + { property: "og:image:width", content: "800" }, + { property: "og:image:height", content: "600" }, + { property: "og:image:alt", content: title }, + { name: "twitter:image", content: coverImage } + ); + } + + return metaTags; } + +// Prevent loader from re-running on anchor param changes +export function shouldRevalidate({ currentParams, nextParams }: ShouldRevalidateFunctionArgs) { + return currentParams.anchor !== nextParams.anchor; +} + +function IssuesLayout(props: Route.ComponentProps) { + const { anchor } = props.params; + // store hooks + const { fetchPublishSettings } = usePublishList(); + const publishSettings = usePublish(anchor); + const { updateLayoutOptions } = useIssueFilter(); + // fetch publish settings + const { error } = useSWR( + anchor ? `PUBLISH_SETTINGS_${anchor}` : null, + anchor + ? async () => { + const response = await fetchPublishSettings(anchor); + if (response.view_props) { + updateLayoutOptions({ + list: !!response.view_props.list, + kanban: !!response.view_props.kanban, + calendar: !!response.view_props.calendar, + gantt: !!response.view_props.gantt, + spreadsheet: !!response.view_props.spreadsheet, + }); + } + } + : null + ); + + if (!publishSettings && !error) { + return ( +
+ +
+ ); + } + + if (error?.status === 404) return ; + + if (error) return ; + + return ( + <> +
+
+ +
+
+ +
+
+ + + ); +} + +export default observer(IssuesLayout); diff --git a/apps/space/app/root.tsx b/apps/space/app/root.tsx index f36031fbd3..25f3e44710 100644 --- a/apps/space/app/root.tsx +++ b/apps/space/app/root.tsx @@ -1,10 +1,11 @@ import { Links, Meta, Outlet, Scripts } from "react-router"; -import type { LinksFunction } from "react-router"; +import type { HeadersFunction, LinksFunction } from "react-router"; // assets import appleTouchIcon from "@/app/assets/favicon/apple-touch-icon.png?url"; import favicon16 from "@/app/assets/favicon/favicon-16x16.png?url"; import favicon32 from "@/app/assets/favicon/favicon-32x32.png?url"; import faviconIco from "@/app/assets/favicon/favicon.ico?url"; +import siteWebmanifest from "@/app/assets/favicon/site.webmanifest?url"; import { LogoSpinner } from "@/components/common/logo-spinner"; import globalStyles from "@/styles/globals.css?url"; // types @@ -21,10 +22,18 @@ export const links: LinksFunction = () => [ { rel: "icon", type: "image/png", sizes: "32x32", href: favicon32 }, { rel: "icon", type: "image/png", sizes: "16x16", href: favicon16 }, { rel: "shortcut icon", href: faviconIco }, - { rel: "manifest", href: `/site.webmanifest.json` }, + { rel: "manifest", href: siteWebmanifest }, { rel: "stylesheet", href: globalStyles }, ]; +export const headers: HeadersFunction = () => ({ + "Referrer-Policy": "origin-when-cross-origin", + "X-Frame-Options": "SAMEORIGIN", + "X-Content-Type-Options": "nosniff", + "X-DNS-Prefetch-Control": "on", + "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", +}); + export function Layout({ children }: { children: React.ReactNode }) { return ( diff --git a/apps/space/app/routes.ts b/apps/space/app/routes.ts index bbfe623667..36c3d20fad 100644 --- a/apps/space/app/routes.ts +++ b/apps/space/app/routes.ts @@ -4,7 +4,7 @@ import { index, layout, route } from "@react-router/dev/routes"; export default [ index("./page.tsx"), route(":workspaceSlug/:projectId", "./[workspaceSlug]/[projectId]/page.tsx"), - layout("./issues/[anchor]/client-layout.tsx", [route("issues/:anchor", "./issues/[anchor]/page.tsx")]), + layout("./issues/[anchor]/layout.tsx", [route("issues/:anchor", "./issues/[anchor]/page.tsx")]), // Catch-all route for 404 handling route("*", "./not-found.tsx"), ] satisfies RouteConfig; diff --git a/apps/space/core/components/issues/peek-overview/layout.tsx b/apps/space/core/components/issues/peek-overview/layout.tsx index a17e6d853c..fe2a4655d8 100644 --- a/apps/space/core/components/issues/peek-overview/layout.tsx +++ b/apps/space/core/components/issues/peek-overview/layout.tsx @@ -1,6 +1,6 @@ "use client"; -import { Fragment, useEffect, useState } from "react"; +import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import { useRouter, useSearchParams } from "next/navigation"; import { Dialog, Transition } from "@headlessui/react"; @@ -25,19 +25,19 @@ export const IssuePeekOverview: React.FC = observer((props) const state = searchParams.get("state") || undefined; const priority = searchParams.get("priority") || undefined; const labels = searchParams.get("labels") || undefined; - // states - const [isSidePeekOpen, setIsSidePeekOpen] = useState(false); - const [isModalPeekOpen, setIsModalPeekOpen] = useState(false); // store - const issueDetailStore = useIssueDetails(); - - const issueDetails = issueDetailStore.peekId && peekId ? issueDetailStore.details[peekId.toString()] : undefined; + const { peekMode, setPeekId, getIssueById, fetchIssueDetails } = useIssueDetails(); + // derived values + const issueDetails = peekId ? getIssueById(peekId.toString()) : undefined; + // state + const isSidePeekOpen = !!peekId && peekMode === "side"; + const isModalPeekOpen = !!peekId && (peekMode === "modal" || peekMode === "full"); useEffect(() => { if (anchor && peekId) { - issueDetailStore.fetchIssueDetails(anchor, peekId.toString()); + fetchIssueDetails(anchor, peekId.toString()); } - }, [anchor, issueDetailStore, peekId]); + }, [anchor, fetchIssueDetails, peekId]); const handleClose = () => { // if close logic is passed down, call that instead of the below logic @@ -46,7 +46,7 @@ export const IssuePeekOverview: React.FC = observer((props) return; } - issueDetailStore.setPeekId(null); + setPeekId(null); let queryParams: any = { board, }; @@ -57,21 +57,6 @@ export const IssuePeekOverview: React.FC = observer((props) router.push(`/issues/${anchor}?${queryParams}`); }; - useEffect(() => { - if (peekId) { - if (issueDetailStore.peekMode === "side") { - setIsSidePeekOpen(true); - setIsModalPeekOpen(false); - } else { - setIsModalPeekOpen(true); - setIsSidePeekOpen(false); - } - } else { - setIsSidePeekOpen(false); - setIsModalPeekOpen(false); - } - }, [peekId, issueDetailStore.peekMode]); - return ( <> @@ -116,13 +101,13 @@ export const IssuePeekOverview: React.FC = observer((props)
- {issueDetailStore.peekMode === "modal" && ( + {peekMode === "modal" && ( )} - {issueDetailStore.peekMode === "full" && ( + {peekMode === "full" && ( )}
diff --git a/apps/space/middleware.js b/apps/space/middleware.js deleted file mode 100644 index f4e89a9451..0000000000 --- a/apps/space/middleware.js +++ /dev/null @@ -1,13 +0,0 @@ -import { next } from "@vercel/edge"; - -export default function middleware() { - return next({ - headers: { - "Referrer-Policy": "origin-when-cross-origin", - "X-Frame-Options": "SAMEORIGIN", - "X-Content-Type-Options": "nosniff", - "X-DNS-Prefetch-Control": "on", - "Strict-Transport-Security": "max-age=31536000; includeSubDomains; preload", - }, - }); -} diff --git a/apps/space/package.json b/apps/space/package.json index d8e81e2c48..d22651da17 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -5,10 +5,10 @@ "license": "AGPL-3.0", "type": "module", "scripts": { - "dev": "cross-env NODE_ENV=development PORT=3002 node server.mjs", + "dev": "react-router dev --port 3002", "build": "react-router build", - "preview": "react-router build && cross-env NODE_ENV=production PORT=3002 node server.mjs", - "start": "serve -s build/client -l 3002", + "preview": "react-router build && PORT=3002 react-router-serve ./build/server/index.js", + "start": "PORT=3002 react-router-serve ./build/server/index.js", "clean": "rm -rf .turbo && rm -rf .next && rm -rf .react-router && rm -rf node_modules && rm -rf dist && rm -rf build", "check:lint": "eslint . --max-warnings 28", "check:types": "react-router typegen && tsc --noEmit", @@ -30,24 +30,18 @@ "@plane/ui": "workspace:*", "@plane/utils": "workspace:*", "@popperjs/core": "^2.11.8", - "@react-router/express": "^7.9.3", "@react-router/node": "^7.9.3", - "@vercel/edge": "1.2.2", + "@react-router/serve": "^7.9.5", "axios": "catalog:", "clsx": "^2.0.0", - "compression": "^1.8.1", - "cross-env": "^7.0.3", "date-fns": "^4.1.0", "dotenv": "^16.4.5", - "express": "^5.1.0", - "http-proxy-middleware": "^3.0.5", "isbot": "^5.1.31", "lodash-es": "catalog:", "lucide-react": "catalog:", "mobx": "catalog:", "mobx-react": "catalog:", "mobx-utils": "catalog:", - "morgan": "^1.10.1", "next-themes": "^0.2.1", "react": "catalog:", "react-dom": "catalog:", @@ -56,7 +50,6 @@ "react-popper": "^2.3.0", "react-router": "^7.9.1", "react-router-dom": "^7.9.1", - "serve": "14.2.5", "swr": "catalog:", "uuid": "catalog:" }, @@ -65,10 +58,7 @@ "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", "@react-router/dev": "^7.9.1", - "@types/compression": "^1.8.1", - "@types/express": "4.17.23", "@types/lodash-es": "catalog:", - "@types/morgan": "^1.9.10", "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", diff --git a/apps/space/react-router.config.ts b/apps/space/react-router.config.ts index b046a7a121..6b2adf937e 100644 --- a/apps/space/react-router.config.ts +++ b/apps/space/react-router.config.ts @@ -1,8 +1,10 @@ import type { Config } from "@react-router/dev/config"; +import { joinUrlPath } from "@plane/utils"; + +const basePath = joinUrlPath(process.env.NEXT_PUBLIC_SPACE_BASE_PATH ?? "", "/") ?? "/"; export default { appDirectory: "app", - basename: process.env.NEXT_PUBLIC_SPACE_BASE_PATH, - // Space runs as a client-side app; build a static client bundle only - ssr: false, + basename: basePath, + ssr: true, } satisfies Config; diff --git a/apps/space/server.mjs b/apps/space/server.mjs deleted file mode 100644 index 3342bd0be9..0000000000 --- a/apps/space/server.mjs +++ /dev/null @@ -1,76 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import compression from "compression"; -import dotenv from "dotenv"; -import express from "express"; -import morgan from "morgan"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -dotenv.config({ path: path.resolve(__dirname, ".env") }); - -const BUILD_PATH = "./build/server/index.js"; -const DEVELOPMENT = process.env.NODE_ENV !== "production"; - -// Derive the port from NEXT_PUBLIC_SPACE_BASE_URL when available, otherwise -// default to http://localhost:3002 and fall back to PORT env if explicitly set. -const DEFAULT_BASE_URL = "http://localhost:3002"; -const SPACE_BASE_URL = process.env.NEXT_PUBLIC_SPACE_BASE_URL || DEFAULT_BASE_URL; -let parsedBaseUrl; -try { - parsedBaseUrl = new URL(SPACE_BASE_URL); -} catch { - parsedBaseUrl = new URL(DEFAULT_BASE_URL); -} - -const PORT = Number.parseInt(parsedBaseUrl.port, 10); - -async function start() { - const app = express(); - - app.use(compression()); - app.disable("x-powered-by"); - - if (DEVELOPMENT) { - console.log("Starting development server"); - - const vite = await import("vite").then((vite) => - vite.createServer({ - server: { middlewareMode: true }, - appType: "custom", - }) - ); - - app.use(vite.middlewares); - - app.use(async (req, res, next) => { - try { - const source = await vite.ssrLoadModule("./server/app.ts"); - return source.app(req, res, next); - } catch (error) { - if (error instanceof Error) { - vite.ssrFixStacktrace(error); - } - - next(error); - } - }); - } else { - console.log("Starting production server"); - - app.use("/assets", express.static("build/client/assets", { immutable: true, maxAge: "1y" })); - app.use(morgan("tiny")); - app.use(express.static("build/client", { maxAge: "1h" })); - app.use(await import(BUILD_PATH).then((mod) => mod.app)); - } - - app.listen(PORT, () => { - const origin = `${parsedBaseUrl.protocol}//${parsedBaseUrl.hostname}:${PORT}`; - console.log(`Server is running on ${origin}`); - }); -} - -start().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/apps/space/server/app.ts b/apps/space/server/app.ts deleted file mode 100644 index d21b5bec5b..0000000000 --- a/apps/space/server/app.ts +++ /dev/null @@ -1,46 +0,0 @@ -import "react-router"; -import { createRequestHandler } from "@react-router/express"; -import express from "express"; -import type { Express } from "express"; -import { createProxyMiddleware } from "http-proxy-middleware"; - -const NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL - ? process.env.NEXT_PUBLIC_API_BASE_URL.replace(/\/$/, "") - : "http://127.0.0.1:8000"; -const NEXT_PUBLIC_API_BASE_PATH = process.env.NEXT_PUBLIC_API_BASE_PATH - ? process.env.NEXT_PUBLIC_API_BASE_PATH.replace(/\/+$/, "") - : "/api"; -const NORMALIZED_API_BASE_PATH = NEXT_PUBLIC_API_BASE_PATH.startsWith("/") - ? NEXT_PUBLIC_API_BASE_PATH - : `/${NEXT_PUBLIC_API_BASE_PATH}`; -const NEXT_PUBLIC_SPACE_BASE_PATH = process.env.NEXT_PUBLIC_SPACE_BASE_PATH - ? process.env.NEXT_PUBLIC_SPACE_BASE_PATH.replace(/\/$/, "") - : "/"; - -export const app: Express = express(); - -// Ensure proxy-aware hostname/URL handling (e.g., X-Forwarded-Host/Proto) -// so generated URLs/redirects reflect the public host when behind Nginx. -// See related fix in Remix Express adapter. -app.set("trust proxy", true); - -app.use( - "/api", - createProxyMiddleware({ - target: NEXT_PUBLIC_API_BASE_URL, - changeOrigin: true, - secure: false, - pathRewrite: (path: string) => - NORMALIZED_API_BASE_PATH === "/api" ? path : path.replace(/^\/api/, NORMALIZED_API_BASE_PATH), - }) -); - -const router = express.Router(); - -router.use( - createRequestHandler({ - build: () => import("virtual:react-router/server-build"), - }) -); - -app.use(NEXT_PUBLIC_SPACE_BASE_PATH, router); diff --git a/apps/space/vite.config.ts b/apps/space/vite.config.ts index 0ef1c5141d..ce1389e81d 100644 --- a/apps/space/vite.config.ts +++ b/apps/space/vite.config.ts @@ -1,59 +1,38 @@ import path from "node:path"; import { reactRouter } from "@react-router/dev/vite"; +import dotenv from "dotenv"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; import { joinUrlPath } from "@plane/utils"; -const PUBLIC_ENV_KEYS = [ - "NEXT_PUBLIC_API_BASE_URL", - "NEXT_PUBLIC_API_BASE_PATH", - "NEXT_PUBLIC_ADMIN_BASE_URL", - "NEXT_PUBLIC_ADMIN_BASE_PATH", - "NEXT_PUBLIC_SPACE_BASE_URL", - "NEXT_PUBLIC_SPACE_BASE_PATH", - "NEXT_PUBLIC_LIVE_BASE_URL", - "NEXT_PUBLIC_LIVE_BASE_PATH", - "NEXT_PUBLIC_WEB_BASE_URL", - "NEXT_PUBLIC_WEB_BASE_PATH", - "NEXT_PUBLIC_WEBSITE_URL", - "NEXT_PUBLIC_SUPPORT_EMAIL", -]; +dotenv.config({ path: path.resolve(__dirname, ".env") }); -const publicEnv = PUBLIC_ENV_KEYS.reduce>((acc, key) => { - acc[key] = process.env[key] ?? ""; - return acc; -}, {}); +// Automatically expose all environment variables prefixed with NEXT_PUBLIC_ +const publicEnv = Object.keys(process.env) + .filter((key) => key.startsWith("NEXT_PUBLIC_")) + .reduce>((acc, key) => { + acc[key] = process.env[key] ?? ""; + return acc; + }, {}); -export default defineConfig(({ isSsrBuild }) => { - // Only produce an SSR bundle when explicitly enabled. - // For static deployments (default), we skip the server build entirely. - const enableSsrBuild = process.env.SPACE_ENABLE_SSR_BUILD === "true"; - const basePath = joinUrlPath(process.env.NEXT_PUBLIC_SPACE_BASE_PATH ?? "", "/") ?? "/"; +const basePath = joinUrlPath(process.env.NEXT_PUBLIC_SPACE_BASE_PATH ?? "", "/") ?? "/"; - return { - base: basePath, - define: { - "process.env": JSON.stringify(publicEnv), +export default defineConfig(() => ({ + base: basePath, + define: { + "process.env": JSON.stringify(publicEnv), + }, + build: { + assetsInlineLimit: 0, + }, + plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], + resolve: { + alias: { + // Next.js compatibility shims used within space + "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), + "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), + "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), }, - build: { - assetsInlineLimit: 0, - rollupOptions: - isSsrBuild && enableSsrBuild - ? { - input: path.resolve(__dirname, "server/app.ts"), - } - : undefined, - }, - plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], - resolve: { - alias: { - // Next.js compatibility shims used within space - "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), - "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), - "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), - }, - dedupe: ["react", "react-dom"], - }, - // No SSR-specific overrides needed; alias resolves to ESM build - }; -}); + dedupe: ["react", "react-dom"], + }, +})); diff --git a/apps/web/package.json b/apps/web/package.json index 464771191c..795caa86eb 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -5,9 +5,9 @@ "license": "AGPL-3.0", "type": "module", "scripts": { - "dev": "cross-env NODE_ENV=development PORT=3000 node server.mjs", + "dev": "react-router dev --port 3000", "build": "react-router build", - "preview": "react-router build && cross-env NODE_ENV=production PORT=3000 node server.mjs", + "preview": "react-router build && serve -s build/client -l 3000", "start": "serve -s build/client -l 3000", "clean": "rm -rf .turbo && rm -rf .next && rm -rf .react-router && rm -rf node_modules && rm -rf dist && rm -rf build", "check:lint": "eslint . --max-warnings 821", @@ -35,28 +35,22 @@ "@plane/utils": "workspace:*", "@popperjs/core": "^2.11.8", "@react-pdf/renderer": "^3.4.5", - "@react-router/express": "^7.9.3", "@react-router/node": "^7.9.3", "@tanstack/react-table": "^8.21.3", "axios": "catalog:", "clsx": "^2.0.0", "cmdk": "^1.0.0", "comlink": "^4.4.1", - "compression": "^1.8.1", - "cross-env": "^7.0.3", "date-fns": "^4.1.0", "dotenv": "^16.4.5", "emoji-picker-react": "^4.5.16", "export-to-csv": "^1.4.0", - "express": "^5.1.0", - "http-proxy-middleware": "^3.0.5", "isbot": "^5.1.31", "lodash-es": "catalog:", "lucide-react": "catalog:", "mobx-react": "catalog:", "mobx-utils": "catalog:", "mobx": "catalog:", - "morgan": "^1.10.1", "next-themes": "^0.2.1", "posthog-js": "^1.131.3", "react-color": "^2.19.3", @@ -85,10 +79,7 @@ "@plane/tailwind-config": "workspace:*", "@plane/typescript-config": "workspace:*", "@react-router/dev": "^7.9.1", - "@types/compression": "^1.8.1", - "@types/express": "4.17.23", "@types/lodash-es": "catalog:", - "@types/morgan": "^1.9.10", "@types/node": "catalog:", "@types/react-color": "^3.0.6", "@types/react-dom": "catalog:", diff --git a/apps/web/react-router.config.ts b/apps/web/react-router.config.ts index 8b10c5e4bf..dfaf7d004d 100644 --- a/apps/web/react-router.config.ts +++ b/apps/web/react-router.config.ts @@ -2,7 +2,6 @@ import type { Config } from "@react-router/dev/config"; export default { appDirectory: "app", - basename: process.env.NEXT_PUBLIC_WEB_BASE_PATH, // Web runs as a client-side app; build a static client bundle only ssr: false, } satisfies Config; diff --git a/apps/web/server.mjs b/apps/web/server.mjs deleted file mode 100644 index 7ffa0d6059..0000000000 --- a/apps/web/server.mjs +++ /dev/null @@ -1,77 +0,0 @@ -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import compression from "compression"; -import dotenv from "dotenv"; -import express from "express"; -import morgan from "morgan"; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); - -dotenv.config({ path: path.resolve(__dirname, ".env") }); - -const BUILD_PATH = "./build/server/index.js"; -const DEVELOPMENT = process.env.NODE_ENV !== "production"; - -// Derive the port from NEXT_PUBLIC_WEB_BASE_URL when available, otherwise -// default to http://localhost:3000 and fall back to PORT env if explicitly set. -const DEFAULT_BASE_URL = "http://localhost:3000"; -const WEB_BASE_URL = process.env.NEXT_PUBLIC_WEB_BASE_URL || DEFAULT_BASE_URL; -let parsedBaseUrl; -try { - parsedBaseUrl = new URL(WEB_BASE_URL); -} catch { - parsedBaseUrl = new URL(DEFAULT_BASE_URL); -} - -const PORT = Number.parseInt(parsedBaseUrl.port, 10); - -async function start() { - const app = express(); - - app.use(compression()); - app.disable("x-powered-by"); - - if (DEVELOPMENT) { - console.log("Starting development server"); - - const vite = await import("vite").then((vite) => - vite.createServer({ - server: { middlewareMode: true }, - appType: "custom", - }) - ); - - app.use(vite.middlewares); - - app.use(async (req, res, next) => { - try { - const source = await vite.ssrLoadModule("./server/app.ts"); - return source.app(req, res, next); - } catch (error) { - if (error instanceof Error) { - vite.ssrFixStacktrace(error); - } - - next(error); - } - }); - } else { - console.log("Starting production server"); - - app.use("/assets", express.static("build/client/assets", { immutable: true, maxAge: "1y" })); - app.use(morgan("tiny")); - app.use(express.static("build/client", { maxAge: "1h" })); - app.use(await import(BUILD_PATH).then((mod) => mod.app)); - } - - app.listen(PORT, () => { - const origin = `${parsedBaseUrl.protocol}//${parsedBaseUrl.hostname}:${PORT}`; - console.log(`Server is running on ${origin}`); - }); -} - -start().catch((error) => { - console.error(error); - process.exit(1); -}); - diff --git a/apps/web/server/app.ts b/apps/web/server/app.ts deleted file mode 100644 index f2e7349f0a..0000000000 --- a/apps/web/server/app.ts +++ /dev/null @@ -1,47 +0,0 @@ -import "react-router"; -import { createRequestHandler } from "@react-router/express"; -import express from "express"; -import type { Express } from "express"; -import { createProxyMiddleware } from "http-proxy-middleware"; -import type { ServerBuild } from "react-router"; - -const NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL - ? process.env.NEXT_PUBLIC_API_BASE_URL.replace(/\/$/, "") - : "http://127.0.0.1:8000"; -const NEXT_PUBLIC_API_BASE_PATH = process.env.NEXT_PUBLIC_API_BASE_PATH - ? process.env.NEXT_PUBLIC_API_BASE_PATH.replace(/\/+$/, "") - : "/api"; -const NORMALIZED_API_BASE_PATH = NEXT_PUBLIC_API_BASE_PATH.startsWith("/") - ? NEXT_PUBLIC_API_BASE_PATH - : `/${NEXT_PUBLIC_API_BASE_PATH}`; -const NEXT_PUBLIC_WEB_BASE_PATH = process.env.NEXT_PUBLIC_WEB_BASE_PATH - ? process.env.NEXT_PUBLIC_WEB_BASE_PATH.replace(/\/$/, "") - : "/"; - -export const app: Express = express(); - -// Ensure proxy-aware hostname/URL handling (e.g., X-Forwarded-Host/Proto) -// so generated URLs/redirects reflect the public host when behind Nginx. -// See related fix in Remix Express adapter. -app.set("trust proxy", true); - -app.use( - "/api", - createProxyMiddleware({ - target: NEXT_PUBLIC_API_BASE_URL, - changeOrigin: true, - secure: false, - pathRewrite: (path: string) => - NORMALIZED_API_BASE_PATH === "/api" ? path : path.replace(/^\/api/, NORMALIZED_API_BASE_PATH), - }) -); - -const router = express.Router(); - -router.use( - createRequestHandler({ - build: () => import("virtual:react-router/server-build") as Promise, - }) -); - -app.use(NEXT_PUBLIC_WEB_BASE_PATH, router); diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index f2a65a06fa..badb98b882 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,67 +1,36 @@ import path from "node:path"; import { reactRouter } from "@react-router/dev/vite"; +import dotenv from "dotenv"; import { defineConfig } from "vite"; import tsconfigPaths from "vite-tsconfig-paths"; -const PUBLIC_ENV_KEYS = [ - "ENABLE_EXPERIMENTAL_COREPACK", - "NEXT_PUBLIC_ADMIN_BASE_PATH", - "NEXT_PUBLIC_ADMIN_BASE_URL", - "NEXT_PUBLIC_API_BASE_PATH", - "NEXT_PUBLIC_API_BASE_URL", - "NEXT_PUBLIC_CRISP_ID", - "NEXT_PUBLIC_ENABLE_SESSION_RECORDER", - "NEXT_PUBLIC_EXTRA_IMAGE_DOMAINS", - "NEXT_PUBLIC_LIVE_BASE_PATH", - "NEXT_PUBLIC_LIVE_BASE_URL", - "NEXT_PUBLIC_PLAUSIBLE_DOMAIN", - "NEXT_PUBLIC_POSTHOG_DEBUG", - "NEXT_PUBLIC_POSTHOG_HOST", - "NEXT_PUBLIC_POSTHOG_KEY", - "NEXT_PUBLIC_SESSION_RECORDER_KEY", - "NEXT_PUBLIC_SPACE_BASE_PATH", - "NEXT_PUBLIC_SPACE_BASE_URL", - "NEXT_PUBLIC_SUPPORT_EMAIL", - "NEXT_PUBLIC_WEB_BASE_PATH", - "NEXT_PUBLIC_WEB_BASE_URL", - "NEXT_PUBLIC_WEBSITE_URL", - "NODE_ENV", -]; +dotenv.config({ path: path.resolve(__dirname, ".env") }); -const publicEnv = PUBLIC_ENV_KEYS.reduce>((acc, key) => { - acc[key] = process.env[key] ?? ""; - return acc; -}, {}); +// Automatically expose all environment variables prefixed with NEXT_PUBLIC_ +const publicEnv = Object.keys(process.env) + .filter((key) => key.startsWith("NEXT_PUBLIC_")) + .reduce>((acc, key) => { + acc[key] = process.env[key] ?? ""; + return acc; + }, {}); -export default defineConfig(({ isSsrBuild }) => { - // Only produce an SSR bundle when explicitly enabled. - // For static deployments (default), we skip the server build entirely. - const enableSsrBuild = process.env.WEB_ENABLE_SSR_BUILD === "true"; - - return { - define: { - "process.env": JSON.stringify(publicEnv), +export default defineConfig(() => ({ + define: { + "process.env": JSON.stringify(publicEnv), + }, + build: { + assetsInlineLimit: 0, + }, + plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], + resolve: { + alias: { + // Next.js compatibility shims used within web + "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), + "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), + "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), + "next/script": path.resolve(__dirname, "app/compat/next/script.tsx"), }, - build: { - assetsInlineLimit: 0, - rollupOptions: - isSsrBuild && enableSsrBuild - ? { - input: path.resolve(__dirname, "server/app.ts"), - } - : undefined, - }, - plugins: [reactRouter(), tsconfigPaths({ projects: [path.resolve(__dirname, "tsconfig.json")] })], - resolve: { - alias: { - // Next.js compatibility shims used within web - "next/image": path.resolve(__dirname, "app/compat/next/image.tsx"), - "next/link": path.resolve(__dirname, "app/compat/next/link.tsx"), - "next/navigation": path.resolve(__dirname, "app/compat/next/navigation.ts"), - "next/script": path.resolve(__dirname, "app/compat/next/script.tsx"), - }, - dedupe: ["react", "react-dom", "@headlessui/react"], - }, - // No SSR-specific overrides needed; alias resolves to ESM build - }; -}); + dedupe: ["react", "react-dom", "@headlessui/react"], + }, + // No SSR-specific overrides needed; alias resolves to ESM build +})); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18452f7ce8..3854fbeb3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,9 +134,6 @@ importers: '@plane/utils': specifier: workspace:* version: link:../../packages/utils - '@react-router/express': - specifier: ^7.9.3 - version: 7.9.4(express@5.1.0)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@react-router/node': specifier: ^7.9.3 version: 7.9.4(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) @@ -152,21 +149,9 @@ importers: axios: specifier: 'catalog:' version: 1.12.0 - compression: - specifier: ^1.8.1 - version: 1.8.1 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 dotenv: specifier: ^16.4.5 version: 16.6.1 - express: - specifier: ^5.1.0 - version: 5.1.0 - http-proxy-middleware: - specifier: ^3.0.5 - version: 3.0.5 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -182,9 +167,6 @@ importers: mobx-react: specifier: 'catalog:' version: 9.1.1(mobx@6.12.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - morgan: - specifier: ^1.10.1 - version: 1.10.1 next-themes: specifier: ^0.2.1 version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -224,19 +206,10 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: ^7.9.1 - version: 7.9.4(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) - '@types/compression': - specifier: ^1.8.1 - version: 1.8.1 - '@types/express': - specifier: 4.17.23 - version: 4.17.23 + version: 7.9.4(@react-router/serve@7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 - '@types/morgan': - specifier: ^1.9.10 - version: 1.9.10 '@types/node': specifier: 'catalog:' version: 22.12.0 @@ -415,39 +388,24 @@ importers: '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 - '@react-router/express': - specifier: ^7.9.3 - version: 7.9.4(express@5.1.0)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@react-router/node': specifier: ^7.9.3 version: 7.9.4(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) - '@vercel/edge': - specifier: 1.2.2 - version: 1.2.2 + '@react-router/serve': + specifier: ^7.9.5 + version: 7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) axios: specifier: 'catalog:' version: 1.12.0 clsx: specifier: ^2.0.0 version: 2.1.1 - compression: - specifier: ^1.8.1 - version: 1.8.1 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 date-fns: specifier: ^4.1.0 version: 4.1.0 dotenv: specifier: ^16.4.5 version: 16.6.1 - express: - specifier: ^5.1.0 - version: 5.1.0 - http-proxy-middleware: - specifier: ^3.0.5 - version: 3.0.5 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -466,9 +424,6 @@ importers: mobx-utils: specifier: 'catalog:' version: 6.0.8(mobx@6.12.0) - morgan: - specifier: ^1.10.1 - version: 1.10.1 next-themes: specifier: ^0.2.1 version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -493,9 +448,6 @@ importers: react-router-dom: specifier: ^7.9.1 version: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - serve: - specifier: 14.2.5 - version: 14.2.5 swr: specifier: 'catalog:' version: 2.2.4(react@18.3.1) @@ -514,19 +466,10 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: ^7.9.1 - version: 7.9.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) - '@types/compression': - specifier: ^1.8.1 - version: 1.8.1 - '@types/express': - specifier: 4.17.23 - version: 4.17.23 + version: 7.9.3(@react-router/serve@7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 - '@types/morgan': - specifier: ^1.9.10 - version: 1.9.10 '@types/node': specifier: 'catalog:' version: 22.12.0 @@ -602,9 +545,6 @@ importers: '@react-pdf/renderer': specifier: ^3.4.5 version: 3.4.5(react@18.3.1) - '@react-router/express': - specifier: ^7.9.3 - version: 7.9.4(express@5.1.0)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) '@react-router/node': specifier: ^7.9.3 version: 7.9.4(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) @@ -623,12 +563,6 @@ importers: comlink: specifier: ^4.4.1 version: 4.4.2 - compression: - specifier: ^1.8.1 - version: 1.8.1 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 date-fns: specifier: ^4.1.0 version: 4.1.0 @@ -641,12 +575,6 @@ importers: export-to-csv: specifier: ^1.4.0 version: 1.4.0 - express: - specifier: ^5.1.0 - version: 5.1.0 - http-proxy-middleware: - specifier: ^3.0.5 - version: 3.0.5 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -665,9 +593,6 @@ importers: mobx-utils: specifier: 'catalog:' version: 6.0.8(mobx@6.12.0) - morgan: - specifier: ^1.10.1 - version: 1.10.1 next-themes: specifier: ^0.2.1 version: 0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -746,19 +671,10 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: ^7.9.1 - version: 7.9.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) - '@types/compression': - specifier: ^1.8.1 - version: 1.8.1 - '@types/express': - specifier: 4.17.23 - version: 4.17.23 + version: 7.9.3(@react-router/serve@7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 - '@types/morgan': - specifier: ^1.9.10 - version: 1.9.10 '@types/node': specifier: 'catalog:' version: 22.12.0 @@ -2184,8 +2100,8 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.0.5': - resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.0.3': + resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} '@next/env@14.2.32': resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} @@ -2803,12 +2719,12 @@ packages: wrangler: optional: true - '@react-router/express@7.9.4': - resolution: {integrity: sha512-qba2YnZXWz8kyXNxXKDa0qS88ct4MwJKMwINmto/LPb08W/YdgRUBSZIw7QnOdN7aFkvWTRGXKBTCcle8WDnRA==} + '@react-router/express@7.9.5': + resolution: {integrity: sha512-Mg94Tw9JSaRuwkvIC6PaODRzsLs6mo70ppz5qdIK/G3iotSxsH08TDNdzot7CaXXevk/pIiD/+Tbn0H/asHsYA==} engines: {node: '>=20.0.0'} peerDependencies: express: ^4.17.1 || ^5 - react-router: 7.9.4 + react-router: 7.9.5 typescript: 5.8.3 peerDependenciesMeta: typescript: @@ -2834,6 +2750,23 @@ packages: typescript: optional: true + '@react-router/node@7.9.5': + resolution: {integrity: sha512-3mDd32mXh3gEkG0cLPnUaoLkY1pApsTPqn7O1j+P8aLf997uYz5lYDjt33vtMhaotlRM0x+5JziAKtz/76YBpQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react-router: 7.9.5 + typescript: 5.8.3 + peerDependenciesMeta: + typescript: + optional: true + + '@react-router/serve@7.9.5': + resolution: {integrity: sha512-sww8oDNqz8SgaXEQ3maqTuMlibCMpmWvLE0s5zyEyOQb1G99clYMcXceQ2HNU2jtXJkp+P5XI1CngpGpngyTnw==} + engines: {node: '>=20.0.0'} + hasBin: true + peerDependencies: + react-router: 7.9.5 + '@remirror/core-constants@3.0.0': resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} @@ -3802,9 +3735,6 @@ packages: '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - '@types/http-proxy@1.17.16': - resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3844,9 +3774,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/morgan@1.9.10': - resolution: {integrity: sha512-sS4A1zheMvsADRVfT0lYbJ4S9lmsey8Zo2F7cnbYjWHP67Q0AwMYuuzLlkIM2N8gAbb9cubhIVFwcIN2XyYCkA==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -4191,10 +4118,6 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -4450,10 +4373,6 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -4719,10 +4638,6 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -4736,10 +4651,6 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -4765,11 +4676,6 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - cross-fetch@3.2.0: resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} @@ -5439,10 +5345,6 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -5514,10 +5416,6 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} - find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -5601,10 +5499,6 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - frimousse@0.3.0: resolution: {integrity: sha512-kO6LMoKY/cLAYEhXXtqLRaLIE6L/DagpFPrUZaLv3LsUa1/8Iza3HhwZcgN8eZ+weXnhv69eoclNUPohcCa/IQ==} peerDependencies: @@ -5659,6 +5553,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -5817,14 +5715,6 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -5836,14 +5726,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} - engines: {node: '>=0.10.0'} - icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -6020,17 +5902,10 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-port-reachable@4.0.0: resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -6362,10 +6237,6 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} @@ -6376,10 +6247,6 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -6478,10 +6345,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} @@ -6584,10 +6447,6 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -6869,9 +6728,6 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7293,10 +7149,6 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - raw-body@3.0.1: - resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} - engines: {node: '>= 0.10'} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -7559,9 +7411,6 @@ packages: resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} engines: {node: '>=8.6.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -7628,10 +7477,6 @@ packages: rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -7694,10 +7539,6 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -7711,10 +7552,6 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - serve@14.2.5: resolution: {integrity: sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==} engines: {node: '>= 14'} @@ -8224,10 +8061,6 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -9451,7 +9284,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.0.5': + '@napi-rs/wasm-runtime@1.0.3': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -10133,7 +9966,7 @@ snapshots: '@react-pdf/primitives': 4.1.1 '@react-pdf/stylesheet': 6.1.0 - '@react-router/dev@7.9.3(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': + '@react-router/dev@7.9.3(@react-router/serve@7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -10165,6 +9998,7 @@ snapshots: vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: + '@react-router/serve': 7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - '@types/node' @@ -10182,7 +10016,7 @@ snapshots: - tsx - yaml - '@react-router/dev@7.9.4(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': + '@react-router/dev@7.9.4(@react-router/serve@7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.5.1)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.3 @@ -10214,6 +10048,7 @@ snapshots: vite: 7.1.11(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.5.1)(terser@5.43.1)(yaml@2.8.1) optionalDependencies: + '@react-router/serve': 7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - '@types/node' @@ -10231,21 +10066,22 @@ snapshots: - tsx - yaml - '@react-router/express@7.9.4(express@5.1.0)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + '@react-router/express@7.9.5(express@4.21.2)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': dependencies: - '@react-router/node': 7.9.4(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) - express: 5.1.0 + '@react-router/node': 7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + express: 4.21.2 react-router: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: typescript: 5.8.3 - '@react-router/express@7.9.4(express@5.1.0)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + '@react-router/express@7.9.5(express@4.21.2)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': dependencies: - '@react-router/node': 7.9.4(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) - express: 5.1.0 + '@react-router/node': 7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + express: 4.21.2 react-router: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: typescript: 5.8.3 + optional: true '@react-router/node@7.9.3(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': dependencies: @@ -10268,6 +10104,52 @@ snapshots: optionalDependencies: typescript: 5.8.3 + '@react-router/node@7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + dependencies: + '@mjackson/node-fetch-server': 0.2.0 + react-router: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + typescript: 5.8.3 + + '@react-router/node@7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + dependencies: + '@mjackson/node-fetch-server': 0.2.0 + react-router: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + typescript: 5.8.3 + optional: true + + '@react-router/serve@7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + dependencies: + '@mjackson/node-fetch-server': 0.2.0 + '@react-router/express': 7.9.5(express@4.21.2)(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + '@react-router/node': 7.9.5(react-router@7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + compression: 1.8.1 + express: 4.21.2 + get-port: 5.1.1 + morgan: 1.10.1 + react-router: 7.9.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + - typescript + + '@react-router/serve@7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3)': + dependencies: + '@mjackson/node-fetch-server': 0.2.0 + '@react-router/express': 7.9.5(express@4.21.2)(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + '@react-router/node': 7.9.5(react-router@7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + compression: 1.8.1 + express: 4.21.2 + get-port: 5.1.1 + morgan: 1.10.1 + react-router: 7.9.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + - typescript + optional: true + '@remirror/core-constants@3.0.0': {} '@remix-run/node-fetch-server@0.9.0': {} @@ -10304,7 +10186,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-beta.34': dependencies: - '@napi-rs/wasm-runtime': 1.0.5 + '@napi-rs/wasm-runtime': 1.0.3 optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34': @@ -11380,10 +11262,6 @@ snapshots: '@types/http-errors@2.0.5': {} - '@types/http-proxy@1.17.16': - dependencies: - '@types/node': 22.12.0 - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -11420,10 +11298,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/morgan@1.9.10': - dependencies: - '@types/node': 22.12.0 - '@types/ms@2.1.0': {} '@types/mysql@2.15.27': @@ -11814,11 +11688,6 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 - acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -12024,7 +11893,7 @@ snapshots: axios@1.12.0: dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11 form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -12096,20 +11965,6 @@ snapshots: transitivePeerDependencies: - supports-color - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.1 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - boolbase@1.0.0: {} boxen@7.0.0: @@ -12394,10 +12249,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - content-type@1.0.5: {} convert-source-map@1.9.0: {} @@ -12406,8 +12257,6 @@ snapshots: cookie-signature@1.0.6: {} - cookie-signature@1.2.2: {} - cookie@0.7.1: {} cookie@1.0.2: {} @@ -12434,10 +12283,6 @@ snapshots: crelt@1.0.6: {} - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - cross-fetch@3.2.0: dependencies: node-fetch: 2.7.0 @@ -13262,38 +13107,6 @@ snapshots: transitivePeerDependencies: - supports-color - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.2.2 - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.1 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -13365,17 +13178,6 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@2.1.0: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -13416,9 +13218,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 + follow-redirects@1.15.11: {} fontfaceobserver@2.1.0: {} @@ -13476,8 +13276,6 @@ snapshots: fresh@0.5.2: {} - fresh@2.0.0: {} - frimousse@0.3.0(react@18.3.1)(typescript@5.8.3): dependencies: react: 18.3.1 @@ -13535,6 +13333,8 @@ snapshots: get-nonce@1.0.1: {} + get-port@5.1.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -13699,25 +13499,6 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-proxy-middleware@3.0.5: - dependencies: - '@types/http-proxy': 1.17.16 - debug: 4.4.3 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-object: 5.0.0 - micromatch: 4.0.8 - transitivePeerDependencies: - - supports-color - - http-proxy@1.18.1(debug@4.4.3): - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - human-signals@2.1.0: {} hyphen@1.10.6: {} @@ -13726,14 +13507,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.7.0: - dependencies: - safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -13919,12 +13692,8 @@ snapshots: is-plain-obj@4.1.0: {} - is-plain-object@5.0.0: {} - is-port-reachable@4.0.0: {} - is-promise@4.0.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -14265,8 +14034,6 @@ snapshots: media-typer@0.3.0: {} - media-typer@1.1.0: {} - memfs@3.5.3: dependencies: fs-monkey: 1.1.0 @@ -14277,8 +14044,6 @@ snapshots: merge-descriptors@1.0.3: {} - merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -14437,10 +14202,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - mime@1.6.0: {} mimic-fn@2.1.0: {} @@ -14515,8 +14276,6 @@ snapshots: negotiator@0.6.4: {} - negotiator@1.0.0: {} - neo-async@2.6.2: {} next-themes@0.2.1(next@14.2.32(@babel/core@7.28.4)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -14809,8 +14568,6 @@ snapshots: path-to-regexp@3.3.0: {} - path-to-regexp@8.3.0: {} - path-type@4.0.0: {} pathe@1.1.2: {} @@ -15174,13 +14931,6 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-body@3.0.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.7.0 - unpipe: 1.0.0 - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -15529,8 +15279,6 @@ snapshots: transitivePeerDependencies: - supports-color - requires-port@1.0.0: {} - reselect@5.1.1: {} resolve-from@4.0.0: {} @@ -15629,16 +15377,6 @@ snapshots: rope-sequence@1.3.4: {} - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.3.0 - transitivePeerDependencies: - - supports-color - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -15722,22 +15460,6 @@ snapshots: transitivePeerDependencies: - supports-color - send@1.2.0: - dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - sentence-case@3.0.4: dependencies: no-case: 3.0.4 @@ -15767,15 +15489,6 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - serve@14.2.5: dependencies: '@zeit/schemas': 2.36.0 @@ -16320,12 +16033,6 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4