From 86419b63a8c8db544cfb20b08ed22c02436bf365 Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 27 Feb 2025 17:16:09 +0100 Subject: [PATCH 1/4] fix: pass `schema` to `drizzle` client for better type generation --- .changeset/swift-poets-wonder.md | 5 +++++ packages/addons/drizzle/index.ts | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/swift-poets-wonder.md diff --git a/.changeset/swift-poets-wonder.md b/.changeset/swift-poets-wonder.md new file mode 100644 index 000000000..9b723c70f --- /dev/null +++ b/.changeset/swift-poets-wonder.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix: pass `schema` to `drizzle` client for better type generation diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 17f715051..77f0da48f 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -261,6 +261,7 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); imports.addNamed(ast, '$env/dynamic/private', { env: 'env' }); + imports.addNamespace(ast, './schema', 'schema'); // env var checks const dbURLCheck = common.statementFromString( @@ -329,6 +330,11 @@ export default defineAddon({ common.addStatement(ast, clientIdentifier); const drizzleCall = functions.callByIdentifier('drizzle', ['client']); + drizzleCall.arguments.push( + object.create({ + schema: variables.identifier('schema') + }) + ); const db = variables.declaration(ast, 'const', 'db', drizzleCall); exports.namedExport(ast, 'db', db); From 3910a48c5c46cac9ecad6cf9e56466dc26598b3b Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 28 Feb 2025 17:47:39 +0100 Subject: [PATCH 2/4] see if tests work --- packages/addons/drizzle/index.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 77f0da48f..c0f3e3fd1 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -261,7 +261,6 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); imports.addNamed(ast, '$env/dynamic/private', { env: 'env' }); - imports.addNamespace(ast, './schema', 'schema'); // env var checks const dbURLCheck = common.statementFromString( @@ -270,6 +269,7 @@ export default defineAddon({ common.addStatement(ast, dbURLCheck); let clientExpression; + let addSchema = true; // SQLite if (options.sqlite === 'better-sqlite3') { imports.addDefault(ast, 'better-sqlite3', 'Database'); @@ -304,12 +304,14 @@ export default defineAddon({ clientExpression = common.expressionFromString( 'await mysql.createConnection(env.DATABASE_URL)' ); + addSchema = false; } if (options.mysql === 'planetscale') { imports.addNamed(ast, '@planetscale/database', { Client: 'Client' }); imports.addNamed(ast, 'drizzle-orm/planetscale-serverless', { drizzle: 'drizzle' }); clientExpression = common.expressionFromString('new Client({ url: env.DATABASE_URL })'); + addSchema = false; } // PostgreSQL if (options.postgresql === 'neon') { @@ -330,11 +332,14 @@ export default defineAddon({ common.addStatement(ast, clientIdentifier); const drizzleCall = functions.callByIdentifier('drizzle', ['client']); - drizzleCall.arguments.push( - object.create({ - schema: variables.identifier('schema') - }) - ); + if (addSchema) { + imports.addNamespace(ast, './schema', 'schema'); + drizzleCall.arguments.push( + object.create({ + schema: variables.identifier('schema') + }) + ); + } const db = variables.declaration(ast, 'const', 'db', drizzleCall); exports.namedExport(ast, 'db', db); From f9237034572e171453806382887616aae4617f63 Mon Sep 17 00:00:00 2001 From: Manuel Date: Fri, 28 Feb 2025 18:00:54 +0100 Subject: [PATCH 3/4] Revert "see if tests work" This reverts commit 3910a48c5c46cac9ecad6cf9e56466dc26598b3b. --- packages/addons/drizzle/index.ts | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index c0f3e3fd1..77f0da48f 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -261,6 +261,7 @@ export default defineAddon({ const { ast, generateCode } = parseScript(content); imports.addNamed(ast, '$env/dynamic/private', { env: 'env' }); + imports.addNamespace(ast, './schema', 'schema'); // env var checks const dbURLCheck = common.statementFromString( @@ -269,7 +270,6 @@ export default defineAddon({ common.addStatement(ast, dbURLCheck); let clientExpression; - let addSchema = true; // SQLite if (options.sqlite === 'better-sqlite3') { imports.addDefault(ast, 'better-sqlite3', 'Database'); @@ -304,14 +304,12 @@ export default defineAddon({ clientExpression = common.expressionFromString( 'await mysql.createConnection(env.DATABASE_URL)' ); - addSchema = false; } if (options.mysql === 'planetscale') { imports.addNamed(ast, '@planetscale/database', { Client: 'Client' }); imports.addNamed(ast, 'drizzle-orm/planetscale-serverless', { drizzle: 'drizzle' }); clientExpression = common.expressionFromString('new Client({ url: env.DATABASE_URL })'); - addSchema = false; } // PostgreSQL if (options.postgresql === 'neon') { @@ -332,14 +330,11 @@ export default defineAddon({ common.addStatement(ast, clientIdentifier); const drizzleCall = functions.callByIdentifier('drizzle', ['client']); - if (addSchema) { - imports.addNamespace(ast, './schema', 'schema'); - drizzleCall.arguments.push( - object.create({ - schema: variables.identifier('schema') - }) - ); - } + drizzleCall.arguments.push( + object.create({ + schema: variables.identifier('schema') + }) + ); const db = variables.declaration(ast, 'const', 'db', drizzleCall); exports.namedExport(ast, 'db', db); From cdb9c7a3e387c5a7b79c8e61231b69f11cc0e866 Mon Sep 17 00:00:00 2001 From: Manuel Date: Sat, 1 Mar 2025 10:59:07 +0100 Subject: [PATCH 4/4] fix everything --- packages/addons/drizzle/index.ts | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/addons/drizzle/index.ts b/packages/addons/drizzle/index.ts index 77f0da48f..cb91b96bd 100644 --- a/packages/addons/drizzle/index.ts +++ b/packages/addons/drizzle/index.ts @@ -297,7 +297,7 @@ export default defineAddon({ } } // MySQL - if (options.mysql === 'mysql2') { + if (options.mysql === 'mysql2' || options.mysql === 'planetscale') { imports.addDefault(ast, 'mysql2/promise', 'mysql'); imports.addNamed(ast, 'drizzle-orm/mysql2', { drizzle: 'drizzle' }); @@ -305,12 +305,6 @@ export default defineAddon({ 'await mysql.createConnection(env.DATABASE_URL)' ); } - if (options.mysql === 'planetscale') { - imports.addNamed(ast, '@planetscale/database', { Client: 'Client' }); - imports.addNamed(ast, 'drizzle-orm/planetscale-serverless', { drizzle: 'drizzle' }); - - clientExpression = common.expressionFromString('new Client({ url: env.DATABASE_URL })'); - } // PostgreSQL if (options.postgresql === 'neon') { imports.addNamed(ast, '@neondatabase/serverless', { neon: 'neon' }); @@ -329,12 +323,20 @@ export default defineAddon({ const clientIdentifier = variables.declaration(ast, 'const', 'client', clientExpression); common.addStatement(ast, clientIdentifier); + // create drizzle function call const drizzleCall = functions.callByIdentifier('drizzle', ['client']); - drizzleCall.arguments.push( - object.create({ - schema: variables.identifier('schema') - }) - ); + + // add schema to support `db.query` + const paramObject = object.create({ + schema: variables.identifier('schema') + }); + if (options.database == 'mysql') { + const mode = options.mysql == 'planetscale' ? 'planetscale' : 'default'; + object.property(paramObject, 'mode', common.createLiteral(mode)); + } + drizzleCall.arguments.push(paramObject); + + // create `db` export const db = variables.declaration(ast, 'const', 'db', drizzleCall); exports.namedExport(ast, 'db', db);