|
1 | 1 | import dotenv from 'dotenv'; |
2 | | -import { z } from 'zod'; |
3 | 2 |
|
4 | 3 | // Load environment variables from .env file |
5 | | -dotenv.config(); |
| 4 | +dotenv.config({quiet: true}); |
6 | 5 |
|
7 | | -// Define schema for required environment variables |
8 | | -const envSchema = z.object({ |
9 | | - PAYSTACK_TEST_SECRET_KEY: z.string().min(30, 'PAYSTACK_TEST_SECRET_KEY is required').refine(val => val.startsWith('sk_test_'), { |
10 | | - message: 'PAYSTACK_TEST_SECRET_KEY must begin with "sk_test_. No live keys allowed."', |
11 | | - }), |
12 | | - NODE_ENV: z.enum(['development', 'production', 'test']).default('development'), |
13 | | - LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'), |
14 | | -}); |
15 | | - |
16 | | -// Validate environment variables |
17 | | -function validateEnv() { |
18 | | - try { |
19 | | - return envSchema.parse({ |
20 | | - PAYSTACK_TEST_SECRET_KEY: process.env.PAYSTACK_TEST_SECRET_KEY, |
21 | | - NODE_ENV: process.env.NODE_ENV || 'development', |
22 | | - LOG_LEVEL: process.env.LOG_LEVEL || 'info', |
23 | | - }); |
24 | | - } catch (error) { |
25 | | - if (error instanceof z.ZodError) { |
26 | | - // Environment validation failed - exit silently |
27 | | - process.exit(1); |
28 | | - } |
29 | | - throw error; |
| 6 | +// Get configuration with optional CLI API key |
| 7 | +export function getConfig(cliApiKey?: string) { |
| 8 | + const apiKey = cliApiKey || process.env.PAYSTACK_TEST_SECRET_KEY; |
| 9 | + |
| 10 | + if (!apiKey) { |
| 11 | + console.error('Error: PAYSTACK_TEST_SECRET_KEY is required'); |
| 12 | + process.exit(1); |
| 13 | + } |
| 14 | + |
| 15 | + if (!apiKey.startsWith('sk_test_')) { |
| 16 | + console.error('Error: PAYSTACK_TEST_SECRET_KEY must begin with "sk_test_". No live keys allowed.'); |
| 17 | + process.exit(1); |
| 18 | + } |
| 19 | + |
| 20 | + if (apiKey.length < 30) { |
| 21 | + console.error('Error: PAYSTACK_TEST_SECRET_KEY appears to be too short'); |
| 22 | + process.exit(1); |
30 | 23 | } |
| 24 | + |
| 25 | + return { |
| 26 | + PAYSTACK_TEST_SECRET_KEY: apiKey, |
| 27 | + NODE_ENV: (process.env.NODE_ENV as 'development' | 'production' | 'test') || 'development', |
| 28 | + LOG_LEVEL: (process.env.LOG_LEVEL as 'debug' | 'info' | 'warn' | 'error') || 'info', |
| 29 | + }; |
31 | 30 | } |
32 | 31 |
|
33 | | -// Export validated configuration |
34 | | -export const config = validateEnv(); |
35 | | - |
36 | | -// Paystack API configuration |
37 | | -export const paystackConfig = { |
38 | | - baseURL: 'https://api.paystack.co', |
39 | | - secretKey: config.PAYSTACK_TEST_SECRET_KEY, |
40 | | - timeout: 30000, // 30 seconds |
41 | | -} as const; |
| 32 | +// Paystack API configuration factory |
| 33 | +export function createPaystackConfig(cliApiKey?: string) { |
| 34 | + const cfg = getConfig(cliApiKey); |
| 35 | + return { |
| 36 | + baseURL: 'https://api.paystack.co', |
| 37 | + secretKey: cfg.PAYSTACK_TEST_SECRET_KEY, |
| 38 | + timeout: 30000, // 30 seconds |
| 39 | + } as const; |
| 40 | +} |
0 commit comments