| 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 |
} |