diff --git a/knip.jsonc b/knip.jsonc index b37136c3d9..755085773b 100644 --- a/knip.jsonc +++ b/knip.jsonc @@ -86,6 +86,7 @@ "better-auth", "c12", "chalk", + "get-tsconfig", "open", "prettier", "prompts", diff --git a/packages/cli/package.json b/packages/cli/package.json index b0b22644e8..94f24bb4d1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -69,6 +69,7 @@ "commander": "^12.1.0", "dotenv": "^17.3.1", "drizzle-orm": "^0.41.0", + "get-tsconfig": "^4.13.6", "open": "^10.2.0", "pg": "^8.19.0", "prettier": "^3.8.1", diff --git a/packages/cli/src/utils/get-config.ts b/packages/cli/src/utils/get-config.ts index 91f8a3142d..0fc96a6e6d 100644 --- a/packages/cli/src/utils/get-config.ts +++ b/packages/cli/src/utils/get-config.ts @@ -7,10 +7,11 @@ import babelPresetTypeScript from "@babel/preset-typescript"; import type { BetterAuthOptions } from "@better-auth/core"; import { BetterAuthError } from "@better-auth/core/error"; import { loadConfig } from "c12"; +import type { TsConfigResult } from "get-tsconfig"; +import { getTsconfig, parseTsconfig } from "get-tsconfig"; import type { JitiOptions } from "jiti"; import { addCloudflareModules } from "./add-cloudflare-modules"; import { addSvelteKitEnvModules } from "./add-svelte-kit-env-modules"; -import { getTsconfigInfo } from "./get-tsconfig-info"; let possiblePaths = [ "auth.ts", @@ -42,93 +43,104 @@ possiblePaths = [ ...possiblePaths.map((it) => `app/${it}`), ]; -function resolveReferencePath(configDir: string, refPath: string): string { - const resolvedPath = path.resolve(configDir, refPath); - - // If it ends with .json, treat as direct file reference - if (refPath.endsWith(".json")) { - return resolvedPath; - } - - // If the exact path exists and is a file, use it - if (fs.existsSync(resolvedPath)) { - try { - const stats = fs.statSync(resolvedPath); - if (stats.isFile()) { - return resolvedPath; - } - } catch { - // Fall through to directory handling +function mergeAliases( + target: Record, + source: Record, +): void { + for (const [alias, aliasPath] of Object.entries(source)) { + if (!(alias in target)) { + target[alias] = aliasPath; } } - - // Otherwise, assume directory reference - return path.resolve(configDir, refPath, "tsconfig.json"); } -function getPathAliasesRecursive( +function extractAliases(tsconfig: TsConfigResult): Record { + const { paths = {}, baseUrl } = tsconfig.config.compilerOptions ?? {}; + const result: Record = {}; + const configDir = path.dirname(tsconfig.path); + const resolvedBaseUrl = baseUrl + ? path.resolve(configDir, baseUrl) + : configDir; + + for (const [alias, aliasPaths = []] of Object.entries(paths)) { + for (const aliasedPath of aliasPaths) { + const finalAlias = alias.slice(-1) === "*" ? alias.slice(0, -1) : alias; + const finalAliasedPath = + aliasedPath.slice(-1) === "*" ? aliasedPath.slice(0, -1) : aliasedPath; + + result[finalAlias || ""] = path.join(resolvedBaseUrl, finalAliasedPath); + } + } + return result; +} + +/** + * Reads raw tsconfig JSON to get `references` (which get-tsconfig strips out). + */ +function readRawTsconfigReferences( + tsconfigPath: string, +): Array<{ path: string }> | undefined { + try { + const text = fs.readFileSync(tsconfigPath, "utf-8"); + const stripped = text + .replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => + g ? "" : m, + ) + .replace(/,(?=\s*[}\]])/g, ""); + const raw = JSON.parse(stripped); + return raw.references; + } catch { + return undefined; + } +} + +/** + * Collect path aliases from tsconfig references recursively. + */ +function collectReferencesAliases( tsconfigPath: string, visited = new Set(), ): Record { - if (visited.has(tsconfigPath)) { - return {}; - } - visited.add(tsconfigPath); + const result: Record = {}; + const refs = readRawTsconfigReferences(tsconfigPath); + if (!refs) return result; - if (!fs.existsSync(tsconfigPath)) { - console.warn(`Referenced tsconfig not found: ${tsconfigPath}`); - return {}; - } + const configDir = path.dirname(tsconfigPath); + for (const ref of refs) { + const resolvedRef = path.resolve(configDir, ref.path); + const refTsconfigPath = resolvedRef.endsWith(".json") + ? resolvedRef + : path.join(resolvedRef, "tsconfig.json"); - try { - const tsConfig = getTsconfigInfo(undefined, tsconfigPath); - const { paths = {}, baseUrl = "." } = tsConfig.compilerOptions || {}; - const result: Record = {}; + if (visited.has(refTsconfigPath)) continue; + visited.add(refTsconfigPath); - const configDir = path.dirname(tsconfigPath); - const obj = Object.entries(paths) as [string, string[]][]; - for (const [alias, aliasPaths] of obj) { - for (const aliasedPath of aliasPaths) { - const resolvedBaseUrl = path.resolve(configDir, baseUrl); - const finalAlias = alias.slice(-1) === "*" ? alias.slice(0, -1) : alias; - const finalAliasedPath = - aliasedPath.slice(-1) === "*" - ? aliasedPath.slice(0, -1) - : aliasedPath; - - result[finalAlias || ""] = path.join(resolvedBaseUrl, finalAliasedPath); - } + try { + const refConfig = parseTsconfig(refTsconfigPath); + mergeAliases( + result, + extractAliases({ path: refTsconfigPath, config: refConfig }), + ); + } catch { + continue; } - if (tsConfig.references) { - for (const ref of tsConfig.references) { - const refPath = resolveReferencePath(configDir, ref.path); - const refAliases = getPathAliasesRecursive(refPath, visited); - for (const [alias, aliasPath] of Object.entries(refAliases)) { - if (!(alias in result)) { - result[alias] = aliasPath; - } - } - } - } - - return result; - } catch (error) { - console.warn(`Error parsing tsconfig at ${tsconfigPath}: ${error}`); - return {}; + mergeAliases(result, collectReferencesAliases(refTsconfigPath, visited)); } + return result; } function getPathAliases(cwd: string): Record | null { - let tsConfigPath = path.join(cwd, "tsconfig.json"); - if (!fs.existsSync(tsConfigPath)) { - tsConfigPath = path.join(cwd, "jsconfig.json"); - } - if (!fs.existsSync(tsConfigPath)) { + const configName = fs.existsSync(path.join(cwd, "tsconfig.json")) + ? "tsconfig.json" + : "jsconfig.json"; + const tsconfig = getTsconfig(cwd, configName); + if (!tsconfig) { return null; } try { - const result = getPathAliasesRecursive(tsConfigPath); + const result = extractAliases(tsconfig); + mergeAliases(result, collectReferencesAliases(tsconfig.path)); addSvelteKitEnvModules(result); addCloudflareModules(result); return result; diff --git a/packages/cli/src/utils/get-tsconfig-info.ts b/packages/cli/src/utils/get-tsconfig-info.ts deleted file mode 100644 index c0e35c7ea4..0000000000 --- a/packages/cli/src/utils/get-tsconfig-info.ts +++ /dev/null @@ -1,27 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -function stripJsonComments(jsonString: string): string { - return jsonString - .replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => - g ? "" : m, - ) - .replace(/,(?=\s*[}\]])/g, ""); -} - -export function getTsconfigInfo(cwd?: string, flatPath?: string) { - let tsConfigPath: string; - if (flatPath) { - tsConfigPath = flatPath; - } else { - tsConfigPath = cwd - ? path.join(cwd, "tsconfig.json") - : path.join("tsconfig.json"); - } - try { - const text = fs.readFileSync(tsConfigPath, "utf-8"); - return JSON.parse(stripJsonComments(text)); - } catch (error) { - throw error; - } -} diff --git a/packages/cli/test/get-config.test.ts b/packages/cli/test/get-config.test.ts index f606aeaa0c..b61657e523 100644 --- a/packages/cli/test/get-config.test.ts +++ b/packages/cli/test/get-config.test.ts @@ -897,4 +897,217 @@ describe("getConfig", async () => { expect(config).not.toBe(null); expect(config?.emailAndPassword?.enabled).toBe(true); }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should resolve path aliases from extended tsconfig", async () => { + const authPath = path.join(tmpDir, "src", "auth"); + const dbPath = path.join(tmpDir, "src", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + + // Create base tsconfig with path aliases + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "compilerOptions": { + "paths": { + "@src/*": ["./src/*"] + } + } + }`, + ); + + // Create tsconfig.json that extends base + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json" + }`, + ); + + // Create dummy db.ts + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts using the alias from extended config + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@src/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "src/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should resolve path aliases from chained extends", async () => { + const authPath = path.join(tmpDir, "src", "auth"); + const dbPath = path.join(tmpDir, "src", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + + // Create grandparent tsconfig with path aliases + await fs.writeFile( + path.join(tmpDir, "tsconfig.root.json"), + `{ + "compilerOptions": { + "paths": { + "@server/*": ["./src/*"] + } + } + }`, + ); + + // Create parent tsconfig that extends grandparent + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "extends": "./tsconfig.root.json" + }`, + ); + + // Create tsconfig.json that extends parent + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json" + }`, + ); + + // Create dummy db.ts + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts using the alias from grandparent + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@server/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "src/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); + + /** + * @see https://github.com/better-auth/better-auth/issues/6373 + */ + it("should let child paths override parent paths from extends", async () => { + const authPath = path.join(tmpDir, "server", "auth"); + const dbPath = path.join(tmpDir, "server", "db"); + const oldDbPath = path.join(tmpDir, "old", "db"); + await fs.mkdir(authPath, { recursive: true }); + await fs.mkdir(dbPath, { recursive: true }); + await fs.mkdir(oldDbPath, { recursive: true }); + + // Create parent tsconfig with path aliases pointing to old location + await fs.writeFile( + path.join(tmpDir, "tsconfig.base.json"), + `{ + "compilerOptions": { + "paths": { + "@server/*": ["./old/*"] + } + } + }`, + ); + + // Create child tsconfig that overrides the alias + await fs.writeFile( + path.join(tmpDir, "tsconfig.json"), + `{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "paths": { + "@server/*": ["./server/*"] + } + } + }`, + ); + + // Create dummy db.ts in the correct (overridden) location + await fs.writeFile( + path.join(dbPath, "db.ts"), + `class PrismaClient { + constructor() {} + } + export const db = new PrismaClient()`, + ); + + // Create auth.ts + await fs.writeFile( + path.join(authPath, "auth.ts"), + `import {betterAuth} from "better-auth"; + import {prismaAdapter} from "better-auth/adapters/prisma"; + import {db} from "@server/db/db"; + + export const auth = betterAuth({ + database: prismaAdapter(db, { + provider: 'sqlite' + }), + emailAndPassword: { + enabled: true, + } + })`, + ); + + const config = await getConfig({ + cwd: tmpDir, + configPath: "server/auth/auth.ts", + }); + + expect(config).not.toBe(null); + expect(config).toMatchObject({ + emailAndPassword: { enabled: true }, + }); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3182ab3801..94d55b5082 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -441,7 +441,7 @@ importers: version: 0.30.6 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) mongodb: specifier: ^7.1.0 version: 7.1.0(socks@2.8.7) @@ -654,7 +654,7 @@ importers: version: link:../../../../../packages/better-auth drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) hono: specifier: ^4.12.4 version: 4.12.5 @@ -1049,7 +1049,7 @@ importers: version: 0.31.9 drizzle-orm: specifier: '>=0.41.0' - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) jose: specifier: ^6.1.3 version: 6.1.3 @@ -1215,7 +1215,10 @@ importers: version: 17.3.1 drizzle-orm: specifier: ^0.41.0 - version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + get-tsconfig: + specifier: ^4.13.6 + version: 4.13.6 open: specifier: ^10.2.0 version: 10.2.0 @@ -1328,7 +1331,7 @@ importers: version: 0.3.1 drizzle-orm: specifier: ^0.45.1 - version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + version: 0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) tsdown: specifier: 'catalog:' version: 0.21.0-beta.2(@arethetypeswrong/core@0.18.2)(oxc-resolver@11.19.0)(publint@0.3.17)(synckit@0.11.11)(typescript@5.9.3) @@ -26871,7 +26874,7 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.41.0(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 '@electric-sql/pglite': 0.3.15 @@ -26907,6 +26910,24 @@ snapshots: postgres: 3.4.8 prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + optionalDependencies: + '@cloudflare/workers-types': 4.20260226.1 + '@electric-sql/pglite': 0.3.15 + '@libsql/client': 0.17.0(encoding@0.1.13) + '@opentelemetry/api': 1.9.0 + '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@types/better-sqlite3': 7.6.13 + '@types/pg': 8.16.0 + better-sqlite3: 12.6.2 + bun-types: 1.3.9 + gel: 2.2.0 + kysely: 0.28.11 + mysql2: 3.18.2(@types/node@25.3.3) + pg: 8.19.0 + postgres: 3.4.8 + prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): optionalDependencies: '@cloudflare/workers-types': 4.20260226.1 @@ -26926,24 +26947,6 @@ snapshots: prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.5.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) optional: true - drizzle-orm@0.45.1(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0)(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.3))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): - optionalDependencies: - '@cloudflare/workers-types': 4.20260226.1 - '@electric-sql/pglite': 0.3.15 - '@libsql/client': 0.17.0(encoding@0.1.13) - '@opentelemetry/api': 1.9.0 - '@prisma/client': 7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) - '@types/better-sqlite3': 7.6.13 - '@types/pg': 8.16.0 - better-sqlite3: 12.6.2 - bun-types: 1.3.9 - gel: 2.2.0 - kysely: 0.28.11 - mysql2: 3.18.2(@types/node@25.3.3) - pg: 8.19.0 - postgres: 3.4.8 - prisma: 7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) - drizzle-zod@0.8.3(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)))(zod@4.3.6): dependencies: drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260226.1)(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.0(encoding@0.1.13))(@opentelemetry/api@1.9.0)(@prisma/client@7.4.1(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(bun-types@1.3.9)(gel@2.2.0)(kysely@0.28.11)(mysql2@3.18.2(@types/node@25.3.2))(pg@8.19.0)(postgres@3.4.8)(prisma@7.4.1(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))