From bbafab52de71729ace17ca2832c3d0282e5b952c Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Sun, 9 Nov 2025 23:13:30 +0100 Subject: [PATCH 01/21] perf: Add react compiler --- apps/docs/next.config.ts | 4 +- apps/docs/package.json | 1 + apps/docs/src/app/layout.tsx | 2 - .../copy-of-vitnode-app/root/next.config.ts | 5 +- .../src/create/create-package-json.ts | 3 + packages/vitnode/package.json | 8 +- plugins/blog/package.json | 2 +- pnpm-lock.yaml | 99 +++++++++++-------- pnpm-workspace.yaml | 1 + 9 files changed, 70 insertions(+), 55 deletions(-) diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index a7954fecc..d2a506bcc 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -9,6 +9,8 @@ const withBundleAnalyzer = nextAnalyzer({ enabled: process.env.ANALYZE === "true", }); -const nextConfig: NextConfig = {}; +const nextConfig: NextConfig = { + reactCompiler: true, +}; export default withBundleAnalyzer(withMDX(vitNodeNextConfig(nextConfig))); diff --git a/apps/docs/package.json b/apps/docs/package.json index d55ae0e2b..37591bbfb 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -53,6 +53,7 @@ "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", "postcss": "^8.5.6", diff --git a/apps/docs/src/app/layout.tsx b/apps/docs/src/app/layout.tsx index 0e88c6de1..ef3b6627d 100644 --- a/apps/docs/src/app/layout.tsx +++ b/apps/docs/src/app/layout.tsx @@ -1,7 +1,5 @@ import "./global.css"; -export const experimental_ppr = true; - export default async function RootLayout({ children, }: { 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 41f04fdd0..d8063ae7f 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 @@ -2,10 +2,7 @@ import { vitNodeNextConfig } from "@vitnode/core/config/next.config"; import type { NextConfig } from "next"; const nextConfig: NextConfig = { - experimental: { - inlineCss: true, - ppr: "incremental", - }, + reactCompiler: true, }; export default vitNodeNextConfig(nextConfig); 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 32d3097f3..9204c278d 100644 --- a/packages/create-vitnode-app/src/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/create/create-package-json.ts @@ -65,6 +65,7 @@ const versions = { zod: "^4.1.12", cva: "^0.7.1", + babelPluginReactCompiler: "^1.0.0", }; /** @@ -225,6 +226,7 @@ const singleAppDevDeps = (eslint: boolean) => ({ "@types/react": versions.typesReact, "@types/react-dom": versions.typesReactDom, "@vitnode/config": "", + "babel-plugin-react-compiler": versions.babelPluginReactCompiler, ...withIf(eslint, { eslint: versions.eslint, prettier: versions.prettier, @@ -255,6 +257,7 @@ const webDevDeps = (eslint: boolean) => ({ "@types/react": versions.typesReact, "@types/react-dom": versions.typesReactDom, "@vitnode/config": "", + "babel-plugin-react-compiler": versions.babelPluginReactCompiler, "class-variance-authority": versions.cva, ...withIf(eslint, { eslint: versions.eslint }), postcss: versions.postcss, diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 1d1462963..677d632a7 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -20,8 +20,8 @@ ], "peerDependencies": { "@hono/zod-openapi": "^1.0.x", - "@swc/cli": "0.6.x", - "@swc/core": "1.12.x", + "@swc/cli": "0.7.x", + "@swc/core": "1.x.x", "@types/react": "^19.1.x", "@types/react-dom": "^19.1.x", "drizzle-kit": "^0.31.x", @@ -41,8 +41,8 @@ "@hono/zod-validator": "^0.7.4", "@hookform/resolvers": "^5.2.2", "@react-email/components": "^1.0.0", - "@swc/cli": "0.6.0", - "@swc/core": "^1.13.5", + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^24.10.0", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index c88c7a6ec..1f4967c66 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -52,7 +52,7 @@ }, "devDependencies": { "@react-email/components": "^1.0.0", - "@swc/cli": "0.6.0", + "@swc/cli": "^0.7.9", "@swc/core": "^1.15.1", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81059afa8..9620f3b09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,7 +55,7 @@ importers: version: 4.10.4 next-intl: specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -128,13 +128,13 @@ importers: version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) fumadocs-core: specifier: ^16.0.8 - version: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fumadocs-mdx: specifier: ^13.0.5 - version: 13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) fumadocs-ui: specifier: ^16.0.8 - version: 16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) + version: 16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) hono: specifier: ^4.10.4 version: 4.10.4 @@ -146,10 +146,10 @@ importers: version: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -196,6 +196,9 @@ importers: '@vitnode/config': specifier: workspace:* version: link:../../packages/config + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -320,7 +323,7 @@ importers: version: 0.5.2(hono@4.10.4) '@react-email/preview-server': specifier: ^5.0.1 - version: 5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(postcss@8.5.6) + version: 5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(babel-plugin-react-compiler@1.0.0)(postcss@8.5.6) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) @@ -371,7 +374,7 @@ importers: version: 8.2.0 react-scan: specifier: ^0.4.3 - version: 0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1) + version: 0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1) resend: specifier: ^6.4.2 version: 6.4.2(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) @@ -401,10 +404,10 @@ importers: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@swc/cli': - specifier: 0.6.0 - version: 0.6.0(@swc/core@1.15.1)(chokidar@4.0.3) + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) '@swc/core': - specifier: ^1.13.5 + specifier: ^1.15.1 version: 1.15.1 '@testing-library/dom': specifier: ^10.4.1 @@ -462,10 +465,10 @@ importers: version: 0.553.0(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -534,10 +537,10 @@ importers: version: 0.553.0(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -564,8 +567,8 @@ importers: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@swc/cli': - specifier: 0.6.0 - version: 0.6.0(@swc/core@1.15.1)(chokidar@4.0.3) + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) '@swc/core': specifier: ^1.15.1 version: 1.15.1 @@ -3377,8 +3380,8 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc/cli@0.6.0': - resolution: {integrity: sha512-Q5FsI3Cw0fGMXhmsg7c08i4EmXCrcl+WnAxb6LYOLHw4JFFC3yzmx9LaXZ7QMbA+JZXbigU2TirI7RAfO0Qlnw==} + '@swc/cli@0.7.9': + resolution: {integrity: sha512-AFQu3ZZ9IcdClTknxbug08S9ed/q8F3aYkO5NoZ+6IjQ5UEo1s2HN1GRKNvUslYx2EoVYxd+6xGcp6C7wwtxyQ==} engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: @@ -4263,6 +4266,9 @@ packages: react-native-b4a: optional: true + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -11184,7 +11190,7 @@ snapshots: marked: 15.0.12 react: 19.2.0 - '@react-email/preview-server@5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(postcss@8.5.6)': + '@react-email/preview-server@5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(babel-plugin-react-compiler@1.0.0)(postcss@8.5.6)': dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 @@ -11213,8 +11219,8 @@ snapshots: json5: 2.2.3 log-symbols: 4.1.0 module-punycode: punycode@2.3.1 - next: 16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - next-safe-action: 8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-safe-action: 8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) node-html-parser: 7.0.1 ora: 5.4.1 pretty-bytes: 6.1.1 @@ -11733,18 +11739,18 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/cli@0.6.0(@swc/core@1.15.1)(chokidar@4.0.3)': + '@swc/cli@0.7.9(@swc/core@1.15.1)(chokidar@4.0.3)': dependencies: '@swc/core': 1.15.1 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.2.0 commander: 8.3.0 - fast-glob: 3.3.3 minimatch: 9.0.5 piscina: 4.9.2 semver: 7.7.3 slash: 3.0.0 source-map: 0.7.6 + tinyglobby: 0.2.15 optionalDependencies: chokidar: 4.0.3 transitivePeerDependencies: @@ -12787,6 +12793,10 @@ snapshots: b4a@1.7.3: {} + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.5 + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -13979,7 +13989,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.16 @@ -14002,20 +14012,20 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 lucide-react: 0.553.0(react@19.2.0) - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + fumadocs-mdx@13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.12 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) js-yaml: 4.1.0 lru-cache: 11.2.2 mdast-util-to-markdown: 2.1.2 @@ -14029,13 +14039,13 @@ snapshots: unist-util-visit: 5.0.0 zod: 4.1.12 optionalDependencies: - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - fumadocs-ui@16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): + fumadocs-ui@16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): dependencies: '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -14048,7 +14058,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: 0.7.1 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postcss-selector-parser: 7.1.0 @@ -14059,7 +14069,7 @@ snapshots: tailwind-merge: 3.4.0 optionalDependencies: '@types/react': 19.2.2 - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwindcss: 4.1.17 transitivePeerDependencies: - '@mixedbread/sdk' @@ -15385,12 +15395,12 @@ snapshots: neo-async@2.6.2: {} - next-intl@4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 use-intl: 4.5.0(react@19.2.0) optionalDependencies: @@ -15398,12 +15408,12 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - next-intl@4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 use-intl: 4.5.0(react@19.2.0) optionalDependencies: @@ -15411,9 +15421,9 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' - next-safe-action@8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-safe-action@8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -15422,7 +15432,7 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15441,12 +15451,13 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15465,12 +15476,13 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15489,6 +15501,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -16206,7 +16219,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.2 - react-scan@0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1): + react-scan@0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1): dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -16228,7 +16241,7 @@ snapshots: react-dom: 19.2.0(react@19.2.0) tsx: 4.20.6 optionalDependencies: - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1882b9677..9b30c1038 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,4 +5,5 @@ packages: ignoredBuiltDependencies: - '@swc/core' + - esbuild - sharp From ee96f34219089e9f5d54f0594ec11199466e52c2 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 12:55:32 +0100 Subject: [PATCH 02/21] refactor(email): Create nodemailer package --- .github/workflows/bump_publish.yml | 6 +- apps/api/package.json | 1 + apps/api/src/vitnode.api.config.ts | 2 +- .../content/docs/dev/email/nodemailer.mdx | 71 +++++++++++++++++++ apps/docs/content/docs/dev/email/smtp.mdx | 13 ---- apps/docs/eslint.config.mjs | 2 + apps/docs/package.json | 1 + apps/docs/src/vitnode.api.config.ts | 3 +- packages/config/eslint.config.mjs | 60 ---------------- packages/config/eslint.react.config.mjs | 67 +++++++++++++++++ packages/config/package.json | 4 ++ .../eslint/eslint.config.mjs | 2 + packages/nodemailer/.swcrc | 25 +++++++ packages/nodemailer/README.md | 20 ++++++ packages/nodemailer/eslint.config.mjs | 17 +++++ packages/nodemailer/package.json | 46 ++++++++++++ .../nodemailer.ts => nodemailer/src/index.ts} | 4 +- packages/nodemailer/tsconfig.json | 19 +++++ packages/vitnode/.swcrc | 2 +- packages/vitnode/eslint.config.mjs | 2 + packages/vitnode/tsconfig.json | 2 +- plugins/blog/eslint.config.mjs | 2 + pnpm-lock.yaml | 40 +++++++++++ 23 files changed, 329 insertions(+), 82 deletions(-) create mode 100644 apps/docs/content/docs/dev/email/nodemailer.mdx delete mode 100644 apps/docs/content/docs/dev/email/smtp.mdx create mode 100644 packages/config/eslint.react.config.mjs create mode 100644 packages/nodemailer/.swcrc create mode 100644 packages/nodemailer/README.md create mode 100644 packages/nodemailer/eslint.config.mjs create mode 100644 packages/nodemailer/package.json rename packages/{vitnode/src/api/adapters/email/nodemailer.ts => nodemailer/src/index.ts} (93%) create mode 100644 packages/nodemailer/tsconfig.json diff --git a/.github/workflows/bump_publish.yml b/.github/workflows/bump_publish.yml index c8e5c0255..856155f2b 100644 --- a/.github/workflows/bump_publish.yml +++ b/.github/workflows/bump_publish.yml @@ -82,21 +82,21 @@ jobs: - name: Publish canary if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'canary' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag canary --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag canary --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish release candidate if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'release-candidate' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag rc --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag rc --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish stable if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'stable' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag latest --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag latest --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/apps/api/package.json b/apps/api/package.json index 7c4099122..bb3ed29fa 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -33,6 +33,7 @@ "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "@vitnode/nodemailer": "workspace:*", "dotenv": "^17.2.3", "eslint": "^9.39.1", "react-email": "^5.0.1", diff --git a/apps/api/src/vitnode.api.config.ts b/apps/api/src/vitnode.api.config.ts index 533a84faf..29274f43b 100644 --- a/apps/api/src/vitnode.api.config.ts +++ b/apps/api/src/vitnode.api.config.ts @@ -1,5 +1,5 @@ -import { NodemailerEmailAdapter } from "@vitnode/core/api/adapters/email/nodemailer"; import { buildApiConfig } from "@vitnode/core/vitnode.config"; +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { config } from "dotenv"; import { drizzle } from "drizzle-orm/postgres-js"; diff --git a/apps/docs/content/docs/dev/email/nodemailer.mdx b/apps/docs/content/docs/dev/email/nodemailer.mdx new file mode 100644 index 000000000..f55904723 --- /dev/null +++ b/apps/docs/content/docs/dev/email/nodemailer.mdx @@ -0,0 +1,71 @@ +--- +title: Nodemailer (SMTP) +description: Send emails using SMTP with the Nodemailer adapter. +--- + +| Cloud | Self-Hosted | Links | +| ---------------- | ------------ | ------------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/nodemailer) | + +## Usage + + + +### Installation + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun i @vitnode/nodemailer -D +``` + +```bash tab="pnpm" +pnpm i @vitnode/nodemailer -D +``` + +```bash tab="npm" +npm i @vitnode/nodemailer -D +``` + + + + + +### Import the adapter + +```ts title="vitnode.api.config.ts" +// [!code ++] +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; + +export const vitNodeApiConfig = buildApiConfig({ + email: { + // [!code ++:6] + adapter: NodemailerEmailAdapter({ + from: process.env.NODE_MAILER_FROM, + host: process.env.NODE_MAILER_HOST, + password: process.env.NODE_MAILER_PASSWORD, + user: process.env.NOD_EMAILER_USER, + }), + }, +}); +``` + + + + +### Environment Variables + +Add the following environment variables to your `.env` file: + +```bash title=".env" +NODE_MAILER_FROM=xxx +NODE_MAILER_HOST=xxx +NODE_MAILER_PASSWORD=xxx +NOD_EMAILER_USER=xxx +``` + + + diff --git a/apps/docs/content/docs/dev/email/smtp.mdx b/apps/docs/content/docs/dev/email/smtp.mdx deleted file mode 100644 index a1386ec4a..000000000 --- a/apps/docs/content/docs/dev/email/smtp.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: SMTP -description: SMTP configuration for sending emails ---- - - - This documentation is for self-hosted VitNode instances only. You cannot use - this if you are planning to deploy your application to the cloud. - - - - We're working hard to bring you the best documentation experience. - diff --git a/apps/docs/eslint.config.mjs b/apps/docs/eslint.config.mjs index ca0cefa60..d190aca3c 100644 --- a/apps/docs/eslint.config.mjs +++ b/apps/docs/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { ignores: [".source"], }, diff --git a/apps/docs/package.json b/apps/docs/package.json index fff357ac4..e13b8d134 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -53,6 +53,7 @@ "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "@vitnode/nodemailer": "workspace:*", "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", diff --git a/apps/docs/src/vitnode.api.config.ts b/apps/docs/src/vitnode.api.config.ts index 1b654bc54..ccb53fc7c 100644 --- a/apps/docs/src/vitnode.api.config.ts +++ b/apps/docs/src/vitnode.api.config.ts @@ -1,6 +1,7 @@ import { blogApiPlugin } from "@vitnode/blog/config.api"; import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; -import { NodemailerEmailAdapter } from "@vitnode/core/api/adapters/email/nodemailer"; + +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { DiscordSSOApiPlugin } from "@vitnode/core/api/adapters/sso/discord"; import { FacebookSSOApiPlugin } from "@vitnode/core/api/adapters/sso/facebook"; import { GoogleSSOApiPlugin } from "@vitnode/core/api/adapters/sso/google"; diff --git a/packages/config/eslint.config.mjs b/packages/config/eslint.config.mjs index b5db2b41d..119f92706 100644 --- a/packages/config/eslint.config.mjs +++ b/packages/config/eslint.config.mjs @@ -1,21 +1,11 @@ // @ts-check -import { dirname } from "node:path"; -import { fileURLToPath } from "node:url"; import eslint from "@eslint/js"; -import eslintReact from "@eslint-react/eslint-plugin"; -import jsxA11y from "eslint-plugin-jsx-a11y"; import perfectionist from "eslint-plugin-perfectionist"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; -import reactPlugin from "eslint-plugin-react"; -import hooksPlugin from "eslint-plugin-react-hooks"; import tsEslint from "typescript-eslint"; -import reactYouMightNotNeedAnEffect from "eslint-plugin-react-you-might-not-need-an-effect"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ - reactYouMightNotNeedAnEffect.configs.recommended, { ignores: [ "next-env.d.ts", @@ -36,43 +26,13 @@ export default [ ], }, eslint.configs.recommended, - eslintReact.configs.recommended, ...tsEslint.configs.stylisticTypeChecked, ...tsEslint.configs.strictTypeChecked, eslintPluginPrettierRecommended, - jsxA11y.flatConfigs.recommended, - reactPlugin.configs.flat.recommended, perfectionist.configs["recommended-natural"], - { - files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], - settings: { - react: { - version: "detect", - }, - }, - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, - }, - { - plugins: { - "react-hooks": hooksPlugin, - }, - rules: { - "react/react-in-jsx-scope": "off", - ...hooksPlugin.configs.recommended.rules, - }, - }, { files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"] }, { rules: { - "react-hooks/exhaustive-deps": "off", - "@eslint-react/no-context-provider": "off", - "@eslint-react/no-unstable-default-props": "off", "perfectionist/sort-array-includes": "warn", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-confusing-void-expression": "off", @@ -143,30 +103,10 @@ export default [ "newline-before-return": "warn", "no-restricted-imports": [ "error", - { - name: "next/link", - message: "Please import from `vitnode-frontend/navigation` instead.", - }, { name: "drizzle-orm/mysql-core", message: "Please import from `drizzle-orm/pg-core` instead.", }, - { - name: "next/navigation", - importNames: [ - "redirect", - "permanentRedirect", - "useRouter", - "usePathname", - ], - 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/eslint.react.config.mjs b/packages/config/eslint.react.config.mjs new file mode 100644 index 000000000..330937bad --- /dev/null +++ b/packages/config/eslint.react.config.mjs @@ -0,0 +1,67 @@ +// @ts-check + +import eslintReact from "@eslint-react/eslint-plugin"; +import reactPlugin from "eslint-plugin-react"; +import hooksPlugin from "eslint-plugin-react-hooks"; +import reactYouMightNotNeedAnEffect from "eslint-plugin-react-you-might-not-need-an-effect"; + +export default [ + reactYouMightNotNeedAnEffect.configs.recommended, + eslintReact.configs.recommended, + reactPlugin.configs.flat.recommended, + { + files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], + settings: { + react: { + version: "detect", + }, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + { + plugins: { + "react-hooks": hooksPlugin, + }, + rules: { + "react/react-in-jsx-scope": "off", + ...hooksPlugin.configs.recommended.rules, + }, + }, + { files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"] }, + { + rules: { + "react-hooks/exhaustive-deps": "off", + "@eslint-react/no-context-provider": "off", + "@eslint-react/no-unstable-default-props": "off", + "no-restricted-imports": [ + "error", + { + name: "next/link", + message: "Please import from `vitnode-frontend/navigation` instead.", + }, + { + name: "next/navigation", + importNames: [ + "redirect", + "permanentRedirect", + "useRouter", + "usePathname", + ], + 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 144bbc12e..99e637469 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -23,6 +23,10 @@ "import": "./eslint.config.mjs", "default": "./eslint.config.mjs" }, + "./eslint.react": { + "import": "./eslint.react.config.mjs", + "default": "./eslint.react.config.mjs" + }, "./tsconfig": { "import": "./tsconfig.json", "default": "./tsconfig.json" diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/packages/nodemailer/.swcrc b/packages/nodemailer/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/nodemailer/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/nodemailer/README.md b/packages/nodemailer/README.md new file mode 100644 index 000000000..57add38dc --- /dev/null +++ b/packages/nodemailer/README.md @@ -0,0 +1,20 @@ +# (VitNode) Nodemailer (SMTP) Adapter + +This package provides a Nodemailer email adapter for VitNode, enabling email sending capabilities using SMTP. + +

+
+ + + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ---------------- | ------------ | ------------------------------------------------------- | ----------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/nodemailer) | [Docs](https://vitnode.com/docs/dev/email/nodemailer) | diff --git a/packages/nodemailer/eslint.config.mjs b/packages/nodemailer/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/nodemailer/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json new file mode 100644 index 000000000..fa373c40a --- /dev/null +++ b/packages/nodemailer/package.json @@ -0,0 +1,46 @@ +{ + "name": "@vitnode/nodemailer", + "version": "1.2.0-canary.60", + "description": "Nodemailer integration package for VitNode, enabling email functionalities.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/nodemailer" + }, + "keywords": [ + "vitnode", + "nodemailer", + "smtp" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "nodemailer": "^7.0.10" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@types/nodemailer": "^7.0.3", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/email/nodemailer.ts b/packages/nodemailer/src/index.ts similarity index 93% rename from packages/vitnode/src/api/adapters/email/nodemailer.ts rename to packages/nodemailer/src/index.ts index 7f00ecfec..1a218d18e 100644 --- a/packages/vitnode/src/api/adapters/email/nodemailer.ts +++ b/packages/nodemailer/src/index.ts @@ -1,6 +1,6 @@ -import { createTransport } from "nodemailer"; +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; -import type { EmailApiPlugin } from "@/api/models/email"; +import { createTransport } from "nodemailer"; export const NodemailerEmailAdapter = ({ host = "", diff --git a/packages/nodemailer/tsconfig.json b/packages/nodemailer/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/nodemailer/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/vitnode/.swcrc b/packages/vitnode/.swcrc index c9903f975..eba97079c 100644 --- a/packages/vitnode/.swcrc +++ b/packages/vitnode/.swcrc @@ -1,6 +1,6 @@ { "$schema": "https://swc.rs/schema.json", - "minify": false, + "minify": true, "jsc": { "baseUrl": "./", "target": "esnext", diff --git a/packages/vitnode/eslint.config.mjs b/packages/vitnode/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/packages/vitnode/eslint.config.mjs +++ b/packages/vitnode/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/packages/vitnode/tsconfig.json b/packages/vitnode/tsconfig.json index ad865484f..de0976d61 100644 --- a/packages/vitnode/tsconfig.json +++ b/packages/vitnode/tsconfig.json @@ -8,7 +8,7 @@ "rootDir": "./", "outDir": "./dist", "jsx": "react-jsx", - "emitDeclarationOnly": true, + "emitDeclarationOnly": false, "declaration": true, "declarationMap": true, "plugins": [ diff --git a/plugins/blog/eslint.config.mjs b/plugins/blog/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/plugins/blog/eslint.config.mjs +++ b/plugins/blog/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9620f3b09..d00ca7dcb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,9 @@ importers: '@vitnode/config': specifier: workspace:* version: link:../../packages/config + '@vitnode/nodemailer': + specifier: workspace:* + version: link:../../packages/nodemailer dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -196,6 +199,9 @@ importers: '@vitnode/config': specifier: workspace:* version: link:../../packages/config + '@vitnode/nodemailer': + specifier: workspace:* + version: link:../../packages/nodemailer babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -313,6 +319,40 @@ importers: specifier: ^5.9.3 version: 5.9.3 + packages/nodemailer: + dependencies: + nodemailer: + specifier: ^7.0.10 + version: 7.0.10 + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@types/nodemailer': + specifier: ^7.0.3 + version: 7.0.3 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/vitnode: dependencies: '@dnd-kit/core': From fd09aedd272455b7136e389bb6823f3c15044bc8 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 13:28:32 +0100 Subject: [PATCH 03/21] refactor(email): Move resend to package --- .github/workflows/bump_publish.yml | 6 +- .../content/docs/dev/email/nodemailer.mdx | 8 +-- apps/docs/content/docs/dev/email/resend.mdx | 67 +++++++++++++++++-- apps/docs/package.json | 1 + apps/docs/src/vitnode.api.config.ts | 15 +++-- packages/nodemailer/.npmignore | 6 ++ packages/resend/.npmignore | 6 ++ packages/resend/.swcrc | 25 +++++++ packages/resend/README.md | 20 ++++++ packages/resend/eslint.config.mjs | 17 +++++ packages/resend/package.json | 44 ++++++++++++ .../email/resend.ts => resend/src/index.ts} | 4 +- packages/resend/tsconfig.json | 19 ++++++ packages/vitnode/package.json | 3 - pnpm-lock.yaml | 43 +++++++++--- 15 files changed, 254 insertions(+), 30 deletions(-) create mode 100644 packages/nodemailer/.npmignore create mode 100644 packages/resend/.npmignore create mode 100644 packages/resend/.swcrc create mode 100644 packages/resend/README.md create mode 100644 packages/resend/eslint.config.mjs create mode 100644 packages/resend/package.json rename packages/{vitnode/src/api/adapters/email/resend.ts => resend/src/index.ts} (90%) create mode 100644 packages/resend/tsconfig.json diff --git a/.github/workflows/bump_publish.yml b/.github/workflows/bump_publish.yml index 856155f2b..609ccb931 100644 --- a/.github/workflows/bump_publish.yml +++ b/.github/workflows/bump_publish.yml @@ -82,21 +82,21 @@ jobs: - name: Publish canary if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'canary' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag canary --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag canary --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish release candidate if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'release-candidate' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag rc --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag rc --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish stable if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'stable' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --tag latest --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag latest --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/apps/docs/content/docs/dev/email/nodemailer.mdx b/apps/docs/content/docs/dev/email/nodemailer.mdx index f55904723..5cb348ad7 100644 --- a/apps/docs/content/docs/dev/email/nodemailer.mdx +++ b/apps/docs/content/docs/dev/email/nodemailer.mdx @@ -61,10 +61,10 @@ export const vitNodeApiConfig = buildApiConfig({ Add the following environment variables to your `.env` file: ```bash title=".env" -NODE_MAILER_FROM=xxx -NODE_MAILER_HOST=xxx -NODE_MAILER_PASSWORD=xxx -NOD_EMAILER_USER=xxx +NODE_MAILER_FROM=your_verified_email +NODE_MAILER_HOST=smtp.your-email-provider.com +NODE_MAILER_PASSWORD=your_email_password +NOD_EMAILER_USER=your_email_username ``` diff --git a/apps/docs/content/docs/dev/email/resend.mdx b/apps/docs/content/docs/dev/email/resend.mdx index 2355f7c04..abe8a3b84 100644 --- a/apps/docs/content/docs/dev/email/resend.mdx +++ b/apps/docs/content/docs/dev/email/resend.mdx @@ -1,8 +1,67 @@ --- title: Resend -description: How to use Resend for sending emails in your application. +description: Send emails using Resend with the Resend adapter. --- - - We're working hard to bring you the best documentation experience. - +| Cloud | Self-Hosted | Links | +| ------------ | ------------ | --------------------------------------------------- | +| ✅ Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/resend) | + +## Usage + + + +### Installation + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun i @vitnode/resend -D +``` + +```bash tab="pnpm" +pnpm i @vitnode/resend -D +``` + +```bash tab="npm" +npm i @vitnode/resend -D +``` + + + + + +### Import the adapter + +```ts title="vitnode.api.config.ts" +// [!code ++] +import { ResendEmailAdapter } from "@vitnode/resend"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; + +export const vitNodeApiConfig = buildApiConfig({ + email: { + // [!code ++:4] + adapter: ResendEmailAdapter({ + apiKey: process.env.RESEND_API_KEY, + from: process.env.RESEND_FROM_EMAIL, + }), + }, +}); +``` + + + + +### Environment Variables + +Add the following environment variables to your `.env` file: + +```bash title=".env" +RESEND_API_KEY=your_resend_api_key +RESEND_FROM_EMAIL=your_verified_resend_email +``` + + + diff --git a/apps/docs/package.json b/apps/docs/package.json index e13b8d134..9530e8a27 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -54,6 +54,7 @@ "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", "@vitnode/nodemailer": "workspace:*", + "@vitnode/resend": "workspace:*", "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", diff --git a/apps/docs/src/vitnode.api.config.ts b/apps/docs/src/vitnode.api.config.ts index ccb53fc7c..be113d3ed 100644 --- a/apps/docs/src/vitnode.api.config.ts +++ b/apps/docs/src/vitnode.api.config.ts @@ -1,5 +1,6 @@ import { blogApiPlugin } from "@vitnode/blog/config.api"; import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; +import { ResendEmailAdapter } from "@vitnode/resend"; import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { DiscordSSOApiPlugin } from "@vitnode/core/api/adapters/sso/discord"; @@ -33,11 +34,15 @@ export const vitNodeApiConfig = buildApiConfig({ duration: 60, // per 60 seconds }, email: { - adapter: NodemailerEmailAdapter({ - from: process.env.NODE_MAILER_FROM, - host: process.env.NODE_MAILER_HOST, - password: process.env.NODE_MAILER_PASSWORD, - user: process.env.NOD_EMAILER_USER, + // adapter: NodemailerEmailAdapter({ + // from: process.env.NODE_MAILER_FROM, + // host: process.env.NODE_MAILER_HOST, + // password: process.env.NODE_MAILER_PASSWORD, + // user: process.env.NOD_EMAILER_USER, + // }), + adapter: ResendEmailAdapter({ + apiKey: process.env.RESEND_API_KEY, + from: process.env.RESEND_FROM_EMAIL, }), logo: { text: "VitNode Email Test", diff --git a/packages/nodemailer/.npmignore b/packages/nodemailer/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/nodemailer/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/resend/.npmignore b/packages/resend/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/resend/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/resend/.swcrc b/packages/resend/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/resend/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/resend/README.md b/packages/resend/README.md new file mode 100644 index 000000000..8fdbcee2c --- /dev/null +++ b/packages/resend/README.md @@ -0,0 +1,20 @@ +# (VitNode) Resend Adapter + +This package provides an adapter for integrating Resend email services into VitNode applications, enabling seamless email sending capabilities. + +

+
+ + + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ------------ | ------------ | --------------------------------------------------- | ------------------------------------------------- | +| ✅ Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/resend) | [Docs](https://vitnode.com/docs/dev/email/resend) | diff --git a/packages/resend/eslint.config.mjs b/packages/resend/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/resend/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/resend/package.json b/packages/resend/package.json new file mode 100644 index 000000000..1a1e1d55f --- /dev/null +++ b/packages/resend/package.json @@ -0,0 +1,44 @@ +{ + "name": "@vitnode/resend", + "version": "1.2.0-canary.60", + "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/resend" + }, + "keywords": [ + "vitnode", + "resend" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "resend": "^6.4.2" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/email/resend.ts b/packages/resend/src/index.ts similarity index 90% rename from packages/vitnode/src/api/adapters/email/resend.ts rename to packages/resend/src/index.ts index 8c2f3cf3a..9ecadf5d6 100644 --- a/packages/vitnode/src/api/adapters/email/resend.ts +++ b/packages/resend/src/index.ts @@ -1,6 +1,6 @@ -import { Resend } from "resend"; +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; -import type { EmailApiPlugin } from "@/api/models/email"; +import { Resend } from "resend"; export const ResendEmailAdapter = ({ apiKey, diff --git a/packages/resend/tsconfig.json b/packages/resend/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/resend/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 77bad6fd8..42262cc83 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -46,7 +46,6 @@ "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^24.10.0", - "@types/nodemailer": "^7.0.3", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^5.1.0", @@ -126,12 +125,10 @@ "input-otp": "^1.4.2", "motion": "^12.23.24", "next-themes": "^0.4.6", - "nodemailer": "^7.0.10", "postgres": "^3.4.7", "radix-ui": "^1.4.3", "rate-limiter-flexible": "^8.2.0", "react-scan": "^0.4.3", - "resend": "^6.4.2", "tailwind-merge": "^3.4.0", "use-debounce": "^10.0.6", "use-intl": "^4.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d00ca7dcb..d77712e3f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -202,6 +202,9 @@ importers: '@vitnode/nodemailer': specifier: workspace:* version: link:../../packages/nodemailer + '@vitnode/resend': + specifier: workspace:* + version: link:../../packages/resend babel-plugin-react-compiler: specifier: ^1.0.0 version: 1.0.0 @@ -353,6 +356,37 @@ importers: specifier: ^5.9.3 version: 5.9.3 + packages/resend: + dependencies: + resend: + specifier: ^6.4.2 + version: 6.4.2(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/vitnode: dependencies: '@dnd-kit/core': @@ -400,9 +434,6 @@ importers: next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - nodemailer: - specifier: ^7.0.10 - version: 7.0.10 postgres: specifier: ^3.4.7 version: 3.4.7 @@ -415,9 +446,6 @@ importers: react-scan: specifier: ^0.4.3 version: 0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1) - resend: - specifier: ^6.4.2 - version: 6.4.2(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) tailwind-merge: specifier: ^3.4.0 version: 3.4.0 @@ -458,9 +486,6 @@ importers: '@types/node': specifier: ^24.10.0 version: 24.10.0 - '@types/nodemailer': - specifier: ^7.0.3 - version: 7.0.3 '@types/react': specifier: ^19.2.2 version: 19.2.2 From a096ddcb4b980a6101df97ad34754d211d8f246d Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 19:06:36 +0100 Subject: [PATCH 04/21] refactor(cron): Move node-cron to package --- .../docs/dev/captcha/captcha_preview.png | Bin 0 -> 43895 bytes .../docs/dev/captcha/custom-adapter.mdx | 116 ++++++ apps/docs/content/docs/dev/captcha/index.mdx | 144 ++----- apps/docs/content/docs/dev/captcha/meta.json | 4 + .../content/docs/dev/cron/custom-adapter.mdx | 83 +++++ apps/docs/content/docs/dev/cron/index.mdx | 86 ++--- apps/docs/content/docs/dev/cron/meta.json | 2 +- apps/docs/content/docs/dev/cron/node-cron.mdx | 28 +- apps/docs/content/docs/dev/cron/rest-api.mdx | 9 +- .../content/docs/dev/email/custom-adapter.mdx | 95 +++++ apps/docs/content/docs/dev/email/index.mdx | 98 +---- apps/docs/content/docs/dev/email/meta.json | 8 +- .../content/docs/dev/sso/custom-adapter.mdx | 352 ++++++++++++++++++ apps/docs/content/docs/dev/sso/index.mdx | 344 ----------------- apps/docs/content/docs/dev/sso/meta.json | 4 + apps/docs/package.json | 1 + apps/docs/src/vitnode.api.config.ts | 25 +- packages/node-cron/.npmignore | 6 + packages/node-cron/.swcrc | 25 ++ packages/node-cron/README.md | 20 + packages/node-cron/eslint.config.mjs | 17 + packages/node-cron/package.json | 46 +++ .../src/index.ts} | 3 +- packages/node-cron/tsconfig.json | 19 + packages/vitnode/package.json | 1 - .../modules/cron/helpers/process-cron-jobs.ts | 4 +- .../lib/api/validate-cron-schedule.test.ts | 171 +++++++++ .../src/lib/api/validate-cron-schedule.ts | 128 +++++++ packages/vitnode/vitest.config.ts | 14 + .../src/api/modules/categories/test.route.ts | 2 +- pnpm-lock.yaml | 37 +- 31 files changed, 1239 insertions(+), 653 deletions(-) create mode 100644 apps/docs/content/docs/dev/captcha/captcha_preview.png create mode 100644 apps/docs/content/docs/dev/captcha/custom-adapter.mdx create mode 100644 apps/docs/content/docs/dev/captcha/meta.json create mode 100644 apps/docs/content/docs/dev/cron/custom-adapter.mdx create mode 100644 apps/docs/content/docs/dev/email/custom-adapter.mdx create mode 100644 apps/docs/content/docs/dev/sso/custom-adapter.mdx create mode 100644 apps/docs/content/docs/dev/sso/meta.json create mode 100644 packages/node-cron/.npmignore create mode 100644 packages/node-cron/.swcrc create mode 100644 packages/node-cron/README.md create mode 100644 packages/node-cron/eslint.config.mjs create mode 100644 packages/node-cron/package.json rename packages/{vitnode/src/api/adapters/cron/node-cron.adapter.ts => node-cron/src/index.ts} (73%) create mode 100644 packages/node-cron/tsconfig.json create mode 100644 packages/vitnode/src/lib/api/validate-cron-schedule.test.ts create mode 100644 packages/vitnode/src/lib/api/validate-cron-schedule.ts diff --git a/apps/docs/content/docs/dev/captcha/captcha_preview.png b/apps/docs/content/docs/dev/captcha/captcha_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d68a5ab9b43b137dd8b07ede25126f61125521 GIT binary patch literal 43895 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 Ai~s-t literal 0 HcmV?d00001 diff --git a/apps/docs/content/docs/dev/captcha/custom-adapter.mdx b/apps/docs/content/docs/dev/captcha/custom-adapter.mdx new file mode 100644 index 000000000..0cc0e0f74 --- /dev/null +++ b/apps/docs/content/docs/dev/captcha/custom-adapter.mdx @@ -0,0 +1,116 @@ +--- +title: Custom Adapter +description: Create your own custom captcha adapter for VitNode. +--- + +If you want to use captcha in your custom form or somewhere else, follow these steps. + +## Usage + + + + +### Activate captcha in route + +```ts title="plugins/{plugin_name}/src/routes/example.ts" +import { buildRoute } from "@vitnode/core/api/lib/route"; + +export const exampleRoute = buildRoute({ + pluginId: CONFIG_PLUGIN.pluginId, + route: { + method: "post", + description: "Create a new user", + path: "/sign_up", + withCaptcha: true, // [!code ++] + }, + handler: async c => {}, +}); +``` + + + + +### Get config from middleware API + +```tsx title="plugins/{plugin_name}/src/app/sing_up/page.tsx" +import { getMiddlewareApi } from "@vitnode/core/lib/api/get-middleware-api"; // [!code ++] + +export const SignUpView = async () => { + const { captcha } = await getMiddlewareApi(); // [!code ++] + + return ; +}; +``` + + + + +### Use `useCaptcha` hook + +Inside your client component, use the `useCaptcha` hook to handle captcha rendering and validation. Remember to add `div` with `id="vitnode_captcha"` where you want the captcha widget to appear. + +```tsx title="plugins/{plugin_name}/src/components/form/sign-up/sign-up.tsx" +"use client"; + +import { AutoForm } from "@vitnode/core/components/form/auto-form"; + +export const FormSignUp = ({ + captcha, // [!code ++] +}: { + captcha: z.infer["captcha"]; // [!code ++] +}) => { + // [!code ++] + const { isReady, getToken, onReset } = useCaptcha(captcha); + + const onSubmit = async () => { + await mutationApi({ + // ...other values, + captchaToken: await getToken(), // [!code ++] + }); + + // Handle success or error + // [!code ++] + onReset(); // Reset captcha after submission + }; + + return ( +
+ {/* Render captcha widget */} + {/* [!code ++] */} +
+ + + + ); +}; +``` + + + + +### Submit form with captcha + +```tsx title="plugins/{plugin_name}/src/components/form/sign-up/mutation-api.ts" +"use server"; + +import type { z } from "zod"; + +import { fetcher } from "@vitnode/core/lib/fetcher"; + +export const mutationApi = async ({ + captchaToken, // [!code ++] +}: { + // [!code ++] + captchaToken; +}) => { + await fetcher(usersModule, { + path: "/test", + method: "post", + module: "blog", + captchaToken, // [!code ++] + }); +}; +``` + + + diff --git a/apps/docs/content/docs/dev/captcha/index.mdx b/apps/docs/content/docs/dev/captcha/index.mdx index 0967d5b84..8841d9655 100644 --- a/apps/docs/content/docs/dev/captcha/index.mdx +++ b/apps/docs/content/docs/dev/captcha/index.mdx @@ -3,7 +3,13 @@ title: Captcha description: Protect your forms and API call with captcha validation. --- -## Support +import captchaPreview from "./captcha_preview.png"; + +import { ImgDocs } from "@/components/fumadocs/img"; + + + +## Providers VitNode supports multiple captcha providers. You can choose the one that fits your needs. Currently, we support: @@ -13,7 +19,11 @@ VitNode supports multiple captcha providers. You can choose the one that fits yo description="By Cloudflare" href="/docs/guides/captcha/cloudflare" /> - + If you need more providers, feel free to open a **Feature Request** on our [GitHub repository](https://github.com/aXenDeveloper/vitnode/issues) :) @@ -38,9 +48,9 @@ export const exampleRoute = buildRoute({ method: "post", description: "Create a new user", path: "/sign_up", - withCaptcha: true // [!code ++] + withCaptcha: true, // [!code ++] }, - handler: async (c) => {} + handler: async c => {}, }); ``` @@ -74,7 +84,7 @@ Get the `captcha` config from the props and pass it to the `AutoForm` component. import { AutoForm } from "@vitnode/core/components/form/auto-form"; export const FormSignUp = ({ - captcha // [!code ++] + captcha, // [!code ++] }: { captcha: z.infer["captcha"]; // [!code ++] }) => { @@ -106,23 +116,23 @@ In your form submission handler, you can get the `captchaToken` from the form su import { AutoForm, - type AutoFormOnSubmit // [!code ++] + type AutoFormOnSubmit, // [!code ++] } from "@vitnode/core/components/form/auto-form"; export const FormSignUp = ({ - captcha + captcha, }: { captcha: z.infer["captcha"]; }) => { const onSubmit: AutoFormOnSubmit = async ( values, form, - { captchaToken } // [!code ++] + { captchaToken }, // [!code ++] ) => { // Call your mutation API with captcha token await mutationApi({ ...values, - captchaToken // [!code ++] + captchaToken, // [!code ++] }); // Handle success or error @@ -159,8 +169,8 @@ z.infer & { captchaToken: string }) => { module: "users", captchaToken, // [!code ++] args: { - body: input - } + body: input, + }, }); if (res.status !== 201) { @@ -175,115 +185,3 @@ z.infer & { captchaToken: string }) => { - -## Custom Usage - -If you want to use captcha in your custom form or somewhere else, follow these steps. - - - - -### Activate captcha in route - -```ts title="plugins/{plugin_name}/src/routes/example.ts" -import { buildRoute } from "@vitnode/core/api/lib/route"; - -export const exampleRoute = buildRoute({ - pluginId: CONFIG_PLUGIN.pluginId, - route: { - method: "post", - description: "Create a new user", - path: "/sign_up", - withCaptcha: true // [!code ++] - }, - handler: async (c) => {} -}); -``` - - - - -### Get config from middleware API - -```tsx title="plugins/{plugin_name}/src/app/sing_up/page.tsx" -import { getMiddlewareApi } from "@vitnode/core/lib/api/get-middleware-api"; // [!code ++] - -export const SignUpView = async () => { - const { captcha } = await getMiddlewareApi(); // [!code ++] - - return ; -}; -``` - - - - -### Use `useCaptcha` hook - -Inside your client component, use the `useCaptcha` hook to handle captcha rendering and validation. Remember to add `div` with `id="vitnode_captcha"` where you want the captcha widget to appear. - -```tsx title="plugins/{plugin_name}/src/components/form/sign-up/sign-up.tsx" -"use client"; - -import { AutoForm } from "@vitnode/core/components/form/auto-form"; - -export const FormSignUp = ({ - captcha // [!code ++] -}: { - captcha: z.infer["captcha"]; // [!code ++] -}) => { - // [!code ++] - const { isReady, getToken, onReset } = useCaptcha(captcha); - - const onSubmit = async () => { - await mutationApi({ - // ...other values, - captchaToken: await getToken() // [!code ++] - }); - - // Handle success or error - // [!code ++] - onReset(); // Reset captcha after submission - }; - - return ( -
- {/* Render captcha widget */} - {/* [!code ++] */} -
- - - - ); -}; -``` - - - - -### Submit form with captcha - -```tsx title="plugins/{plugin_name}/src/components/form/sign-up/mutation-api.ts" -"use server"; - -import type { z } from "zod"; - -import { fetcher } from "@vitnode/core/lib/fetcher"; - -export const mutationApi = async ({ - captchaToken // [!code ++] -}: { - // [!code ++] - captchaToken; -}) => { - await fetcher(usersModule, { - path: "/test", - method: "post", - module: "blog", - captchaToken // [!code ++] - }); -}; -``` - - - diff --git a/apps/docs/content/docs/dev/captcha/meta.json b/apps/docs/content/docs/dev/captcha/meta.json new file mode 100644 index 000000000..f9977456b --- /dev/null +++ b/apps/docs/content/docs/dev/captcha/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Captcha", + "pages": ["...", "custom-adapter"] +} diff --git a/apps/docs/content/docs/dev/cron/custom-adapter.mdx b/apps/docs/content/docs/dev/cron/custom-adapter.mdx new file mode 100644 index 000000000..14c461303 --- /dev/null +++ b/apps/docs/content/docs/dev/cron/custom-adapter.mdx @@ -0,0 +1,83 @@ +--- +title: Custom Adapter +description: Create your own custom cron adapter for VitNode. +--- + +VitNode supports custom cron adapters, allowing you to integrate with various scheduling libraries or services. + +## Usage + + + + +### Create your custom adapter + +As an example we will create a custom adapter using the popular `node-cron` library. + +```ts +import { schedule } from "node-cron"; +import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; + +export const NodeCronAdapter = (): CronAdapter => { + return { + schedule() { + schedule("*/1 * * * *", async () => { + await handleCronJobs(); // [!code ++] + }); + }, + }; +}; +``` + + + + + +### Integrate the adapter into your application + +```ts title="src/vitnode.api.config.ts" +import { NodeCronAdapter } from "./path/to/your/custom/node-cron.adapter"; + +export const vitNodeApiConfig = buildApiConfig({ + cronAdapter: NodeCronAdapter(), +}); +``` + + + + + +### Restart server + +After making these changes, stop your server (if it's running) and restart it to apply the new configuration. + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun dev +``` + +```bash tab="pnpm" +pnpm dev +``` + +```bash tab="npm" +npm run dev +``` + + + +That's it — your app now has a built-in task scheduler, ready to handle cron jobs with standard cron expressions. + + + + +### Check Your Cron Jobs + +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. + + + + diff --git a/apps/docs/content/docs/dev/cron/index.mdx b/apps/docs/content/docs/dev/cron/index.mdx index 5be6d1c73..8b0dacb25 100644 --- a/apps/docs/content/docs/dev/cron/index.mdx +++ b/apps/docs/content/docs/dev/cron/index.mdx @@ -20,80 +20,52 @@ Before you can use cron functionality, you need to provide an adapter to your ap /> -## Custom adapter - -VitNode supports custom cron adapters, allowing you to integrate with various scheduling libraries or services. +## Usage - -### Create your custom adapter - -As an example we will create a custom adapter using the popular `node-cron` library. - -```ts -import { schedule } from "node-cron"; -import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; - -export const NodeCronAdapter = (): CronAdapter => { - return { - schedule() { - schedule("*/1 * * * *", async () => { - await handleCronJobs(); // [!code ++] - }); - } - }; -}; -``` - - - - - -### Integrate the adapter into your application - -```ts title="src/vitnode.api.config.ts" -import { NodeCronAdapter } from "./path/to/your/custom/node-cron.adapter"; - -export const vitNodeApiConfig = buildApiConfig({ - cronAdapter: NodeCronAdapter() +### Create CRON file + +```ts title="cron/clean.cron.ts" +import { buildCron } from "@vitnode/core/api/lib/cron"; + +export const cleanCron = buildCron({ + name: "clean", + description: "Clean up expired sessions and tokens", + // Run every 1 hour + schedule: "0 * * * *", + handler: async c => { + console.log("Running cleanup cron job..."); + }, }); ``` - +### Register CRON in module -## Restart server - -After making these changes, stop your server (if it's running) and restart it to apply the new configuration. +```ts title="modules/clean/clean.module.ts" +import { buildModule } from "@vitnode/core/api/lib/module"; +import { CONFIG_PLUGIN } from "@/config"; -import { Tab, Tabs } from "fumadocs-ui/components/tabs"; - - - -```bash tab="bun" -bun dev -``` +// [!code ++] +import { cleanCron } from "./cron/clean.cron"; -```bash tab="pnpm" -pnpm dev -``` - -```bash tab="npm" -npm run dev +export const cronModule = buildModule({ + pluginId: CONFIG_PLUGIN.pluginId, + name: "clean", + routes: [], + // [!code ++] + cronJobs: [cleanCron], +}); ``` - - -That's it — your app now has a built-in task scheduler, ready to handle cron jobs with standard cron expressions. - -## Check Your Cron Jobs +### Check Your Cron Job -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +When your CRON job will run first time, you should see your job in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/cron/meta.json b/apps/docs/content/docs/dev/cron/meta.json index f5df12b36..42ae35c6f 100644 --- a/apps/docs/content/docs/dev/cron/meta.json +++ b/apps/docs/content/docs/dev/cron/meta.json @@ -1,4 +1,4 @@ { "title": "CRON Jobs", - "pages": ["rest-api", "..."] + "pages": ["rest-api", "...", "custom-adapter"] } diff --git a/apps/docs/content/docs/dev/cron/node-cron.mdx b/apps/docs/content/docs/dev/cron/node-cron.mdx index cfe76f380..2a5f75706 100644 --- a/apps/docs/content/docs/dev/cron/node-cron.mdx +++ b/apps/docs/content/docs/dev/cron/node-cron.mdx @@ -5,10 +5,9 @@ description: In-memory tiny task scheduler in pure JavaScript for node.js based This adapter lets you run scheduled jobs directly inside your Node.js app. It's simple, lightweight, and doesn't require any external services — great for when you just need cron tasks running locally or in memory. - - This documentation is for self-hosted VitNode instances only. You cannot use this if you are - planning to deploy your application to the cloud. - +| Cloud | Self-Hosted | Links | +| ---------------- | ------------ | ------------------------------------------------------ | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/node-cron) | @@ -16,18 +15,18 @@ This adapter lets you run scheduled jobs directly inside your Node.js app. It's import { Tab, Tabs } from "fumadocs-ui/components/tabs"; - + ```bash tab="bun" -bun i node-cron +bun i @vitnode/node-cron -D ``` ```bash tab="pnpm" -pnpm i node-cron +pnpm i @vitnode/node-cron -D ``` ```bash tab="npm" -npm i node-cron +npm i @vitnode/node-cron -D ``` @@ -37,12 +36,13 @@ npm i node-cron ## Usage ```ts title="src/vitnode.api.config.ts" -import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; -``` +// [!code ++] +import { NodeCronAdapter } from "@vitnode/node-cron"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; -```ts title="src/vitnode.api.config.ts" export const vitNodeApiConfig = buildApiConfig({ - cronAdapter: NodeCronAdapter() + // [!code ++] + cronAdapter: NodeCronAdapter(), }); ``` @@ -54,7 +54,7 @@ export const vitNodeApiConfig = buildApiConfig({ After making these changes, stop your server (if it's running) and restart it to apply the new configuration. - + ```bash tab="bun" bun dev @@ -77,7 +77,7 @@ That's it — your app now has a built-in task scheduler, ready to handle cron j ## Check Your Cron Jobs -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/cron/rest-api.mdx b/apps/docs/content/docs/dev/cron/rest-api.mdx index e4d6e1b95..d28901c74 100644 --- a/apps/docs/content/docs/dev/cron/rest-api.mdx +++ b/apps/docs/content/docs/dev/cron/rest-api.mdx @@ -5,6 +5,10 @@ description: Run cron jobs by triggering REST API endpoints from an external sch This method lets you use external services to manage and run your cron jobs through simple HTTP requests. It's flexible and works with many providers, so you can pick the scheduling tool that best fits your infrastructure. +| Cloud | Self-Hosted | +| ------------ | ------------ | +| ✅ Supported | ✅ Supported | + ## Add a Secret Key @@ -18,7 +22,8 @@ CRON_SECRET=your_secret_key ``` - We recommend using a random string of at least **16 characters** for better security. + We recommend using a random string of at least **16 characters** for better + security. @@ -61,7 +66,7 @@ Replace `https://your-domain.com/api/cron` with your actual domain and `{{your_k ## Check Your Cron Jobs -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/email/custom-adapter.mdx b/apps/docs/content/docs/dev/email/custom-adapter.mdx new file mode 100644 index 000000000..109eabe40 --- /dev/null +++ b/apps/docs/content/docs/dev/email/custom-adapter.mdx @@ -0,0 +1,95 @@ +--- +title: Custom Adapter +description: Create your own custom email adapter for VitNode. +--- + +Want to create your own email adapter? You can do it by implementing the `EmailApiPlugin` interface. This allows you to define how emails are sent in your application. + +## Usage + + + +### Create adapter + +Here is your template for a custom email adapter. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = (): EmailApiPlugin => {}; +``` + + + + +### Add config + +If you want to provide config for you adapter, you can do it like this: + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = ({ + // [!code ++:13] + host = "", + port = 587, + secure = false, + user = "", + password = "", + from = "", +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => {}; +``` + + + + + +### Add `sendEmail()` method + +Implement the `sendEmail()` method to send emails using your custom logic. You can use any email sending library or service. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = ({ + host = "", + port = 587, + secure = false, + user = "", + password = "", + from = "", +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => { + // [!code ++:3] + return { + sendEmail: async ({ metadata, to, subject, html, replyTo, text }) => {}, + }; +}; +``` + + + + +## Publish to NPM + +If you want to share your custom adapter with the community, you can publish it as an NPM package. + +Example source code for NPM packages: + +- [Resend Adapter](https://github.com/aXenDeveloper/vitnode/tree/canary/packages/resend), +- [Nodemailer Adapter](https://github.com/aXenDeveloper/vitnode/tree/canary/packages/nodemailer) + +Make sure to follow best practices for package development and include proper documentation. diff --git a/apps/docs/content/docs/dev/email/index.mdx b/apps/docs/content/docs/dev/email/index.mdx index b63e75607..7e132717c 100644 --- a/apps/docs/content/docs/dev/email/index.mdx +++ b/apps/docs/content/docs/dev/email/index.mdx @@ -9,10 +9,10 @@ Before you can use email functionality, you need to provide an adapter to your a - + -or create your own [custom email adapter](/docs/dev/email/overview#custom-email-adapter)... +or create your own [custom email adapter](/docs/dev/email/custom-adapter). ## Usage @@ -24,10 +24,10 @@ import { buildRoute } from "@vitnode/core/api/lib/route"; import { UserModel } from "@vitnode/core/api/models/user"; export const testRoute = buildRoute({ - handler: async (c) => { + handler: async c => { const user = await new UserModel().getUserById({ id: 3, - c + c, }); if (!user) throw new Error("User not found"); @@ -36,11 +36,11 @@ export const testRoute = buildRoute({ await c.get("email").send({ subject: "Test Email", content: () => "This is a test email.", - user + user, }); return c.text("test"); - } + }, }); ``` @@ -51,96 +51,16 @@ import { z } from "zod"; import { buildRoute } from "@vitnode/core/api/lib/route"; export const testRoute = buildRoute({ - handler: async (c) => { + handler: async c => { // [!code ++:6] await c.get("email").send({ to: "test@test.com", subject: "Test Email", content: () => "This is a test email.", - locale: "en" + locale: "en", }); return c.text("test"); - } + }, }); ``` - -## Custom Email Adapter - -Want to create your own email adapter? You can do it by implementing the `EmailApiPlugin` interface. This allows you to define how emails are sent in your application. - - - -### Create adapter - -Here is your template for a custom email adapter. - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = (): EmailApiPlugin => {}; -``` - - - - -### Add config - -If you want to provide config for you adapter, you can do it like this: - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = ({ - // [!code ++:13] - host = "", - port = 587, - secure = false, - user = "", - password = "", - from = "" -}: { - from: string | undefined; - host: string | undefined; - password: string | undefined; - port?: number; - secure?: boolean; - user: string | undefined; -}): EmailApiPlugin => {}; -``` - - - - - -### Add `sendEmail()` method - -Implement the `sendEmail()` method to send emails using your custom logic. You can use any email sending library or service. - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = ({ - host = "", - port = 587, - secure = false, - user = "", - password = "", - from = "" -}: { - from: string | undefined; - host: string | undefined; - password: string | undefined; - port?: number; - secure?: boolean; - user: string | undefined; -}): EmailApiPlugin => { - // [!code ++:3] - return { - sendEmail: async ({ metadata, to, subject, html, replyTo, text }) => {} - }; -}; -``` - - - diff --git a/apps/docs/content/docs/dev/email/meta.json b/apps/docs/content/docs/dev/email/meta.json index 7d2940a6b..a0d3641b4 100644 --- a/apps/docs/content/docs/dev/email/meta.json +++ b/apps/docs/content/docs/dev/email/meta.json @@ -1,4 +1,10 @@ { "title": "Email", - "pages": ["templates", "components", "---Adapters---", "..."] + "pages": [ + "templates", + "components", + "---Adapters---", + "...", + "custom-adapter" + ] } diff --git a/apps/docs/content/docs/dev/sso/custom-adapter.mdx b/apps/docs/content/docs/dev/sso/custom-adapter.mdx new file mode 100644 index 000000000..45a8feeb3 --- /dev/null +++ b/apps/docs/content/docs/dev/sso/custom-adapter.mdx @@ -0,0 +1,352 @@ +--- +title: Custom Adapter +description: Create your own custom SSO adapter for VitNode. +--- + +Want to let your users sign in with their favorite services? Let's build a custom SSO adapter! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. + +## Usage + +import { Callout } from "fumadocs-ui/components/callout"; + + + + ### Create Your SSO Plugin + +Let's start with the basics. Create a new file for your SSO provider: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { id, name: "Discord" }; +}; +``` + +This is like creating a blueprint for your SSO provider. The `id` will be used in URLs and the `name` is what users will see. + + + + +### Add Authentication URL Generator + +Now let's add the magic that sends users to Discord for login: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + getUrl: ({ state }) => { + // [!code ++] + const url = new URL("https://discord.com/oauth2/authorize"); + // [!code ++] + url.searchParams.set("client_id", clientId); + // [!code ++] + url.searchParams.set("redirect_uri", redirectUri); + // [!code ++] + url.searchParams.set("response_type", "code"); + // [!code ++] + url.searchParams.set("scope", "identify email"); + // [!code ++] + url.searchParams.set("state", state); + // [!code ++] + return url.toString(); + // [!code ++] + }, + }; +}; +``` + + + Always include the `state` parameter - it's your security guard against CSRF + attacks. Don't worry, VitNode handles this automatically! + + + + + + +### Handle Token Exchange + +After the user approves access, Discord sends us a code. Let's exchange it for an access token: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; +import { HTTPException } from "hono/http-exception"; +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { z } from "zod"; + +const tokenSchema = z.object({ + access_token: z.string(), + token_type: z.string(), +}); + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + fetchToken: async code => { + // [!code ++] + const res = await fetch("https://discord.com/api/oauth2/token", { + // [!code ++] + method: "POST", + // [!code ++] + headers: { + // [!code ++] + "Content-Type": "application/x-www-form-urlencoded", + // [!code ++] + Accept: "application/json", + // [!code ++] + }, + // [!code ++] + body: new URLSearchParams({ + // [!code ++] + code, + // [!code ++] + redirect_uri: redirectUri, + // [!code ++] + grant_type: "authorization_code", + // [!code ++] + client_id: clientId, + // [!code ++] + client_secret: clientSecret, + // [!code ++] + }), + // [!code ++] + }); + + // [!code ++] + if (!res.ok) { + // [!code ++] + throw new HTTPException( + // [!code ++] + +res.status.toString() as ContentfulStatusCode, + // [!code ++] + { + // [!code ++] + message: "Internal error requesting token", + // [!code ++] + }, + // [!code ++] + ); + // [!code ++] + } + + // [!code ++] + const { data, error } = tokenSchema.safeParse(await res.json()); + // [!code ++] + if (error ?? !data) { + // [!code ++] + throw new HTTPException(400, { + // [!code ++] + message: "Invalid token response", + // [!code ++] + }); + // [!code ++] + } + + // [!code ++] + return data; + // [!code ++] + }, + getUrl: ({ state }) => { + const url = new URL("https://discord.com/oauth2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("redirect_uri", redirectUri); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", "identify email"); + url.searchParams.set("state", state); + + return url.toString(); + }, + }; +}; +``` + + + + + +### Get User Information + +Finally, let's get the user's profile data using our shiny new access token: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; +import { HTTPException } from "hono/http-exception"; +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { z } from "zod"; + +const userSchema = z.object({ + id: z.number(), + email: z.string(), + username: z.string(), +}); + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + fetchUser: async ({ token_type, access_token }) => { + // [!code ++] + const res = await fetch("https://discord.com/api/users/@me", { + // [!code ++] + headers: { + // [!code ++] + Authorization: `${token_type} ${access_token}`, + // [!code ++] + }, + // [!code ++] + }); + + // [!code ++] + const { data, error } = userSchema.safeParse(await res.json()); + // [!code ++] + if (error ?? !data) { + // [!code ++] + throw new HTTPException(400, { + // [!code ++] + message: "Invalid user response", + // [!code ++] + }); + // [!code ++] + } + + // [!code ++] + return data; + // [!code ++] + }, + fetchToken: async code => { + const res = await fetch("https://discord.com/api/oauth2/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json", + }, + body: new URLSearchParams({ + code, + redirect_uri: redirectUri, + grant_type: "authorization_code", + client_id: clientId, + client_secret: clientSecret, + }), + }); + + if (!res.ok) { + throw new HTTPException( + +res.status.toString() as ContentfulStatusCode, + { + message: "Internal error requesting token", + }, + ); + } + + const { data, error } = tokenSchema.safeParse(await res.json()); + if (error ?? !data) { + throw new HTTPException(400, { + message: "Invalid token response", + }); + } + + return data; + }, + getUrl: ({ state }) => { + const url = new URL("https://discord.com/oauth2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("redirect_uri", redirectUri); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", "identify email"); + url.searchParams.set("state", state); + + return url.toString(); + }, + }; +}; +``` + + + Pro tip: Some OAuth providers might return unverified email addresses. If your + provider gives you an email verification status, add it to your validation to + keep things secure! + + + + + + +## Connect Everything Together + +Last step! Let's plug your new SSO provider into your app: + +```ts title="src/app/api/[...route]/route.ts" +import { OpenAPIHono } from "@hono/zod-openapi"; +import { handle } from "hono/vercel"; +import { VitNodeAPI } from "@vitnode/core/api/config"; +import { DiscordSSOApiPlugin } from "@/utils/sso/discord_api"; + +const app = new OpenAPIHono().basePath("/api"); +VitNodeAPI({ + app, + plugins: [], + authorization: { + // [!code ++] + ssoAdapters: [ + // [!code ++] + DiscordSSOApiPlugin({ + // [!code ++] + clientId: process.env.DISCORD_CLIENT_ID, + // [!code ++] + clientSecret: process.env.DISCORD_CLIENT_SECRET, + // [!code ++] + }), + // [!code ++] + ], + }, +}); +``` + + + + diff --git a/apps/docs/content/docs/dev/sso/index.mdx b/apps/docs/content/docs/dev/sso/index.mdx index 4c2fa1875..5372ccb1e 100644 --- a/apps/docs/content/docs/dev/sso/index.mdx +++ b/apps/docs/content/docs/dev/sso/index.mdx @@ -22,347 +22,3 @@ Before you can use SSO, you need to provide an adapter to your application. or create your own custom SSO adapter... - -## Custom SSO Adapter - -Want to let your users sign in with their favorite services? Let's build a custom SSO adapter! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. - -import { Callout } from "fumadocs-ui/components/callout"; - - - - ### Create Your SSO Plugin - -Let's start with the basics. Create a new file for your SSO provider: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { id, name: "Discord" }; -}; -``` - -This is like creating a blueprint for your SSO provider. The `id` will be used in URLs and the `name` is what users will see. - - - - -### Add Authentication URL Generator - -Now let's add the magic that sends users to Discord for login: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - getUrl: ({ state }) => { - // [!code ++] - const url = new URL("https://discord.com/oauth2/authorize"); - // [!code ++] - url.searchParams.set("client_id", clientId); - // [!code ++] - url.searchParams.set("redirect_uri", redirectUri); - // [!code ++] - url.searchParams.set("response_type", "code"); - // [!code ++] - url.searchParams.set("scope", "identify email"); - // [!code ++] - url.searchParams.set("state", state); - // [!code ++] - return url.toString(); - // [!code ++] - }, - }; -}; -``` - - - Always include the `state` parameter - it's your security guard against CSRF - attacks. Don't worry, VitNode handles this automatically! - - - - - - -### Handle Token Exchange - -After the user approves access, Discord sends us a code. Let's exchange it for an access token: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; -import { HTTPException } from "hono/http-exception"; -import { ContentfulStatusCode } from "hono/utils/http-status"; -import { z } from "zod"; - -const tokenSchema = z.object({ - access_token: z.string(), - token_type: z.string(), -}); - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - fetchToken: async code => { - // [!code ++] - const res = await fetch("https://discord.com/api/oauth2/token", { - // [!code ++] - method: "POST", - // [!code ++] - headers: { - // [!code ++] - "Content-Type": "application/x-www-form-urlencoded", - // [!code ++] - Accept: "application/json", - // [!code ++] - }, - // [!code ++] - body: new URLSearchParams({ - // [!code ++] - code, - // [!code ++] - redirect_uri: redirectUri, - // [!code ++] - grant_type: "authorization_code", - // [!code ++] - client_id: clientId, - // [!code ++] - client_secret: clientSecret, - // [!code ++] - }), - // [!code ++] - }); - - // [!code ++] - if (!res.ok) { - // [!code ++] - throw new HTTPException( - // [!code ++] - +res.status.toString() as ContentfulStatusCode, - // [!code ++] - { - // [!code ++] - message: "Internal error requesting token", - // [!code ++] - }, - // [!code ++] - ); - // [!code ++] - } - - // [!code ++] - const { data, error } = tokenSchema.safeParse(await res.json()); - // [!code ++] - if (error ?? !data) { - // [!code ++] - throw new HTTPException(400, { - // [!code ++] - message: "Invalid token response", - // [!code ++] - }); - // [!code ++] - } - - // [!code ++] - return data; - // [!code ++] - }, - getUrl: ({ state }) => { - const url = new URL("https://discord.com/oauth2/authorize"); - url.searchParams.set("client_id", clientId); - url.searchParams.set("redirect_uri", redirectUri); - url.searchParams.set("response_type", "code"); - url.searchParams.set("scope", "identify email"); - url.searchParams.set("state", state); - - return url.toString(); - }, - }; -}; -``` - - - - - -### Get User Information - -Finally, let's get the user's profile data using our shiny new access token: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; -import { HTTPException } from "hono/http-exception"; -import { ContentfulStatusCode } from "hono/utils/http-status"; -import { z } from "zod"; - -const userSchema = z.object({ - id: z.number(), - email: z.string(), - username: z.string(), -}); - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - fetchUser: async ({ token_type, access_token }) => { - // [!code ++] - const res = await fetch("https://discord.com/api/users/@me", { - // [!code ++] - headers: { - // [!code ++] - Authorization: `${token_type} ${access_token}`, - // [!code ++] - }, - // [!code ++] - }); - - // [!code ++] - const { data, error } = userSchema.safeParse(await res.json()); - // [!code ++] - if (error ?? !data) { - // [!code ++] - throw new HTTPException(400, { - // [!code ++] - message: "Invalid user response", - // [!code ++] - }); - // [!code ++] - } - - // [!code ++] - return data; - // [!code ++] - }, - fetchToken: async code => { - const res = await fetch("https://discord.com/api/oauth2/token", { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded", - Accept: "application/json", - }, - body: new URLSearchParams({ - code, - redirect_uri: redirectUri, - grant_type: "authorization_code", - client_id: clientId, - client_secret: clientSecret, - }), - }); - - if (!res.ok) { - throw new HTTPException( - +res.status.toString() as ContentfulStatusCode, - { - message: "Internal error requesting token", - }, - ); - } - - const { data, error } = tokenSchema.safeParse(await res.json()); - if (error ?? !data) { - throw new HTTPException(400, { - message: "Invalid token response", - }); - } - - return data; - }, - getUrl: ({ state }) => { - const url = new URL("https://discord.com/oauth2/authorize"); - url.searchParams.set("client_id", clientId); - url.searchParams.set("redirect_uri", redirectUri); - url.searchParams.set("response_type", "code"); - url.searchParams.set("scope", "identify email"); - url.searchParams.set("state", state); - - return url.toString(); - }, - }; -}; -``` - - - Pro tip: Some OAuth providers might return unverified email addresses. If your - provider gives you an email verification status, add it to your validation to - keep things secure! - - - - - - -## Connect Everything Together - -Last step! Let's plug your new SSO provider into your app: - -```ts title="src/app/api/[...route]/route.ts" -import { OpenAPIHono } from "@hono/zod-openapi"; -import { handle } from "hono/vercel"; -import { VitNodeAPI } from "@vitnode/core/api/config"; -import { DiscordSSOApiPlugin } from "@/utils/sso/discord_api"; - -const app = new OpenAPIHono().basePath("/api"); -VitNodeAPI({ - app, - plugins: [], - authorization: { - // [!code ++] - ssoAdapters: [ - // [!code ++] - DiscordSSOApiPlugin({ - // [!code ++] - clientId: process.env.DISCORD_CLIENT_ID, - // [!code ++] - clientSecret: process.env.DISCORD_CLIENT_SECRET, - // [!code ++] - }), - // [!code ++] - ], - }, -}); -``` diff --git a/apps/docs/content/docs/dev/sso/meta.json b/apps/docs/content/docs/dev/sso/meta.json new file mode 100644 index 000000000..c4b976e82 --- /dev/null +++ b/apps/docs/content/docs/dev/sso/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Single Sign-On (SSO)", + "pages": ["...", "custom-adapter"] +} diff --git a/apps/docs/package.json b/apps/docs/package.json index 9530e8a27..633557eba 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -55,6 +55,7 @@ "@vitnode/config": "workspace:*", "@vitnode/nodemailer": "workspace:*", "@vitnode/resend": "workspace:*", + "@vitnode/node-cron": "workspace:*", "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", diff --git a/apps/docs/src/vitnode.api.config.ts b/apps/docs/src/vitnode.api.config.ts index be113d3ed..49cb91b54 100644 --- a/apps/docs/src/vitnode.api.config.ts +++ b/apps/docs/src/vitnode.api.config.ts @@ -1,12 +1,11 @@ import { blogApiPlugin } from "@vitnode/blog/config.api"; -import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; -import { ResendEmailAdapter } from "@vitnode/resend"; - -import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { DiscordSSOApiPlugin } from "@vitnode/core/api/adapters/sso/discord"; +// import { ResendEmailAdapter } from "@vitnode/resend"; import { FacebookSSOApiPlugin } from "@vitnode/core/api/adapters/sso/facebook"; import { GoogleSSOApiPlugin } from "@vitnode/core/api/adapters/sso/google"; import { buildApiConfig } from "@vitnode/core/vitnode.config"; +import { NodeCronAdapter } from "@vitnode/node-cron"; +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { drizzle } from "drizzle-orm/postgres-js"; export const POSTGRES_URL = @@ -34,16 +33,16 @@ export const vitNodeApiConfig = buildApiConfig({ duration: 60, // per 60 seconds }, email: { - // adapter: NodemailerEmailAdapter({ - // from: process.env.NODE_MAILER_FROM, - // host: process.env.NODE_MAILER_HOST, - // password: process.env.NODE_MAILER_PASSWORD, - // user: process.env.NOD_EMAILER_USER, - // }), - adapter: ResendEmailAdapter({ - apiKey: process.env.RESEND_API_KEY, - from: process.env.RESEND_FROM_EMAIL, + adapter: NodemailerEmailAdapter({ + from: process.env.NODE_MAILER_FROM, + host: process.env.NODE_MAILER_HOST, + password: process.env.NODE_MAILER_PASSWORD, + user: process.env.NOD_EMAILER_USER, }), + // adapter: ResendEmailAdapter({ + // apiKey: process.env.RESEND_API_KEY, + // from: process.env.RESEND_FROM_EMAIL, + // }), logo: { text: "VitNode Email Test", src: "http://localhost:3000/logo_vitnode_dark.png", diff --git a/packages/node-cron/.npmignore b/packages/node-cron/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/node-cron/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/node-cron/.swcrc b/packages/node-cron/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/node-cron/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/node-cron/README.md b/packages/node-cron/README.md new file mode 100644 index 000000000..a68ff4bab --- /dev/null +++ b/packages/node-cron/README.md @@ -0,0 +1,20 @@ +# (VitNode) Node-cron Adapter + +This package provides the Node-cron adapter for VitNode, enabling cron job scheduling and management within your VitNode applications. + +

+
+
+ + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ---------------- | ------------ | ------------------------------------------------------ | --------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/node-cron) | [Docs](https://vitnode.com/docs/dev/cron/node-cron) | diff --git a/packages/node-cron/eslint.config.mjs b/packages/node-cron/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/node-cron/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json new file mode 100644 index 000000000..928766c0c --- /dev/null +++ b/packages/node-cron/package.json @@ -0,0 +1,46 @@ +{ + "name": "@vitnode/node-cron", + "version": "1.2.0-canary.60", + "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/node-cron" + }, + "keywords": [ + "vitnode", + "node-cron", + "cron", + "scheduler" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "node-cron": "^4.2.1" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts b/packages/node-cron/src/index.ts similarity index 73% rename from packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts rename to packages/node-cron/src/index.ts index de2606ecb..d51d24d85 100644 --- a/packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts +++ b/packages/node-cron/src/index.ts @@ -1,7 +1,6 @@ +import { type CronAdapter, handleCronJobs } from "@vitnode/core/api/lib/cron"; import { schedule } from "node-cron"; -import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; - export const NodeCronAdapter = (): CronAdapter => { return { schedule() { diff --git a/packages/node-cron/tsconfig.json b/packages/node-cron/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/node-cron/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 42262cc83..f8419f925 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -62,7 +62,6 @@ "lucide-react": "^0.553.0", "next": "^16.0.1", "next-intl": "^4.5.0", - "node-cron": "^4.2.1", "react": "^19.2.0", "react-dom": "^19.2.0", "react-email": "^5.0.1", diff --git a/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts b/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts index 6d2ef8ffd..c7916f627 100644 --- a/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts +++ b/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts @@ -1,12 +1,12 @@ import type { drizzle } from "drizzle-orm/postgres-js"; import { eq, inArray } from "drizzle-orm"; -import { validate } from "node-cron"; import type { CronJobConfig } from "@/api/lib/cron"; import { core_cron } from "@/database/cron"; import { shouldCronJobRun } from "@/lib/api/should-cron-job-run"; +import { validateCronSchedule } from "@/lib/api/validate-cron-schedule"; interface CronJobFromDb { createdAt: Date; @@ -82,7 +82,7 @@ export function processCronJobs( ); for (const job of cronJobs) { - if (!validate(job.schedule)) { + if (!validateCronSchedule(job.schedule)) { // eslint-disable-next-line no-console console.warn( `\x1b[34m[VitNode]\x1b[0m \x1b[33mInvalid cron schedule for job "${job.pluginId}:${job.module}:${job.name}"\x1b[0m: ${job.schedule}`, diff --git a/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts b/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts new file mode 100644 index 000000000..d944b6d73 --- /dev/null +++ b/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts @@ -0,0 +1,171 @@ +import { describe, expect, it } from "vitest"; + +import { validateCronSchedule } from "./validate-cron-schedule"; + +describe("validateCronSchedule", () => { + describe("valid 5-field cron expressions", () => { + it("should validate wildcard expression", () => { + expect(validateCronSchedule("* * * * *")).toBe(true); + }); + + it("should validate specific time expressions", () => { + expect(validateCronSchedule("0 0 * * *")).toBe(true); // Daily at midnight + expect(validateCronSchedule("30 14 * * 1")).toBe(true); // Every Monday at 14:30 + expect(validateCronSchedule("0 0 1 * *")).toBe(true); // First day of month at midnight + expect(validateCronSchedule("0 0 1 1 *")).toBe(true); // January 1st at midnight + expect(validateCronSchedule("15 10 * * 5")).toBe(true); // Every Friday at 10:15 + }); + + it("should validate step expressions", () => { + expect(validateCronSchedule("*/5 * * * *")).toBe(true); // Every 5 minutes + expect(validateCronSchedule("*/15 * * * *")).toBe(true); // Every 15 minutes + expect(validateCronSchedule("0 */2 * * *")).toBe(true); // Every 2 hours + expect(validateCronSchedule("0 0 */3 * *")).toBe(true); // Every 3 days + expect(validateCronSchedule("0-30/5 * * * *")).toBe(true); // Every 5 minutes from 0 to 30 + }); + + it("should validate range expressions", () => { + expect(validateCronSchedule("0 9-17 * * *")).toBe(true); // Every hour from 9am to 5pm + expect(validateCronSchedule("0 0 1-15 * *")).toBe(true); // First 15 days of month + expect(validateCronSchedule("0 0 * 1-6 *")).toBe(true); // First 6 months + expect(validateCronSchedule("0 0 * * 1-5")).toBe(true); // Monday to Friday + }); + + it("should validate list expressions", () => { + expect(validateCronSchedule("0 0,12 * * *")).toBe(true); // At midnight and noon + expect(validateCronSchedule("0 0 1,15 * *")).toBe(true); // 1st and 15th of month + expect(validateCronSchedule("0 0 * * 1,3,5")).toBe(true); // Monday, Wednesday, Friday + expect(validateCronSchedule("0 9,12,15 * * *")).toBe(true); // At 9am, noon, 3pm + }); + + it("should validate complex expressions", () => { + expect(validateCronSchedule("0-30/5 9-17 * * 1-5")).toBe(true); // Every 5 minutes from 0-30, 9am-5pm, Monday-Friday + expect(validateCronSchedule("0 0,12 1,15 * *")).toBe(true); // Midnight and noon on 1st and 15th + expect(validateCronSchedule("*/10 */2 * * *")).toBe(true); // Every 10 minutes, every 2 hours + }); + + it("should validate weekday 0 and 7 (both Sunday)", () => { + expect(validateCronSchedule("0 0 * * 0")).toBe(true); // Sunday + expect(validateCronSchedule("0 0 * * 7")).toBe(true); // Sunday (alternative) + }); + + it("should validate edge cases", () => { + expect(validateCronSchedule("59 23 31 12 7")).toBe(true); // Max values + expect(validateCronSchedule("0 0 1 1 0")).toBe(true); // Min values (except minute/hour) + }); + }); + + describe("valid 6-field cron expressions (with seconds)", () => { + it("should validate wildcard expression with seconds", () => { + expect(validateCronSchedule("* * * * * *")).toBe(true); + }); + + it("should validate specific time expressions with seconds", () => { + expect(validateCronSchedule("0 0 0 * * *")).toBe(true); // Daily at midnight + expect(validateCronSchedule("30 30 14 * * 1")).toBe(true); // Every Monday at 14:30:30 + expect(validateCronSchedule("0 0 0 1 * *")).toBe(true); // First day of month at midnight + }); + + it("should validate step expressions with seconds", () => { + expect(validateCronSchedule("*/5 * * * * *")).toBe(true); // Every 5 seconds + expect(validateCronSchedule("0 */5 * * * *")).toBe(true); // Every 5 minutes + expect(validateCronSchedule("*/30 0 * * * *")).toBe(true); // Every 30 seconds at minute 0 + }); + + it("should validate range expressions with seconds", () => { + expect(validateCronSchedule("0-30 0 9-17 * * *")).toBe(true); // Seconds 0-30, minute 0, 9am-5pm + }); + + it("should validate list expressions with seconds", () => { + expect(validateCronSchedule("0,30 0 0,12 * * *")).toBe(true); // At 0 and 30 seconds, midnight and noon + }); + }); + + describe("invalid cron expressions", () => { + it("should reject empty or non-string input", () => { + expect(validateCronSchedule("")).toBe(false); + expect(validateCronSchedule(" ")).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(null)).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(undefined)).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(123)).toBe(false); + }); + + it("should reject wrong number of fields", () => { + expect(validateCronSchedule("* * *")).toBe(false); // Too few + expect(validateCronSchedule("* * * *")).toBe(false); // Too few + expect(validateCronSchedule("* * * * * * *")).toBe(false); // Too many + expect(validateCronSchedule("* * * * * * * *")).toBe(false); // Too many + }); + + it("should reject invalid characters", () => { + expect(validateCronSchedule("a * * * *")).toBe(false); + expect(validateCronSchedule("* b * * *")).toBe(false); + expect(validateCronSchedule("* * c * *")).toBe(false); + expect(validateCronSchedule("@ # $ % ^")).toBe(false); + expect(validateCronSchedule("invalid cron")).toBe(false); + }); + + it("should reject out-of-range values", () => { + expect(validateCronSchedule("60 * * * *")).toBe(false); // Minute > 59 + expect(validateCronSchedule("* 24 * * *")).toBe(false); // Hour > 23 + expect(validateCronSchedule("* * 32 * *")).toBe(false); // Day > 31 + expect(validateCronSchedule("* * 0 * *")).toBe(false); // Day < 1 + expect(validateCronSchedule("* * * 13 *")).toBe(false); // Month > 12 + expect(validateCronSchedule("* * * 0 *")).toBe(false); // Month < 1 + expect(validateCronSchedule("* * * * 8")).toBe(false); // Weekday > 7 + expect(validateCronSchedule("-1 * * * *")).toBe(false); // Negative minute + }); + + it("should reject out-of-range values in 6-field format", () => { + expect(validateCronSchedule("60 * * * * *")).toBe(false); // Second > 59 + expect(validateCronSchedule("-1 * * * * *")).toBe(false); // Negative second + }); + + it("should reject invalid ranges", () => { + expect(validateCronSchedule("10-5 * * * *")).toBe(false); // Start > end + expect(validateCronSchedule("* 20-10 * * *")).toBe(false); // Start > end + expect(validateCronSchedule("* * 60-70 * *")).toBe(false); // Out of range + expect(validateCronSchedule("0-60 * * * *")).toBe(false); // End out of range + }); + + it("should reject invalid steps", () => { + expect(validateCronSchedule("*/0 * * * *")).toBe(false); // Step of 0 + expect(validateCronSchedule("*/-1 * * * *")).toBe(false); // Negative step + expect(validateCronSchedule("*/60 * * * *")).toBe(false); // Step > max + expect(validateCronSchedule("*/abc * * * *")).toBe(false); // Non-numeric step + expect(validateCronSchedule("* */25 * * *")).toBe(false); // Step > max for hour + }); + + it("should reject invalid lists", () => { + expect(validateCronSchedule("0,60 * * * *")).toBe(false); // Out of range in list + expect(validateCronSchedule("* 0,24 * * *")).toBe(false); // Out of range in list + expect(validateCronSchedule("a,b,c * * * *")).toBe(false); // Non-numeric list + expect(validateCronSchedule(",, * * * *")).toBe(false); // Empty list items + }); + + it("should reject malformed expressions", () => { + expect(validateCronSchedule("1--5 * * * *")).toBe(false); // Double dash + expect(validateCronSchedule("1//5 * * * *")).toBe(false); // Double slash + expect(validateCronSchedule("1- * * * *")).toBe(false); // Incomplete range + expect(validateCronSchedule("-5 * * * *")).toBe(false); // Invalid start + expect(validateCronSchedule("1/ * * * *")).toBe(false); // Incomplete step + expect(validateCronSchedule("/5 * * * *")).toBe(false); // Missing base for step + }); + }); + + describe("edge cases", () => { + it("should handle extra whitespace", () => { + expect(validateCronSchedule(" * * * * * ")).toBe(true); + expect(validateCronSchedule("0 0 * * *")).toBe(true); + }); + + it("should reject mixed valid and invalid fields", () => { + expect(validateCronSchedule("0 0 * * invalid")).toBe(false); + expect(validateCronSchedule("0 25 * * *")).toBe(false); // Invalid hour + expect(validateCronSchedule("* * * * * 60")).toBe(false); // Invalid second in 6-field + }); + }); +}); diff --git a/packages/vitnode/src/lib/api/validate-cron-schedule.ts b/packages/vitnode/src/lib/api/validate-cron-schedule.ts new file mode 100644 index 000000000..d0655bb5c --- /dev/null +++ b/packages/vitnode/src/lib/api/validate-cron-schedule.ts @@ -0,0 +1,128 @@ +/** + * Validates a cron schedule expression + * Supports standard cron format: minute hour day month weekday + * Also supports extended format with seconds (6 fields): second minute hour day month weekday + * + * @param schedule - The cron schedule string to validate + * @returns true if the schedule is valid, false otherwise + * + * @example + * ```typescript + * validateCronSchedule("0 0 * * *") // true - runs at midnight every day + * validateCronSchedule("*\/5 * * * *") // true - runs every 5 minutes + * validateCronSchedule("0 0 1 * *") // true - runs at midnight on the first day of each month + * validateCronSchedule("invalid") // false + * ``` + */ +export function validateCronSchedule(schedule: string): boolean { + if (!schedule || typeof schedule !== "string") { + return false; + } + + const trimmedSchedule = schedule.trim(); + if (!trimmedSchedule) { + return false; + } + + const parts = trimmedSchedule.split(/\s+/); + + // Support both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats + if (parts.length !== 5 && parts.length !== 6) { + return false; + } + + // Define field configurations + const fieldConfigs = + parts.length === 6 + ? [ + { name: "second", min: 0, max: 59 }, + { name: "minute", min: 0, max: 59 }, + { name: "hour", min: 0, max: 23 }, + { name: "day", min: 1, max: 31 }, + { name: "month", min: 1, max: 12 }, + { name: "weekday", min: 0, max: 7 }, // 0 and 7 both represent Sunday + ] + : [ + { name: "minute", min: 0, max: 59 }, + { name: "hour", min: 0, max: 23 }, + { name: "day", min: 1, max: 31 }, + { name: "month", min: 1, max: 12 }, + { name: "weekday", min: 0, max: 7 }, // 0 and 7 both represent Sunday + ]; + + // Validate each field + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + const config = fieldConfigs[i]; + + if (!validateCronField(part, config.min, config.max)) { + return false; + } + } + + return true; +} + +/** + * Validates a single cron field + * Supports: asterisk, numbers, ranges (1-5), steps (star/5, 1-10/2), and lists (1,2,3) + */ +function validateCronField(field: string, min: number, max: number): boolean { + if (field === "*") { + return true; + } + + // Handle lists (e.g., "1,2,3,5") + if (field.includes(",")) { + const listItems = field.split(","); + + return listItems.every(item => validateCronField(item.trim(), min, max)); + } + + // Handle steps (e.g., "*/5" or "1-10/2") + if (field.includes("/")) { + const [range, step] = field.split("/"); + const stepNum = parseInt(step, 10); + + if (isNaN(stepNum) || stepNum <= 0 || stepNum > max) { + return false; + } + + // If range is "*", it's valid + if (range === "*") { + return true; + } + + // Otherwise, validate the range part + return validateCronField(range, min, max); + } + + // Handle ranges (e.g., "1-5") + if (field.includes("-")) { + const [start, end] = field.split("-"); + const startNum = parseInt(start, 10); + const endNum = parseInt(end, 10); + + if ( + isNaN(startNum) || + isNaN(endNum) || + startNum < min || + startNum > max || + endNum < min || + endNum > max || + startNum > endNum + ) { + return false; + } + + return true; + } + + // Handle single numbers + const num = parseInt(field, 10); + if (isNaN(num) || num < min || num > max) { + return false; + } + + return true; +} diff --git a/packages/vitnode/vitest.config.ts b/packages/vitnode/vitest.config.ts index 3a3574d48..237c1132e 100644 --- a/packages/vitnode/vitest.config.ts +++ b/packages/vitnode/vitest.config.ts @@ -9,6 +9,20 @@ export default defineConfig({ globals: true, environment: "jsdom", setupFiles: ["./src/tests/setup.ts"], + exclude: [ + "**/node_modules/**", + "**/dist/**", + "**/build/**", + "**/.next/**", + "**/.turbo/**", + "**/coverage/**", + "**/src/tests/**", // Assuming setup files aren't tests + "**/src/emails/**", + "**/config/**", + "**/scripts/**", + "**/*.config.*", + "**/*.d.ts", + ], coverage: { provider: "v8", reporter: ["text", "json", "html"], diff --git a/plugins/blog/src/api/modules/categories/test.route.ts b/plugins/blog/src/api/modules/categories/test.route.ts index d3260901b..be8151267 100644 --- a/plugins/blog/src/api/modules/categories/test.route.ts +++ b/plugins/blog/src/api/modules/categories/test.route.ts @@ -32,7 +32,7 @@ export const testRoute = buildRoute({ }, handler: async c => { const user = await new UserModel().getUserById({ - id: 3, + id: 2, c, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d77712e3f..5dd64f27d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,6 +199,9 @@ importers: '@vitnode/config': specifier: workspace:* version: link:../../packages/config + '@vitnode/node-cron': + specifier: workspace:* + version: link:../../packages/node-cron '@vitnode/nodemailer': specifier: workspace:* version: link:../../packages/nodemailer @@ -322,6 +325,37 @@ importers: specifier: ^5.9.3 version: 5.9.3 + packages/node-cron: + dependencies: + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/nodemailer: dependencies: nodemailer: @@ -534,9 +568,6 @@ importers: next-intl: specifier: ^4.5.0 version: 4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - node-cron: - specifier: ^4.2.1 - version: 4.2.1 react: specifier: ^19.2.0 version: 19.2.0 From ba466a481ae244ea030f35e354b166c7fa4aeb93 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:17:43 +0100 Subject: [PATCH 05/21] feat(plugin): Add create package.json --- .github/workflows/bump_publish.yml | 6 +- apps/docs/content/docs/dev/cron/rest-api.mdx | 13 +- .../eslint-react/eslint.config.mjs | 19 ++ .../copy-of-vitnode-plugin/root/.npmignore | 19 ++ .../copy-of-vitnode-plugin/root/.swcrc | 25 ++ .../copy-of-vitnode-plugin/root/global.d.ts | 10 + .../copy-of-vitnode-plugin/root/tsconfig.json | 25 ++ packages/create-vitnode-app/eslint.config.mjs | 2 +- .../src/create/create-package-json.ts | 223 +++++++----------- .../src/create/package-versions.ts | 47 ++++ .../helpers/get-vitnode-package-version.ts | 17 ++ .../create-vitnode-app/src/helpers/with-If.ts | 4 + .../src/plugin/create/create-package-json.ts | 79 +++++++ .../plugin/create/create-plugin-vitnode.ts | 36 ++- .../create-vitnode-app/src/plugin/index.ts | 4 +- .../src/plugin/validation.ts | 10 +- 16 files changed, 389 insertions(+), 150 deletions(-) create mode 100644 packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs create mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore create mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc create mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts create mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json create mode 100644 packages/create-vitnode-app/src/create/package-versions.ts create mode 100644 packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts create mode 100644 packages/create-vitnode-app/src/helpers/with-If.ts create mode 100644 packages/create-vitnode-app/src/plugin/create/create-package-json.ts diff --git a/.github/workflows/bump_publish.yml b/.github/workflows/bump_publish.yml index 609ccb931..84304b5a4 100644 --- a/.github/workflows/bump_publish.yml +++ b/.github/workflows/bump_publish.yml @@ -82,21 +82,21 @@ jobs: - name: Publish canary if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'canary' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag canary --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag canary --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish release candidate if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'release-candidate' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag rc --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag rc --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish stable if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'stable' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --tag latest --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag latest --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/apps/docs/content/docs/dev/cron/rest-api.mdx b/apps/docs/content/docs/dev/cron/rest-api.mdx index d28901c74..515e9041b 100644 --- a/apps/docs/content/docs/dev/cron/rest-api.mdx +++ b/apps/docs/content/docs/dev/cron/rest-api.mdx @@ -39,11 +39,16 @@ Next, configure a scheduler that will send HTTP requests to your cron endpoint. - [Google Cloud Functions with Cloud Scheduler](https://cloud.google.com/scheduler/docs/tut-pub-sub) - [EasyCron](https://www.easycron.com/) - - You need to set schedule for every minute to ensure that your cron jobs are executed on time. - -Make sure to include the `Authorization` header with the value `Bearer {your_key}` in your requests, where `{your_key}` is the value of the `CRON_SECRET` variable you set in your `.env` file. + + You need to set schedule for every minute to ensure that your cron jobs are + executed on time. Some schedulers may have limitations on minimum intervals, + so choose one that fits your needs. + + + Make sure to include the `Authorization` header with the value `Bearer{" "} + {your_key}` in your requests, where `{your_key}` is the value of the + `CRON_SECRET` variable you set in your `.env` file. diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs new file mode 100644 index 000000000..b1ce26beb --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs @@ -0,0 +1,19 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + ...eslintVitNodeReact, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore new file mode 100644 index 000000000..2fb2a5651 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore @@ -0,0 +1,19 @@ +/src/* +!/src/app +!/src/app/** +!/src/app_admin +!/src/app_admin/** +!/src/locales +!/src/locales/** + +/node_modules +/.turbo +/tsconfig.json +/.swcrc +/components.json +/global.d.ts +/tsup.config.ts +/vitest.config.ts +/tsconfig.json +/scripts +/config \ No newline at end of file diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts new file mode 100644 index 000000000..a57ec4757 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts @@ -0,0 +1,10 @@ +/// + +import core from "@vitnode/core/locales/en.json" with { type: "json" }; +import plugin from "./src/locales/en.json" with { type: "json" }; + +declare module "next-intl" { + interface AppConfig { + Messages: typeof plugin & typeof core; + } +} diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json new file mode 100644 index 000000000..7ee719d7a --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "jsx": "react-jsx", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src", "global.d.ts"] +} diff --git a/packages/create-vitnode-app/eslint.config.mjs b/packages/create-vitnode-app/eslint.config.mjs index 609e6ba68..eafa42383 100644 --- a/packages/create-vitnode-app/eslint.config.mjs +++ b/packages/create-vitnode-app/eslint.config.mjs @@ -12,7 +12,7 @@ export default [ }, }, { - ignores: ["copy-of-vitnode-app"], + ignores: ["copy-of-vitnode-app", "copy-of-vitnode-plugin"], }, { languageOptions: { 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 9204c278d..ded8bdf35 100644 --- a/packages/create-vitnode-app/src/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/create/create-package-json.ts @@ -1,14 +1,13 @@ -import { readFile, writeFile } from "fs/promises"; -import { dirname, join } from "path"; -import { fileURLToPath } from "url"; +import { writeFile } from "fs/promises"; +import { join } from "path"; import type { PackageJSON } from "../helpers/packages-json.js"; import type { CreateCliReturn } from "../questions.js"; import { getAvailablePackageManagers } from "../helpers/get-available-package-managers.js"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +import { getVitnodePackageVersion } from "../helpers/get-vitnode-package-version.js"; +import { withIf } from "../helpers/with-If.js"; +import { versionsPackageJson } from "./package-versions.js"; type Mode = CreateCliReturn["mode"]; @@ -21,53 +20,6 @@ const paths = (root: string) => ({ web: join(root, "apps", "web"), }); -const withIf = >(cond: boolean, obj: T) => - (cond ? obj : {}) as Partial; - -const versions = { - typesNode: "^24", - typesReact: "^19.2", - typesReactDom: "^19.2", - typesBun: "latest", - - turbo: "^2.5", - typescript: "^5.9", - tsx: "^4.20.6", - tscAlias: "^1.8.16", - eslint: "^9.39.1", - prettier: "^3.6.2", - prettierTailwind: "^0.6.14", - tailwind: "^4.1.17", - tailwindPostcss: "^4.1.17", - postcss: "^8.5.6", - twAnimateCss: "^1.4.0", - - react: "^19.2", - reactDom: "^19.2", - nextSingle: "^16.0.1", - nextWebInMonorepo: "^15.4.6", - nextIntl: "^4.5.0", - useIntl: "^4.5.0", - rhf: "^7.66.0", - rhfResolvers: "^5.1.1", - lucide: "^0.553.0", - sonner: "^2.0.7", - dotenv: "^17.2.2", - - drizzleKit: "^0.31.6", - drizzleOrm: "^0.44.7", - - hono: "^4.10.4", - honoZodOpenapi: "^1.1.4", - honoZodValidator: "^0.7.4", - reactEmail: "^5.0.1", - reactEmailComponents: "^1.0.0", - zod: "^4.1.12", - - cva: "^0.7.1", - babelPluginReactCompiler: "^1.0.0", -}; - /** * Shared blocks */ @@ -149,122 +101,122 @@ const webScripts = (eslint: boolean) => ({ * Dependency builders */ const baseDevDeps = (eslint: boolean, includePrettier: boolean) => ({ - "@types/node": versions.typesNode, + "@types/node": versionsPackageJson.typesNode, "@vitnode/config": "", // filled with local version dynamically ...withIf(eslint, { - eslint: versions.eslint, + eslint: versionsPackageJson.eslint, ...withIf(includePrettier, { - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, }), }), }); const rootDevDeps = (eslint: boolean) => ({ ...baseDevDeps(eslint, true), - turbo: versions.turbo, - typescript: versions.typescript, - zod: versions.zod, + turbo: versionsPackageJson.turbo, + typescript: versionsPackageJson.typescript, + zod: versionsPackageJson.zod, }); const apiDeps = { - "@hono/zod-openapi": versions.honoZodOpenapi, - "@hono/zod-validator": versions.honoZodValidator, - "@react-email/components": versions.reactEmailComponents, + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@hono/zod-validator": versionsPackageJson.honoZodValidator, + "@react-email/components": versionsPackageJson.reactEmailComponents, "@vitnode/core": "", // filled dynamically - "drizzle-kit": versions.drizzleKit, - "drizzle-orm": versions.drizzleOrm, - hono: versions.hono, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "use-intl": versions.useIntl, - zod: versions.zod, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, }; const apiDevDeps = (pm: string, eslint: boolean) => ({ "@hono/node-server": "^1.19", - ...(pm === "bun" ? { "@types/bun": versions.typesBun } : {}), - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + ...(pm === "bun" ? { "@types/bun": versionsPackageJson.typesBun } : {}), + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", - dotenv: versions.dotenv, + dotenv: versionsPackageJson.dotenv, ...withIf(eslint, { - eslint: versions.eslint, + eslint: versionsPackageJson.eslint, // Prettier in API only when onlyApi + eslint in original code – we'll preserve by passing include later if needed }), - "react-email": versions.reactEmail, - "tsc-alias": versions.tscAlias, - tsx: versions.tsx, - typescript: versions.typescript, + "react-email": versionsPackageJson.reactEmail, + "tsc-alias": versionsPackageJson.tscAlias, + tsx: versionsPackageJson.tsx, + typescript: versionsPackageJson.typescript, }); const singleAppDeps = { - "@hono/zod-openapi": versions.honoZodOpenapi, - "@hono/zod-validator": versions.honoZodValidator, - "@hookform/resolvers": versions.rhfResolvers, - "@react-email/components": versions.reactEmailComponents, + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@hono/zod-validator": versionsPackageJson.honoZodValidator, + "@hookform/resolvers": versionsPackageJson.rhfResolvers, + "@react-email/components": versionsPackageJson.reactEmailComponents, "@vitnode/core": "", - "drizzle-kit": versions.drizzleKit, - "drizzle-orm": versions.drizzleOrm, - hono: versions.hono, - "lucide-react": versions.lucide, - next: versions.nextSingle, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "react-hook-form": versions.rhf, - sonner: versions.sonner, - "use-intl": versions.useIntl, - zod: versions.zod, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextSingle, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, }; const singleAppDevDeps = (eslint: boolean) => ({ - "@tailwindcss/postcss": versions.tailwindPostcss, - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + "@tailwindcss/postcss": versionsPackageJson.tailwindPostcss, + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", - "babel-plugin-react-compiler": versions.babelPluginReactCompiler, + "babel-plugin-react-compiler": versionsPackageJson.babelPluginReactCompiler, ...withIf(eslint, { - eslint: versions.eslint, - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + eslint: versionsPackageJson.eslint, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, }), - "react-email": versions.reactEmail, - turbo: versions.turbo, - tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCss, - typescript: versions.typescript, + "react-email": versionsPackageJson.reactEmail, + turbo: versionsPackageJson.turbo, + tailwindcss: versionsPackageJson.tailwind, + "tw-animate-css": versionsPackageJson.twAnimateCss, + typescript: versionsPackageJson.typescript, }); const webDeps = { "@vitnode/core": "", - "lucide-react": versions.lucide, - next: versions.nextWebInMonorepo, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "react-hook-form": versions.rhf, - sonner: versions.sonner, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextWebInMonorepo, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, }; const webDevDeps = (eslint: boolean) => ({ - "@hookform/resolvers": versions.rhfResolvers, - "@tailwindcss/postcss": versions.tailwindPostcss, - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + "@hookform/resolvers": versionsPackageJson.rhfResolvers, + "@tailwindcss/postcss": versionsPackageJson.tailwindPostcss, + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", - "babel-plugin-react-compiler": versions.babelPluginReactCompiler, - "class-variance-authority": versions.cva, - ...withIf(eslint, { eslint: versions.eslint }), - postcss: versions.postcss, - tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCss, - typescript: versions.typescript, - zod: versions.zod, + "babel-plugin-react-compiler": versionsPackageJson.babelPluginReactCompiler, + "class-variance-authority": versionsPackageJson.cva, + ...withIf(eslint, { eslint: versionsPackageJson.eslint }), + postcss: versionsPackageJson.postcss, + tailwindcss: versionsPackageJson.tailwind, + "tw-animate-css": versionsPackageJson.twAnimateCss, + typescript: versionsPackageJson.typescript, + zod: versionsPackageJson.zod, }); /** @@ -287,12 +239,7 @@ export const createPackageJSON = async ({ packageManager: string; root: string; }) => { - // Resolve local version of @vitnode/* based on this CLI's package.json - const cliPkg: PackageJSON = JSON.parse( - await readFile(join(__dirname, "..", "..", "..", "package.json"), "utf-8"), - ); - const vitnodeVersionRange = `^${cliPkg.version}`; - + const vitnodeVersionRange = await getVitnodePackageVersion(); const pmVersions = await getAvailablePackageManagers(); const pmSpec = `${packageManager}@${pmVersions[packageManager]}`; const p = paths(root); @@ -340,8 +287,8 @@ export const createPackageJSON = async ({ "@vitnode/config": vitnodeVersionRange, ...(eslint && mode === "onlyApi" ? { - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, } : {}), // TS pipeline pieces when not using Bun for dev diff --git a/packages/create-vitnode-app/src/create/package-versions.ts b/packages/create-vitnode-app/src/create/package-versions.ts new file mode 100644 index 000000000..843f3dc47 --- /dev/null +++ b/packages/create-vitnode-app/src/create/package-versions.ts @@ -0,0 +1,47 @@ +export const versionsPackageJson = { + typesNode: "^24", + typesReact: "^19.2", + typesReactDom: "^19.2", + typesBun: "latest", + + turbo: "^2.5", + typescript: "^5.9", + tsx: "^4.20.6", + tscAlias: "^1.8.16", + eslint: "^9.39.1", + prettier: "^3.6.2", + prettierTailwind: "^0.6.14", + tailwind: "^4.1.17", + tailwindPostcss: "^4.1.17", + postcss: "^8.5.6", + twAnimateCss: "^1.4.0", + + react: "^19.2", + reactDom: "^19.2", + nextSingle: "^16.0.1", + nextWebInMonorepo: "^15.4.6", + nextIntl: "^4.5.0", + useIntl: "^4.5.0", + rhf: "^7.66.0", + rhfResolvers: "^5.1.1", + lucide: "^0.553.0", + sonner: "^2.0.7", + dotenv: "^17.2.2", + + drizzleKit: "^0.31.6", + drizzleOrm: "^0.44.7", + + hono: "^4.10.4", + honoZodOpenapi: "^1.1.4", + honoZodValidator: "^0.7.4", + reactEmail: "^5.0.1", + reactEmailComponents: "^1.0.0", + zod: "^4.1.12", + + cva: "^0.7.1", + babelPluginReactCompiler: "^1.0.0", + + swcCli: "^0.7.9", + swcCore: "^1.15.1", + concurrently: "^9.2.1", +}; diff --git a/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts b/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts new file mode 100644 index 000000000..209d756a9 --- /dev/null +++ b/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts @@ -0,0 +1,17 @@ +import { readFile } from "fs/promises"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; + +import type { PackageJSON } from "./packages-json.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export const getVitnodePackageVersion = async () => { + // Resolve local version of @vitnode/* based on this CLI's package.json + const cliPkg: PackageJSON = JSON.parse( + await readFile(join(__dirname, "..", "..", "..", "package.json"), "utf-8"), + ); + + return `^${cliPkg.version}`; +}; diff --git a/packages/create-vitnode-app/src/helpers/with-If.ts b/packages/create-vitnode-app/src/helpers/with-If.ts new file mode 100644 index 000000000..5d6c0af57 --- /dev/null +++ b/packages/create-vitnode-app/src/helpers/with-If.ts @@ -0,0 +1,4 @@ +export const withIf = >( + cond: boolean, + obj: T, +) => (cond ? obj : {}) as Partial; diff --git a/packages/create-vitnode-app/src/plugin/create/create-package-json.ts b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts new file mode 100644 index 000000000..aa6a47f5a --- /dev/null +++ b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts @@ -0,0 +1,79 @@ +import { writeFile } from "fs/promises"; + +import type { PackageJSON } from "../../helpers/packages-json.js"; + +import { versionsPackageJson } from "../../create/package-versions.js"; +import { getVitnodePackageVersion } from "../../helpers/get-vitnode-package-version.js"; +import { withIf } from "../../helpers/with-If.js"; + +const writeJson = async (path: string, data: unknown) => + writeFile(path, JSON.stringify(data, null, 2)); + +export const createPluginPackageJSON = async ({ + pluginName, + root, + eslint, +}: { + eslint: boolean; + pluginName: string; + root: string; +}) => { + const vitnodeVersionRange = await getVitnodePackageVersion(); + + const pluginPkg: PackageJSON = { + name: pluginName, + version: "0.1.0", + private: true, + type: "module", + scripts: { + "build:plugins": + "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + dev: 'concurrently "tsc -w --preserveWatchOutput" "swc src -d dist --config-file .swcrc -w" "tsc-alias -w" "vitnode plugin --w"', + "dev:email": "email dev --dir src/emails", + ...withIf(eslint, { + lint: "turbo lint", + "lint:fix": "turbo lint:fix", + }), + }, + exports: { + "./*": { + import: "./dist/src/*.js", + types: "./dist/src/*.d.ts", + default: "./dist/src/*.js", + }, + }, + dependencies: { + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@vitnode/core": vitnodeVersionRange, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextSingle, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-email": versionsPackageJson.reactEmail, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, + }, + devDependencies: { + "@react-email/components": versionsPackageJson.reactEmailComponents, + "@swc/cli": versionsPackageJson.swcCli, + "@swc/core": versionsPackageJson.swcCore, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, + "@vitnode/config": vitnodeVersionRange, + concurrently: versionsPackageJson.concurrently, + ...withIf(eslint, { + eslint: versionsPackageJson.eslint, + }), + "tsc-alias": versionsPackageJson.tscAlias, + typescript: versionsPackageJson.typescript, + }, + }; + + await writeJson(`${root}/package.json`, pluginPkg); +}; diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index 89dc3f3b5..37d4bdefe 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -1,5 +1,5 @@ import { existsSync } from "fs"; -import { mkdir } from "fs/promises"; +import { cp, mkdir } from "fs/promises"; import ora from "ora"; import { dirname, join } from "path"; import color from "picocolors"; @@ -10,13 +10,16 @@ import type { CreatePluginCliReturn } from "../questions.js"; import { getPackageManagerFromRoot } from "../../helpers/get-package-manager-from-root.js"; import { installDependencies } from "../../helpers/install-dependencies.js"; import { isFolderEmpty } from "../../helpers/is-folder-empty.js"; +import { createPluginPackageJSON } from "./create-package-json.js"; export const createPluginVitNode = async ({ pluginPath, pluginName, install, root, + eslint, }: CreatePluginCliReturn & { + eslint: boolean; pluginName: string; pluginPath: string; root: string; @@ -35,6 +38,7 @@ export const createPluginVitNode = async ({ "..", "..", "copy-of-vitnode-plugin", + "root", ); if (!existsSync(templatePath)) { spinner.fail( @@ -50,9 +54,37 @@ export const createPluginVitNode = async ({ } spinner.text = "Preparing the plugin structure..."; + await cp(templatePath, pluginPath, { recursive: true }); spinner.text = "Creating package.json..."; - // Create package.json for the plugin + await createPluginPackageJSON({ + pluginName, + root, + eslint, + }); + + if (eslint) { + spinner.text = "Setting up ESLint..."; + const templateEslintPath = join( + __dirname, + "..", + "..", + "..", + "copy-of-vitnode-app", + "eslint-react", + ); + + if (!existsSync(templateEslintPath)) { + spinner.fail( + `\n${color.red("Error!")} ESLint template path ${color.cyan( + templateEslintPath, + )} does not exist.`, + ); + process.exit(1); + } + + await cp(templateEslintPath, pluginPath, { recursive: true }); + } if (install) { spinner.text = "Installing dependencies..."; diff --git a/packages/create-vitnode-app/src/plugin/index.ts b/packages/create-vitnode-app/src/plugin/index.ts index 3651c606a..e1bf811b5 100644 --- a/packages/create-vitnode-app/src/plugin/index.ts +++ b/packages/create-vitnode-app/src/plugin/index.ts @@ -29,11 +29,13 @@ export const createPlugin = async ({ }); } - const { pluginName, pluginPath } = await validationProjectForPlugin(name); + const { pluginName, pluginPath, eslint } = + await validationProjectForPlugin(name); const options = await createPluginQuestionsCli(program); await createPluginVitNode({ pluginName, pluginPath, + eslint, root: projectPath, ...options, }); diff --git a/packages/create-vitnode-app/src/plugin/validation.ts b/packages/create-vitnode-app/src/plugin/validation.ts index 479faa44f..77e2ea44b 100644 --- a/packages/create-vitnode-app/src/plugin/validation.ts +++ b/packages/create-vitnode-app/src/plugin/validation.ts @@ -53,6 +53,8 @@ export const validationProjectForPlugin = async (projectPath: string) => { process.exit(1); } + let eslint = false; + try { const packageJson: PackageJSON = JSON.parse( await readFile(packageJsonPath, "utf-8"), @@ -70,6 +72,12 @@ export const validationProjectForPlugin = async (projectPath: string) => { ); process.exit(1); } + + eslint = !!( + packageJson.dependencies?.eslint ?? + packageJson.devDependencies?.eslint ?? + false + ); } catch (error) { console.error( `${color.red("Error:")} Failed to read or parse ${color.cyan("package.json")}.`, @@ -124,5 +132,5 @@ export const validationProjectForPlugin = async (projectPath: string) => { process.exit(1); } - return { pluginName, pluginPath }; + return { pluginName, pluginPath, eslint }; }; From 703aa11094a9f162cb6107224d13f594dd4bc091 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 21:19:14 +0000 Subject: [PATCH 06/21] ci: version bump to v1.2.0-canary.61 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index bb3ed29fa..43479a493 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index 633557eba..9a849dfbd 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index 99e637469..249cebe22 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 2892579ae..0e5b2080b 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index 928766c0c..689059537 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index fa373c40a..4f4fc8a78 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index 1a1e1d55f..527992c23 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index f8419f925..5834f0391 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 46f7f32a8..995a6e74b 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.61", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From ed3cb2cc3a2add62623ab7fd921454dc206d8c29 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:34:21 +0100 Subject: [PATCH 07/21] =?UTF-8?q?refactor(prepare):=20=E2=9C=A8=20refactor?= =?UTF-8?q?=20directory=20creation=20to=20handle=20multiple=20paths?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/create-vitnode-app/src/prepare/prepare.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/create-vitnode-app/src/prepare/prepare.ts b/packages/create-vitnode-app/src/prepare/prepare.ts index b5cf406d8..38271ea9b 100644 --- a/packages/create-vitnode-app/src/prepare/prepare.ts +++ b/packages/create-vitnode-app/src/prepare/prepare.ts @@ -3,10 +3,16 @@ import { mkdir } from "node:fs/promises"; import { join } from "node:path"; const prepare = async () => { - const toRootPath = join(process.cwd(), "copy-of-vitnode-app"); - if (!existsSync(toRootPath)) { - await mkdir(toRootPath); - } + const toRootPaths = ["copy-of-vitnode-app", "copy-of-vitnode-plugin"]; + await Promise.all( + toRootPaths.map(async path => { + const toRootPath = join(process.cwd(), path); + if (!existsSync(toRootPath)) { + await mkdir(toRootPath); + } + }), + ); + const fromRootPath = join(process.cwd(), "..", "..", "apps", "docs"); if (!existsSync(fromRootPath)) { console.error( From 9de53c253279acaf8b942482ba195f45dde60dea Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 21:35:27 +0000 Subject: [PATCH 08/21] ci: version bump to v1.2.0-canary.62 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 43479a493..364ae9a6f 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index 9a849dfbd..682fb990d 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index 249cebe22..c0bc609f5 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 0e5b2080b..e5e504748 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index 689059537..e7e8f2e51 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 4f4fc8a78..c5d0686a7 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index 527992c23..814b1f77e 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 5834f0391..44087c825 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 995a6e74b..aa3556739 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.61", + "version": "1.2.0-canary.62", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From c6e8448434f1d8ff6af2ee84fd33d93921c0db04 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:52:22 +0100 Subject: [PATCH 09/21] =?UTF-8?q?refactor(plugin):=20=E2=9C=A8=20update=20?= =?UTF-8?q?npmignore=20handling=20and=20add=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../copy-of-vitnode-plugin/root/.npmignore | 20 +------------------ .../root/npmignore.template | 19 ++++++++++++++++++ packages/create-vitnode-app/package.json | 8 ++++++++ .../plugin/create/create-plugin-vitnode.ts | 9 ++++++++- 4 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore index 2fb2a5651..b5f319100 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore @@ -1,19 +1 @@ -/src/* -!/src/app -!/src/app/** -!/src/app_admin -!/src/app_admin/** -!/src/locales -!/src/locales/** - -/node_modules -/.turbo -/tsconfig.json -/.swcrc -/components.json -/global.d.ts -/tsup.config.ts -/vitest.config.ts -/tsconfig.json -/scripts -/config \ No newline at end of file +This file intentionally left here for reference; actual ignore rules live in npmignore.template and will be renamed by the CLI. \ No newline at end of file diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template new file mode 100644 index 000000000..af72c3549 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template @@ -0,0 +1,19 @@ +/src/* +!/src/app +!/src/app/** +!/src/app_admin +!/src/app_admin/** +!/src/locales +!/src/locales/** + +/node_modules +/.turbo +/tsconfig.json +/.swcrc +/components.json +/global.d.ts +/tsup.config.ts +/vitest.config.ts +/tsconfig.json +/scripts +/config diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index e5e504748..4fe2991a5 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -14,6 +14,14 @@ "bin": { "create-vitnode-app": "dist/src/index.js" }, + "files": [ + "dist", + "copy-of-vitnode-app", + "copy-of-vitnode-plugin", + "README.md", + "eslint", + "eslint-react" + ], "scripts": { "build:scripts": "tsc && node dist/src/prepare/prepare.js", "start:scripts": "node dist/src/index.js", diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index 37d4bdefe..ea91562db 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -1,5 +1,5 @@ import { existsSync } from "fs"; -import { cp, mkdir } from "fs/promises"; +import { cp, mkdir, rename } from "fs/promises"; import ora from "ora"; import { dirname, join } from "path"; import color from "picocolors"; @@ -56,6 +56,13 @@ export const createPluginVitNode = async ({ spinner.text = "Preparing the plugin structure..."; await cp(templatePath, pluginPath, { recursive: true }); + // Rename template npmignore to .npmignore in the generated plugin + const npmIgnoreTemplatePath = join(pluginPath, "npmignore.template"); + const dotNpmIgnorePath = join(pluginPath, ".npmignore"); + if (existsSync(npmIgnoreTemplatePath)) { + await rename(npmIgnoreTemplatePath, dotNpmIgnorePath); + } + spinner.text = "Creating package.json..."; await createPluginPackageJSON({ pluginName, From d5d3f8f1885de1c12e2a89b48049c178c23ce609 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:53:49 +0100 Subject: [PATCH 10/21] =?UTF-8?q?refactor(npmignore):=20=E2=9C=A8=20update?= =?UTF-8?q?=20.npmignore=20for=20clarity=20and=20organization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore deleted file mode 100644 index b5f319100..000000000 --- a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.npmignore +++ /dev/null @@ -1 +0,0 @@ -This file intentionally left here for reference; actual ignore rules live in npmignore.template and will be renamed by the CLI. \ No newline at end of file From c3281dcf442e838a2ca6e1a363dbf9229d903e0d Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 21:54:57 +0000 Subject: [PATCH 11/21] ci: version bump to v1.2.0-canary.63 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 364ae9a6f..6f5c408b2 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index 682fb990d..b09c19c48 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index c0bc609f5..be3f6523a 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 4fe2991a5..979bf1c89 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index e7e8f2e51..73a132e54 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index c5d0686a7..48885f82e 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index 814b1f77e..55ffbdd55 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 44087c825..bfdf03f0d 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index aa3556739..a8c4f74a7 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.62", + "version": "1.2.0-canary.63", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From 0bc1006122d5466551995f036a946c912e1c7908 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 23:04:54 +0100 Subject: [PATCH 12/21] =?UTF-8?q?refactor(plugin):=20=E2=9C=A8=20update=20?= =?UTF-8?q?path=20resolution=20for=20plugin=20template?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/package.json | 8 +- apps/docs/package.json | 16 +- package.json | 2 +- packages/config/package.json | 4 +- .../src/create/package-versions.ts | 8 +- .../plugin/create/create-plugin-vitnode.ts | 1 + packages/vitnode/package.json | 16 +- plugins/blog/package.json | 8 +- pnpm-lock.yaml | 2348 ++++++++--------- 9 files changed, 1206 insertions(+), 1205 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 6f5c408b2..94bd53a96 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -19,18 +19,18 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "hono": "^4.10.4", - "next-intl": "^4.5.0", + "hono": "^4.10.5", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" }, "devDependencies": { "@hono/node-server": "^1.19.6", "@react-email/components": "^1.0.0", "@types/node": "^24.10.0", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", "@vitnode/nodemailer": "workspace:*", diff --git a/apps/docs/package.json b/apps/docs/package.json index b09c19c48..cefe571d8 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -28,14 +28,14 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "fumadocs-core": "^16.0.8", - "fumadocs-mdx": "^13.0.5", - "fumadocs-ui": "^16.0.8", - "hono": "^4.10.4", + "fumadocs-core": "^16.0.10", + "fumadocs-mdx": "^13.0.7", + "fumadocs-ui": "^16.0.10", + "hono": "^4.10.5", "lucide-react": "^0.553.0", "motion": "^12.23.24", "next": "^16.0.1", - "next-intl": "^4.5.0", + "next-intl": "^4.5.1", "node-cron": "^4.2.1", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -50,12 +50,12 @@ "@tailwindcss/postcss": "^4.1.17", "@types/mdx": "^2.0.13", "@types/node": "^24.10.0", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "@vitnode/node-cron": "workspace:*", "@vitnode/nodemailer": "workspace:*", "@vitnode/resend": "workspace:*", - "@vitnode/node-cron": "workspace:*", "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", @@ -65,7 +65,7 @@ "tailwindcss": "^4.1.17", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" } } diff --git a/package.json b/package.json index 2735bbe21..00b6843ec 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.7.1", "tsx": "^4.20.6", - "turbo": "^2.6.0", + "turbo": "^2.6.1", "typescript": "^5.9.3", "zod": "^4.1.12" }, diff --git a/packages/config/package.json b/packages/config/package.json index be3f6523a..f8ab70899 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -45,7 +45,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "@eslint-react/eslint-plugin": "^2.3.1", + "@eslint-react/eslint-plugin": "^2.3.4", "@eslint/js": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -55,6 +55,6 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-you-might-not-need-an-effect": "^0.7.0", "prettier-plugin-tailwindcss": "^0.7.1", - "typescript-eslint": "^8.46.3" + "typescript-eslint": "^8.46.4" } } diff --git a/packages/create-vitnode-app/src/create/package-versions.ts b/packages/create-vitnode-app/src/create/package-versions.ts index 843f3dc47..1b6d96738 100644 --- a/packages/create-vitnode-app/src/create/package-versions.ts +++ b/packages/create-vitnode-app/src/create/package-versions.ts @@ -4,7 +4,7 @@ export const versionsPackageJson = { typesReactDom: "^19.2", typesBun: "latest", - turbo: "^2.5", + turbo: "^2.6", typescript: "^5.9", tsx: "^4.20.6", tscAlias: "^1.8.16", @@ -20,8 +20,8 @@ export const versionsPackageJson = { reactDom: "^19.2", nextSingle: "^16.0.1", nextWebInMonorepo: "^15.4.6", - nextIntl: "^4.5.0", - useIntl: "^4.5.0", + nextIntl: "^4.5", + useIntl: "^4.5", rhf: "^7.66.0", rhfResolvers: "^5.1.1", lucide: "^0.553.0", @@ -31,7 +31,7 @@ export const versionsPackageJson = { drizzleKit: "^0.31.6", drizzleOrm: "^0.44.7", - hono: "^4.10.4", + hono: "^4.10", honoZodOpenapi: "^1.1.4", honoZodValidator: "^0.7.4", reactEmail: "^5.0.1", diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index ea91562db..621c4d293 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -37,6 +37,7 @@ export const createPluginVitNode = async ({ "..", "..", "..", + "..", "copy-of-vitnode-plugin", "root", ); diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index bfdf03f0d..f98dc2753 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -46,7 +46,7 @@ "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^24.10.0", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^5.1.0", "@vitest/coverage-v8": "^4.0.8", @@ -57,11 +57,11 @@ "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", "eslint": "^9.39.1", - "hono": "^4.10.4", + "hono": "^4.10.5", "jsdom": "^27.1.0", "lucide-react": "^0.553.0", "next": "^16.0.1", - "next-intl": "^4.5.0", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", "react-email": "^5.0.1", @@ -113,10 +113,10 @@ "@hono/swagger-ui": "^0.5.2", "@react-email/preview-server": "^5.0.1", "@tanstack/react-query": "^5.90.7", - "@tiptap/extension-text-align": "^3.10.4", - "@tiptap/pm": "^3.10.4", - "@tiptap/react": "^3.10.4", - "@tiptap/starter-kit": "^3.10.4", + "@tiptap/extension-text-align": "^3.10.5", + "@tiptap/pm": "^3.10.5", + "@tiptap/react": "^3.10.5", + "@tiptap/starter-kit": "^3.10.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -130,7 +130,7 @@ "react-scan": "^0.4.3", "tailwind-merge": "^3.4.0", "use-debounce": "^10.0.6", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "vaul": "^1.1.2" } } diff --git a/plugins/blog/package.json b/plugins/blog/package.json index a8c4f74a7..904c1cbc0 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -38,23 +38,23 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "hono": "^4.10.4", + "hono": "^4.10.5", "lucide-react": "^0.553.0", "next": "^16.0.1", - "next-intl": "^4.5.0", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", "react-email": "^5.0.1", "react-hook-form": "^7.66.0", "sonner": "^2.0.7", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" }, "devDependencies": { "@react-email/components": "^1.0.0", "@swc/cli": "^0.7.9", "@swc/core": "^1.15.1", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", "concurrently": "^9.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dd64f27d..3dff0fb28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^4.20.6 version: 4.20.6 turbo: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.6.1 + version: 2.6.1 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -37,10 +37,10 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -51,11 +51,11 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -63,15 +63,15 @@ importers: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 devDependencies: '@hono/node-server': specifier: ^1.19.6 - version: 1.19.6(hono@4.10.4) + version: 1.19.6(hono@4.10.5) '@react-email/components': specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -79,11 +79,11 @@ importers: specifier: ^24.10.0 version: 24.10.0 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config @@ -113,10 +113,10 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@vitnode/blog': specifier: workspace:* version: link:../../plugins/blog @@ -130,17 +130,17 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) fumadocs-core: - specifier: ^16.0.8 - version: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^16.0.10 + version: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fumadocs-mdx: - specifier: ^13.0.5 - version: 13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^13.0.7 + version: 13.0.7(fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) fumadocs-ui: - specifier: ^16.0.8 - version: 16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) + specifier: ^16.0.10 + version: 16.0.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 lucide-react: specifier: ^0.553.0 version: 0.553.0(react@19.2.0) @@ -151,8 +151,8 @@ importers: specifier: ^16.0.1 version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -191,11 +191,11 @@ importers: specifier: ^24.10.0 version: 24.10.0 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config @@ -236,8 +236,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 @@ -245,8 +245,8 @@ importers: packages/config: dependencies: '@eslint-react/eslint-plugin': - specifier: ^2.3.1 - version: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ^2.3.4 + version: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@eslint/js': specifier: ^9.39.1 version: 9.39.1 @@ -281,8 +281,8 @@ importers: specifier: ^0.7.1 version: 0.7.1(prettier@3.6.2) typescript-eslint: - specifier: ^8.46.3 - version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.4 + version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) devDependencies: typescript: specifier: ^5.9.3 @@ -428,7 +428,7 @@ importers: version: 6.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@hono/swagger-ui': specifier: ^0.5.2 - version: 0.5.2(hono@4.10.4) + version: 0.5.2(hono@4.10.5) '@react-email/preview-server': specifier: ^5.0.1 version: 5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(babel-plugin-react-compiler@1.0.0)(postcss@8.5.6) @@ -436,17 +436,17 @@ importers: specifier: ^5.90.7 version: 5.90.7(react@19.2.0) '@tiptap/extension-text-align': - specifier: ^3.10.4 - version: 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) + specifier: ^3.10.5 + version: 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) '@tiptap/pm': - specifier: ^3.10.4 - version: 3.10.4 + specifier: ^3.10.5 + version: 3.10.5 '@tiptap/react': - specifier: ^3.10.4 - version: 3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^3.10.5 + version: 3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tiptap/starter-kit': - specifier: ^3.10.4 - version: 3.10.4 + specifier: ^3.10.5 + version: 3.10.5 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -455,7 +455,7 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) cron-parser: specifier: ^5.4.0 version: 5.4.0 @@ -473,13 +473,13 @@ importers: version: 3.4.7 radix-ui: specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.4.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rate-limiter-flexible: specifier: ^8.2.0 version: 8.2.0 react-scan: specifier: ^0.4.3 - version: 0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1) + version: 0.4.3(@types/react@19.2.3)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2) tailwind-merge: specifier: ^3.4.0 version: 3.4.0 @@ -487,18 +487,18 @@ importers: specifier: ^10.0.6 version: 10.0.6(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) vaul: specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.2(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) devDependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.66.0(react@19.2.0)) @@ -516,16 +516,16 @@ importers: version: 10.4.1 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/node': specifier: ^24.10.0 version: 24.10.0 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitejs/plugin-react': specifier: ^5.1.0 version: 5.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) @@ -554,8 +554,8 @@ importers: specifier: ^9.39.1 version: 9.39.1(jiti@2.6.1) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 jsdom: specifier: ^27.1.0 version: 27.1.0 @@ -566,8 +566,8 @@ importers: specifier: ^16.0.1 version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -615,7 +615,7 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -626,8 +626,8 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 lucide-react: specifier: ^0.553.0 version: 0.553.0(react@19.2.0) @@ -635,8 +635,8 @@ importers: specifier: ^16.0.1 version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -653,8 +653,8 @@ importers: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 @@ -669,11 +669,11 @@ importers: specifier: ^1.15.1 version: 1.15.1 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config @@ -979,8 +979,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.15': - resolution: {integrity: sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==} + '@csstools/css-syntax-patches-for-csstree@1.0.16': + resolution: {integrity: sha512-2SpS4/UaWQaGpBINyG5ZuCHnUDeVByOhvbkARwfmnfxDvTaj80yOI1cD8Tw93ICV5Fx4fnyDKWQZI1CDtcWyUg==} engines: {node: '>=18'} '@csstools/css-tokenizer@3.0.4': @@ -1475,31 +1475,31 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.3.1': - resolution: {integrity: sha512-jB/P72HVbZcC7DtUvjna8tjPSageAS6L9x5muMsBRQxEXkfv2J6CPX47sSpaPu1mMJn1Zzpn9m5z4aTPbfV6Ug==} + '@eslint-react/ast@2.3.4': + resolution: {integrity: sha512-wueu2vBRwKqnrgOuz1JmEefhn5dgfa1NgvFtDMfefePfICTYFtwkTuOJNGJI77TUnqV9inp9ZNDB1nyAMmlZMg==} engines: {node: '>=20.19.0'} - '@eslint-react/core@2.3.1': - resolution: {integrity: sha512-R0gXjIqHqqYSeHxNMbXblnlwzmZ2gD32aVPmrJB+SrLP0rItzo/WgVSvstjOK5+N5KExdM87hopFcqnlZS3ONg==} + '@eslint-react/core@2.3.4': + resolution: {integrity: sha512-1ve3pSjAhd4PKcTpZd0bQwkAgWOAJjfgAixTfOvJ7QhWi3gPKq0Wn0vi78XcFO8K0IL3EcOfX2g2JhZJzSRnWQ==} engines: {node: '>=20.19.0'} - '@eslint-react/eff@2.3.1': - resolution: {integrity: sha512-k58lxHmhzatRZXVFzWdLZwfRwPgI5Thhf7BNVJ9F+NI2G1fFypclSVFRPqjGmI5jQ8bqB+5UVt9Rh49rZGZPzw==} + '@eslint-react/eff@2.3.4': + resolution: {integrity: sha512-/SXI23DpQCutSXPdAPdSvErfsBFYwaqbgQy5dLmnde4wHivk/eD9O/rA/Xu1c4j9tLJG/sZBQ9DzN/UXHizjag==} engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@2.3.1': - resolution: {integrity: sha512-ThWx+AWI3Tl/6g+L1Cq/kTQrrZ4NXWMxRN92iBswYMW7bPaolh/8WBdiLAVZldqnlm+l6LZriia89jyr0CeTHA==} + '@eslint-react/eslint-plugin@2.3.4': + resolution: {integrity: sha512-fcLZNQRbzjBK510a2oqLcsvdCSMK169x3CGfi1E3JvdMPyLICM+KZ8wNnhULZPey7BnEFVWC7dQfz5Dct60C7g==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - '@eslint-react/shared@2.3.1': - resolution: {integrity: sha512-UiTbPi1i7UPdsIT2Z7mKZ3zzrgAm1GLeexkKe4QwvZJ1LLeEJmgMwHUw852+VzlDeV8stcQmZ9zWqFX2L0CmGg==} + '@eslint-react/shared@2.3.4': + resolution: {integrity: sha512-FN3X4jA0kksFO9cjXwRaFHA6wbc7AgHjYkczdfwm0dOr/uUVv3Sc/F3kUNJ6KFOSoDCfNGybRCICu9DZbanhWA==} engines: {node: '>=20.19.0'} - '@eslint-react/var@2.3.1': - resolution: {integrity: sha512-1rC9dbuKKMq77pPoODGT91VTA3ReivIAfdFJePEjscPSRAUhCy7QPA/yK8MPe9nTsG89IDV+hilCGKiLZW8vNQ==} + '@eslint-react/var@2.3.4': + resolution: {integrity: sha512-hT2TvusBcEfFLFGfwZRstkQv9lp+079DEba5F6Dr53g3f+gBvLNDcayb5zDgwNP5+hQRd8lY8goEOfA8PWyaJQ==} engines: {node: '>=20.19.0'} '@eslint/config-array@0.21.1': @@ -3145,113 +3145,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.1': - resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} + '@rollup/rollup-android-arm-eabi@4.53.2': + resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.1': - resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} + '@rollup/rollup-android-arm64@4.53.2': + resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.1': - resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} + '@rollup/rollup-darwin-arm64@4.53.2': + resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.1': - resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} + '@rollup/rollup-darwin-x64@4.53.2': + resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.1': - resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} + '@rollup/rollup-freebsd-arm64@4.53.2': + resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.1': - resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} + '@rollup/rollup-freebsd-x64@4.53.2': + resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': - resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.1': - resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} + '@rollup/rollup-linux-arm-musleabihf@4.53.2': + resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.1': - resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} + '@rollup/rollup-linux-arm64-gnu@4.53.2': + resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.1': - resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} + '@rollup/rollup-linux-arm64-musl@4.53.2': + resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.1': - resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} + '@rollup/rollup-linux-loong64-gnu@4.53.2': + resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.1': - resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} + '@rollup/rollup-linux-ppc64-gnu@4.53.2': + resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.1': - resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} + '@rollup/rollup-linux-riscv64-gnu@4.53.2': + resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.1': - resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.2': + resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.1': - resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} + '@rollup/rollup-linux-s390x-gnu@4.53.2': + resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.1': - resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} + '@rollup/rollup-linux-x64-gnu@4.53.2': + resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.1': - resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} + '@rollup/rollup-linux-x64-musl@4.53.2': + resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.1': - resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} + '@rollup/rollup-openharmony-arm64@4.53.2': + resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.1': - resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} + '@rollup/rollup-win32-arm64-msvc@4.53.2': + resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.1': - resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} + '@rollup/rollup-win32-ia32-msvc@4.53.2': + resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.1': - resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} + '@rollup/rollup-win32-x64-gnu@4.53.2': + resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.1': - resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} + '@rollup/rollup-win32-x64-msvc@4.53.2': + resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} cpu: [x64] os: [win32] @@ -3684,159 +3684,159 @@ packages: '@types/react-dom': optional: true - '@tiptap/core@3.10.4': - resolution: {integrity: sha512-/jT0NAOvNPHn9x2TmJE2lWe81qTOE4wdRD+OEE+NJUsOtRPEvEP/CEPpT3cT9/mfPBC/U80EvVeUn7bjc2USOw==} + '@tiptap/core@3.10.5': + resolution: {integrity: sha512-JvvgWrQMP+yEhw20Q2+N62k+G8tspko7oLQxBktnN3PLlP67nKb1qOBzcrnEGsaiASjSu25myUmxY+ZpOmP+MQ==} peerDependencies: - '@tiptap/pm': ^3.10.4 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-blockquote@3.10.4': - resolution: {integrity: sha512-YCKObg614/y4YsMMU/AjZ+YrdpnCpW1Ym75540mrB3DllmImj22F3xsAAgCHyYIQvtwDM6f6ilqfx5FD8tPEmw==} + '@tiptap/extension-blockquote@3.10.5': + resolution: {integrity: sha512-vuqqnFgbcKK0pXIASDpiZV33cZho9eq3TMBpIFQ1Kcfmy1DVsfq++AvukiPY/eSa9ciVRNApPp99+v8PDg8RmA==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-bold@3.10.4': - resolution: {integrity: sha512-fgyfmY3bTsCLOyQo8YZGX0qioJ0+DzCdlmrXx8sFkhcdCeOCr9PI0+XKyWW0MY6A8VV17tdKRgODp3n1Ru7R3A==} + '@tiptap/extension-bold@3.10.5': + resolution: {integrity: sha512-YvslsSF4oSwBXMc9tDAUfqr8VmmQ8W/TJVdfdai+gwHSkCWtaqsojUmnAFSiMIyHg5ACVPYMdoThP3aqScNrWQ==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-bubble-menu@3.10.4': - resolution: {integrity: sha512-Ougck8UgMRziy2wq/6S39q5WqkmcMxg3K0dIOxkOQqe9oSRcwA/fWA0Gq4VZd69SMCNzAOgjwIl6znZDxBoXiA==} + '@tiptap/extension-bubble-menu@3.10.5': + resolution: {integrity: sha512-Kc71uAonSNCYoY+0oxLkxqk846ZgDYy8D28iKUp8Fc+0s6efpwbXLNVma5ooLlOKEz8vKeZNYVOKphTg/0xdZw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-bullet-list@3.10.4': - resolution: {integrity: sha512-7Di4QLW4Ri5xDD4sYNXI1gmM8wIALRlIBP8fOL7veBTenT1CVqawVl/wZuPLnoXsj3j8wtzop3fwFiyv8jEnAA==} + '@tiptap/extension-bullet-list@3.10.5': + resolution: {integrity: sha512-ohysgT2p17h8ARyzB7z0nX/Pk7Lyilr/ruT0n5JXNO4pbgw9r6WYFyyiNJCkeFIjJEu7a4C3HBPH/r1EhDu6YA==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-code-block@3.10.4': - resolution: {integrity: sha512-dkqeZRGhwDobKfrZmRXojU/8s11gaMj+Bb5oUjhzmnWoS2Y3UwesdrAUcBwZd+fgV7/hAud5rt7oX4hJqCjgtw==} + '@tiptap/extension-code-block@3.10.5': + resolution: {integrity: sha512-6YEyASCT7UhzkWDfJ3Snajgy2XzYV7lPZxx9En2G9F/dqorGw1Kr45Gv3T6r46mJHXayGyb6OAN9AamVlOyk/Q==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-code@3.10.4': - resolution: {integrity: sha512-33L3HlD2fb+LqwUKndbwf2IRiGR8P3EzkcDwpHysE0C5VY13Fb0YkeIXV8CyWShrzIYCOK8btjIeNf0T0HSphg==} + '@tiptap/extension-code@3.10.5': + resolution: {integrity: sha512-zt7w+AQ5El5rERY8QsiDlpCmaw951hLORUeI6p7HjgnA6KQoBJXxz750W8bfqEYnLFJ9uOXQka/Ds37/IyijGA==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-document@3.10.4': - resolution: {integrity: sha512-w1ZNDyafoq+J6cmerVisDTiD9imKfVpvNqxz5D8PvVo1vvNqtLxzMbkGjGedewQIZzwxAPu46czyVAk7Jxp7Cg==} + '@tiptap/extension-document@3.10.5': + resolution: {integrity: sha512-5Q/BSc9BubVSQFqPvn6fJ/0KFzt6FgyEIeXAEGKhvEwvFJlHRKS+afypi0DWLVFBQ7lona9vJmhEX18XMIHMrw==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-dropcursor@3.10.4': - resolution: {integrity: sha512-9llL60Gl+ExEuSPlwh4/kd3ivMoKnbXOC1ac5gZfbxz4wY3me5Ql2kqZrtn7ibeZcocjA2DG9febNBgY0VVQ4g==} + '@tiptap/extension-dropcursor@3.10.5': + resolution: {integrity: sha512-39VkdbWwD2yDVYDeeQKfGINouhViK4n465CDR5etFfBNG3lj28dHDvFmZn81SfwcYlpUOVS7GdczNVLHVjqrfA==} peerDependencies: - '@tiptap/extensions': ^3.10.4 + '@tiptap/extensions': ^3.10.5 - '@tiptap/extension-floating-menu@3.10.4': - resolution: {integrity: sha512-bmSolrXs0xeOwJzSaclayR8sTnsdsA1gNM52KpsUIM6uJoklX6OVsPcgUv6qPGNsUaDI0XVn5xONeXcuzaFVHg==} + '@tiptap/extension-floating-menu@3.10.5': + resolution: {integrity: sha512-N9qxP37s+gpOCBBrwoVaK1e61wuYY/KnEkhhodmYxMS/zuRHQ79ics7i1B18CJFfcT6+USHB6HzNxLLrlmpt4w==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-gapcursor@3.10.4': - resolution: {integrity: sha512-IS9aFIpU6fODfya/q7lDjJRRpmpF1aqkuqjltlBXa2tzg2rdJNNJWiySamijj12DG2D6K2r/Kwt7FxCjsbQl2w==} + '@tiptap/extension-gapcursor@3.10.5': + resolution: {integrity: sha512-/C13mvMGmQ3/8T9jg5KiT1/kMM9rFOXzsI2x0KO6IImTMBke6v259qEJyUCfG+Q90ttf95Muymp4I5FbFqJPww==} peerDependencies: - '@tiptap/extensions': ^3.10.4 + '@tiptap/extensions': ^3.10.5 - '@tiptap/extension-hard-break@3.10.4': - resolution: {integrity: sha512-2fTSe5F0NuWTOSaShcjA871GODVec4ieKK9RHpHmrl98D0FJ6rJKE/6hUe+RFizW8S0j//fjnTTkcSu+YrNcMg==} + '@tiptap/extension-hard-break@3.10.5': + resolution: {integrity: sha512-qYouFEvxmWQ5258IHt0D2AmI66gpY5b3zCTgc+EMv/Vj+O2ViJ0/3Sq/fwxqmGRAM5o3R/aEr5Ctk2M/qUjz1A==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-heading@3.10.4': - resolution: {integrity: sha512-DT3kuQbVquZccM8s7H9FFSYtafb/LmmhfNzCLFxBHHHdZQNSWs1nExxlSiCX7NkQSkcnUeqHfEsbOmREnbqUqg==} + '@tiptap/extension-heading@3.10.5': + resolution: {integrity: sha512-sJBdtoCUcB9xmiAhg+OztrfQi1FpB9DUQO2IpbedYPixextK3cX8ntQ4NJelT7kBsdOrW3jmWccbjzvK0wZ7Eg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-horizontal-rule@3.10.4': - resolution: {integrity: sha512-AaO+teMVWHec3XRaC5Jj5iZzMjas+bx+MHPfXTw0KIcn+4wlHV/0bkcWH31E+fbSswH4MnVFET6RmTkzXpEGhw==} + '@tiptap/extension-horizontal-rule@3.10.5': + resolution: {integrity: sha512-okzBJVm68QMb9mwYM74az5bzHuXV6NSuoSb32dRwt3zx8zVdNUK0z585SxlQGDJ3ksB+1UR5tGlcst6sT05esw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-italic@3.10.4': - resolution: {integrity: sha512-SlvKzL/oUxZ0s+1idv4ZdKmr4tS6m8jbXZYVZlzlRHxSfmt85SqUa2hMxmeNXySrHxURQNP6F+KyI6Z26ddFzA==} + '@tiptap/extension-italic@3.10.5': + resolution: {integrity: sha512-f4RI0KGmtkZgVQlthrSm0dEIwx6Vw1ppbQevJecaaXLQTBoS9jAhqRrZbWkqWnof2fTyO2KK23wAMHAjXOKvmg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-link@3.10.4': - resolution: {integrity: sha512-ccwROcKdqFnDDSKw1hsp06kDZCjjjnThIDg7Mku9RnXAYcJw7nmjCkIdzPYjggpzlpxZPsfhmX4No1sG3G3J9g==} + '@tiptap/extension-link@3.10.5': + resolution: {integrity: sha512-6lb8SZSi2+N37/BzkOwFaHHSbloZ3CG5OT0J+h9MULdH0/X8d8fvK/Kxtfa0NgxYWP446u62HJkjvAk234k/Jw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-list-item@3.10.4': - resolution: {integrity: sha512-Q2sQvo5NJcEMEI+IVeAlBM4ArBCJBUhH0Gyex6rJPxwiZYVK2VMezLHCQXNVoQMXCDEZuB37E54U/QapDVlBEg==} + '@tiptap/extension-list-item@3.10.5': + resolution: {integrity: sha512-BklqZIig3c/PiQoivmqXd25lqyC8VbRLMMDkAeJlOljG7oAielYIbFV76lnaoiGsEt4sK7z75qpZ/E6sbXDQMw==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-list-keymap@3.10.4': - resolution: {integrity: sha512-t8PYkgp5avFRZaeOxO+UMGDZPnUrLzLaTVbmrMobO1UVnVEmsT6PlTt0klKVziE12OzDOMCYHwpfZwVnCIBxPw==} + '@tiptap/extension-list-keymap@3.10.5': + resolution: {integrity: sha512-FdGwnULYnuH+F+2u9OElBTky2kRA6S9P9w2Pi4i0FHuB9rMb10R5rIjwunjrkYvAQfnsTEdwJo8YWaPvz+TJIA==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-list@3.10.4': - resolution: {integrity: sha512-4e4vX0co9qDZ9TFpm/zDzQAFrX43XUGeNvQMJzfHz+QINjUj4fKUPTQnTfYp8ce3w0VgFnHgQ8lriE9tVxElbA==} + '@tiptap/extension-list@3.10.5': + resolution: {integrity: sha512-0aW7gIiho0DpJyG0bT/RL0ZofH89Og0sIGgJG4SQqzgsba1EYfcPlaauugA473G8SnN5FslG5D0k9ZC+TYXNpw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-ordered-list@3.10.4': - resolution: {integrity: sha512-qdOGKsUMniyfbglJZMSDCPqwlbk5h0jSHfrLAz/dYdhLUAK6NgBXxNdIeZhfdTHbkog/7lcajYU0zzpsuoMCfA==} + '@tiptap/extension-ordered-list@3.10.5': + resolution: {integrity: sha512-sqhA6IzcS/mlcABEUeYX0ZD+jtb5ga01ATz+b5xYAqOQlB7xHRQ5TdZTB/rKwJxaKxdevFXCenAwJA3d1B5O1g==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-paragraph@3.10.4': - resolution: {integrity: sha512-N3Y54hUcwMdrIWIxSEtrGLJRCtRe2FpbIVY3eIsEf/FysLZKgtLLifQg4Xf7oWSMP5Rxkr8sCx7ajG1skvg36w==} + '@tiptap/extension-paragraph@3.10.5': + resolution: {integrity: sha512-YCXFJiWC2w3Q62Q+nAf0SYWNysbQYpBA+fNyczaz+9vJYUBPcuu1WB0kdIGg/07RsUsg0U0txBnx+GuDuWXh2A==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-strike@3.10.4': - resolution: {integrity: sha512-Y+M2TrlQKAIbP4XR8TQ1ZUpfnEWVKCFvVvh740MTgJRiAtLPdQz37XeT0pIWGkY0XRyFRssKYgiozJGuxU2TpQ==} + '@tiptap/extension-strike@3.10.5': + resolution: {integrity: sha512-tyJs3ArYGaYi/cy79NWKfkb7nIcWocFmou3JW229mZ+lFH1jNy9jGnIITN8BG8aizC6QkXBaeEy8+uBUJ+5Tkw==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-text-align@3.10.4': - resolution: {integrity: sha512-GR8+50U4usFGofk/tpCMQcilcG4P9cWCOCW1+0PGAQrc9Q2hnzmzPDDQCmCaWEZ/LeQaOeIms+hRCbLO5uwf2g==} + '@tiptap/extension-text-align@3.10.5': + resolution: {integrity: sha512-TX888f1SPnAFYxPF7HGjU55RopaTZwdIviqVF+/jfUc59KXWwXbGZph3HexHl1rKVYiVrCazOr6eqx7LBkXtyQ==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-text@3.10.4': - resolution: {integrity: sha512-5HCdDPzyjBljfSitP5AEScAiovt3m8OyMBmqOW64ZnJwBkZW7BUh/DpLYpYireLspu76kDNNhJ4/2Ca+l795dw==} + '@tiptap/extension-text@3.10.5': + resolution: {integrity: sha512-anLb/bJ9TfjVjOAdqQGQTDYsvI5Tgid1RgRokpK6vOxVhukBW7q8RnIsyWYj/uV6UefS6YtVOl5H9DAnpCVfvg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-underline@3.10.4': - resolution: {integrity: sha512-FlDxgTr8NSPOYJFB5jD+WzLUn1fGhZumm8q9fvYJqYvZ62pRBacsU4pilHbG+Wf8DFl+4zjmNq4yWmTnqSCwCQ==} + '@tiptap/extension-underline@3.10.5': + resolution: {integrity: sha512-2SUQTsD5CYwTAdEFIifGHW/N363B9x5qxdzz2wrzn1mbJB4yG6QKyYY0uAGHmSOeC8iHS8scWDFiU09NlAhoew==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extensions@3.10.4': - resolution: {integrity: sha512-DO/72X2AVhuVbcghBRvHNwb9tHmKQvERax1XKX9D9AuJyL/s8x9F0CXbbuBjdSkEeIFrFxQMLxH0NBak3upW4A==} + '@tiptap/extensions@3.10.5': + resolution: {integrity: sha512-odZ9tXRBOj1PdpoMILBZ1DoTgXb+30jR0HMLtML5E8JqE3sDRSh1PgUAVXKmzRX/IytRabiKnhP4L8ZwrJAFaA==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/pm@3.10.4': - resolution: {integrity: sha512-tNGAXSLq5l/G72EPTBUNRHkRmiQoU2ODpIvqXZWFjymaW+8x1nzU3oZwinfvCdwNPrsZJv4x7pfX5EA6pbnW8w==} + '@tiptap/pm@3.10.5': + resolution: {integrity: sha512-yILFuY8nyZbfbJQh1aZfwT/E4o5dHrKXnWsGDiljdr+6NryaU+hcmlwlbz6Q+0550Ik0B2oQoRxAnhzz7qH3Hg==} - '@tiptap/react@3.10.4': - resolution: {integrity: sha512-F/5mGXgd9Cer9QZibE4XJ+ooCDqfIk1kGLvsmrKLdnIVWWvZBDuqRD7jqIzKgIWLKc8BTjbi2gqp7cu8v1USzA==} + '@tiptap/react@3.10.5': + resolution: {integrity: sha512-HP5qn4tMNlAGieTO4ChzbJ/QrGZPrEvF31vRqDQYMre0aSwIHsClQ0fOhOs2YM2wYQgX5dKwymoE7n+9MxJ6Pw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.10.4': - resolution: {integrity: sha512-4Re887ExOwVz51UsBES/qTpLmiUiFKD/KOtzLMUDz+08Ikc5XLD47H9GaqYrf1yCgSXHCCfpf7FxGk6BwKerfQ==} + '@tiptap/starter-kit@3.10.5': + resolution: {integrity: sha512-CdFlqKGboxKgFHLqLkvtUtvavfxXpWKq7o5i9P9xntaooFq1nucB6ME/axJgua6lJamltrQ90ddS1/pMwAmfrg==} '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} @@ -3962,8 +3962,8 @@ packages: '@types/react@19.0.10': resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} - '@types/react@19.2.2': - resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + '@types/react@19.2.3': + resolution: {integrity: sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -3980,63 +3980,63 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@typescript-eslint/eslint-plugin@8.46.3': - resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} + '@typescript-eslint/eslint-plugin@8.46.4': + resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.3 + '@typescript-eslint/parser': ^8.46.4 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.3': - resolution: {integrity: sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==} + '@typescript-eslint/parser@8.46.4': + resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.3': - resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} + '@typescript-eslint/project-service@8.46.4': + resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.3': - resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} + '@typescript-eslint/scope-manager@8.46.4': + resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.3': - resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} + '@typescript-eslint/tsconfig-utils@8.46.4': + resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.3': - resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} + '@typescript-eslint/type-utils@8.46.4': + resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.3': - resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} + '@typescript-eslint/types@8.46.4': + resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.3': - resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} + '@typescript-eslint/typescript-estree@8.46.4': + resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.3': - resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} + '@typescript-eslint/utils@8.46.4': + resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.3': - resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} + '@typescript-eslint/visitor-keys@8.46.4': + resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4386,8 +4386,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.25: - resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + baseline-browser-mapping@2.8.26: + resolution: {integrity: sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==} hasBin: true bidi-js@1.0.3: @@ -4432,8 +4432,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + browserslist@4.28.0: + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4490,8 +4490,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.0: - resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} chalk@4.1.2: @@ -4952,8 +4952,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.249: - resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + electron-to-chromium@1.5.250: + resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5102,15 +5102,15 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-dom@2.3.1: - resolution: {integrity: sha512-Zuvb8iDYRbi8s7mYzvjHKD+i+loHjF6TKJiLGYM/t9F42OWU7V7b4sjIM7pXueukl0o8BSJXDVrQ+9sHOOmxBA==} + eslint-plugin-react-dom@2.3.4: + resolution: {integrity: sha512-xAetOWwrfYnqU0Vd6LjEQi1paAwU7Tgoa+jHUb7QCKxdILDV618yPrMigWpY+438cg6oXTYE/awFI/Rv+dOFCw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-hooks-extra@2.3.1: - resolution: {integrity: sha512-2t4xQYhUEgPNq1SDQJEXuH3doT+h5spVmerX4rPnBFx0zG2sYfaJV1Gz6z40pI1L3CtBrZag5nFJ44AF/BEg0w==} + eslint-plugin-react-hooks-extra@2.3.4: + resolution: {integrity: sha512-widwgbMP3cC3sjmHidryg2McYqnzoIWcpsQ4JYnaXmRMMTem+Sp7a3+fkWvAUfWQBQIbigPT9O2+VhlvC+xlPg==} engines: {node: '>=20.0.0'} peerDependencies: eslint: ^9.38.0 @@ -5122,22 +5122,22 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@2.3.1: - resolution: {integrity: sha512-Ghh1o++3XDk3zNKF7DXy3kIN1kJYFiH7wvl4aJF5m9LytQGFrJKTA5kygAaWgR7iL8o4mjk5Ty6Be3OKskpHwA==} + eslint-plugin-react-naming-convention@2.3.4: + resolution: {integrity: sha512-KP6d3WxiLmTnm245VK1lLI4Pzu/tkJLNOsmAetDm0kPfamD71msZMerp4VYFsFtqk0km9rbRKE7Cdd27tL43Ow==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-web-api@2.3.1: - resolution: {integrity: sha512-rb7AYR9SCJkCDkFdqnD6JHNLKF1o29o6tZLSaPdzA1Ssxh7/VKgJ8GpTrgl3Rv+Gnyn+w+3w4XE14d7T1Db9nA==} + eslint-plugin-react-web-api@2.3.4: + resolution: {integrity: sha512-NQMVDVIOiU+vJ98hkrIZeNdIwmO54UOjB8EfiHkgDWk69QBJrBtrn5AguFBuUlBUdZR/9vp4yKdQFtzBbRcDTw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-x@2.3.1: - resolution: {integrity: sha512-7zfi297NfkoEtqaz2W953gdK4J9nJD5okVhJVxgrcrP+9FVertkGqpbWtMZLpQuWJ216FncY8P6t1U+af8KNOA==} + eslint-plugin-react-x@2.3.4: + resolution: {integrity: sha512-6rW/CALxGCO9M2wuIUMNKuepSf5uW+Sg+AaQtLpsfs+B6fmDVHFrxIgg9wYk2aRrI6MMQcjDUMEYPUX9eOg2wQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 @@ -5257,8 +5257,8 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} @@ -5412,8 +5412,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.0.8: - resolution: {integrity: sha512-nWWwEfcHxn4tmx/knvDlbRUUkbGc6ChNEpLymV5cmQCSAazG0FkgksF5aOxoDq1wPG0THoEMBVD320spe4QWHw==} + fumadocs-core@16.0.10: + resolution: {integrity: sha512-6DQLpJ7ETvSuGZ4TnK6z1wGwnbqht0lK8BcKc3ergWjc8u2XTsPZP3i3tMgOUsKCG0cr9s8fLYz3FGEMOkDuFw==} peerDependencies: '@mixedbread/sdk': ^0.19.0 '@orama/core': 1.x.x @@ -5450,8 +5450,8 @@ packages: waku: optional: true - fumadocs-mdx@13.0.5: - resolution: {integrity: sha512-ERhPxQzoTwEdtuel5dN5OmUItOhGGXTLR1uCjiGPABYeVkc57vAexyTRQSYZMxGlcfjkJaYqt3qY1p5j7i4g7A==} + fumadocs-mdx@13.0.7: + resolution: {integrity: sha512-sbGbqOgfPVZdDWCiSgLXy7gBbu4hXHH+r53Faq6oreXI5QMbKp8/xfEiuqwEldUqD1em1fGvwfhpYrR264Q72Q==} hasBin: true peerDependencies: '@fumadocs/mdx-remote': ^1.4.0 @@ -5469,8 +5469,8 @@ packages: vite: optional: true - fumadocs-ui@16.0.8: - resolution: {integrity: sha512-NyqAiYJnseXYy6ah/rI67Luy5mssSOwOMv03Xy2SHaDrH588Xjtbx84DwnaJXDlu2L/evHMJ+Bvt5/WIdBQbWQ==} + fumadocs-ui@16.0.10: + resolution: {integrity: sha512-XqQU1vFcbl7i3QiRKqRAWGDAmkKTwSSJSSKOoBNk0HGvk1s4wmNJiEH66YwGJFWrvWwGrrSleyuvVS9i3q3seg==} peerDependencies: '@types/react': '*' next: 16.x.x @@ -5649,8 +5649,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hono@4.10.4: - resolution: {integrity: sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg==} + hono@4.10.5: + resolution: {integrity: sha512-h/MXuTkoAK8NG1EfDp0jI1YLf6yGdDnfkebRO2pwEh5+hE3RAJFXkCsnD0vamSiARK4ZrB6MY+o3E/hCnOyHrQ==} engines: {node: '>=16.9.0'} html-encoding-sniffer@4.0.0: @@ -6532,8 +6532,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next-intl@4.5.0: - resolution: {integrity: sha512-XglGmbs38smaN/QedFVzsypdI4l5tRMpjdU3UL2TtZ3d412oLmmM6enSnHSn0/P59b0ksIp+HlgoLjvHREj1EQ==} + next-intl@4.5.1: + resolution: {integrity: sha512-irtCL71cYJrnleHFpELhlYqb7LIqNiXBssijNVjxUU7hShUFuLYDvYFMbQA0Ocy1WTwSasgmysUHo/bWuKXpRA==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -7105,8 +7105,8 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.10.4: - resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} prosemirror-view@1.41.3: resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} @@ -7397,8 +7397,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.1: - resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} + rollup@4.53.2: + resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7984,38 +7984,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.6.0: - resolution: {integrity: sha512-6vHnLAubHj8Ib45Knu+oY0ZVCLO7WcibzAvt5b1E72YHqAs4y8meMAGMZM0jLqWPh/9maHDc16/qBCMxtW4pXg==} + turbo-darwin-64@2.6.1: + resolution: {integrity: sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.6.0: - resolution: {integrity: sha512-IU+gWMEXNBw8H0pxvE7nPEa5p6yahxbN8g/Q4Bf0AHymsAFqsScgV0peeNbWybdmY9jk1LPbALOsF2kY1I7ZiQ==} + turbo-darwin-arm64@2.6.1: + resolution: {integrity: sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.6.0: - resolution: {integrity: sha512-CKoiJ2ZFJLCDsWdRlZg+ew1BkGn8iCEGdePhISVpjsGwkJwSVhVu49z2zKdBeL1IhcSKS2YALwp9ellNZANJxw==} + turbo-linux-64@2.6.1: + resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.6.0: - resolution: {integrity: sha512-WroVCdCvJbrhNxNdw7XB7wHAfPPJPV+IXY+ZKNed+9VdfBu/2mQNfKnvqTuFTH7n+Pdpv8to9qwhXRTJe26upg==} + turbo-linux-arm64@2.6.1: + resolution: {integrity: sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.6.0: - resolution: {integrity: sha512-7pZo5aGQPR+A7RMtWCZHusarJ6y15LQ+o3jOmpMxTic/W6Bad+jSeqo07TWNIseIWjCVzrSv27+0odiYRYtQdA==} + turbo-windows-64@2.6.1: + resolution: {integrity: sha512-buq7/VAN7KOjMYi4tSZT5m+jpqyhbRU2EUTTvp6V0Ii8dAkY2tAAjQN1q5q2ByflYWKecbQNTqxmVploE0LVwQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.6.0: - resolution: {integrity: sha512-1Ty+NwIksQY7AtFUCPrTpcKQE7zmd/f7aRjdT+qkqGFQjIjFYctEtN7qo4vpQPBgCfS1U3ka83A2u/9CfJQ3wQ==} + turbo-windows-arm64@2.6.1: + resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} cpu: [arm64] os: [win32] - turbo@2.6.0: - resolution: {integrity: sha512-kC5VJqOXo50k0/0jnJDDjibLAXalqT9j7PQ56so0pN+81VR4Fwb2QgIE9dTzT3phqOTQuEXkPh3sCpnv5Isz2g==} + turbo@2.6.1: + resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} hasBin: true tw-animate-css@1.4.0: @@ -8049,8 +8049,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.46.3: - resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} + typescript-eslint@8.46.4: + resolution: {integrity: sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8146,8 +8146,8 @@ packages: peerDependencies: react: '*' - use-intl@4.5.0: - resolution: {integrity: sha512-H0w/sWilzbd1y0+fve2o6EnJ8B7bDwpI+pd1o/zjO717FVSi1clYe6dCmIyPc8NEKOS9BGm1IK9ipSY7OZAqZg==} + use-intl@4.5.1: + resolution: {integrity: sha512-a9wVAuIofJuoD3wQazNuCr2B04rStdgUzILHNXHuogyOx2h0RabnfrRfFlGJnmrZDwN6JtPqD2aHLh4Naa8M0Q==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -8910,9 +8910,9 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.27.0 '@babel/types': 7.28.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -8954,7 +8954,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.27.0 + browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -9028,7 +9028,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.0 '@babel/template': 7.27.2 '@babel/types': 7.28.5 debug: 4.4.3 @@ -9086,7 +9086,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.15': {} + '@csstools/css-syntax-patches-for-csstree@1.0.16': {} '@csstools/css-tokenizer@3.0.4': {} @@ -9356,27 +9356,27 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/ast@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) string-ts: 2.2.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/core@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) birecord: 0.1.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -9384,31 +9384,31 @@ snapshots: - supports-color - typescript - '@eslint-react/eff@2.3.1': {} + '@eslint-react/eff@2.3.4': {} - '@eslint-react/eslint-plugin@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/eslint-plugin@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-dom: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-x: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-dom: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/shared@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-pattern: 5.9.0 zod: 4.1.12 transitivePeerDependencies: @@ -9416,13 +9416,13 @@ snapshots: - supports-color - typescript - '@eslint-react/var@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/var@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-pattern: 5.9.0 transitivePeerDependencies: - eslint @@ -9521,25 +9521,25 @@ snapshots: dependencies: tslib: 2.8.1 - '@hono/node-server@1.19.6(hono@4.10.4)': + '@hono/node-server@1.19.6(hono@4.10.5)': dependencies: - hono: 4.10.4 + hono: 4.10.5 - '@hono/swagger-ui@0.5.2(hono@4.10.4)': + '@hono/swagger-ui@0.5.2(hono@4.10.5)': dependencies: - hono: 4.10.4 + hono: 4.10.5 - '@hono/zod-openapi@1.1.4(hono@4.10.4)(zod@4.1.12)': + '@hono/zod-openapi@1.1.4(hono@4.10.5)(zod@4.1.12)': dependencies: '@asteasolutions/zod-to-openapi': 8.1.0(zod@4.1.12) - '@hono/zod-validator': 0.7.4(hono@4.10.4)(zod@4.1.12) - hono: 4.10.4 + '@hono/zod-validator': 0.7.4(hono@4.10.5)(zod@4.1.12) + hono: 4.10.5 openapi3-ts: 4.5.0 zod: 4.1.12 - '@hono/zod-validator@0.7.4(hono@4.10.4)(zod@4.1.12)': + '@hono/zod-validator@0.7.4(hono@4.10.5)(zod@4.1.12)': dependencies: - hono: 4.10.4 + hono: 4.10.5 zod: 4.1.12 '@hookform/resolvers@5.2.2(react-hook-form@7.66.0(react@19.2.0))': @@ -10097,45 +10097,45 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10146,52 +10146,52 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10209,21 +10209,21 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-collection@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10237,17 +10237,17 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10255,25 +10255,25 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-context@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10281,33 +10281,33 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-direction@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10315,11 +10315,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10334,18 +10334,18 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10362,20 +10362,20 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-focus-guards@1.1.3(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10383,11 +10383,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10400,47 +10400,47 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-id@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10449,21 +10449,21 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-menu@2.1.16(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10491,107 +10491,107 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10616,28 +10616,28 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-popper@1.2.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10657,23 +10657,23 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) '@radix-ui/rect': 1.1.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-portal@1.1.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10685,15 +10685,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-presence@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10705,15 +10705,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10724,51 +10724,51 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10787,96 +10787,96 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-slot@1.2.3(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10885,34 +10885,34 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10930,41 +10930,41 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10981,20 +10981,20 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -11007,31 +11007,31 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -11053,25 +11053,25 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11079,11 +11079,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11093,13 +11093,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11108,12 +11108,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11122,19 +11122,19 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11142,17 +11142,17 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-rect@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11161,12 +11161,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-size@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11175,12 +11175,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -11191,14 +11191,14 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/rect@1.1.1': {} @@ -11423,78 +11423,78 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.43': {} - '@rollup/pluginutils@5.3.0(rollup@4.53.1)': + '@rollup/pluginutils@5.3.0(rollup@4.53.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.1 + rollup: 4.53.2 - '@rollup/rollup-android-arm-eabi@4.53.1': + '@rollup/rollup-android-arm-eabi@4.53.2': optional: true - '@rollup/rollup-android-arm64@4.53.1': + '@rollup/rollup-android-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-arm64@4.53.1': + '@rollup/rollup-darwin-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-x64@4.53.1': + '@rollup/rollup-darwin-x64@4.53.2': optional: true - '@rollup/rollup-freebsd-arm64@4.53.1': + '@rollup/rollup-freebsd-arm64@4.53.2': optional: true - '@rollup/rollup-freebsd-x64@4.53.1': + '@rollup/rollup-freebsd-x64@4.53.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.1': + '@rollup/rollup-linux-arm-musleabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.1': + '@rollup/rollup-linux-arm64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.1': + '@rollup/rollup-linux-arm64-musl@4.53.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.1': + '@rollup/rollup-linux-loong64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.1': + '@rollup/rollup-linux-ppc64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.1': + '@rollup/rollup-linux-riscv64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.1': + '@rollup/rollup-linux-riscv64-musl@4.53.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.1': + '@rollup/rollup-linux-s390x-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.1': + '@rollup/rollup-linux-x64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-musl@4.53.1': + '@rollup/rollup-linux-x64-musl@4.53.2': optional: true - '@rollup/rollup-openharmony-arm64@4.53.1': + '@rollup/rollup-openharmony-arm64@4.53.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.1': + '@rollup/rollup-win32-arm64-msvc@4.53.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.1': + '@rollup/rollup-win32-ia32-msvc@4.53.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.1': + '@rollup/rollup-win32-x64-gnu@4.53.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.1': + '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true '@schummar/icu-type-parser@1.21.5': {} @@ -12001,133 +12001,133 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@tiptap/core@3.10.4(@tiptap/pm@3.10.4)': + '@tiptap/core@3.10.5(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/pm': 3.10.4 + '@tiptap/pm': 3.10.5 - '@tiptap/extension-blockquote@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-blockquote@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-bold@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-bold@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-bubble-menu@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-bubble-menu@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 optional: true - '@tiptap/extension-bullet-list@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-bullet-list@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-code-block@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-code-block@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-code@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-code@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-document@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-document@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-dropcursor@3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-dropcursor@3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-floating-menu@3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-floating-menu@3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 optional: true - '@tiptap/extension-gapcursor@3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-gapcursor@3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-hard-break@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-hard-break@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-heading@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-heading@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-horizontal-rule@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-horizontal-rule@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-italic@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-italic@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-link@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-link@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-list-item@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-list-keymap@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-list-keymap@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-ordered-list@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-ordered-list@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-paragraph@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-paragraph@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-strike@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-strike@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-text-align@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-text-align@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-text@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-text@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-underline@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-underline@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/pm@3.10.4': + '@tiptap/pm@3.10.5': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -12145,52 +12145,52 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-tables: 1.8.1 prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 - '@tiptap/react@3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tiptap/react@3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-floating-menu': 3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-bubble-menu': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-floating-menu': 3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.10.4': - dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/extension-blockquote': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-bold': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-bullet-list': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-code': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-code-block': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-document': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-dropcursor': 3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-gapcursor': 3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-hard-break': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-heading': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-horizontal-rule': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-italic': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-link': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-list-item': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-list-keymap': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-ordered-list': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-paragraph': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-strike': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-text': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-underline': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/starter-kit@3.10.5': + dependencies: + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/extension-blockquote': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-bold': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-bullet-list': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-code': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-code-block': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-document': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-dropcursor': 3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-gapcursor': 3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-hard-break': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-heading': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-horizontal-rule': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-italic': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-link': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-list-item': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-list-keymap': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-ordered-list': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-paragraph': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-strike': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-text': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-underline': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 '@tokenizer/inflate@0.2.7': dependencies: @@ -12333,19 +12333,19 @@ snapshots: dependencies: '@types/react': 19.0.10 - '@types/react-dom@19.2.2(@types/react@19.2.2)': + '@types/react-dom@19.2.2(@types/react@19.2.3)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@types/react-reconciler@0.28.9(@types/react@19.2.2)': + '@types/react-reconciler@0.28.9(@types/react@19.2.3)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@types/react@19.0.10': dependencies: csstype: 3.1.3 - '@types/react@19.2.2': + '@types/react@19.2.3': dependencies: csstype: 3.1.3 @@ -12368,14 +12368,14 @@ snapshots: - uglify-js - webpack-cli - '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.4 eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -12385,41 +12385,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.4.3 eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.3(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.3': + '@typescript-eslint/scope-manager@8.46.4': dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/visitor-keys': 8.46.4 - '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) @@ -12427,14 +12427,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.3': {} + '@typescript-eslint/types@8.46.4': {} - '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -12445,20 +12445,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.3': + '@typescript-eslint/visitor-keys@8.46.4': dependencies: - '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/types': 8.46.4 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -12498,7 +12498,7 @@ snapshots: '@types/chai': 5.2.3 '@vitest/spy': 4.0.8 '@vitest/utils': 4.0.8 - chai: 6.2.0 + chai: 6.2.1 tinyrainbow: 3.0.3 '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': @@ -12871,7 +12871,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.0 caniuse-lite: 1.0.30001754 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -12903,7 +12903,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.25: {} + baseline-browser-mapping@2.8.26: {} bidi-js@1.0.3: dependencies: @@ -12922,9 +12922,9 @@ snapshots: binary-extensions@2.3.0: {} - bippy@0.3.34(@types/react@19.2.2)(react@19.2.0): + bippy@0.3.34(@types/react@19.2.3)(react@19.2.0): dependencies: - '@types/react-reconciler': 0.28.9(@types/react@19.2.2) + '@types/react-reconciler': 0.28.9(@types/react@19.2.3) react: 19.2.0 transitivePeerDependencies: - '@types/react' @@ -12954,13 +12954,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.27.0: + browserslist@4.28.0: dependencies: - baseline-browser-mapping: 2.8.25 + baseline-browser-mapping: 2.8.26 caniuse-lite: 1.0.30001754 - electron-to-chromium: 1.5.249 + electron-to-chromium: 1.5.250 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.27.0) + update-browserslist-db: 1.1.4(browserslist@4.28.0) buffer-crc32@0.2.13: {} @@ -13015,7 +13015,7 @@ snapshots: ccount@2.0.1: {} - chai@6.2.0: {} + chai@6.2.1: {} chalk@4.1.2: dependencies: @@ -13086,12 +13086,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -13217,7 +13217,7 @@ snapshots: cssstyle@5.3.3: dependencies: '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.15 + '@csstools/css-syntax-patches-for-csstree': 1.0.16 css-tree: 3.1.0 csstype@3.1.3: {} @@ -13372,7 +13372,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.249: {} + electron-to-chromium@1.5.250: {} emoji-regex@10.6.0: {} @@ -13665,8 +13665,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) natural-orderby: 5.0.0 transitivePeerDependencies: @@ -13683,16 +13683,16 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 10.1.8(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-dom@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-dom@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 @@ -13701,17 +13701,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13723,17 +13723,17 @@ snapshots: dependencies: eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-naming-convention@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13741,16 +13741,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-web-api@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13758,17 +13758,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) is-immutable-type: 5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) @@ -13950,7 +13950,7 @@ snapshots: expect-type@1.2.2: {} - exsolve@1.0.7: {} + exsolve@1.0.8: {} ext-list@2.2.2: dependencies: @@ -14039,7 +14039,7 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.0 - rollup: 4.53.1 + rollup: 4.53.2 flat-cache@4.0.1: dependencies: @@ -14085,7 +14085,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.16 @@ -14106,7 +14106,7 @@ snapshots: shiki: 3.15.0 unist-util-visit: 5.0.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 lucide-react: 0.553.0(react@19.2.0) next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 @@ -14114,14 +14114,14 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + fumadocs-mdx@13.0.7(fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.12 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) js-yaml: 4.1.0 lru-cache: 11.2.2 mdast-util-to-markdown: 2.1.2 @@ -14141,20 +14141,20 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-ui@16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): - dependencies: - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-ui@16.0.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): + dependencies: + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: 0.7.1 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postcss-selector-parser: 7.1.0 @@ -14164,7 +14164,7 @@ snapshots: scroll-into-view-if-needed: 3.1.0 tailwind-merge: 3.4.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwindcss: 4.1.17 transitivePeerDependencies: @@ -14406,7 +14406,7 @@ snapshots: he@1.2.0: {} - hono@4.10.4: {} + hono@4.10.5: {} html-encoding-sniffer@4.0.0: dependencies: @@ -14586,7 +14586,7 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) @@ -15491,27 +15491,27 @@ snapshots: neo-async@2.6.2: {} - next-intl@4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.1(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 - use-intl: 4.5.0(react@19.2.0) + use-intl: 4.5.1(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@swc/helpers' - next-intl@4.5.0(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 - use-intl: 4.5.0(react@19.2.0) + use-intl: 4.5.1(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -15894,7 +15894,7 @@ snapshots: pkg-types@2.3.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.7 + exsolve: 1.0.8 pathe: 2.0.3 playwright-core@1.56.1: {} @@ -16046,7 +16046,7 @@ snapshots: prosemirror-changeset@2.3.1: dependencies: - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-collab@1.3.1: dependencies: @@ -16056,12 +16056,12 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-gapcursor@1.4.0: @@ -16074,14 +16074,14 @@ snapshots: prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-keymap@1.2.3: dependencies: @@ -16113,12 +16113,12 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-tables@1.8.1: @@ -16126,7 +16126,7 @@ snapshots: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3): @@ -16137,7 +16137,7 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-view: 1.41.3 - prosemirror-transform@1.10.4: + prosemirror-transform@1.10.5: dependencies: prosemirror-model: 1.25.4 @@ -16145,7 +16145,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 punycode.js@2.3.1: {} @@ -16159,68 +16159,68 @@ snapshots: quick-lru@5.1.1: {} - radix-ui@1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + radix-ui@1.4.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) randombytes@2.1.0: dependencies: @@ -16285,13 +16285,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.3)(react@19.2.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 react-remove-scroll@2.7.1(@types/react@19.0.10)(react@19.0.0): dependencies: @@ -16304,18 +16304,18 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll@2.7.1(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.3)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.3)(react@19.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) - use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) + use-callback-ref: 1.3.3(@types/react@19.2.3)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - react-scan@0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1): + react-scan@0.4.3(@types/react@19.2.3)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2): dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -16324,9 +16324,9 @@ snapshots: '@clack/prompts': 0.8.2 '@pivanov/utils': 0.0.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@preact/signals': 1.3.2(preact@10.27.2) - '@rollup/pluginutils': 5.3.0(rollup@4.53.1) + '@rollup/pluginutils': 5.3.0(rollup@4.53.2) '@types/node': 20.19.24 - bippy: 0.3.34(@types/react@19.2.2)(react@19.2.0) + bippy: 0.3.34(@types/react@19.2.3)(react@19.2.0) esbuild: 0.25.12 estree-walker: 3.0.3 kleur: 4.1.5 @@ -16352,13 +16352,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): + react-style-singleton@2.2.3(@types/react@19.2.3)(react@19.2.0): dependencies: get-nonce: 1.0.1 react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 react-universal-interface@0.6.2(react@19.2.0)(tslib@2.8.1): dependencies: @@ -16577,32 +16577,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.1: + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.1 - '@rollup/rollup-android-arm64': 4.53.1 - '@rollup/rollup-darwin-arm64': 4.53.1 - '@rollup/rollup-darwin-x64': 4.53.1 - '@rollup/rollup-freebsd-arm64': 4.53.1 - '@rollup/rollup-freebsd-x64': 4.53.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 - '@rollup/rollup-linux-arm-musleabihf': 4.53.1 - '@rollup/rollup-linux-arm64-gnu': 4.53.1 - '@rollup/rollup-linux-arm64-musl': 4.53.1 - '@rollup/rollup-linux-loong64-gnu': 4.53.1 - '@rollup/rollup-linux-ppc64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-musl': 4.53.1 - '@rollup/rollup-linux-s390x-gnu': 4.53.1 - '@rollup/rollup-linux-x64-gnu': 4.53.1 - '@rollup/rollup-linux-x64-musl': 4.53.1 - '@rollup/rollup-openharmony-arm64': 4.53.1 - '@rollup/rollup-win32-arm64-msvc': 4.53.1 - '@rollup/rollup-win32-ia32-msvc': 4.53.1 - '@rollup/rollup-win32-x64-gnu': 4.53.1 - '@rollup/rollup-win32-x64-msvc': 4.53.1 + '@rollup/rollup-android-arm-eabi': 4.53.2 + '@rollup/rollup-android-arm64': 4.53.2 + '@rollup/rollup-darwin-arm64': 4.53.2 + '@rollup/rollup-darwin-x64': 4.53.2 + '@rollup/rollup-freebsd-arm64': 4.53.2 + '@rollup/rollup-freebsd-x64': 4.53.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 + '@rollup/rollup-linux-arm-musleabihf': 4.53.2 + '@rollup/rollup-linux-arm64-gnu': 4.53.2 + '@rollup/rollup-linux-arm64-musl': 4.53.2 + '@rollup/rollup-linux-loong64-gnu': 4.53.2 + '@rollup/rollup-linux-ppc64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-musl': 4.53.2 + '@rollup/rollup-linux-s390x-gnu': 4.53.2 + '@rollup/rollup-linux-x64-gnu': 4.53.2 + '@rollup/rollup-linux-x64-musl': 4.53.2 + '@rollup/rollup-openharmony-arm64': 4.53.2 + '@rollup/rollup-win32-arm64-msvc': 4.53.2 + '@rollup/rollup-win32-ia32-msvc': 4.53.2 + '@rollup/rollup-win32-x64-gnu': 4.53.2 + '@rollup/rollup-win32-x64-msvc': 4.53.2 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -17317,7 +17317,7 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.53.1 + rollup: 4.53.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 @@ -17340,32 +17340,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.6.0: + turbo-darwin-64@2.6.1: optional: true - turbo-darwin-arm64@2.6.0: + turbo-darwin-arm64@2.6.1: optional: true - turbo-linux-64@2.6.0: + turbo-linux-64@2.6.1: optional: true - turbo-linux-arm64@2.6.0: + turbo-linux-arm64@2.6.1: optional: true - turbo-windows-64@2.6.0: + turbo-windows-64@2.6.1: optional: true - turbo-windows-arm64@2.6.0: + turbo-windows-arm64@2.6.1: optional: true - turbo@2.6.0: + turbo@2.6.1: optionalDependencies: - turbo-darwin-64: 2.6.0 - turbo-darwin-arm64: 2.6.0 - turbo-linux-64: 2.6.0 - turbo-linux-arm64: 2.6.0 - turbo-windows-64: 2.6.0 - turbo-windows-arm64: 2.6.0 + turbo-darwin-64: 2.6.1 + turbo-darwin-arm64: 2.6.1 + turbo-linux-64: 2.6.1 + turbo-linux-arm64: 2.6.1 + turbo-windows-64: 2.6.1 + turbo-windows-arm64: 2.6.1 tw-animate-css@1.4.0: {} @@ -17412,12 +17412,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -17495,9 +17495,9 @@ snapshots: webpack-virtual-modules: 0.6.2 optional: true - update-browserslist-db@1.1.4(browserslist@4.27.0): + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -17517,12 +17517,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): + use-callback-ref@1.3.3(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 use-debounce@10.0.4(react@19.0.0): dependencies: @@ -17532,7 +17532,7 @@ snapshots: dependencies: react: 19.2.0 - use-intl@4.5.0(react@19.2.0): + use-intl@4.5.1(react@19.2.0): dependencies: '@formatjs/fast-memoize': 2.2.7 '@schummar/icu-type-parser': 1.21.5 @@ -17547,13 +17547,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): + use-sidecar@1.1.3(@types/react@19.2.3)(react@19.2.0): dependencies: detect-node-es: 1.1.0 react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 use-sync-external-store@1.6.0(react@19.2.0): dependencies: @@ -17567,9 +17567,9 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + vaul@1.1.2(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -17603,7 +17603,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.1 + rollup: 4.53.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 @@ -17707,7 +17707,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.27.0 + browserslist: 4.28.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 From a68c4845b46ac46fa7e99d97a715b81c8c9cf04e Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:06:06 +0000 Subject: [PATCH 13/21] ci: version bump to v1.2.0-canary.64 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 94bd53a96..8d8c92633 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index cefe571d8..4db525d9d 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index f8ab70899..c406a6e96 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 979bf1c89..bd2c0f8d4 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index 73a132e54..9eba259bd 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 48885f82e..4ea12c387 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index 55ffbdd55..c934ec80a 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index f98dc2753..87cfdc6dd 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 904c1cbc0..89ac0cda8 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.63", + "version": "1.2.0-canary.64", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From f2f0111a8c36f0ab0ba23b5d24e8ddb6085b353c Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 23:14:18 +0100 Subject: [PATCH 14/21] =?UTF-8?q?refactor(plugin):=20=E2=9C=A8=20update=20?= =?UTF-8?q?parameter=20names=20for=20clarity=20in=20`createPluginVitNode`?= =?UTF-8?q?=20and=20`createPluginPackageJSON`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugin/create/create-package-json.ts | 6 +++--- .../src/plugin/create/create-plugin-vitnode.ts | 6 ++---- packages/create-vitnode-app/src/plugin/index.ts | 1 - 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/create-vitnode-app/src/plugin/create/create-package-json.ts b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts index aa6a47f5a..ace3ac1b2 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts @@ -11,12 +11,12 @@ const writeJson = async (path: string, data: unknown) => export const createPluginPackageJSON = async ({ pluginName, - root, + pluginPath, eslint, }: { eslint: boolean; pluginName: string; - root: string; + pluginPath: string; }) => { const vitnodeVersionRange = await getVitnodePackageVersion(); @@ -75,5 +75,5 @@ export const createPluginPackageJSON = async ({ }, }; - await writeJson(`${root}/package.json`, pluginPkg); + await writeJson(`${pluginPath}/package.json`, pluginPkg); }; diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index 621c4d293..e49e1a806 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -16,13 +16,11 @@ export const createPluginVitNode = async ({ pluginPath, pluginName, install, - root, eslint, }: CreatePluginCliReturn & { eslint: boolean; pluginName: string; pluginPath: string; - root: string; }) => { const packageManager = getPackageManagerFromRoot(process.cwd()); @@ -67,7 +65,7 @@ export const createPluginVitNode = async ({ spinner.text = "Creating package.json..."; await createPluginPackageJSON({ pluginName, - root, + pluginPath, eslint, }); @@ -98,7 +96,7 @@ export const createPluginVitNode = async ({ spinner.text = "Installing dependencies..."; await installDependencies({ packageManager, - cwd: root, + cwd: pluginPath, }); } diff --git a/packages/create-vitnode-app/src/plugin/index.ts b/packages/create-vitnode-app/src/plugin/index.ts index e1bf811b5..d2e4ca81b 100644 --- a/packages/create-vitnode-app/src/plugin/index.ts +++ b/packages/create-vitnode-app/src/plugin/index.ts @@ -36,7 +36,6 @@ export const createPlugin = async ({ pluginName, pluginPath, eslint, - root: projectPath, ...options, }); }; From df0031c50223c3040009f210a86366cca83383d8 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:15:20 +0000 Subject: [PATCH 15/21] ci: version bump to v1.2.0-canary.65 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 8d8c92633..68da26908 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index 4db525d9d..d47bf7bda 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index c406a6e96..395bf670a 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index bd2c0f8d4..c4c03ca87 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index 9eba259bd..7bf8b45e0 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 4ea12c387..51a9832c1 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index c934ec80a..26069bd93 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 87cfdc6dd..6f03677ff 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 89ac0cda8..1ce12edd1 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.64", + "version": "1.2.0-canary.65", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From 65246222b066ffcf81bb15a35c711676061bb3a4 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 23:34:04 +0100 Subject: [PATCH 16/21] =?UTF-8?q?refactor(plugin):=20=E2=9C=A8=20update=20?= =?UTF-8?q?import=20paths=20to=20include=20file=20extensions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugin/create/create-plugin-vitnode.ts | 1 + packages/vitnode/package.json | 2 +- packages/vitnode/scripts/get-config.ts | 2 +- packages/vitnode/scripts/plugin.ts | 2 +- packages/vitnode/scripts/prepare-plugins-files.ts | 4 ++-- pnpm-lock.yaml | 6 +++--- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index e49e1a806..4effc3f11 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -76,6 +76,7 @@ export const createPluginVitNode = async ({ "..", "..", "..", + "..", "copy-of-vitnode-app", "eslint-react", ); diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 6f03677ff..7f0689942 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -53,7 +53,6 @@ "@vitnode/config": "workspace:*", "chokidar": "^4.0.3", "concurrently": "^9.2.1", - "dotenv": "^17.2.3", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", "eslint": "^9.39.1", @@ -121,6 +120,7 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "cron-parser": "^5.4.0", + "dotenv": "^17.2.3", "input-otp": "^1.4.2", "motion": "^12.23.24", "next-themes": "^0.4.6", diff --git a/packages/vitnode/scripts/get-config.ts b/packages/vitnode/scripts/get-config.ts index a8618c850..3de8fbed6 100644 --- a/packages/vitnode/scripts/get-config.ts +++ b/packages/vitnode/scripts/get-config.ts @@ -2,7 +2,7 @@ import { join } from "node:path"; import { pathToFileURL } from "node:url"; -import type { VitNodeApiConfig, VitNodeConfig } from "../src/vitnode.config"; +import type { VitNodeApiConfig, VitNodeConfig } from "../src/vitnode.config.js"; type ConfigType = T extends "config" ? VitNodeConfig diff --git a/packages/vitnode/scripts/plugin.ts b/packages/vitnode/scripts/plugin.ts index cc74a107f..45cf35518 100644 --- a/packages/vitnode/scripts/plugin.ts +++ b/packages/vitnode/scripts/plugin.ts @@ -18,7 +18,7 @@ import { isDirectoryEmpty, routeKey, type SourceConfig, -} from "./shared/file-utils"; +} from "./shared/file-utils.js"; /** * Helper: detect if an app path is web, api, or null diff --git a/packages/vitnode/scripts/prepare-plugins-files.ts b/packages/vitnode/scripts/prepare-plugins-files.ts index 7da8b0840..f7768bbd3 100644 --- a/packages/vitnode/scripts/prepare-plugins-files.ts +++ b/packages/vitnode/scripts/prepare-plugins-files.ts @@ -3,7 +3,7 @@ import { existsSync, readdirSync } from "node:fs"; import { readFile } from "node:fs/promises"; import { join, relative } from "node:path"; -import { getConfig } from "./get-config"; +import { getConfig } from "./get-config.js"; import { buildInitialRouteMap, copyDirectoryRecursive, @@ -11,7 +11,7 @@ import { findRepoRoot, isDirectoryEmpty, type SourceConfig, -} from "./shared/file-utils"; +} from "./shared/file-utils.js"; export const preparePluginsFiles = async (flag?: string) => { // Detect which config file to load based on flag or auto-detection diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dff0fb28..9aee26b08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -459,6 +459,9 @@ importers: cron-parser: specifier: ^5.4.0 version: 5.4.0 + dotenv: + specifier: ^17.2.3 + version: 17.2.3 input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -541,9 +544,6 @@ importers: concurrently: specifier: ^9.2.1 version: 9.2.1 - dotenv: - specifier: ^17.2.3 - version: 17.2.3 drizzle-kit: specifier: ^0.31.6 version: 0.31.6 From a27322e507d2a4069b8484fde0adb03d84641e9c Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Tue, 11 Nov 2025 22:35:06 +0000 Subject: [PATCH 17/21] ci: version bump to v1.2.0-canary.66 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 68da26908..b358fab50 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index d47bf7bda..b2c66deac 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index 395bf670a..4813b5a3c 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index c4c03ca87..ce3bca885 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index 7bf8b45e0..eda9ec3e8 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 51a9832c1..cd07679a8 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index 26069bd93..c7950022c 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 7f0689942..9e6d65a42 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 1ce12edd1..619a80168 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.65", + "version": "1.2.0-canary.66", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From 2ab1867aaa2c31cc5ef9286b9f1cd2f86d7c6ad4 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Wed, 12 Nov 2025 12:08:34 +0100 Subject: [PATCH 18/21] =?UTF-8?q?feat(plugin):=20=E2=9C=A8=20add=20functio?= =?UTF-8?q?nality=20to=20register=20new=20plugins=20in=20workspace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/create/add-plugin-to-workspace.ts | 141 ++++++++++++++++++ .../plugin/create/create-plugin-vitnode.ts | 20 +++ 2 files changed, 161 insertions(+) create mode 100644 packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts diff --git a/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts new file mode 100644 index 000000000..e0c752931 --- /dev/null +++ b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts @@ -0,0 +1,141 @@ +import { readdir, readFile, writeFile } from "fs/promises"; +import { join } from "path"; + +import type { PackageJSON } from "../../helpers/packages-json.js"; + +const writeJson = async (path: string, data: unknown) => + writeFile(path, JSON.stringify(data, null, 2) + "\n"); + +interface AddPluginToWorkspaceArgs { + packageManager: string; + pluginName: string; + pluginPath: string; + rootPath: string; +} + +/** + * Recursively find all package.json files in a directory + * @param dir - The directory to search in + * @param results - Array to accumulate results (used internally) + * @returns Array of absolute paths to package.json files + */ +const findPackageJsonFiles = async ( + dir: string, + results: string[] = [], +): Promise => { + try { + const entries = await readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = join(dir, entry.name); + + // Skip node_modules and dist folders + if (entry.name === "node_modules" || entry.name === "dist") { + continue; + } + + if (entry.isDirectory()) { + await findPackageJsonFiles(fullPath, results); + } else if (entry.name === "package.json") { + results.push(fullPath); + } + } + } catch { + // Ignore permission errors or inaccessible directories + } + + return results; +}; + +/** + * Adds the newly created plugin to all workspace packages that depend on @vitnode/core. + * This function: + * 1. Finds all package.json files in the workspace (excluding node_modules and dist) + * 2. Identifies packages that have @vitnode/core as a dependency + * 3. Adds the new plugin as a dependency with the appropriate workspace reference + * 4. Skips packages in the plugins folder (except the new plugin itself) + * 5. Respects the package manager's workspace protocol + * + * @param packageManager - The package manager being used (pnpm, npm, yarn, bun) + * @param pluginName - The name of the plugin to add (e.g., "@my-org/my-plugin") + * @param pluginPath - The absolute path to the plugin directory + * @param rootPath - The absolute path to the monorepo root (where turbo.json is located) + */ + +export const addPluginToWorkspace = async ({ + packageManager, + pluginName, + pluginPath, + rootPath, +}: AddPluginToWorkspaceArgs) => { + // Find all package.json files in the workspace + const packageJsonFiles = await findPackageJsonFiles(rootPath); + + for (const packageJsonPath of packageJsonFiles) { + // Skip if this is the plugin's own package.json + if (packageJsonPath === join(pluginPath, "package.json")) { + continue; + } + + // Skip if this is in the plugins folder (excluding the new plugin itself) + if ( + packageJsonPath.includes("/plugins/") && + !packageJsonPath.startsWith(pluginPath) + ) { + continue; + } + + try { + const content = await readFile(packageJsonPath, "utf-8"); + const pkg: PackageJSON = JSON.parse(content); + + // Check if this package has @vitnode/core + const hasVitnodeCore = + pkg.dependencies?.["@vitnode/core"] ?? + pkg.devDependencies?.["@vitnode/core"]; + + if (!hasVitnodeCore) { + continue; + } + + // Determine the workspace reference based on package manager + let workspaceReference: string; + + switch (packageManager) { + case "bun": + workspaceReference = "workspace:*"; + break; + case "npm": + workspaceReference = "*"; + break; + case "pnpm": + workspaceReference = "workspace:*"; + break; + case "yarn": + workspaceReference = "workspace:*"; + break; + default: + workspaceReference = "workspace:*"; + } + + // Add the plugin to dependencies + pkg.dependencies ??= {}; + + pkg.dependencies[pluginName] = workspaceReference; + + // Sort dependencies alphabetically + pkg.dependencies = Object.keys(pkg.dependencies) + .sort() + .reduce>((acc, key) => { + acc[key] = pkg.dependencies?.[key] ?? ""; + + return acc; + }, {}); + + await writeJson(packageJsonPath, pkg); + } catch { + // Skip files that can't be read or parsed + continue; + } + } +}; diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index 4effc3f11..dfd223048 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -10,6 +10,7 @@ import type { CreatePluginCliReturn } from "../questions.js"; import { getPackageManagerFromRoot } from "../../helpers/get-package-manager-from-root.js"; import { installDependencies } from "../../helpers/install-dependencies.js"; import { isFolderEmpty } from "../../helpers/is-folder-empty.js"; +import { addPluginToWorkspace } from "./add-plugin-to-workspace.js"; import { createPluginPackageJSON } from "./create-package-json.js"; export const createPluginVitNode = async ({ @@ -93,6 +94,25 @@ export const createPluginVitNode = async ({ await cp(templateEslintPath, pluginPath, { recursive: true }); } + // Find the root of the monorepo (where turbo.json is located) + let rootPath = process.cwd(); + let currentDir = rootPath; + while (currentDir !== dirname(currentDir)) { + if (existsSync(join(currentDir, "turbo.json"))) { + rootPath = currentDir; + break; + } + currentDir = dirname(currentDir); + } + + spinner.text = "Adding plugin to workspace packages..."; + await addPluginToWorkspace({ + packageManager, + pluginName, + pluginPath, + rootPath, + }); + if (install) { spinner.text = "Installing dependencies..."; await installDependencies({ From db1928b7c467b5146bc8d0ca7ffd818abf0442f2 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Wed, 12 Nov 2025 11:09:36 +0000 Subject: [PATCH 19/21] ci: version bump to v1.2.0-canary.67 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index b358fab50..1c6dde76b 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index b2c66deac..2d47604a4 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index 4813b5a3c..3ad07d81e 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index ce3bca885..6d2ce2c4b 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index eda9ec3e8..a97691052 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index cd07679a8..00296d003 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index c7950022c..b0e941347 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 9e6d65a42..8a8c56577 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index 619a80168..dd87e0863 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.66", + "version": "1.2.0-canary.67", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", From f6656a6527d76354d0a4fa1dca600af25cb31587 Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Wed, 12 Nov 2025 12:16:38 +0100 Subject: [PATCH 20/21] =?UTF-8?q?refactor(plugin):=20=E2=9C=A8=20improve?= =?UTF-8?q?=20logic=20for=20skipping=20packages=20in=20the=20same=20parent?= =?UTF-8?q?=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/create/add-plugin-to-workspace.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts index e0c752931..079989df1 100644 --- a/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts +++ b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts @@ -1,5 +1,5 @@ import { readdir, readFile, writeFile } from "fs/promises"; -import { join } from "path"; +import { dirname, join } from "path"; import type { PackageJSON } from "../../helpers/packages-json.js"; @@ -53,8 +53,9 @@ const findPackageJsonFiles = async ( * 1. Finds all package.json files in the workspace (excluding node_modules and dist) * 2. Identifies packages that have @vitnode/core as a dependency * 3. Adds the new plugin as a dependency with the appropriate workspace reference - * 4. Skips packages in the plugins folder (except the new plugin itself) - * 5. Respects the package manager's workspace protocol + * 4. Skips other packages in the same parent directory as the plugin (e.g., other plugins) + * 5. Works with any folder structure (apps/, applications/, sandbox/, etc.) + * 6. Respects the package manager's workspace protocol * * @param packageManager - The package manager being used (pnpm, npm, yarn, bun) * @param pluginName - The name of the plugin to add (e.g., "@my-org/my-plugin") @@ -71,17 +72,19 @@ export const addPluginToWorkspace = async ({ // Find all package.json files in the workspace const packageJsonFiles = await findPackageJsonFiles(rootPath); + // Get the parent directory of the plugin (e.g., "plugins", "packages", etc.) + const pluginParentDir = dirname(pluginPath); + for (const packageJsonPath of packageJsonFiles) { // Skip if this is the plugin's own package.json if (packageJsonPath === join(pluginPath, "package.json")) { continue; } - // Skip if this is in the plugins folder (excluding the new plugin itself) - if ( - packageJsonPath.includes("/plugins/") && - !packageJsonPath.startsWith(pluginPath) - ) { + // Skip other packages in the same parent directory as the plugin + // (e.g., if plugin is in "plugins/my-plugin", skip "plugins/other-plugin") + const packageDir = dirname(dirname(packageJsonPath)); // Get parent of package folder + if (packageDir === pluginParentDir) { continue; } From dfeb025f75bdb2558a381ee452ffe613f0f1527e Mon Sep 17 00:00:00 2001 From: aXenDeveloper Date: Wed, 12 Nov 2025 11:17:51 +0000 Subject: [PATCH 21/21] ci: version bump to v1.2.0-canary.68 --- apps/api/package.json | 2 +- apps/docs/package.json | 2 +- packages/config/package.json | 2 +- packages/create-vitnode-app/package.json | 2 +- packages/node-cron/package.json | 2 +- packages/nodemailer/package.json | 2 +- packages/resend/package.json | 2 +- packages/vitnode/package.json | 2 +- plugins/blog/package.json | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/api/package.json b/apps/api/package.json index 1c6dde76b..3d2e54ae8 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "private": true, "type": "module", "scripts": { diff --git a/apps/docs/package.json b/apps/docs/package.json index 2d47604a4..45875a602 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "type": "module", "private": true, "scripts": { diff --git a/packages/config/package.json b/packages/config/package.json index 3ad07d81e..fcb0c9b79 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 6d2ce2c4b..dfa90766e 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json index a97691052..962571251 100644 --- a/packages/node-cron/package.json +++ b/packages/node-cron/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/node-cron", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json index 00296d003..be41a69f6 100644 --- a/packages/nodemailer/package.json +++ b/packages/nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/nodemailer", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Nodemailer integration package for VitNode, enabling email functionalities.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/resend/package.json b/packages/resend/package.json index b0e941347..ed45660e7 100644 --- a/packages/resend/package.json +++ b/packages/resend/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/resend", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", "author": "VitNode Team", "license": "MIT", diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 8a8c56577..51fcf3479 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", diff --git a/plugins/blog/package.json b/plugins/blog/package.json index dd87e0863..fb4d340ae 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.67", + "version": "1.2.0-canary.68", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT",