@engjts/nexus 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/BENCHMARK_REPORT.md +0 -343
- package/documentation/01-getting-started.md +0 -240
- package/documentation/02-context.md +0 -335
- package/documentation/03-routing.md +0 -397
- package/documentation/04-middleware.md +0 -483
- package/documentation/05-validation.md +0 -514
- package/documentation/06-error-handling.md +0 -465
- package/documentation/07-performance.md +0 -364
- package/documentation/08-adapters.md +0 -470
- package/documentation/09-api-reference.md +0 -548
- package/documentation/10-examples.md +0 -582
- package/documentation/11-deployment.md +0 -477
- package/documentation/12-sentry.md +0 -620
- package/documentation/13-sentry-data-storage.md +0 -996
- package/documentation/14-sentry-data-reference.md +0 -457
- package/documentation/15-sentry-summary.md +0 -409
- package/documentation/16-alerts-system.md +0 -745
- package/documentation/17-alert-adapters.md +0 -696
- package/documentation/18-alerts-implementation-summary.md +0 -385
- package/documentation/19-class-based-routing.md +0 -840
- package/documentation/20-websocket-realtime.md +0 -813
- package/documentation/21-cache-system.md +0 -510
- package/documentation/22-job-queue.md +0 -772
- package/documentation/23-sentry-plugin.md +0 -551
- package/documentation/24-testing-utilities.md +0 -1287
- package/documentation/25-api-versioning.md +0 -533
- package/documentation/26-context-store.md +0 -607
- package/documentation/27-dependency-injection.md +0 -329
- package/documentation/28-lifecycle-hooks.md +0 -521
- package/documentation/29-package-structure.md +0 -196
- package/documentation/30-plugin-system.md +0 -414
- package/documentation/31-jwt-authentication.md +0 -597
- package/documentation/32-cli.md +0 -268
- package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
- package/documentation/ALERTS-INDEX.md +0 -330
- package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
- package/documentation/README.md +0 -178
- package/documentation/index.html +0 -34
- package/modern_framework_paper.md +0 -1870
- package/public/css/style.css +0 -87
- package/public/index.html +0 -34
- package/public/js/app.js +0 -27
- package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
- package/src/advanced/cache/MultiTierCache.ts +0 -194
- package/src/advanced/cache/RedisCacheStore.ts +0 -341
- package/src/advanced/cache/index.ts +0 -5
- package/src/advanced/cache/types.ts +0 -40
- package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
- package/src/advanced/graphql/index.ts +0 -22
- package/src/advanced/graphql/server.ts +0 -252
- package/src/advanced/graphql/types.ts +0 -42
- package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
- package/src/advanced/jobs/JobQueue.ts +0 -556
- package/src/advanced/jobs/RedisQueueStore.ts +0 -367
- package/src/advanced/jobs/index.ts +0 -5
- package/src/advanced/jobs/types.ts +0 -70
- package/src/advanced/observability/APMManager.ts +0 -163
- package/src/advanced/observability/AlertManager.ts +0 -109
- package/src/advanced/observability/MetricRegistry.ts +0 -151
- package/src/advanced/observability/ObservabilityCenter.ts +0 -304
- package/src/advanced/observability/StructuredLogger.ts +0 -154
- package/src/advanced/observability/TracingManager.ts +0 -117
- package/src/advanced/observability/adapters.ts +0 -304
- package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
- package/src/advanced/observability/index.ts +0 -11
- package/src/advanced/observability/types.ts +0 -174
- package/src/advanced/playground/extractPathParams.ts +0 -6
- package/src/advanced/playground/generateFieldExample.ts +0 -31
- package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
- package/src/advanced/playground/generateSummary.ts +0 -19
- package/src/advanced/playground/getTagFromPath.ts +0 -9
- package/src/advanced/playground/index.ts +0 -8
- package/src/advanced/playground/playground.ts +0 -250
- package/src/advanced/playground/types.ts +0 -49
- package/src/advanced/playground/zodToExample.ts +0 -16
- package/src/advanced/playground/zodToParams.ts +0 -15
- package/src/advanced/postman/buildAuth.ts +0 -31
- package/src/advanced/postman/buildBody.ts +0 -15
- package/src/advanced/postman/buildQueryParams.ts +0 -27
- package/src/advanced/postman/buildRequestItem.ts +0 -36
- package/src/advanced/postman/buildResponses.ts +0 -11
- package/src/advanced/postman/buildUrl.ts +0 -33
- package/src/advanced/postman/capitalize.ts +0 -4
- package/src/advanced/postman/generateCollection.ts +0 -59
- package/src/advanced/postman/generateEnvironment.ts +0 -34
- package/src/advanced/postman/generateExampleFromZod.ts +0 -21
- package/src/advanced/postman/generateFieldExample.ts +0 -45
- package/src/advanced/postman/generateName.ts +0 -20
- package/src/advanced/postman/generateUUID.ts +0 -11
- package/src/advanced/postman/getTagFromPath.ts +0 -10
- package/src/advanced/postman/index.ts +0 -28
- package/src/advanced/postman/postman.ts +0 -156
- package/src/advanced/postman/slugify.ts +0 -7
- package/src/advanced/postman/types.ts +0 -140
- package/src/advanced/realtime/index.ts +0 -18
- package/src/advanced/realtime/websocket.ts +0 -231
- package/src/advanced/sentry/index.ts +0 -1236
- package/src/advanced/sentry/types.ts +0 -355
- package/src/advanced/static/generateDirectoryListing.ts +0 -47
- package/src/advanced/static/generateETag.ts +0 -7
- package/src/advanced/static/getMimeType.ts +0 -9
- package/src/advanced/static/index.ts +0 -32
- package/src/advanced/static/isSafePath.ts +0 -13
- package/src/advanced/static/publicDir.ts +0 -21
- package/src/advanced/static/serveStatic.ts +0 -225
- package/src/advanced/static/spa.ts +0 -24
- package/src/advanced/static/types.ts +0 -159
- package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
- package/src/advanced/swagger/buildOperation.ts +0 -61
- package/src/advanced/swagger/buildParameters.ts +0 -61
- package/src/advanced/swagger/buildRequestBody.ts +0 -21
- package/src/advanced/swagger/buildResponses.ts +0 -54
- package/src/advanced/swagger/capitalize.ts +0 -5
- package/src/advanced/swagger/convertPath.ts +0 -9
- package/src/advanced/swagger/createSwagger.ts +0 -12
- package/src/advanced/swagger/generateOperationId.ts +0 -21
- package/src/advanced/swagger/generateSpec.ts +0 -105
- package/src/advanced/swagger/generateSummary.ts +0 -24
- package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
- package/src/advanced/swagger/generateThemeCss.ts +0 -53
- package/src/advanced/swagger/index.ts +0 -25
- package/src/advanced/swagger/swagger.ts +0 -237
- package/src/advanced/swagger/types.ts +0 -206
- package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
- package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
- package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
- package/src/advanced/testing/factory.ts +0 -509
- package/src/advanced/testing/harness.ts +0 -612
- package/src/advanced/testing/index.ts +0 -430
- package/src/advanced/testing/load-test.ts +0 -618
- package/src/advanced/testing/mock-server.ts +0 -498
- package/src/advanced/testing/mock.ts +0 -670
- package/src/cli/bin.ts +0 -9
- package/src/cli/cli.ts +0 -158
- package/src/cli/commands/add.ts +0 -178
- package/src/cli/commands/build.ts +0 -73
- package/src/cli/commands/create.ts +0 -166
- package/src/cli/commands/dev.ts +0 -85
- package/src/cli/commands/generate.ts +0 -99
- package/src/cli/commands/help.ts +0 -95
- package/src/cli/commands/init.ts +0 -91
- package/src/cli/commands/version.ts +0 -38
- package/src/cli/index.ts +0 -6
- package/src/cli/templates/generators.ts +0 -359
- package/src/cli/templates/index.ts +0 -680
- package/src/cli/utils/exec.ts +0 -52
- package/src/cli/utils/file-system.ts +0 -78
- package/src/cli/utils/logger.ts +0 -111
- package/src/core/adapter.ts +0 -88
- package/src/core/application.ts +0 -1453
- package/src/core/context-pool.ts +0 -79
- package/src/core/context.ts +0 -856
- package/src/core/index.ts +0 -94
- package/src/core/middleware.ts +0 -272
- package/src/core/performance/buffer-pool.ts +0 -108
- package/src/core/performance/middleware-optimizer.ts +0 -162
- package/src/core/plugin/PluginManager.ts +0 -435
- package/src/core/plugin/builder.ts +0 -358
- package/src/core/plugin/index.ts +0 -50
- package/src/core/plugin/types.ts +0 -214
- package/src/core/router/file-router.ts +0 -623
- package/src/core/router/index.ts +0 -260
- package/src/core/router/radix-tree.ts +0 -242
- package/src/core/serializer.ts +0 -397
- package/src/core/store/index.ts +0 -30
- package/src/core/store/registry.ts +0 -178
- package/src/core/store/request-store.ts +0 -240
- package/src/core/store/types.ts +0 -233
- package/src/core/types.ts +0 -616
- package/src/database/adapter.ts +0 -35
- package/src/database/adapters/index.ts +0 -1
- package/src/database/adapters/mysql.ts +0 -669
- package/src/database/database.ts +0 -70
- package/src/database/dialect.ts +0 -388
- package/src/database/index.ts +0 -12
- package/src/database/migrations.ts +0 -86
- package/src/database/optimizer.ts +0 -125
- package/src/database/query-builder.ts +0 -404
- package/src/database/realtime.ts +0 -53
- package/src/database/schema.ts +0 -71
- package/src/database/transactions.ts +0 -56
- package/src/database/types.ts +0 -87
- package/src/deployment/cluster.ts +0 -471
- package/src/deployment/config.ts +0 -454
- package/src/deployment/docker.ts +0 -599
- package/src/deployment/graceful-shutdown.ts +0 -373
- package/src/deployment/index.ts +0 -56
- package/src/index.ts +0 -281
- package/src/security/adapter.ts +0 -318
- package/src/security/auth/JWTPlugin.ts +0 -234
- package/src/security/auth/JWTProvider.ts +0 -316
- package/src/security/auth/adapter.ts +0 -12
- package/src/security/auth/jwt.ts +0 -234
- package/src/security/auth/middleware.ts +0 -188
- package/src/security/csrf.ts +0 -220
- package/src/security/headers.ts +0 -108
- package/src/security/index.ts +0 -60
- package/src/security/rate-limit/adapter.ts +0 -7
- package/src/security/rate-limit/memory.ts +0 -108
- package/src/security/rate-limit/middleware.ts +0 -181
- package/src/security/sanitization.ts +0 -75
- package/src/security/types.ts +0 -240
- package/src/security/utils.ts +0 -52
- package/tsconfig.json +0 -39
package/src/deployment/config.ts
DELETED
|
@@ -1,454 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment-based Configuration System
|
|
3
|
-
* Provides type-safe configuration with environment separation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { existsSync, readFileSync } from 'fs';
|
|
7
|
-
import { resolve } from 'path';
|
|
8
|
-
|
|
9
|
-
export type Environment = 'development' | 'production' | 'test' | 'staging';
|
|
10
|
-
|
|
11
|
-
export interface ServerConfig {
|
|
12
|
-
port?: number;
|
|
13
|
-
host?: string;
|
|
14
|
-
trustProxy?: boolean;
|
|
15
|
-
maxRequestSize?: string;
|
|
16
|
-
timeout?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface DatabaseConfig {
|
|
20
|
-
url?: string;
|
|
21
|
-
host?: string;
|
|
22
|
-
port?: number;
|
|
23
|
-
database?: string;
|
|
24
|
-
user?: string;
|
|
25
|
-
password?: string;
|
|
26
|
-
pool?: {
|
|
27
|
-
min?: number;
|
|
28
|
-
max?: number;
|
|
29
|
-
idleTimeout?: number;
|
|
30
|
-
connectionTimeout?: number;
|
|
31
|
-
};
|
|
32
|
-
ssl?: boolean | {
|
|
33
|
-
rejectUnauthorized?: boolean;
|
|
34
|
-
ca?: string;
|
|
35
|
-
cert?: string;
|
|
36
|
-
key?: string;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface LoggingConfig {
|
|
41
|
-
level?: 'debug' | 'info' | 'warn' | 'error';
|
|
42
|
-
format?: 'json' | 'pretty';
|
|
43
|
-
colorize?: boolean;
|
|
44
|
-
timestamp?: boolean;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface SecurityConfig {
|
|
48
|
-
headers?: 'strict' | 'relaxed' | 'none';
|
|
49
|
-
cors?: {
|
|
50
|
-
origin?: string | string[] | boolean;
|
|
51
|
-
credentials?: boolean;
|
|
52
|
-
methods?: string[];
|
|
53
|
-
};
|
|
54
|
-
rateLimit?: {
|
|
55
|
-
max?: number;
|
|
56
|
-
window?: string;
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface CacheConfig {
|
|
61
|
-
driver?: 'memory' | 'redis';
|
|
62
|
-
ttl?: number;
|
|
63
|
-
prefix?: string;
|
|
64
|
-
redis?: {
|
|
65
|
-
url?: string;
|
|
66
|
-
host?: string;
|
|
67
|
-
port?: number;
|
|
68
|
-
password?: string;
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface SessionConfig {
|
|
73
|
-
driver?: 'memory' | 'redis';
|
|
74
|
-
secret?: string;
|
|
75
|
-
ttl?: number;
|
|
76
|
-
cookie?: {
|
|
77
|
-
name?: string;
|
|
78
|
-
secure?: boolean;
|
|
79
|
-
httpOnly?: boolean;
|
|
80
|
-
sameSite?: 'strict' | 'lax' | 'none';
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface BaseConfig {
|
|
85
|
-
server?: ServerConfig;
|
|
86
|
-
database?: DatabaseConfig;
|
|
87
|
-
logging?: LoggingConfig;
|
|
88
|
-
security?: SecurityConfig;
|
|
89
|
-
cache?: CacheConfig;
|
|
90
|
-
session?: SessionConfig;
|
|
91
|
-
[key: string]: any;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface ConfigDefinition<T extends BaseConfig = BaseConfig> {
|
|
95
|
-
/**
|
|
96
|
-
* Base configuration applied to all environments
|
|
97
|
-
*/
|
|
98
|
-
base?: T;
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Development environment configuration
|
|
102
|
-
*/
|
|
103
|
-
development?: Partial<T>;
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Production environment configuration
|
|
107
|
-
*/
|
|
108
|
-
production?: Partial<T>;
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Test environment configuration
|
|
112
|
-
*/
|
|
113
|
-
test?: Partial<T>;
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Staging environment configuration
|
|
117
|
-
*/
|
|
118
|
-
staging?: Partial<T>;
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Custom environment configurations
|
|
122
|
-
*/
|
|
123
|
-
[env: string]: Partial<T> | undefined;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export interface ConfigOptions {
|
|
127
|
-
/**
|
|
128
|
-
* Environment variable name for environment
|
|
129
|
-
* @default 'NODE_ENV'
|
|
130
|
-
*/
|
|
131
|
-
envKey?: string;
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Default environment if not specified
|
|
135
|
-
* @default 'development'
|
|
136
|
-
*/
|
|
137
|
-
defaultEnv?: Environment;
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Path to .env file
|
|
141
|
-
*/
|
|
142
|
-
envFile?: string;
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Whether to load .env file
|
|
146
|
-
* @default true
|
|
147
|
-
*/
|
|
148
|
-
loadEnvFile?: boolean;
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Environment variable prefix for auto-loading
|
|
152
|
-
* @default 'APP_'
|
|
153
|
-
*/
|
|
154
|
-
envPrefix?: string;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Deep merge utility
|
|
159
|
-
*/
|
|
160
|
-
function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {
|
|
161
|
-
const result = { ...target };
|
|
162
|
-
|
|
163
|
-
for (const key in source) {
|
|
164
|
-
const sourceValue = source[key];
|
|
165
|
-
const targetValue = result[key];
|
|
166
|
-
|
|
167
|
-
if (
|
|
168
|
-
sourceValue !== null &&
|
|
169
|
-
typeof sourceValue === 'object' &&
|
|
170
|
-
!Array.isArray(sourceValue) &&
|
|
171
|
-
targetValue !== null &&
|
|
172
|
-
typeof targetValue === 'object' &&
|
|
173
|
-
!Array.isArray(targetValue)
|
|
174
|
-
) {
|
|
175
|
-
result[key] = deepMerge(targetValue, sourceValue as any);
|
|
176
|
-
} else if (sourceValue !== undefined) {
|
|
177
|
-
result[key] = sourceValue as any;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return result;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Parse environment variable value
|
|
186
|
-
*/
|
|
187
|
-
function parseEnvValue(value: string): any {
|
|
188
|
-
// Boolean
|
|
189
|
-
if (value.toLowerCase() === 'true') return true;
|
|
190
|
-
if (value.toLowerCase() === 'false') return false;
|
|
191
|
-
|
|
192
|
-
// Number
|
|
193
|
-
if (/^-?\d+$/.test(value)) return parseInt(value, 10);
|
|
194
|
-
if (/^-?\d+\.\d+$/.test(value)) return parseFloat(value);
|
|
195
|
-
|
|
196
|
-
// JSON
|
|
197
|
-
if ((value.startsWith('{') && value.endsWith('}')) || (value.startsWith('[') && value.endsWith(']'))) {
|
|
198
|
-
try {
|
|
199
|
-
return JSON.parse(value);
|
|
200
|
-
} catch {
|
|
201
|
-
return value;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
return value;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Load .env file
|
|
210
|
-
*/
|
|
211
|
-
function loadEnvFile(filePath: string): void {
|
|
212
|
-
if (!existsSync(filePath)) return;
|
|
213
|
-
|
|
214
|
-
const content = readFileSync(filePath, 'utf-8');
|
|
215
|
-
const lines = content.split('\n');
|
|
216
|
-
|
|
217
|
-
for (const line of lines) {
|
|
218
|
-
const trimmed = line.trim();
|
|
219
|
-
|
|
220
|
-
// Skip empty lines and comments
|
|
221
|
-
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
222
|
-
|
|
223
|
-
const equalIndex = trimmed.indexOf('=');
|
|
224
|
-
if (equalIndex === -1) continue;
|
|
225
|
-
|
|
226
|
-
const key = trimmed.slice(0, equalIndex).trim();
|
|
227
|
-
let value = trimmed.slice(equalIndex + 1).trim();
|
|
228
|
-
|
|
229
|
-
// Remove quotes
|
|
230
|
-
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
231
|
-
value = value.slice(1, -1);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Don't override existing env vars
|
|
235
|
-
if (process.env[key] === undefined) {
|
|
236
|
-
process.env[key] = value;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Configuration Manager
|
|
243
|
-
*/
|
|
244
|
-
export class ConfigManager<T extends BaseConfig = BaseConfig> {
|
|
245
|
-
private config: T;
|
|
246
|
-
private environment: Environment;
|
|
247
|
-
private options: Required<ConfigOptions>;
|
|
248
|
-
|
|
249
|
-
constructor(definition: ConfigDefinition<T>, options: ConfigOptions = {}) {
|
|
250
|
-
this.options = {
|
|
251
|
-
envKey: options.envKey ?? 'NODE_ENV',
|
|
252
|
-
defaultEnv: options.defaultEnv ?? 'development',
|
|
253
|
-
envFile: options.envFile ?? '.env',
|
|
254
|
-
loadEnvFile: options.loadEnvFile ?? true,
|
|
255
|
-
envPrefix: options.envPrefix ?? 'APP_'
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
// Load .env file if enabled
|
|
259
|
-
if (this.options.loadEnvFile) {
|
|
260
|
-
const envPath = resolve(process.cwd(), this.options.envFile);
|
|
261
|
-
loadEnvFile(envPath);
|
|
262
|
-
|
|
263
|
-
// Also try environment-specific .env files
|
|
264
|
-
const env = this.getEnvironment();
|
|
265
|
-
const envSpecificPath = resolve(process.cwd(), `.env.${env}`);
|
|
266
|
-
loadEnvFile(envSpecificPath);
|
|
267
|
-
|
|
268
|
-
// Local overrides (not committed to git)
|
|
269
|
-
const localPath = resolve(process.cwd(), '.env.local');
|
|
270
|
-
loadEnvFile(localPath);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
this.environment = this.getEnvironment();
|
|
274
|
-
this.config = this.buildConfig(definition);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Get current environment
|
|
279
|
-
*/
|
|
280
|
-
private getEnvironment(): Environment {
|
|
281
|
-
const env = process.env[this.options.envKey];
|
|
282
|
-
if (env && ['development', 'production', 'test', 'staging'].includes(env)) {
|
|
283
|
-
return env as Environment;
|
|
284
|
-
}
|
|
285
|
-
return this.options.defaultEnv;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Build configuration by merging base with environment-specific
|
|
290
|
-
*/
|
|
291
|
-
private buildConfig(definition: ConfigDefinition<T>): T {
|
|
292
|
-
const base = definition.base || ({} as T);
|
|
293
|
-
const envConfig = definition[this.environment] || {};
|
|
294
|
-
|
|
295
|
-
let config = deepMerge(base, envConfig);
|
|
296
|
-
|
|
297
|
-
// Override with environment variables
|
|
298
|
-
config = this.applyEnvOverrides(config);
|
|
299
|
-
|
|
300
|
-
return config;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Apply environment variable overrides
|
|
305
|
-
*/
|
|
306
|
-
private applyEnvOverrides(config: T): T {
|
|
307
|
-
const prefix = this.options.envPrefix;
|
|
308
|
-
const result = { ...config };
|
|
309
|
-
|
|
310
|
-
for (const [key, value] of Object.entries(process.env)) {
|
|
311
|
-
if (!key.startsWith(prefix)) continue;
|
|
312
|
-
|
|
313
|
-
// Convert APP_SERVER_PORT to server.port
|
|
314
|
-
const configPath = key
|
|
315
|
-
.slice(prefix.length)
|
|
316
|
-
.toLowerCase()
|
|
317
|
-
.split('_')
|
|
318
|
-
.reduce((path, part, index) => {
|
|
319
|
-
if (index === 0) return part;
|
|
320
|
-
return path + '.' + part;
|
|
321
|
-
}, '');
|
|
322
|
-
|
|
323
|
-
this.setNestedValue(result, configPath, parseEnvValue(value!));
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
return result;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/**
|
|
330
|
-
* Set a nested value in an object
|
|
331
|
-
*/
|
|
332
|
-
private setNestedValue(obj: any, path: string, value: any): void {
|
|
333
|
-
const parts = path.split('.');
|
|
334
|
-
let current = obj;
|
|
335
|
-
|
|
336
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
337
|
-
const part = parts[i];
|
|
338
|
-
if (current[part] === undefined) {
|
|
339
|
-
current[part] = {};
|
|
340
|
-
}
|
|
341
|
-
current = current[part];
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
current[parts[parts.length - 1]] = value;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Get a configuration value
|
|
349
|
-
*/
|
|
350
|
-
get<K extends keyof T>(key: K): T[K];
|
|
351
|
-
get<V = any>(path: string): V;
|
|
352
|
-
get(keyOrPath: string): any {
|
|
353
|
-
if (keyOrPath in this.config) {
|
|
354
|
-
return this.config[keyOrPath as keyof T];
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
const parts = keyOrPath.split('.');
|
|
358
|
-
let current: any = this.config;
|
|
359
|
-
|
|
360
|
-
for (const part of parts) {
|
|
361
|
-
if (current === undefined || current === null) return undefined;
|
|
362
|
-
current = current[part];
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
return current;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
/**
|
|
369
|
-
* Check if a configuration key exists
|
|
370
|
-
*/
|
|
371
|
-
has(path: string): boolean {
|
|
372
|
-
return this.get(path) !== undefined;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
/**
|
|
376
|
-
* Get all configuration
|
|
377
|
-
*/
|
|
378
|
-
all(): T {
|
|
379
|
-
return { ...this.config };
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* Get current environment
|
|
384
|
-
*/
|
|
385
|
-
env(): Environment {
|
|
386
|
-
return this.environment;
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/**
|
|
390
|
-
* Check if current environment matches
|
|
391
|
-
*/
|
|
392
|
-
isEnv(env: Environment): boolean {
|
|
393
|
-
return this.environment === env;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Check if running in production
|
|
398
|
-
*/
|
|
399
|
-
isProduction(): boolean {
|
|
400
|
-
return this.environment === 'production';
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/**
|
|
404
|
-
* Check if running in development
|
|
405
|
-
*/
|
|
406
|
-
isDevelopment(): boolean {
|
|
407
|
-
return this.environment === 'development';
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* Check if running in test
|
|
412
|
-
*/
|
|
413
|
-
isTest(): boolean {
|
|
414
|
-
return this.environment === 'test';
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
/**
|
|
418
|
-
* Get environment variable with optional default
|
|
419
|
-
*/
|
|
420
|
-
static env<T = string>(key: string, defaultValue?: T): T {
|
|
421
|
-
const value = process.env[key];
|
|
422
|
-
if (value === undefined) {
|
|
423
|
-
return defaultValue as T;
|
|
424
|
-
}
|
|
425
|
-
return parseEnvValue(value) as T;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
/**
|
|
429
|
-
* Require an environment variable (throws if not set)
|
|
430
|
-
*/
|
|
431
|
-
static requireEnv(key: string): string {
|
|
432
|
-
const value = process.env[key];
|
|
433
|
-
if (value === undefined) {
|
|
434
|
-
throw new Error(`Required environment variable ${key} is not set`);
|
|
435
|
-
}
|
|
436
|
-
return value;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Define a type-safe configuration
|
|
442
|
-
*/
|
|
443
|
-
export function defineConfig<T extends BaseConfig>(
|
|
444
|
-
definition: ConfigDefinition<T>,
|
|
445
|
-
options?: ConfigOptions
|
|
446
|
-
): ConfigManager<T> {
|
|
447
|
-
return new ConfigManager(definition, options);
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Quick access to environment variables
|
|
452
|
-
*/
|
|
453
|
-
export const env = ConfigManager.env;
|
|
454
|
-
export const requireEnv = ConfigManager.requireEnv;
|