From 4862133bb639090237ea0582461a69c57b7f7573 Mon Sep 17 00:00:00 2001 From: cpojer Date: Thu, 26 Mar 2026 18:17:26 +0900 Subject: [PATCH] chore: Upgrade & fix Vinext integration. --- packages/void/src/codegen/project-tsconfig.ts | 9 ++++-- packages/void/src/index.ts | 6 +++- packages/void/src/plugin-drizzle.ts | 5 ++- .../void/test/unit/plugin-drizzle.test.ts | 10 ++++++ playground/vinext-app/package.json | 2 +- playground/vinext-pages/package.json | 2 +- pnpm-lock.yaml | 32 +++++++++++++------ 7 files changed, 49 insertions(+), 17 deletions(-) diff --git a/packages/void/src/codegen/project-tsconfig.ts b/packages/void/src/codegen/project-tsconfig.ts index 6d35980db..1af22f74d 100644 --- a/packages/void/src/codegen/project-tsconfig.ts +++ b/packages/void/src/codegen/project-tsconfig.ts @@ -16,6 +16,7 @@ export function ensureProjectTsconfig( hasRouteTypes?: boolean, hasDb?: boolean, hasSchema?: boolean, + options: { redirectDbModule?: boolean } = {}, ): void { const outDir = join(root, ".void"); mkdirSync(outDir, { recursive: true }); @@ -30,13 +31,15 @@ export function ensureProjectTsconfig( const tsconfig: Record = { files }; if (hasDb) { - const paths: Record = { + const paths: Record = {}; + + if (options.redirectDbModule !== false) { // Redirect void/db to the generated db.d.ts so TypeScript uses // schema-aware types instead of the generic base module. // (moduleResolution: "bundler" ignores ambient `declare module` // when the module resolves to a real file — paths is the fix.) - "void/db": ["./db.d.ts"], - }; + paths["void/db"] = ["./db.d.ts"]; + } if (hasSchema) { // Determine whether schema is a file or directory diff --git a/packages/void/src/index.ts b/packages/void/src/index.ts index 01f3c27be..37c9458f6 100644 --- a/packages/void/src/index.ts +++ b/packages/void/src/index.ts @@ -720,6 +720,7 @@ export function voidPlugin(options?: { // all other Class A frameworks and vinext Pages Router use plain SSR. const viteEnvironment: { name: string; childEnvironments?: string[] } = framework === "vinext-app" ? { name: "rsc", childEnvironments: ["ssr"] } : { name: "ssr" }; + const redirectDbTypePaths = framework !== "vinext-app" && framework !== "vinext-pages"; // vinext injects vite-tsconfig-paths which spams warnings for every // tsconfig that extends a non-existent .void/tsconfig.json. Void @@ -752,7 +753,10 @@ export function voidPlugin(options?: { bindingWatchPlugin, envPlugin, clientStubsPlugin, - drizzlePlugin(root, false, getDatabaseDialect(config), { forceVirtualDb: authEnabled }), + drizzlePlugin(root, false, getDatabaseDialect(config), { + forceVirtualDb: authEnabled, + redirectDbTypePaths, + }), migrationPlugin(root, getDatabaseDialect(config)), ...(vinextCompat ? [vinextCompat] : []), ...cloudflare({ diff --git a/packages/void/src/plugin-drizzle.ts b/packages/void/src/plugin-drizzle.ts index 1a2b99fd5..a64852475 100644 --- a/packages/void/src/plugin-drizzle.ts +++ b/packages/void/src/plugin-drizzle.ts @@ -21,6 +21,7 @@ const DRIZZLE_OPERATORS = interface DrizzlePluginOptions { forceVirtualDb?: boolean; + redirectDbTypePaths?: boolean; } /** @@ -44,7 +45,9 @@ export function drizzlePlugin( const hasDbRuntime = schema != null || options.forceVirtualDb === true; // Always write tsconfig (for routes.d.ts, queues.d.ts, etc.) - ensureProjectTsconfig(root, hasRouteTypes, hasDbRuntime, schema != null); + ensureProjectTsconfig(root, hasRouteTypes, hasDbRuntime, schema != null, { + redirectDbModule: options.redirectDbTypePaths, + }); // Generate db.d.ts when void/db is available, even without a user schema. if (hasDbRuntime) { diff --git a/packages/void/test/unit/plugin-drizzle.test.ts b/packages/void/test/unit/plugin-drizzle.test.ts index c5e1f47ce..5b6d0f138 100644 --- a/packages/void/test/unit/plugin-drizzle.test.ts +++ b/packages/void/test/unit/plugin-drizzle.test.ts @@ -106,4 +106,14 @@ describe("drizzlePlugin db typing generation", () => { expect(code).not.toContain("import * as schema"); expect(code).toContain("drizzle(getConnectionString())"); }); + + it("can keep void/db off tsconfig paths for metaframeworks that materialize aliases", () => { + const root = createProjectRoot(); + + drizzlePlugin(root, false, "sqlite", { redirectDbTypePaths: false }); + + const tsconfig = JSON.parse(readFileSync(join(root, ".void", "tsconfig.json"), "utf8")); + expect(tsconfig.compilerOptions.paths["void/db"]).toBeUndefined(); + expect(tsconfig.compilerOptions.paths["@schema"]).toEqual(["../db/schema.ts"]); + }); }); diff --git a/playground/vinext-app/package.json b/playground/vinext-app/package.json index 37962f46a..66169fe47 100644 --- a/playground/vinext-app/package.json +++ b/playground/vinext-app/package.json @@ -11,7 +11,7 @@ "react": "^19.2.4", "react-dom": "^19.2.4", "react-server-dom-webpack": "^19.2.4", - "vinext": "^0.0.18" + "vinext": "^0.0.35" }, "devDependencies": { "@types/react": "^19.2.14", diff --git a/playground/vinext-pages/package.json b/playground/vinext-pages/package.json index 808baf772..74529ab76 100644 --- a/playground/vinext-pages/package.json +++ b/playground/vinext-pages/package.json @@ -9,7 +9,7 @@ "dependencies": { "react": "^19.2.4", "react-dom": "^19.2.4", - "vinext": "^0.0.18" + "vinext": "^0.0.35" }, "devDependencies": { "@types/react": "^19.2.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 991bf0bb4..e9a56c2cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -843,8 +843,8 @@ importers: specifier: ^19.2.4 version: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)) vinext: - specifier: ^0.0.18 - version: 0.0.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.3(esbuild@0.27.4)) + specifier: ^0.0.35 + version: 0.0.35(@vitejs/plugin-react@6.0.1(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(@vitejs/plugin-rsc@0.5.21(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) devDependencies: '@types/react': specifier: ^19.2.14 @@ -871,8 +871,8 @@ importers: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) vinext: - specifier: ^0.0.18 - version: 0.0.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.3(esbuild@0.27.4)) + specifier: ^0.0.35 + version: 0.0.35(@vitejs/plugin-react@6.0.1(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(@vitejs/plugin-rsc@0.5.21(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) devDependencies: '@types/react': specifier: ^19.2.14 @@ -7687,14 +7687,25 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vinext@0.0.18: - resolution: {integrity: sha512-HTaO+fWYYInbLfRge+TgdEJqyjcV5amwHCUvEI9gp32jGEb/9xS/6NVscgMmjUlAlS4FSmwpgWEv6kwzDuZ2lQ==} + vinext@0.0.35: + resolution: {integrity: sha512-z0EFQN6R+o5AdrTL/KRpsbc9mr0JLICy+v8ReBrx/R5TopC/bixllcuKB0/1HIvxm9TuLeO9+Llwv3D5APLSBA==} engines: {node: '>=22'} hasBin: true peerDependencies: + '@mdx-js/rollup': ^3.0.0 + '@vitejs/plugin-react': ^5.1.4 || ^6.0.0 + '@vitejs/plugin-rsc': ^0.5.19 react: '>=19.2.0' react-dom: '>=19.2.0' + react-server-dom-webpack: ^19.2.4 vite: ^8.0.2 + peerDependenciesMeta: + '@mdx-js/rollup': + optional: true + '@vitejs/plugin-rsc': + optional: true + react-server-dom-webpack: + optional: true vite-dev-rpc@1.1.0: resolution: {integrity: sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==} @@ -15431,24 +15442,25 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vinext@0.0.18(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(webpack@5.105.3(esbuild@0.27.4)): + vinext@0.0.35(@vitejs/plugin-react@6.0.1(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(@vitejs/plugin-rsc@0.5.21(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@unpic/react': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@vercel/og': 0.8.6 - '@vitejs/plugin-rsc': 0.5.21(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitejs/plugin-react': 6.0.1(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) magic-string: 0.30.21 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - react-server-dom-webpack: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)) rsc-html-stream: 0.0.7 vite: 8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-commonjs: 0.10.4 vite-tsconfig-paths: 6.1.1(typescript@5.9.3)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + '@vitejs/plugin-rsc': 0.5.21(react-dom@19.2.4(react@19.2.4))(react-server-dom-webpack@19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)))(react@19.2.4)(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + react-server-dom-webpack: 19.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(webpack@5.105.3(esbuild@0.27.4)) transitivePeerDependencies: - next - supports-color - typescript - - webpack vite-dev-rpc@1.1.0(vite@8.0.2(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: