fix(cli): resolve path aliases from extended tsconfig files (#8520)

This commit is contained in:
Alex Yang
2026-03-09 11:03:46 -07:00
committed by GitHub
parent c2d4b48516
commit b5e2203f14
6 changed files with 323 additions and 120 deletions

View File

@@ -86,6 +86,7 @@
"better-auth",
"c12",
"chalk",
"get-tsconfig",
"open",
"prettier",
"prompts",

View File

@@ -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",

View File

@@ -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<string, string>,
source: Record<string, string>,
): 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<string, string> {
const { paths = {}, baseUrl } = tsconfig.config.compilerOptions ?? {};
const result: Record<string, string> = {};
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<string>(),
): Record<string, string> {
if (visited.has(tsconfigPath)) {
return {};
}
visited.add(tsconfigPath);
const result: Record<string, string> = {};
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<string, string> = {};
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<string, string> | 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;

View File

@@ -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;
}
}

View File

@@ -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 },
});
});
});

51
pnpm-lock.yaml generated
View File

@@ -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))