64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { registerAs } from '@nestjs/config';
|
|
import { ConnectionString } from 'connection-string';
|
|
import { first } from 'lodash';
|
|
import { z } from 'zod';
|
|
import coerceRecordTypes from '../config/utils/coerce-record-types';
|
|
|
|
export const databaseSchema = z.object({
|
|
connectionString: z.string(),
|
|
type: z.enum([
|
|
'mysql',
|
|
'postgres',
|
|
'cockroachdb',
|
|
'sap',
|
|
'mariadb',
|
|
'sqlite',
|
|
'cordova',
|
|
'react-native',
|
|
'nativescript',
|
|
'sqljs',
|
|
'oracle',
|
|
'mssql',
|
|
'mongodb',
|
|
'aurora-mysql',
|
|
'aurora-postgres',
|
|
'expo',
|
|
'better-sqlite3',
|
|
'capacitor',
|
|
'spanner',
|
|
]),
|
|
host: z.string(),
|
|
port: z.number().optional(),
|
|
username: z.string(),
|
|
password: z.string(),
|
|
database: z.string(),
|
|
secure: z.boolean(),
|
|
});
|
|
|
|
export type DatabaseConfig = z.TypeOf<typeof databaseSchema>;
|
|
const rawDatabaseSchema = z.object({
|
|
connectionString: z.string(),
|
|
secure: z.boolean().default(true),
|
|
});
|
|
|
|
export const databaseConfig = registerAs('database', () => {
|
|
const env = coerceRecordTypes(process.env);
|
|
const envParsed = rawDatabaseSchema.strict().parse({
|
|
connectionString: env['DATABASE_CONNECTION_STRING'],
|
|
secure: env['DATABASE_SECURE'],
|
|
});
|
|
|
|
const connectionString = new ConnectionString(envParsed.connectionString);
|
|
const config: DatabaseConfig = databaseSchema.strict().parse({
|
|
connectionString: connectionString.toString(),
|
|
type: connectionString.protocol,
|
|
host: first(connectionString.hosts)?.name,
|
|
port: first(connectionString.hosts)?.port,
|
|
username: connectionString.user,
|
|
password: connectionString.password,
|
|
database: first(connectionString.path),
|
|
secure: envParsed.secure,
|
|
});
|
|
return config;
|
|
});
|