From e06948e5f4944bb11b8176a809324a77afacab2b Mon Sep 17 00:00:00 2001 From: Benzi Date: Mon, 24 Nov 2025 00:38:53 -0500 Subject: [PATCH 1/4] feat: add generate database types function --- src/generators/db/generateDatabaseTypes.ts | 46 ++++++++++++++++++++++ src/generators/db/generateDrizzleSchema.ts | 27 +------------ src/generators/db/scaffoldDatabase.ts | 3 +- 3 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 src/generators/db/generateDatabaseTypes.ts diff --git a/src/generators/db/generateDatabaseTypes.ts b/src/generators/db/generateDatabaseTypes.ts new file mode 100644 index 0000000..c829785 --- /dev/null +++ b/src/generators/db/generateDatabaseTypes.ts @@ -0,0 +1,46 @@ +import { + AuthProvider, + AvailableDrizzleDialect, + DatabaseHost +} from '../../types'; + +type GenerateTypesProps = { + databaseHost: DatabaseHost; + authProvider: AuthProvider; +}; + +export const generateDatabaseTypes = ({ + databaseHost, + authProvider +}: GenerateTypesProps) => { + let dbImport = ''; + let dbTypeLine = ''; + if (databaseHost === 'neon') { + dbImport = `import { NeonHttpDatabase } from 'drizzle-orm/neon-http';`; + dbTypeLine = 'export type DatabaseType = NeonHttpDatabase;'; + } else if (databaseHost === 'planetscale') { + dbImport = `import { PlanetScaleDatabase } from 'drizzle-orm/planetscale-serverless';`; + dbTypeLine = + 'export type DatabaseType = PlanetScaleDatabase;'; + } else if (databaseHost === 'turso') { + dbImport = `import { LibSQLDatabase } from 'drizzle-orm/libsql';`; + dbTypeLine = 'export type DatabaseType = LibSQLDatabase;'; + } + + const schemaImport = + authProvider === 'absoluteAuth' + ? `import { users, SchemaType } from '../../db/schema';` + : `import { countHistory, SchemaType } from '../../db/schema';`; + const extraTypes = + authProvider === 'absoluteAuth' + ? `export type User = typeof users.$inferSelect; +export type NewUser = typeof users.$inferInsert;` + : `export type CountHistory = typeof countHistory.$inferSelect; +export type NewCountHistory = typeof countHistory.$inferInsert;`; + + return `${schemaImport} +${dbImport} + +${dbTypeLine ? `${dbTypeLine}\n\n` : '\n'}${extraTypes} +`; +}; \ No newline at end of file diff --git a/src/generators/db/generateDrizzleSchema.ts b/src/generators/db/generateDrizzleSchema.ts index f3f72f0..b4282e0 100644 --- a/src/generators/db/generateDrizzleSchema.ts +++ b/src/generators/db/generateDrizzleSchema.ts @@ -1,7 +1,6 @@ import { AuthProvider, - AvailableDrizzleDialect, - DatabaseHost + AvailableDrizzleDialect } from '../../types'; const DIALECTS = { @@ -57,7 +56,6 @@ const DIALECTS = { type GenerateSchemaProps = { databaseEngine: AvailableDrizzleDialect; - databaseHost: DatabaseHost; authProvider: AuthProvider; }; @@ -65,7 +63,6 @@ const builder = (expr: string) => expr.split('(')[0]; export const generateDrizzleSchema = ({ databaseEngine, - databaseHost, authProvider }: GenerateSchemaProps) => { const cfg = DIALECTS[databaseEngine]; @@ -91,20 +88,6 @@ export const generateDrizzleSchema = ({ ? `import { sql } from 'drizzle-orm';\n` : ''; - let dbImport = ''; - let dbTypeLine = ''; - if (databaseHost === 'neon') { - dbImport = `import { NeonHttpDatabase } from 'drizzle-orm/neon-http';`; - dbTypeLine = 'export type DatabaseType = NeonHttpDatabase;'; - } else if (databaseHost === 'planetscale') { - dbImport = `import { PlanetScaleDatabase } from 'drizzle-orm/planetscale-serverless';`; - dbTypeLine = - 'export type DatabaseType = PlanetScaleDatabase;'; - } else if (databaseHost === 'turso') { - dbImport = `import { LibSQLDatabase } from 'drizzle-orm/libsql';`; - dbTypeLine = 'export type DatabaseType = LibSQLDatabase;'; - } - let uidColumn: string; if (databaseEngine === 'mysql' || databaseEngine === 'singlestore' || databaseEngine === 'mariadb') { uidColumn = `${intBuilder}('uid').primaryKey().autoincrement()`; @@ -140,16 +123,9 @@ const MILLIS_PER_DAY = 86400000;\n\n` const schemaKey = authProvider === 'absoluteAuth' ? 'users' : 'countHistory'; - const extraTypes = - authProvider === 'absoluteAuth' - ? `export type User = typeof users.$inferSelect; -export type NewUser = typeof users.$inferInsert;` - : `export type CountHistory = typeof countHistory.$inferSelect; -export type NewCountHistory = typeof countHistory.$inferInsert;`; return ` ${sqliteImports}${builderImport} -${dbImport} ${constsBlock}${tableBlock} @@ -158,6 +134,5 @@ export const schema = { }; export type SchemaType = typeof schema; -${dbTypeLine ? `${dbTypeLine}\n\n` : '\n'}${extraTypes} `; }; diff --git a/src/generators/db/scaffoldDatabase.ts b/src/generators/db/scaffoldDatabase.ts index b726862..390bb5f 100644 --- a/src/generators/db/scaffoldDatabase.ts +++ b/src/generators/db/scaffoldDatabase.ts @@ -87,8 +87,7 @@ export const scaffoldDatabase = async ({ const drizzleSchema = generateDrizzleSchema({ authProvider, - databaseEngine, - databaseHost + databaseEngine }); writeFileSync( join(projectDatabaseDirectory, 'schema.ts'), From 40827220402c0cc7db9df5299ec3cce993a84422 Mon Sep 17 00:00:00 2001 From: Benzi Date: Mon, 24 Nov 2025 00:39:13 -0500 Subject: [PATCH 2/4] feat: add path for database types file --- src/generators/configurations/initializeRoot.ts | 5 +++-- src/generators/db/scaffoldDatabase.ts | 13 ++++++++++++- src/scaffold.ts | 5 +++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/generators/configurations/initializeRoot.ts b/src/generators/configurations/initializeRoot.ts index 1b29aa7..2edc41f 100644 --- a/src/generators/configurations/initializeRoot.ts +++ b/src/generators/configurations/initializeRoot.ts @@ -14,7 +14,8 @@ export const initalizeRoot = ( mkdirSync(projectName); const srcDir = join(projectName, 'src'); mkdirSync(srcDir); - mkdirSync(join(srcDir, 'types')); + const typesDirectory = join(srcDir, 'types'); + mkdirSync(typesDirectory); const constantsSrc = join(templatesDirectory, 'constants.ts'); const constantsDest = join(srcDir, 'constants.ts'); @@ -40,5 +41,5 @@ export const initalizeRoot = ( join(projectAssetsDirectory, 'png', 'absolutejs-temp.png') ); - return { backendDirectory, frontendDirectory, projectAssetsDirectory }; + return { backendDirectory, frontendDirectory, projectAssetsDirectory, typesDirectory }; }; diff --git a/src/generators/db/scaffoldDatabase.ts b/src/generators/db/scaffoldDatabase.ts index 390bb5f..031db42 100644 --- a/src/generators/db/scaffoldDatabase.ts +++ b/src/generators/db/scaffoldDatabase.ts @@ -9,6 +9,7 @@ import { createDrizzleConfig } from '../configurations/generateDrizzleConfig'; import { generateDrizzleSchema } from './generateDrizzleSchema'; import { generateDBHandlers } from './generateHandlers'; import { generateSqliteSchema } from './generateSqliteSchema'; +import { generateDatabaseTypes } from './generateDatabaseTypes'; import { scaffoldDocker } from './scaffoldDocker'; type ScaffoldDatabaseProps = Pick< @@ -22,6 +23,7 @@ type ScaffoldDatabaseProps = Pick< > & { databaseDirectory: string; backendDirectory: string; + typesDirectory: string; }; export const scaffoldDatabase = async ({ @@ -31,7 +33,8 @@ export const scaffoldDatabase = async ({ databaseDirectory, backendDirectory, authProvider, - orm + orm, + typesDirectory }: ScaffoldDatabaseProps) => { const projectDatabaseDirectory = join(projectName, databaseDirectory); const handlerDirectory = join(backendDirectory, 'handlers'); @@ -95,6 +98,14 @@ export const scaffoldDatabase = async ({ ); createDrizzleConfig({ databaseDirectory, databaseEngine, projectName }); + const drizzleTypes = generateDatabaseTypes({ + databaseHost, + authProvider + }); + writeFileSync( + join(typesDirectory, 'databaseTypes.ts'), + drizzleTypes + ); return; } diff --git a/src/scaffold.ts b/src/scaffold.ts index 2313efa..907f9c9 100644 --- a/src/scaffold.ts +++ b/src/scaffold.ts @@ -46,7 +46,7 @@ export const scaffold = async ({ const __dirname = dirname(fileURLToPath(import.meta.url)); const templatesDirectory = join(__dirname, '/templates'); - const { frontendDirectory, backendDirectory, projectAssetsDirectory } = + const { frontendDirectory, backendDirectory, projectAssetsDirectory, typesDirectory } = initalizeRoot(projectName, templatesDirectory); copyFileSync( @@ -103,7 +103,8 @@ export const scaffold = async ({ databaseEngine, databaseHost, orm, - projectName + projectName, + typesDirectory })) ); From 2c0bf948b08572a6885c4439120227e7e0eb3bc8 Mon Sep 17 00:00:00 2001 From: Benzi Date: Mon, 24 Nov 2025 00:56:02 -0500 Subject: [PATCH 3/4] fix: run bun format --- src/generators/configurations/initializeRoot.ts | 7 ++++++- src/generators/db/generateDatabaseTypes.ts | 12 ++++-------- src/generators/db/generateDrizzleSchema.ts | 5 +---- src/generators/db/scaffoldDatabase.ts | 12 +++++------- src/scaffold.ts | 8 ++++++-- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/generators/configurations/initializeRoot.ts b/src/generators/configurations/initializeRoot.ts index 2edc41f..45478fa 100644 --- a/src/generators/configurations/initializeRoot.ts +++ b/src/generators/configurations/initializeRoot.ts @@ -41,5 +41,10 @@ export const initalizeRoot = ( join(projectAssetsDirectory, 'png', 'absolutejs-temp.png') ); - return { backendDirectory, frontendDirectory, projectAssetsDirectory, typesDirectory }; + return { + backendDirectory, + frontendDirectory, + projectAssetsDirectory, + typesDirectory + }; }; diff --git a/src/generators/db/generateDatabaseTypes.ts b/src/generators/db/generateDatabaseTypes.ts index c829785..4d9be9e 100644 --- a/src/generators/db/generateDatabaseTypes.ts +++ b/src/generators/db/generateDatabaseTypes.ts @@ -1,12 +1,8 @@ -import { - AuthProvider, - AvailableDrizzleDialect, - DatabaseHost -} from '../../types'; +import { AuthProvider, DatabaseHost } from '../../types'; type GenerateTypesProps = { - databaseHost: DatabaseHost; - authProvider: AuthProvider; + databaseHost: DatabaseHost; + authProvider: AuthProvider; }; export const generateDatabaseTypes = ({ @@ -43,4 +39,4 @@ ${dbImport} ${dbTypeLine ? `${dbTypeLine}\n\n` : '\n'}${extraTypes} `; -}; \ No newline at end of file +}; diff --git a/src/generators/db/generateDrizzleSchema.ts b/src/generators/db/generateDrizzleSchema.ts index b4282e0..02da291 100644 --- a/src/generators/db/generateDrizzleSchema.ts +++ b/src/generators/db/generateDrizzleSchema.ts @@ -1,7 +1,4 @@ -import { - AuthProvider, - AvailableDrizzleDialect -} from '../../types'; +import { AuthProvider, AvailableDrizzleDialect } from '../../types'; const DIALECTS = { gel: { diff --git a/src/generators/db/scaffoldDatabase.ts b/src/generators/db/scaffoldDatabase.ts index 031db42..1daba7e 100644 --- a/src/generators/db/scaffoldDatabase.ts +++ b/src/generators/db/scaffoldDatabase.ts @@ -6,10 +6,10 @@ import { isDrizzleDialect } from '../../typeGuards'; import type { CreateConfiguration } from '../../types'; import { checkSqliteInstalled } from '../../utils/checkSqliteInstalled'; import { createDrizzleConfig } from '../configurations/generateDrizzleConfig'; +import { generateDatabaseTypes } from './generateDatabaseTypes'; import { generateDrizzleSchema } from './generateDrizzleSchema'; import { generateDBHandlers } from './generateHandlers'; import { generateSqliteSchema } from './generateSqliteSchema'; -import { generateDatabaseTypes } from './generateDatabaseTypes'; import { scaffoldDocker } from './scaffoldDocker'; type ScaffoldDatabaseProps = Pick< @@ -99,13 +99,11 @@ export const scaffoldDatabase = async ({ createDrizzleConfig({ databaseDirectory, databaseEngine, projectName }); const drizzleTypes = generateDatabaseTypes({ - databaseHost, - authProvider + authProvider, + databaseHost }); - writeFileSync( - join(typesDirectory, 'databaseTypes.ts'), - drizzleTypes - ); + writeFileSync(join(typesDirectory, 'databaseTypes.ts'), drizzleTypes); + return; } diff --git a/src/scaffold.ts b/src/scaffold.ts index 907f9c9..7f9c996 100644 --- a/src/scaffold.ts +++ b/src/scaffold.ts @@ -46,8 +46,12 @@ export const scaffold = async ({ const __dirname = dirname(fileURLToPath(import.meta.url)); const templatesDirectory = join(__dirname, '/templates'); - const { frontendDirectory, backendDirectory, projectAssetsDirectory, typesDirectory } = - initalizeRoot(projectName, templatesDirectory); + const { + frontendDirectory, + backendDirectory, + projectAssetsDirectory, + typesDirectory + } = initalizeRoot(projectName, templatesDirectory); copyFileSync( join(templatesDirectory, 'README.md'), From 13cf37f100636278529d54f9799581531108d465 Mon Sep 17 00:00:00 2001 From: Benzi Date: Mon, 24 Nov 2025 01:10:21 -0500 Subject: [PATCH 4/4] fix: update import for User type --- src/generators/project/generateImportsBlock.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/generators/project/generateImportsBlock.ts b/src/generators/project/generateImportsBlock.ts index 28e7d24..706139a 100644 --- a/src/generators/project/generateImportsBlock.ts +++ b/src/generators/project/generateImportsBlock.ts @@ -159,9 +159,9 @@ export const generateImportsBlock = ({ ...(databaseEngine === 'sqlite' && !isRemoteHost ? [] : [`import { getEnv } from '@absolutejs/absolute'`]), - authProvider === 'absoluteAuth' - ? `import { schema, User } from '../../db/schema'` - : `import { schema } from '../../db/schema'` + ...(authProvider === 'absoluteAuth' + ? [`import { schema } from '../../db/schema'`, `import { User } from '../types/databaseTypes'`] + : [`import { schema } from '../../db/schema'`]) ); }