From 15d7c683dce86c5ba8967b08a3778b258a120e35 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Fri, 3 Oct 2025 22:47:22 +0200 Subject: [PATCH 1/3] perf: Update to React 19.2, Next.js canary --- .github/workflows/build-lint-test.yml | 6 +- .github/workflows/bump_publish.yml | 2 +- apps/api/package.json | 38 +- apps/docs/next.config.ts | 2 +- apps/docs/package.json | 59 +- .../src/app/[locale]/(docs)/docs/layout.tsx | 2 +- .../src/app/[locale]/(main)/(home)/page.tsx | 4 +- .../(main)/(home)/sections/admin/admin.tsx | 4 +- .../(main)/(home)/sections/call-to-action.tsx | 4 +- .../powering-by/logos/tailwindcss.tsx | 2 +- .../sections/powering-by/powering-by.tsx | 4 +- .../animated-beam/animated-beam.tsx | 4 +- apps/docs/src/examples/scroll-area.tsx | 2 +- apps/docs/src/examples/separator.tsx | 2 +- package.json | 12 +- packages/config/eslint.config.mjs | 6 + packages/config/package.json | 8 +- .../copy-of-vitnode-app/root/next.config.ts | 2 +- packages/create-vitnode-app/package.json | 10 +- .../src/create/create-package-json.ts | 61 +- packages/vitnode/package.json | 72 +- packages/vitnode/src/api/lib/route.ts | 29 +- .../vitnode/src/components/form/auto-form.tsx | 2 +- .../src/components/form/fields/checkbox.tsx | 2 +- .../components/form/fields/radio-group.tsx | 2 +- .../switchers/themes/theme-switcher.tsx | 4 +- .../vitnode/src/components/table/content.tsx | 2 +- .../vitnode/src/components/ui/accordion.tsx | 4 +- .../src/components/ui/alert-dialog.tsx | 2 +- packages/vitnode/src/components/ui/card.tsx | 6 +- .../vitnode/src/components/ui/checkbox.tsx | 2 +- .../vitnode/src/components/ui/command.tsx | 8 +- .../src/components/ui/context-menu.tsx | 12 +- packages/vitnode/src/components/ui/dialog.tsx | 6 +- .../src/components/ui/dropdown-menu.tsx | 12 +- packages/vitnode/src/components/ui/editor.tsx | 2 +- .../vitnode/src/components/ui/hover-card.tsx | 2 +- .../vitnode/src/components/ui/input-otp.tsx | 4 +- packages/vitnode/src/components/ui/input.tsx | 2 +- packages/vitnode/src/components/ui/label.tsx | 2 +- .../vitnode/src/components/ui/menubar.tsx | 16 +- .../src/components/ui/navigation-menu.tsx | 8 +- .../vitnode/src/components/ui/popover.tsx | 2 +- .../vitnode/src/components/ui/radio-group.tsx | 4 +- .../vitnode/src/components/ui/scroll-area.tsx | 4 +- packages/vitnode/src/components/ui/select.tsx | 6 +- .../vitnode/src/components/ui/separator.tsx | 2 +- packages/vitnode/src/components/ui/sheet.tsx | 2 +- .../vitnode/src/components/ui/sidebar.tsx | 23 +- packages/vitnode/src/components/ui/slider.tsx | 6 +- packages/vitnode/src/components/ui/switch.tsx | 2 +- packages/vitnode/src/components/ui/table.tsx | 2 +- packages/vitnode/src/components/ui/tabs.tsx | 2 +- .../vitnode/src/components/ui/textarea.tsx | 2 +- .../src/components/ui/toggle-group.tsx | 2 +- .../vitnode/src/components/ui/tooltip.tsx | 2 +- .../vitnode/src/emails/reset-password.tsx | 2 +- packages/vitnode/src/emails/ui/card.tsx | 2 +- packages/vitnode/src/hooks/use-captcha.ts | 3 + .../src/views/auth/sign-in/sign-in-view.tsx | 2 +- .../src/views/auth/sign-up/form/use-form.ts | 4 +- .../src/views/auth/sign-up/sign-up-view.tsx | 2 +- .../src/views/auth/sign-up/wrapper.tsx | 10 +- .../vitnode/src/views/layouts/provider.tsx | 1 + plugins/blog/package.json | 34 +- pnpm-lock.yaml | 6601 +++++++++-------- 66 files changed, 3644 insertions(+), 3513 deletions(-) diff --git a/.github/workflows/build-lint-test.yml b/.github/workflows/build-lint-test.yml index 002e810cf..fde016a7e 100644 --- a/.github/workflows/build-lint-test.yml +++ b/.github/workflows/build-lint-test.yml @@ -2,7 +2,7 @@ name: Build, Lint & Test on: pull_request: - branches: '*' + branches: "*" types: - opened - edited @@ -22,13 +22,13 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 10.15.0 + version: 10.18.0 - name: Install Node.js uses: actions/setup-node@v4 with: node-version-file: .nvmrc - cache: 'pnpm' + cache: "pnpm" - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/bump_publish.yml b/.github/workflows/bump_publish.yml index 074e6b4c9..ba1891e9d 100644 --- a/.github/workflows/bump_publish.yml +++ b/.github/workflows/bump_publish.yml @@ -52,7 +52,7 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 10.15.0 + version: 10.18.0 - name: Install Node.js uses: actions/setup-node@v4 diff --git a/apps/api/package.json b/apps/api/package.json index 098c457d6..145c0c38f 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -14,30 +14,30 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@hono/zod-openapi": "^1.1.0", - "@hono/zod-validator": "^0.7.2", + "@hono/zod-openapi": "^1.1.3", + "@hono/zod-validator": "^0.7.3", "@vitnode/core": "workspace:*", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.5", - "hono": "^4.9.6", - "next-intl": "^4.3.6", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "use-intl": "^4.3.6", - "zod": "^4.1.5" + "drizzle-kit": "^0.31.5", + "drizzle-orm": "^0.44.6", + "hono": "^4.9.9", + "next-intl": "^4.3.9", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "use-intl": "^4.3.9", + "zod": "^4.1.11" }, "devDependencies": { - "@hono/node-server": "^1.19.1", - "@react-email/components": "^0.5.2", - "@types/node": "^24.3.1", - "@types/react": "^19.1.12", - "@types/react-dom": "^19.1.9", + "@hono/node-server": "^1.19.5", + "@react-email/components": "^0.5.5", + "@types/node": "^24.6.2", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", "@vitnode/config": "workspace:*", - "dotenv": "^17.2.2", + "dotenv": "^17.2.3", "eslint": "^9.36.0", - "react-email": "^4.2.8", + "react-email": "^4.2.12", "tsc-alias": "^1.8.16", - "tsx": "^4.20.5", - "typescript": "^5.9.2" + "tsx": "^4.20.6", + "typescript": "^5.9.3" } } diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index 235d877c7..ff1e2c44c 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -12,7 +12,7 @@ const withBundleAnalyzer = nextAnalyzer({ const nextConfig: NextConfig = { experimental: { inlineCss: true, - reactCompiler: process.env.ANALYZE !== "true", + ppr: "incremental", }, }; diff --git a/apps/docs/package.json b/apps/docs/package.json index d9272c475..84bd517a1 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -22,47 +22,46 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@hono/zod-openapi": "^1.1.0", - "@hono/zod-validator": "^0.7.2", + "@hono/zod-openapi": "^1.1.3", + "@hono/zod-validator": "^0.7.3", "@vitnode/blog": "workspace:*", "@vitnode/core": "workspace:*", - "babel-plugin-react-compiler": "19.1.0-rc.3", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.5", - "fumadocs-core": "^15.7.10", - "fumadocs-mdx": "^11.9.0", - "fumadocs-ui": "^15.7.10", - "hono": "^4.9.6", - "lucide-react": "^0.542.0", - "motion": "^12.23.12", - "next": "^15.5.2", - "next-intl": "^4.3.6", + "drizzle-kit": "^0.31.5", + "drizzle-orm": "^0.44.6", + "fumadocs-core": "^15.8.3", + "fumadocs-mdx": "^12.0.2", + "fumadocs-ui": "^15.8.3", + "hono": "^4.9.9", + "lucide-react": "^0.544.0", + "motion": "^12.23.22", + "next": "15.6.0-canary.41", + "next-intl": "^4.3.9", "node-cron": "^4.2.1", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "react-hook-form": "^7.62.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-hook-form": "^7.63.0", "react-use": "^17.6.0", "sonner": "^2.0.7" }, "devDependencies": { - "@next/bundle-analyzer": "^15.5.2", - "@playwright/test": "^1.55.0", - "@react-email/components": "^0.5.2", - "@tailwindcss/postcss": "^4.1.13", + "@next/bundle-analyzer": "^15.5.4", + "@playwright/test": "^1.55.1", + "@react-email/components": "^0.5.5", + "@tailwindcss/postcss": "^4.1.14", "@types/mdx": "^2.0.13", - "@types/node": "^24.3.1", - "@types/react": "^19.1.12", - "@types/react-dom": "^19.1.9", + "@types/node": "^24.6.2", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", "@vitnode/config": "workspace:*", "class-variance-authority": "^0.7.1", "eslint": "^9.36.0", "postcss": "^8.5.6", - "react-email": "^4.2.8", - "shiki": "^3.12.2", - "tailwindcss": "^4.1.13", - "tw-animate-css": "^1.3.8", - "typescript": "^5.9.2", - "use-intl": "^4.3.6", - "zod": "^4.1.5" + "react-email": "^4.2.12", + "shiki": "^3.13.0", + "tailwindcss": "^4.1.14", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "use-intl": "^4.3.9", + "zod": "^4.1.11" } } diff --git a/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx b/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx index e8a4384d0..0e82841ab 100644 --- a/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx +++ b/apps/docs/src/app/[locale]/(docs)/docs/layout.tsx @@ -22,7 +22,7 @@ export default function Layout({ children }: { children: ReactNode }) { ...option, icon: (
-

+

Extendable Framework for Building Apps

-

+

Simplifies development with a powerful Plugin System, Admin Control Panel and extensible architecture.

diff --git a/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx b/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx index 1a3d46b0c..604c17f34 100644 --- a/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx +++ b/apps/docs/src/app/[locale]/(main)/(home)/sections/admin/admin.tsx @@ -13,8 +13,8 @@ export const AdminSection = () => {
-
-
+
+
payments illustration dark { return (
-

+

Start Building

-

+

Everything you need for modern web apps, zero config.

diff --git a/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx b/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx index bcd565d7e..8fe70187b 100644 --- a/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx +++ b/apps/docs/src/app/[locale]/(main)/(home)/sections/powering-by/logos/tailwindcss.tsx @@ -2,7 +2,7 @@ export const TailwindCSSLogo = () => { return ( { -
-
+
+
diff --git a/apps/docs/src/components/animated-beam/animated-beam.tsx b/apps/docs/src/components/animated-beam/animated-beam.tsx index 0eb84fad9..5b9f97cc7 100644 --- a/apps/docs/src/components/animated-beam/animated-beam.tsx +++ b/apps/docs/src/components/animated-beam/animated-beam.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @eslint-react/hooks-extra/no-direct-set-state-in-use-effect */ "use client"; import { cn } from "@vitnode/core/lib/utils"; @@ -91,6 +92,7 @@ export const AnimatedBeam = ({ // Initialize ResizeObserver const resizeObserver = new ResizeObserver(entries => { // For all entries, recalculate the path + // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const _entry of entries) { updatePath(); } @@ -122,7 +124,7 @@ export const AnimatedBeam = ({ return (
-

Tags

+

Tags

{tags.map(tag => (
{tag}
diff --git a/apps/docs/src/examples/separator.tsx b/apps/docs/src/examples/separator.tsx index 7e5459e82..f5221bc5c 100644 --- a/apps/docs/src/examples/separator.tsx +++ b/apps/docs/src/examples/separator.tsx @@ -4,7 +4,7 @@ export default function ProgressDemo() { return (
-

Radix Primitives

+

Radix Primitives

An open-source UI component library.

diff --git a/package.json b/package.json index 204b4345d..3a088959b 100644 --- a/package.json +++ b/package.json @@ -17,19 +17,19 @@ "test:e2e": "turbo test:e2e" }, "devDependencies": { - "@types/node": "^24.3.1", + "@types/node": "^24.6.2", "@vitnode/config": "workspace:*", "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.6.14", - "tsx": "^4.20.5", - "turbo": "^2.5.6", - "typescript": "^5.9.2", - "zod": "^4.1.5" + "tsx": "^4.20.6", + "turbo": "^2.5.8", + "typescript": "^5.9.3", + "zod": "^4.1.11" }, "engines": { "node": ">=22" }, - "packageManager": "pnpm@10.15.0", + "packageManager": "pnpm@10.18.0", "workspaces": [ "apps/*", "packages/*", diff --git a/packages/config/eslint.config.mjs b/packages/config/eslint.config.mjs index 1d26a3b85..b5db2b41d 100644 --- a/packages/config/eslint.config.mjs +++ b/packages/config/eslint.config.mjs @@ -161,6 +161,12 @@ export default [ ], message: "Please import from `vitnode-frontend/navigation` instead.", }, + { + name: "next/router", + importNames: ["useRouter"], + message: + "This import is from Page router. Please import from `vitnode-frontend/navigation` instead.", + }, ], }, }, diff --git a/packages/config/package.json b/packages/config/package.json index a7c03f7f8..03c018b67 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -38,10 +38,10 @@ "typescript": "5.9.x" }, "devDependencies": { - "typescript": "^5.9.2" + "typescript": "^5.9.3" }, "dependencies": { - "@eslint-react/eslint-plugin": "^1.53.1", + "@eslint-react/eslint-plugin": "^2.0.6", "@eslint/js": "^9.36.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -49,8 +49,8 @@ "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-you-might-not-need-an-effect": "^0.5.3", + "eslint-plugin-react-you-might-not-need-an-effect": "^0.5.5", "prettier-plugin-tailwindcss": "^0.6.14", - "typescript-eslint": "^8.44.1" + "typescript-eslint": "^8.45.0" } } diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts index 7a7db9334..41f04fdd0 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts @@ -4,7 +4,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { experimental: { inlineCss: true, - reactCompiler: true, + ppr: "incremental", }, }; diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 496c832d9..366117426 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -28,18 +28,18 @@ "typescript" ], "dependencies": { - "@inquirer/prompts": "^7.8.4", - "commander": "^14.0.0", - "ora": "^8.2.0", + "@inquirer/prompts": "^7.8.6", + "commander": "^14.0.1", + "ora": "^9.0.0", "picocolors": "^1.1.1", "validate-npm-package-name": "^6.0.2" }, "devDependencies": { - "@types/node": "^24.3.1", + "@types/node": "^24.6.2", "@types/prompts": "^2.4.9", "@types/validate-npm-package-name": "^4.0.2", "@vitnode/config": "workspace:*", "eslint": "^9.36.0", - "typescript": "^5.9.2" + "typescript": "^5.9.3" } } diff --git a/packages/create-vitnode-app/src/create/create-package-json.ts b/packages/create-vitnode-app/src/create/create-package-json.ts index a6a06b526..0b6ec84b8 100644 --- a/packages/create-vitnode-app/src/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/create/create-package-json.ts @@ -26,48 +26,45 @@ const withIf = >(cond: boolean, obj: T) => const versions = { typesNode: "^24", - typesReact: "^19.1", - typesReactDom: "^19.1", + typesReact: "^19.2", + typesReactDom: "^19.2", typesMdx: "^2.0.13", typesBun: "latest", - turbo: "^2.5.6", - typescript: "^5.9.2", - tsx: "^4.20.5", + turbo: "^2.5.8", + typescript: "^5.9.3", + tsx: "^4.20.6", tscAlias: "^1.8.16", eslint: "^9.33.0", prettier: "^3.6.2", prettierTailwind: "^0.6.14", - tailwind: "^4.1.12", - tailwindPostcss: "^4.1.13", + tailwind: "^4.1.14", + tailwindPostcss: "^4.1.14", postcss: "^8.5.6", - twAnimateCssWeb: "^1.3.7", - twAnimateCssSingle: "^1.3.8", + twAnimateCss: "^1.4.0", - react: "^19.1", - reactDom: "^19.1", - nextSingle: "^15.5.2", + react: "^19.2", + reactDom: "^19.2", + nextSingle: "15.6.0-canary.41", nextWebInMonorepo: "^15.4.6", - nextIntl: "^4.3.6", - useIntl: "^4.3.6", - rhf: "^7.62.0", + nextIntl: "^4.3.9", + useIntl: "^4.3.9", + rhf: "^7.63.0", rhfResolvers: "^5.1.1", - lucide: "^0.542.0", + lucide: "^0.544.0", sonner: "^2.0.7", dotenv: "^17.2.2", - drizzleKitSingle: "^0.31.4", - drizzleKitApi: "^0.31.3", - drizzleOrm: "^0.44.5", + drizzleKit: "^0.31.5", + drizzleOrm: "^0.44.6", - hono: "^4.9.6", - honoZodOpenapi: "^1.1.0", - honoZodValidator: "^0.7.2", - reactEmail: "^4.2.8", - reactEmailComponents: "^0.5.2", - zod: "^4.1.5", + hono: "^4.9.9", + honoZodOpenapi: "^1.1.3", + honoZodValidator: "^0.7.3", + reactEmail: "^4.2.12", + reactEmailComponents: "^0.5.5", + zod: "^4.1.11", - babelReactCompiler: "^19.1.0-rc.3", cva: "^0.7.1", }; @@ -172,7 +169,7 @@ const apiDeps = { "@hono/zod-validator": versions.honoZodValidator, "@react-email/components": versions.reactEmailComponents, "@vitnode/core": "", // filled dynamically - "drizzle-kit": versions.drizzleKitApi, + "drizzle-kit": versions.drizzleKit, "drizzle-orm": versions.drizzleOrm, hono: versions.hono, "next-intl": versions.nextIntl, @@ -183,7 +180,7 @@ const apiDeps = { }; const apiDevDeps = (pm: string, eslint: boolean) => ({ - "@hono/node-server": "^1.19.1", + "@hono/node-server": "^1.19.5", ...(pm === "bun" ? { "@types/bun": versions.typesBun } : {}), "@types/node": versions.typesNode, "@types/react": versions.typesReact, @@ -206,8 +203,7 @@ const singleAppDeps = { "@hookform/resolvers": versions.rhfResolvers, "@react-email/components": versions.reactEmailComponents, "@vitnode/core": "", - "babel-plugin-react-compiler": versions.babelReactCompiler, - "drizzle-kit": versions.drizzleKitSingle, + "drizzle-kit": versions.drizzleKit, "drizzle-orm": versions.drizzleOrm, hono: versions.hono, "lucide-react": versions.lucide, @@ -235,13 +231,12 @@ const singleAppDevDeps = (eslint: boolean) => ({ "react-email": versions.reactEmail, turbo: versions.turbo, tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCssSingle, + "tw-animate-css": versions.twAnimateCss, typescript: versions.typescript, }); const webDeps = { "@vitnode/core": "", - "babel-plugin-react-compiler": versions.babelReactCompiler, "lucide-react": versions.lucide, next: versions.nextWebInMonorepo, "next-intl": versions.nextIntl, @@ -263,7 +258,7 @@ const webDevDeps = (eslint: boolean) => ({ ...withIf(eslint, { eslint: versions.eslint }), postcss: versions.postcss, tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCssWeb, + "tw-animate-css": versions.twAnimateCss, typescript: versions.typescript, zod: versions.zod, }); diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index b516b3fee..d84227813 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -37,47 +37,47 @@ "zod": "^4.x.x" }, "devDependencies": { - "@hono/zod-openapi": "^1.1.0", - "@hono/zod-validator": "^0.7.2", - "@hookform/resolvers": "^5.2.1", - "@react-email/components": "^0.5.2", + "@hono/zod-openapi": "^1.1.3", + "@hono/zod-validator": "^0.7.3", + "@hookform/resolvers": "^5.2.2", + "@react-email/components": "^0.5.5", "@swc/cli": "0.6.0", "@swc/core": "^1.13.5", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", - "@types/node": "^24.3.1", - "@types/nodemailer": "^7.0.1", - "@types/react": "^19.1.12", - "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^5.0.2", + "@types/node": "^24.6.2", + "@types/nodemailer": "^7.0.2", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + "@vitejs/plugin-react": "^5.0.4", "@vitest/coverage-v8": "^3.2.4", "@vitnode/config": "workspace:*", "chokidar": "^4.0.3", "concurrently": "^9.2.1", - "dotenv": "^17.2.2", - "drizzle-kit": "^0.31.4", - "drizzle-orm": "^0.44.5", + "dotenv": "^17.2.3", + "drizzle-kit": "^0.31.5", + "drizzle-orm": "^0.44.6", "eslint": "^9.36.0", - "hono": "^4.9.6", + "hono": "^4.9.9", "jsdom": "^26.1.0", - "lucide-react": "^0.542.0", - "next": "^15.5.2", - "next-intl": "^4.3.6", + "lucide-react": "^0.544.0", + "next": "15.6.0-canary.41", + "next-intl": "^4.3.9", "node-cron": "^4.2.1", - "react": "^19.1.1", - "react-dom": "^19.1.1", - "react-email": "^4.2.8", - "react-hook-form": "^7.62.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-email": "^4.2.12", + "react-hook-form": "^7.63.0", "sonner": "^2.0.7", - "tailwindcss": "^4.1.13", + "tailwindcss": "^4.1.14", "tsc-alias": "^1.8.16", "tsup": "^8.5.0", - "tsx": "^4.20.5", - "tw-animate-css": "^1.3.8", - "typescript": "^5.9.2", + "tsx": "^4.20.6", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4", - "zod": "^4.1.5" + "zod": "^4.1.11" }, "bin": { "vitnode": "./dist/scripts/scripts.js" @@ -113,28 +113,28 @@ "dependencies": { "@dnd-kit/core": "^6.3.1", "@hono/swagger-ui": "^0.5.2", - "@react-email/preview-server": "^4.2.8", - "@tanstack/react-query": "^5.87.1", - "@tiptap/extension-text-align": "^3.4.1", - "@tiptap/pm": "^3.4.1", - "@tiptap/react": "^3.4.1", - "@tiptap/starter-kit": "^3.4.1", + "@react-email/preview-server": "^4.2.12", + "@tanstack/react-query": "^5.90.2", + "@tiptap/extension-text-align": "^3.6.5", + "@tiptap/pm": "^3.6.5", + "@tiptap/react": "^3.6.5", + "@tiptap/starter-kit": "^3.6.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "cron-parser": "^5.3.1", + "cron-parser": "^5.4.0", "input-otp": "^1.4.2", - "motion": "^12.23.12", + "motion": "^12.23.22", "next-themes": "^0.4.6", "nodemailer": "^7.0.6", "postgres": "^3.4.7", "radix-ui": "^1.4.3", - "rate-limiter-flexible": "^7.3.0", + "rate-limiter-flexible": "^8.0.1", "react-scan": "^0.4.3", - "resend": "^6.0.2", + "resend": "^6.1.2", "tailwind-merge": "^3.3.1", "use-debounce": "^10.0.6", - "use-intl": "^4.3.6", + "use-intl": "^4.3.9", "vaul": "^1.1.2" } } diff --git a/packages/vitnode/src/api/lib/route.ts b/packages/vitnode/src/api/lib/route.ts index a6c39cc68..e2f217ef4 100644 --- a/packages/vitnode/src/api/lib/route.ts +++ b/packages/vitnode/src/api/lib/route.ts @@ -8,15 +8,6 @@ import { pluginMiddleware, } from "../middlewares/global.middleware"; -type RoutingPath

= - P extends `${infer Head}/{${infer Param}}${infer Tail}` - ? `${Head}/:${Param}${RoutingPath}` - : P; - -type ValidHandler = ( - c: Parameters>[0], -) => ReturnType>; - export const buildRoute = < Plugin extends string, P extends string, @@ -24,22 +15,15 @@ export const buildRoute = < path: P; withCaptcha?: boolean; }, - H extends ValidHandler, >({ route, handler, pluginId, }: { - handler: H; + handler: RouteHandler; pluginId: Plugin; route: R; -}): { - handler: H; - pluginId: Plugin; - route: R & { - getRoutingPath: () => RoutingPath; - }; -} => { +}): Route => { const pluginTag = pluginId .split(/[-_]/) .map(word => word.charAt(0).toUpperCase() + word.slice(1)) @@ -60,10 +44,8 @@ export const buildRoute = < : []), ], ...route, - }) as R & { - getRoutingPath: () => RoutingPath; - }, - handler, + }) as R & { path: P }, + handler: handler as Route["handler"], pluginId, }; }; @@ -71,9 +53,8 @@ export const buildRoute = < export interface Route< Plugin extends string = string, R extends RouteConfig = RouteConfig, - H extends RouteHandler = RouteHandler, > { - handler: H; + handler: (...args: unknown[]) => Promise | Response; pluginId: Plugin; route: R; } diff --git a/packages/vitnode/src/components/form/auto-form.tsx b/packages/vitnode/src/components/form/auto-form.tsx index feef41a60..06bd2c57b 100644 --- a/packages/vitnode/src/components/form/auto-form.tsx +++ b/packages/vitnode/src/components/form/auto-form.tsx @@ -142,7 +142,7 @@ export function AutoForm< return (

{item.label && ( - + {item.label} )} diff --git a/packages/vitnode/src/components/form/fields/checkbox.tsx b/packages/vitnode/src/components/form/fields/checkbox.tsx index 3d0a1c7f2..0c96090dd 100644 --- a/packages/vitnode/src/components/form/fields/checkbox.tsx +++ b/packages/vitnode/src/components/form/fields/checkbox.tsx @@ -15,7 +15,7 @@ export const AutoFormCheckbox = ({ }: ItemAutoFormComponentProps & Omit, "checked">) => { return ( - + {values.map(({ value, label }) => ( diff --git a/packages/vitnode/src/components/switchers/themes/theme-switcher.tsx b/packages/vitnode/src/components/switchers/themes/theme-switcher.tsx index 5c5429445..ffcc4140c 100644 --- a/packages/vitnode/src/components/switchers/themes/theme-switcher.tsx +++ b/packages/vitnode/src/components/switchers/themes/theme-switcher.tsx @@ -21,8 +21,8 @@ export const ThemeSwitcher = () => { size="icon" variant="ghost" > - - + + ); }; diff --git a/packages/vitnode/src/components/table/content.tsx b/packages/vitnode/src/components/table/content.tsx index b5464fa67..8deed95cb 100644 --- a/packages/vitnode/src/components/table/content.tsx +++ b/packages/vitnode/src/components/table/content.tsx @@ -77,7 +77,7 @@ export function ContentDataTable({ ) : ( {customNotFoundComponent ?? ( diff --git a/packages/vitnode/src/components/ui/accordion.tsx b/packages/vitnode/src/components/ui/accordion.tsx index 0fe9d3dcd..87172e9d7 100644 --- a/packages/vitnode/src/components/ui/accordion.tsx +++ b/packages/vitnode/src/components/ui/accordion.tsx @@ -35,7 +35,7 @@ function AccordionTrigger({ svg]:rotate-180", + "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className, )} data-slot="accordion-trigger" @@ -59,7 +59,7 @@ function AccordionContent({ data-slot="accordion-content" {...props} > -
{children}
+
{children}
); } diff --git a/packages/vitnode/src/components/ui/alert-dialog.tsx b/packages/vitnode/src/components/ui/alert-dialog.tsx index cc0109eb2..29f58ff92 100644 --- a/packages/vitnode/src/components/ui/alert-dialog.tsx +++ b/packages/vitnode/src/components/ui/alert-dialog.tsx @@ -85,7 +85,7 @@ function AlertDialogContent({ ) { return (
) { function CardTitle({ className, ...props }: React.ComponentProps<"div">) { return (
@@ -74,7 +74,7 @@ function CardContent({ className, ...props }: React.ComponentProps<"div">) { function CardFooter({ className, ...props }: React.ComponentProps<"div">) { return (
diff --git a/packages/vitnode/src/components/ui/checkbox.tsx b/packages/vitnode/src/components/ui/checkbox.tsx index e30a700ae..e57fb25a4 100644 --- a/packages/vitnode/src/components/ui/checkbox.tsx +++ b/packages/vitnode/src/components/ui/checkbox.tsx @@ -14,7 +14,7 @@ function Checkbox({ return ( - + {children} @@ -73,7 +73,7 @@ function CommandInput({ { if (isDirty) { @@ -240,7 +240,7 @@ function DialogTitle({ }: React.ComponentProps) { return ( diff --git a/packages/vitnode/src/components/ui/dropdown-menu.tsx b/packages/vitnode/src/components/ui/dropdown-menu.tsx index d389303cd..9c2c4b4ea 100644 --- a/packages/vitnode/src/components/ui/dropdown-menu.tsx +++ b/packages/vitnode/src/components/ui/dropdown-menu.tsx @@ -41,7 +41,7 @@ function DropdownMenuContent({ ) { return ( - + ); diff --git a/packages/vitnode/src/components/ui/scroll-area.tsx b/packages/vitnode/src/components/ui/scroll-area.tsx index 97a2b01b8..952f12aea 100644 --- a/packages/vitnode/src/components/ui/scroll-area.tsx +++ b/packages/vitnode/src/components/ui/scroll-area.tsx @@ -18,7 +18,7 @@ function ScrollArea({ {...props} > {children} @@ -37,7 +37,7 @@ function ScrollBar({ return ( {children} - + Close diff --git a/packages/vitnode/src/components/ui/sidebar.tsx b/packages/vitnode/src/components/ui/sidebar.tsx index 2c59a7020..f35d9e21f 100644 --- a/packages/vitnode/src/components/ui/sidebar.tsx +++ b/packages/vitnode/src/components/ui/sidebar.tsx @@ -72,6 +72,7 @@ function SidebarProvider({ // This is the internal state of the sidebar. // We use openProp and setOpenProp for control from outside the component. + // eslint-disable-next-line @eslint-react/naming-convention/use-state const [_open, _setOpen] = React.useState(defaultOpen); const open = openProp ?? _open; const setOpen = React.useCallback( @@ -171,7 +172,7 @@ function Sidebar({ return (