TypeScript · 2018 bytes Raw Blame History
1 import { z } from 'zod';
2
3 const configSchema = z.object({
4 port: z.number().default(3000),
5 host: z.string().default('0.0.0.0'),
6 nodeEnv: z.enum(['development', 'production', 'test']).default('development'),
7
8 // ZephyrFS Node integration
9 zephyrfsNodeUrl: z.string().default('http://localhost:8080'),
10 zephyrfsNodeTimeout: z.number().default(30000),
11
12 // Authentication
13 jwtSecret: z.string().min(32),
14 jwtExpiresIn: z.string().default('24h'),
15 jwtRefreshExpiresIn: z.string().default('7d'),
16
17 // CORS
18 corsOrigins: z.array(z.string()).default(['http://localhost:5173']),
19
20 // File upload limits
21 maxFileSize: z.number().default(1024 * 1024 * 1024), // 1GB
22 maxChunkSize: z.number().default(1024 * 1024), // 1MB
23
24 // WebDAV
25 webdavEnabled: z.boolean().default(true),
26 webdavPath: z.string().default('/webdav'),
27
28 // Logging
29 logLevel: z.enum(['error', 'warn', 'info', 'debug']).default('info'),
30 });
31
32 export type Config = z.infer<typeof configSchema>;
33
34 export function loadConfig(): Config {
35 const rawConfig = {
36 port: parseInt(process.env.PORT || '3000'),
37 host: process.env.HOST || '0.0.0.0',
38 nodeEnv: process.env.NODE_ENV || 'development',
39
40 zephyrfsNodeUrl: process.env.ZEPHYRFS_NODE_URL || 'http://localhost:8080',
41 zephyrfsNodeTimeout: parseInt(process.env.ZEPHYRFS_NODE_TIMEOUT || '30000'),
42
43 jwtSecret: process.env.JWT_SECRET || 'change-this-in-production-min-32-chars-long',
44 jwtExpiresIn: process.env.JWT_EXPIRES_IN || '24h',
45 jwtRefreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '7d',
46
47 corsOrigins: process.env.CORS_ORIGINS?.split(',') || ['http://localhost:5173'],
48
49 maxFileSize: parseInt(process.env.MAX_FILE_SIZE || (1024 * 1024 * 1024).toString()),
50 maxChunkSize: parseInt(process.env.MAX_CHUNK_SIZE || (1024 * 1024).toString()),
51
52 webdavEnabled: process.env.WEBDAV_ENABLED !== 'false',
53 webdavPath: process.env.WEBDAV_PATH || '/webdav',
54
55 logLevel: process.env.LOG_LEVEL || 'info',
56 };
57
58 return configSchema.parse(rawConfig);
59 }