managarten/packages/shared-drizzle-config/src/index.ts
Till-JS 6807543d60 🔧 chore: create @manacore/shared-drizzle-config and migrate 16 configs
- Create factory function with dbName, schemaPath, outDir, schemaFilter options
- Migrate 12 app backends: calendar, chat, clock, contacts, nutriphi, picture,
  planta, presi, questions, skilltree, storage, todo
- Migrate 4 services: mana-core-auth, telegram-zitare-bot, telegram-todo-bot,
  telegram-nutriphi-bot
- Update consolidation docs with completed Drizzle config task

Savings: ~160 LOC (16 configs × ~10 LOC each)
2026-01-29 16:54:44 +01:00

129 lines
2.9 KiB
TypeScript

import { defineConfig, type Config } from 'drizzle-kit';
export interface DrizzleConfigOptions {
/**
* Database name for fallback URL when DATABASE_URL is not set
* Example: 'calendar' -> postgresql://manacore:devpassword@localhost:5432/calendar
*/
dbName: string;
/**
* Path to schema file(s)
* @default './src/db/schema/index.ts'
*/
schemaPath?: string;
/**
* Output directory for migrations
* @default './src/db/migrations'
*/
outDir?: string;
/**
* Environment variable name for database URL
* @default 'DATABASE_URL'
*/
envVar?: string;
/**
* Additional environment variable names to check (in order)
* Example: ['STORAGE_DATABASE_URL'] for storage backend
*/
additionalEnvVars?: string[];
/**
* Schema filter for multi-schema databases
* Example: ['auth', 'credits', 'public']
*/
schemaFilter?: string[];
/**
* Enable verbose output
* @default true
*/
verbose?: boolean;
/**
* Enable strict mode
* @default true
*/
strict?: boolean;
}
/**
* Default PostgreSQL connection for local development
*/
const DEFAULT_PG_HOST = 'localhost';
const DEFAULT_PG_PORT = '5432';
const DEFAULT_PG_USER = 'manacore';
const DEFAULT_PG_PASSWORD = 'devpassword';
/**
* Creates a Drizzle Kit configuration with sensible defaults
*
* @example
* // Basic usage
* export default createDrizzleConfig({ dbName: 'calendar' });
*
* @example
* // With custom paths
* export default createDrizzleConfig({
* dbName: 'calendar',
* schemaPath: './src/database/schema.ts',
* outDir: './drizzle',
* });
*
* @example
* // With schema filter (multi-schema)
* export default createDrizzleConfig({
* dbName: 'manacore',
* schemaFilter: ['auth', 'credits', 'public'],
* });
*/
export function createDrizzleConfig(options: DrizzleConfigOptions): Config {
const {
dbName,
schemaPath = './src/db/schema/index.ts',
outDir = './src/db/migrations',
envVar = 'DATABASE_URL',
additionalEnvVars = [],
schemaFilter,
verbose = true,
strict = true,
} = options;
// Build fallback URL
const fallbackUrl = `postgresql://${DEFAULT_PG_USER}:${DEFAULT_PG_PASSWORD}@${DEFAULT_PG_HOST}:${DEFAULT_PG_PORT}/${dbName}`;
// Check all env vars in order
let databaseUrl: string | undefined;
for (const envVarName of [...additionalEnvVars, envVar]) {
if (process.env[envVarName]) {
databaseUrl = process.env[envVarName];
break;
}
}
databaseUrl = databaseUrl || fallbackUrl;
const config: Config = {
dialect: 'postgresql',
schema: schemaPath,
out: outDir,
dbCredentials: {
url: databaseUrl,
},
verbose,
strict,
};
// Add schema filter if provided
if (schemaFilter && schemaFilter.length > 0) {
config.schemaFilter = schemaFilter;
}
return defineConfig(config);
}
// Re-export defineConfig for cases where more customization is needed
export { defineConfig } from 'drizzle-kit';
export type { Config } from 'drizzle-kit';