mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-18 02:49:41 +02:00
- 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)
129 lines
2.9 KiB
TypeScript
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';
|