-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathconfig.ts
More file actions
39 lines (31 loc) · 1.27 KB
/
config.ts
File metadata and controls
39 lines (31 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import dotenv from 'dotenv';
import { z } from 'zod';
dotenv.config();
function isAccelerateUrl(url: string) {
return url.startsWith('prisma://') || url.startsWith('prisma+postgres://');
}
const envSchema = z.object({
DATABASE_URL: z.string().min(1, 'DATABASE_URL is required'),
DIRECT_DATABASE_URL: z.string().min(1, 'DIRECT_DATABASE_URL cannot be empty').optional(),
NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
PAGE_SIZE: z.coerce.number().int().positive().max(100).default(10),
PORT: z.coerce.number().int().positive().default(8080),
});
const env = envSchema.parse(process.env);
const usesAccelerate = isAccelerateUrl(env.DATABASE_URL);
const directDatabaseUrl = env.DIRECT_DATABASE_URL ?? (usesAccelerate ? undefined : env.DATABASE_URL);
if (env.NODE_ENV === 'production' && !usesAccelerate) {
throw new Error('Production requires DATABASE_URL to be a Prisma Accelerate URL.');
}
if (env.NODE_ENV !== 'production' && !directDatabaseUrl) {
throw new Error('Non-production requires a direct PostgreSQL URL via DIRECT_DATABASE_URL or DATABASE_URL.');
}
const config = {
databaseUrl: env.DATABASE_URL,
directDatabaseUrl,
nodeEnv: env.NODE_ENV,
pageSize: env.PAGE_SIZE,
port: env.PORT,
usesAccelerate,
};
export default config;