@dyanet/config-aws 1.0.0

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.
Files changed (122) hide show
  1. package/README.md +195 -0
  2. package/dist/cjs/config-manager.js +360 -0
  3. package/dist/cjs/config-manager.js.map +1 -0
  4. package/dist/cjs/errors/index.js +65 -0
  5. package/dist/cjs/errors/index.js.map +1 -0
  6. package/dist/cjs/index.js +37 -0
  7. package/dist/cjs/index.js.map +1 -0
  8. package/dist/cjs/interfaces/config-loader.interface.js +3 -0
  9. package/dist/cjs/interfaces/config-loader.interface.js.map +1 -0
  10. package/dist/cjs/interfaces/config-manager.interface.js +3 -0
  11. package/dist/cjs/interfaces/config-manager.interface.js.map +1 -0
  12. package/dist/cjs/interfaces/env-file-loader.interface.js +3 -0
  13. package/dist/cjs/interfaces/env-file-loader.interface.js.map +1 -0
  14. package/dist/cjs/interfaces/environment-loader.interface.js +3 -0
  15. package/dist/cjs/interfaces/environment-loader.interface.js.map +1 -0
  16. package/dist/cjs/interfaces/index.js +3 -0
  17. package/dist/cjs/interfaces/index.js.map +1 -0
  18. package/dist/cjs/interfaces/s3-loader.interface.js +3 -0
  19. package/dist/cjs/interfaces/s3-loader.interface.js.map +1 -0
  20. package/dist/cjs/interfaces/secrets-manager-loader.interface.js +3 -0
  21. package/dist/cjs/interfaces/secrets-manager-loader.interface.js.map +1 -0
  22. package/dist/cjs/interfaces/ssm-parameter-store-loader.interface.js +3 -0
  23. package/dist/cjs/interfaces/ssm-parameter-store-loader.interface.js.map +1 -0
  24. package/dist/cjs/loaders/env-file.loader.js +167 -0
  25. package/dist/cjs/loaders/env-file.loader.js.map +1 -0
  26. package/dist/cjs/loaders/environment.loader.js +83 -0
  27. package/dist/cjs/loaders/environment.loader.js.map +1 -0
  28. package/dist/cjs/loaders/index.js +14 -0
  29. package/dist/cjs/loaders/index.js.map +1 -0
  30. package/dist/cjs/loaders/s3.loader.js +141 -0
  31. package/dist/cjs/loaders/s3.loader.js.map +1 -0
  32. package/dist/cjs/loaders/secrets-manager.loader.js +156 -0
  33. package/dist/cjs/loaders/secrets-manager.loader.js.map +1 -0
  34. package/dist/cjs/loaders/ssm-parameter-store.loader.js +193 -0
  35. package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +1 -0
  36. package/dist/cjs/utils/env-file-parser.util.js +98 -0
  37. package/dist/cjs/utils/env-file-parser.util.js.map +1 -0
  38. package/dist/cjs/utils/index.js +8 -0
  39. package/dist/cjs/utils/index.js.map +1 -0
  40. package/dist/cjs/utils/validation.util.js +116 -0
  41. package/dist/cjs/utils/validation.util.js.map +1 -0
  42. package/dist/esm/config-manager.js +356 -0
  43. package/dist/esm/config-manager.js.map +1 -0
  44. package/dist/esm/errors/index.js +57 -0
  45. package/dist/esm/errors/index.js.map +1 -0
  46. package/dist/esm/index.js +21 -0
  47. package/dist/esm/index.js.map +1 -0
  48. package/dist/esm/interfaces/config-loader.interface.js +2 -0
  49. package/dist/esm/interfaces/config-loader.interface.js.map +1 -0
  50. package/dist/esm/interfaces/config-manager.interface.js +2 -0
  51. package/dist/esm/interfaces/config-manager.interface.js.map +1 -0
  52. package/dist/esm/interfaces/env-file-loader.interface.js +2 -0
  53. package/dist/esm/interfaces/env-file-loader.interface.js.map +1 -0
  54. package/dist/esm/interfaces/environment-loader.interface.js +2 -0
  55. package/dist/esm/interfaces/environment-loader.interface.js.map +1 -0
  56. package/dist/esm/interfaces/index.js +2 -0
  57. package/dist/esm/interfaces/index.js.map +1 -0
  58. package/dist/esm/interfaces/s3-loader.interface.js +2 -0
  59. package/dist/esm/interfaces/s3-loader.interface.js.map +1 -0
  60. package/dist/esm/interfaces/secrets-manager-loader.interface.js +2 -0
  61. package/dist/esm/interfaces/secrets-manager-loader.interface.js.map +1 -0
  62. package/dist/esm/interfaces/ssm-parameter-store-loader.interface.js +2 -0
  63. package/dist/esm/interfaces/ssm-parameter-store-loader.interface.js.map +1 -0
  64. package/dist/esm/loaders/env-file.loader.js +130 -0
  65. package/dist/esm/loaders/env-file.loader.js.map +1 -0
  66. package/dist/esm/loaders/environment.loader.js +79 -0
  67. package/dist/esm/loaders/environment.loader.js.map +1 -0
  68. package/dist/esm/loaders/index.js +6 -0
  69. package/dist/esm/loaders/index.js.map +1 -0
  70. package/dist/esm/loaders/s3.loader.js +137 -0
  71. package/dist/esm/loaders/s3.loader.js.map +1 -0
  72. package/dist/esm/loaders/secrets-manager.loader.js +152 -0
  73. package/dist/esm/loaders/secrets-manager.loader.js.map +1 -0
  74. package/dist/esm/loaders/ssm-parameter-store.loader.js +189 -0
  75. package/dist/esm/loaders/ssm-parameter-store.loader.js.map +1 -0
  76. package/dist/esm/utils/env-file-parser.util.js +94 -0
  77. package/dist/esm/utils/env-file-parser.util.js.map +1 -0
  78. package/dist/esm/utils/index.js +3 -0
  79. package/dist/esm/utils/index.js.map +1 -0
  80. package/dist/esm/utils/validation.util.js +112 -0
  81. package/dist/esm/utils/validation.util.js.map +1 -0
  82. package/dist/types/config-manager.d.ts +119 -0
  83. package/dist/types/config-manager.d.ts.map +1 -0
  84. package/dist/types/errors/index.d.ts +43 -0
  85. package/dist/types/errors/index.d.ts.map +1 -0
  86. package/dist/types/index.d.ts +24 -0
  87. package/dist/types/index.d.ts.map +1 -0
  88. package/dist/types/interfaces/config-loader.interface.d.ts +33 -0
  89. package/dist/types/interfaces/config-loader.interface.d.ts.map +1 -0
  90. package/dist/types/interfaces/config-manager.interface.d.ts +86 -0
  91. package/dist/types/interfaces/config-manager.interface.d.ts.map +1 -0
  92. package/dist/types/interfaces/env-file-loader.interface.d.ts +12 -0
  93. package/dist/types/interfaces/env-file-loader.interface.d.ts.map +1 -0
  94. package/dist/types/interfaces/environment-loader.interface.d.ts +10 -0
  95. package/dist/types/interfaces/environment-loader.interface.d.ts.map +1 -0
  96. package/dist/types/interfaces/index.d.ts +8 -0
  97. package/dist/types/interfaces/index.d.ts.map +1 -0
  98. package/dist/types/interfaces/s3-loader.interface.d.ts +14 -0
  99. package/dist/types/interfaces/s3-loader.interface.d.ts.map +1 -0
  100. package/dist/types/interfaces/secrets-manager-loader.interface.d.ts +12 -0
  101. package/dist/types/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
  102. package/dist/types/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
  103. package/dist/types/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
  104. package/dist/types/loaders/env-file.loader.d.ts +69 -0
  105. package/dist/types/loaders/env-file.loader.d.ts.map +1 -0
  106. package/dist/types/loaders/environment.loader.d.ts +46 -0
  107. package/dist/types/loaders/environment.loader.d.ts.map +1 -0
  108. package/dist/types/loaders/index.d.ts +6 -0
  109. package/dist/types/loaders/index.d.ts.map +1 -0
  110. package/dist/types/loaders/s3.loader.d.ts +62 -0
  111. package/dist/types/loaders/s3.loader.d.ts.map +1 -0
  112. package/dist/types/loaders/secrets-manager.loader.d.ts +68 -0
  113. package/dist/types/loaders/secrets-manager.loader.d.ts.map +1 -0
  114. package/dist/types/loaders/ssm-parameter-store.loader.d.ts +78 -0
  115. package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
  116. package/dist/types/utils/env-file-parser.util.d.ts +45 -0
  117. package/dist/types/utils/env-file-parser.util.d.ts.map +1 -0
  118. package/dist/types/utils/index.d.ts +3 -0
  119. package/dist/types/utils/index.d.ts.map +1 -0
  120. package/dist/types/utils/validation.util.d.ts +53 -0
  121. package/dist/types/utils/validation.util.d.ts.map +1 -0
  122. package/package.json +97 -0
package/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # @dyanet/config-aws
2
+
3
+ Framework-agnostic AWS configuration management library for Node.js applications.
4
+
5
+ ## Features
6
+
7
+ - **Multiple Configuration Sources**: Load configuration from environment variables, `.env` files, AWS Secrets Manager, AWS SSM Parameter Store, and S3
8
+ - **Configurable Precedence**: Control which sources override others with `aws-first`, `local-first`, or custom precedence strategies
9
+ - **AWS ECS Compatible**: `.env` file parsing follows the [AWS ECS environment file format](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html)
10
+ - **Zod Validation**: Optional schema validation using Zod
11
+ - **Framework Agnostic**: Works with any JavaScript/TypeScript application
12
+ - **Tree-Shakeable**: ESM and CommonJS builds with full tree-shaking support
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @dyanet/config-aws
18
+ ```
19
+
20
+ ### Peer Dependencies
21
+
22
+ Install the AWS SDK clients you need:
23
+
24
+ ```bash
25
+ # For Secrets Manager
26
+ npm install @aws-sdk/client-secrets-manager
27
+
28
+ # For SSM Parameter Store
29
+ npm install @aws-sdk/client-ssm
30
+
31
+ # For S3
32
+ npm install @aws-sdk/client-s3
33
+
34
+ # For schema validation
35
+ npm install zod
36
+ ```
37
+
38
+ ## Quick Start
39
+
40
+ ```typescript
41
+ import { ConfigManager, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/config-aws';
42
+ import { z } from 'zod';
43
+
44
+ // Define your configuration schema
45
+ const configSchema = z.object({
46
+ DATABASE_URL: z.string(),
47
+ API_KEY: z.string(),
48
+ PORT: z.string().transform(Number),
49
+ });
50
+
51
+ // Create and load configuration
52
+ const configManager = new ConfigManager({
53
+ loaders: [
54
+ new EnvironmentLoader({ prefix: 'APP_' }),
55
+ new SecretsManagerLoader({ secretName: '/myapp/config' }),
56
+ ],
57
+ schema: configSchema,
58
+ precedence: 'aws-first', // AWS values override local
59
+ });
60
+
61
+ await configManager.load();
62
+
63
+ // Access configuration
64
+ const dbUrl = configManager.get('DATABASE_URL');
65
+ const allConfig = configManager.getAll();
66
+ ```
67
+
68
+ ## Loaders
69
+
70
+ ### EnvironmentLoader
71
+
72
+ Loads configuration from `process.env` with optional prefix filtering.
73
+
74
+ ```typescript
75
+ new EnvironmentLoader({
76
+ prefix: 'APP_', // Only load vars starting with APP_
77
+ exclude: ['APP_DEBUG'] // Exclude specific variables
78
+ });
79
+ ```
80
+
81
+ ### EnvFileLoader
82
+
83
+ Loads configuration from `.env` files using AWS ECS format.
84
+
85
+ ```typescript
86
+ new EnvFileLoader({
87
+ paths: ['.env', '.env.local'], // Files to load (later overrides earlier)
88
+ override: true // Whether later files override earlier
89
+ });
90
+ ```
91
+
92
+ ### S3Loader
93
+
94
+ Loads configuration from S3 buckets (JSON or `.env` format).
95
+
96
+ ```typescript
97
+ new S3Loader({
98
+ bucket: 'my-config-bucket',
99
+ key: 'config/production.json',
100
+ format: 'auto' // 'json', 'env', or 'auto'
101
+ });
102
+ ```
103
+
104
+ ### SecretsManagerLoader
105
+
106
+ Loads configuration from AWS Secrets Manager.
107
+
108
+ ```typescript
109
+ new SecretsManagerLoader({
110
+ secretName: '/myapp/secrets',
111
+ region: 'us-east-1',
112
+ environmentMapping: {
113
+ local: 'dev',
114
+ development: 'dev',
115
+ production: 'prod'
116
+ }
117
+ });
118
+ ```
119
+
120
+ ### SSMParameterStoreLoader
121
+
122
+ Loads configuration from AWS SSM Parameter Store.
123
+
124
+ ```typescript
125
+ new SSMParameterStoreLoader({
126
+ parameterPath: '/myapp/config',
127
+ region: 'us-east-1',
128
+ withDecryption: true
129
+ });
130
+ ```
131
+
132
+ ## Precedence Strategies
133
+
134
+ - **`aws-first`**: Local sources load first, AWS sources override (AWS wins)
135
+ - **`local-first`**: AWS sources load first, local sources override (local wins)
136
+ - **Custom**: Define your own order with `LoaderPrecedence[]`
137
+
138
+ ```typescript
139
+ // Custom precedence (higher priority = later, overrides earlier)
140
+ const configManager = new ConfigManager({
141
+ loaders: [envLoader, secretsLoader, ssmLoader],
142
+ precedence: [
143
+ { loader: 'EnvironmentLoader', priority: 1 },
144
+ { loader: 'SecretsManagerLoader', priority: 2 },
145
+ { loader: 'SSMParameterStoreLoader', priority: 3 }, // Highest priority wins
146
+ ]
147
+ });
148
+ ```
149
+
150
+ ## Verbose Logging
151
+
152
+ Enable detailed logging to debug configuration loading:
153
+
154
+ ```typescript
155
+ const configManager = new ConfigManager({
156
+ loaders: [...],
157
+ verbose: {
158
+ logKeys: true, // Log variable names
159
+ logOverrides: true, // Log when values are overridden
160
+ logTiming: true, // Log loader timing
161
+ logValues: false, // Don't log values (security)
162
+ }
163
+ });
164
+ ```
165
+
166
+ ## Error Handling
167
+
168
+ The library provides specific error classes:
169
+
170
+ - `ConfigurationError` - Base error class
171
+ - `ValidationError` - Zod schema validation failed
172
+ - `AWSServiceError` - AWS API call failed
173
+ - `ConfigurationLoadError` - Loader failed to load
174
+ - `MissingConfigurationError` - Required keys missing
175
+
176
+ ```typescript
177
+ try {
178
+ await configManager.load();
179
+ } catch (error) {
180
+ if (error instanceof ValidationError) {
181
+ console.error('Invalid config:', error.validationErrors);
182
+ } else if (error instanceof AWSServiceError) {
183
+ console.error(`AWS ${error.service} failed:`, error.message);
184
+ }
185
+ }
186
+ ```
187
+
188
+ ## Framework Adapters
189
+
190
+ - **NestJS**: Use `@dyanet/nestjs-config-aws` for NestJS integration
191
+ - **Next.js**: Use `@dyanet/nextjs-config-aws` for Next.js integration
192
+
193
+ ## License
194
+
195
+ MIT
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigManager = void 0;
4
+ const errors_1 = require("./errors");
5
+ /**
6
+ * Default console logger implementation
7
+ */
8
+ const defaultLogger = {
9
+ log: (message) => console.log(message),
10
+ error: (message) => console.error(message),
11
+ warn: (message) => console.warn(message),
12
+ debug: (message) => console.debug(message),
13
+ };
14
+ /**
15
+ * Default sensitive keys that should always be masked
16
+ */
17
+ const DEFAULT_SENSITIVE_KEYS = ['password', 'secret', 'key', 'token', 'credential', 'api_key', 'apikey'];
18
+ /**
19
+ * Default verbose options
20
+ */
21
+ const DEFAULT_VERBOSE_OPTIONS = {
22
+ logKeys: true,
23
+ logValues: false,
24
+ logOverrides: true,
25
+ logTiming: true,
26
+ maskValues: true,
27
+ sensitiveKeys: DEFAULT_SENSITIVE_KEYS,
28
+ };
29
+ /**
30
+ * Predefined precedence orders for common strategies
31
+ * Higher index = higher priority (later loaders override earlier ones)
32
+ */
33
+ const PRECEDENCE_ORDERS = {
34
+ // AWS wins: env -> envFile -> s3 -> secretsManager -> ssm
35
+ 'aws-first': [
36
+ 'EnvironmentLoader',
37
+ 'EnvFileLoader',
38
+ 'S3Loader',
39
+ 'SecretsManagerLoader',
40
+ 'SSMParameterStoreLoader',
41
+ ],
42
+ // Local wins: ssm -> secretsManager -> s3 -> envFile -> env
43
+ 'local-first': [
44
+ 'SSMParameterStoreLoader',
45
+ 'SecretsManagerLoader',
46
+ 'S3Loader',
47
+ 'EnvFileLoader',
48
+ 'EnvironmentLoader',
49
+ ],
50
+ };
51
+ /**
52
+ * ConfigManager orchestrates loading configuration from multiple sources
53
+ * with configurable precedence and validation.
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { ConfigManager, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/config-aws';
58
+ * import { z } from 'zod';
59
+ *
60
+ * const schema = z.object({
61
+ * DATABASE_URL: z.string(),
62
+ * API_KEY: z.string(),
63
+ * PORT: z.coerce.number().default(3000),
64
+ * });
65
+ *
66
+ * const manager = new ConfigManager({
67
+ * loaders: [
68
+ * new EnvironmentLoader({ prefix: 'APP_' }),
69
+ * new SecretsManagerLoader({ secretName: '/my-app/config' }),
70
+ * ],
71
+ * schema,
72
+ * precedence: 'aws-first',
73
+ * verbose: true,
74
+ * });
75
+ *
76
+ * await manager.load();
77
+ * const dbUrl = manager.get('DATABASE_URL');
78
+ * ```
79
+ */
80
+ class ConfigManager {
81
+ constructor(options = {}) {
82
+ this.config = null;
83
+ this.loadResult = null;
84
+ this.loaded = false;
85
+ this._options = {
86
+ loaders: options.loaders ?? [],
87
+ schema: options.schema,
88
+ precedence: options.precedence ?? 'aws-first',
89
+ validateOnLoad: options.validateOnLoad ?? true,
90
+ enableLogging: options.enableLogging ?? false,
91
+ logger: options.logger,
92
+ verbose: options.verbose,
93
+ };
94
+ this._logger = options.logger ?? defaultLogger;
95
+ this._verboseOptions = this.resolveVerboseOptions(options.verbose);
96
+ }
97
+ /**
98
+ * Resolve verbose options from boolean or object
99
+ */
100
+ resolveVerboseOptions(verbose) {
101
+ if (verbose === undefined || verbose === false) {
102
+ return null;
103
+ }
104
+ if (verbose === true) {
105
+ return { ...DEFAULT_VERBOSE_OPTIONS };
106
+ }
107
+ return {
108
+ logKeys: verbose.logKeys ?? DEFAULT_VERBOSE_OPTIONS.logKeys,
109
+ logValues: verbose.logValues ?? DEFAULT_VERBOSE_OPTIONS.logValues,
110
+ logOverrides: verbose.logOverrides ?? DEFAULT_VERBOSE_OPTIONS.logOverrides,
111
+ logTiming: verbose.logTiming ?? DEFAULT_VERBOSE_OPTIONS.logTiming,
112
+ maskValues: verbose.maskValues ?? DEFAULT_VERBOSE_OPTIONS.maskValues,
113
+ sensitiveKeys: verbose.sensitiveKeys ?? DEFAULT_VERBOSE_OPTIONS.sensitiveKeys,
114
+ };
115
+ }
116
+ /**
117
+ * Log a message if logging is enabled
118
+ */
119
+ log(message) {
120
+ if (this._options.enableLogging || this._verboseOptions) {
121
+ this._logger.log(`[config-aws] ${message}`);
122
+ }
123
+ }
124
+ /**
125
+ * Mask a value for logging
126
+ */
127
+ maskValue(key, value) {
128
+ if (!this._verboseOptions?.logValues) {
129
+ return '';
130
+ }
131
+ const strValue = String(value);
132
+ const lowerKey = key.toLowerCase();
133
+ // Check if key contains any sensitive patterns
134
+ const isSensitive = this._verboseOptions.sensitiveKeys.some((pattern) => lowerKey.includes(pattern.toLowerCase()));
135
+ if (this._verboseOptions.maskValues || isSensitive) {
136
+ if (strValue.length <= 4) {
137
+ return '****';
138
+ }
139
+ return `${strValue.slice(0, 2)}**...${strValue.slice(-2)}`;
140
+ }
141
+ return strValue;
142
+ }
143
+ /**
144
+ * Get the loading order for loaders based on precedence strategy.
145
+ * Returns loaders sorted by priority (lower priority first, so higher priority loads last and wins).
146
+ */
147
+ getLoadOrder() {
148
+ const { loaders, precedence } = this._options;
149
+ if (!loaders || loaders.length === 0) {
150
+ return [];
151
+ }
152
+ // If precedence is a custom array, use it
153
+ if (Array.isArray(precedence)) {
154
+ return this.sortByCustomPrecedence(loaders, precedence);
155
+ }
156
+ // Use predefined precedence order
157
+ const order = PRECEDENCE_ORDERS[precedence];
158
+ return this.sortByPredefinedOrder(loaders, order);
159
+ }
160
+ /**
161
+ * Sort loaders by custom precedence configuration
162
+ */
163
+ sortByCustomPrecedence(loaders, precedence) {
164
+ const priorityMap = new Map();
165
+ for (const p of precedence) {
166
+ priorityMap.set(p.loader, p.priority);
167
+ }
168
+ // Sort by priority (lower first, so higher priority loads last and wins)
169
+ return [...loaders].sort((a, b) => {
170
+ const priorityA = priorityMap.get(a.getName()) ?? 0;
171
+ const priorityB = priorityMap.get(b.getName()) ?? 0;
172
+ return priorityA - priorityB;
173
+ });
174
+ }
175
+ /**
176
+ * Sort loaders by predefined order
177
+ */
178
+ sortByPredefinedOrder(loaders, order) {
179
+ const orderMap = new Map();
180
+ order.forEach((name, index) => orderMap.set(name, index));
181
+ // Sort by order index (lower first, so higher index loads last and wins)
182
+ return [...loaders].sort((a, b) => {
183
+ const indexA = orderMap.get(a.getName()) ?? -1;
184
+ const indexB = orderMap.get(b.getName()) ?? -1;
185
+ return indexA - indexB;
186
+ });
187
+ }
188
+ /**
189
+ * Load configuration from all configured loaders.
190
+ * Loaders are executed in precedence order, with later loaders overriding earlier ones.
191
+ */
192
+ async load() {
193
+ const startTime = Date.now();
194
+ const sources = [];
195
+ let mergedConfig = {};
196
+ const keyOrigins = new Map(); // Track which loader set each key
197
+ this.log('Loading configuration...');
198
+ const orderedLoaders = this.getLoadOrder();
199
+ for (const loader of orderedLoaders) {
200
+ const loaderName = loader.getName();
201
+ const loaderStartTime = Date.now();
202
+ try {
203
+ // Check if loader is available
204
+ const isAvailable = await loader.isAvailable();
205
+ if (!isAvailable) {
206
+ if (this._verboseOptions?.logTiming) {
207
+ this.log(`${loaderName}: skipped (not available)`);
208
+ }
209
+ continue;
210
+ }
211
+ // Load configuration from this loader
212
+ const loaderConfig = await loader.load();
213
+ const keysLoaded = Object.keys(loaderConfig);
214
+ const duration = Date.now() - loaderStartTime;
215
+ // Track source info
216
+ sources.push({
217
+ loader: loaderName,
218
+ keysLoaded,
219
+ duration,
220
+ });
221
+ // Log timing and keys
222
+ if (this._verboseOptions?.logTiming) {
223
+ this.log(`${loaderName}: loaded ${keysLoaded.length} keys in ${duration}ms`);
224
+ }
225
+ // Log individual keys and track overrides
226
+ for (const key of keysLoaded) {
227
+ const previousLoader = keyOrigins.get(key);
228
+ const isOverride = previousLoader !== undefined;
229
+ if (this._verboseOptions?.logKeys) {
230
+ let logLine = ` - ${key}`;
231
+ if (this._verboseOptions.logValues) {
232
+ logLine += ` = "${this.maskValue(key, loaderConfig[key])}"`;
233
+ }
234
+ if (isOverride && this._verboseOptions.logOverrides) {
235
+ logLine += ` (overrides ${previousLoader})`;
236
+ }
237
+ this.log(logLine);
238
+ }
239
+ keyOrigins.set(key, loaderName);
240
+ }
241
+ // Merge configuration (later loaders override earlier ones)
242
+ mergedConfig = { ...mergedConfig, ...loaderConfig };
243
+ }
244
+ catch (error) {
245
+ throw new errors_1.ConfigurationLoadError(`Failed to load configuration from ${loaderName}: ${error instanceof Error ? error.message : String(error)}`, loaderName, error instanceof Error ? error : undefined);
246
+ }
247
+ }
248
+ // Count overrides
249
+ const totalKeys = Object.keys(mergedConfig).length;
250
+ const totalDuration = Date.now() - startTime;
251
+ const overrideCount = sources.reduce((acc, s) => acc + s.keysLoaded.length, 0) - totalKeys;
252
+ if (this._verboseOptions?.logTiming) {
253
+ this.log(`Configuration loaded: ${totalKeys} total keys, ${overrideCount} overrides, ${totalDuration}ms total`);
254
+ }
255
+ // Validate if schema is provided and validation is enabled
256
+ if (this._options.schema && this._options.validateOnLoad) {
257
+ const result = this._options.schema.safeParse(mergedConfig);
258
+ if (!result.success) {
259
+ const zodError = result.error;
260
+ throw new errors_1.ValidationError(`Configuration validation failed: ${zodError.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, zodError.errors, undefined);
261
+ }
262
+ this.config = result.data;
263
+ }
264
+ else {
265
+ this.config = mergedConfig;
266
+ }
267
+ this.loadResult = {
268
+ config: this.config,
269
+ sources,
270
+ loadedAt: new Date(),
271
+ };
272
+ this.loaded = true;
273
+ }
274
+ /**
275
+ * Get a specific configuration value by key.
276
+ * @param key The configuration key
277
+ * @returns The configuration value
278
+ * @throws ConfigurationError if configuration is not loaded
279
+ */
280
+ get(key) {
281
+ if (!this.loaded || this.config === null) {
282
+ throw new errors_1.ConfigurationError('Configuration not loaded. Call load() first.');
283
+ }
284
+ // Non-null assertion is safe here because we've checked this.config !== null above
285
+ return this.config[key];
286
+ }
287
+ /**
288
+ * Get all configuration values.
289
+ * @returns The complete configuration object
290
+ * @throws ConfigurationError if configuration is not loaded
291
+ */
292
+ getAll() {
293
+ if (!this.loaded || this.config === null) {
294
+ throw new errors_1.ConfigurationError('Configuration not loaded. Call load() first.');
295
+ }
296
+ return this.config;
297
+ }
298
+ /**
299
+ * Check if configuration has been loaded.
300
+ * @returns true if configuration is loaded
301
+ */
302
+ isLoaded() {
303
+ return this.loaded;
304
+ }
305
+ /**
306
+ * Get the current application environment.
307
+ * @returns The APP_ENV value or 'development' as default
308
+ */
309
+ getAppEnv() {
310
+ return process.env['APP_ENV'] ?? 'development';
311
+ }
312
+ /**
313
+ * Get the load result with source information.
314
+ * @returns The load result or null if not loaded
315
+ */
316
+ getLoadResult() {
317
+ return this.loadResult;
318
+ }
319
+ /**
320
+ * Serialize the current configuration to JSON string.
321
+ * @returns JSON string representation of the configuration
322
+ * @throws ConfigurationError if configuration is not loaded
323
+ */
324
+ serialize() {
325
+ if (!this.loaded || this.config === null) {
326
+ throw new errors_1.ConfigurationError('Configuration not loaded. Call load() first.');
327
+ }
328
+ return JSON.stringify(this.config);
329
+ }
330
+ /**
331
+ * Create a new ConfigManager with configuration loaded from a JSON string.
332
+ * This is useful for restoring configuration from a serialized state.
333
+ * @param json JSON string to deserialize
334
+ * @param options Optional ConfigManager options (schema will be used for validation)
335
+ * @returns A new ConfigManager instance with the deserialized configuration
336
+ */
337
+ static deserialize(json, options = {}) {
338
+ const parsed = JSON.parse(json);
339
+ // Validate if schema is provided
340
+ if (options.schema) {
341
+ const result = options.schema.safeParse(parsed);
342
+ if (!result.success) {
343
+ const zodError = result.error;
344
+ throw new errors_1.ValidationError(`Deserialization validation failed: ${zodError.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, zodError.errors, undefined);
345
+ }
346
+ }
347
+ // Create a new ConfigManager and set its internal state
348
+ const manager = new ConfigManager(options);
349
+ manager.config = parsed;
350
+ manager.loaded = true;
351
+ manager.loadResult = {
352
+ config: parsed,
353
+ sources: [{ loader: 'deserialize', keysLoaded: Object.keys(parsed), duration: 0 }],
354
+ loadedAt: new Date(),
355
+ };
356
+ return manager;
357
+ }
358
+ }
359
+ exports.ConfigManager = ConfigManager;
360
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/config-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MissingConfigurationError = exports.ConfigurationLoadError = exports.AWSServiceError = exports.ValidationError = exports.ConfigurationError = void 0;
4
+ /**
5
+ * Base error class for all configuration-related errors
6
+ */
7
+ class ConfigurationError extends Error {
8
+ constructor(message, cause) {
9
+ super(message);
10
+ this.name = 'ConfigurationError';
11
+ this.cause = cause;
12
+ Object.setPrototypeOf(this, ConfigurationError.prototype);
13
+ }
14
+ }
15
+ exports.ConfigurationError = ConfigurationError;
16
+ /**
17
+ * Error thrown when configuration validation fails
18
+ */
19
+ class ValidationError extends ConfigurationError {
20
+ constructor(message, validationErrors, cause) {
21
+ super(message, cause);
22
+ this.name = 'ValidationError';
23
+ this.validationErrors = validationErrors;
24
+ Object.setPrototypeOf(this, ValidationError.prototype);
25
+ }
26
+ }
27
+ exports.ValidationError = ValidationError;
28
+ /**
29
+ * Error thrown when an AWS service operation fails
30
+ */
31
+ class AWSServiceError extends ConfigurationError {
32
+ constructor(message, service, operation, cause) {
33
+ super(message, cause);
34
+ this.name = 'AWSServiceError';
35
+ this.service = service;
36
+ this.operation = operation;
37
+ Object.setPrototypeOf(this, AWSServiceError.prototype);
38
+ }
39
+ }
40
+ exports.AWSServiceError = AWSServiceError;
41
+ /**
42
+ * Error thrown when a configuration loader fails to load
43
+ */
44
+ class ConfigurationLoadError extends ConfigurationError {
45
+ constructor(message, loader, cause) {
46
+ super(message, cause);
47
+ this.name = 'ConfigurationLoadError';
48
+ this.loader = loader;
49
+ Object.setPrototypeOf(this, ConfigurationLoadError.prototype);
50
+ }
51
+ }
52
+ exports.ConfigurationLoadError = ConfigurationLoadError;
53
+ /**
54
+ * Error thrown when required configuration keys are missing
55
+ */
56
+ class MissingConfigurationError extends ConfigurationError {
57
+ constructor(message, missingKeys, cause) {
58
+ super(message, cause);
59
+ this.name = 'MissingConfigurationError';
60
+ this.missingKeys = missingKeys;
61
+ Object.setPrototypeOf(this, MissingConfigurationError.prototype);
62
+ }
63
+ }
64
+ exports.MissingConfigurationError = MissingConfigurationError;
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,kBAAmB,SAAQ,KAAK;IAI3C,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAVD,gDAUC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,kBAAkB;IAIrD,YAAY,OAAe,EAAE,gBAAyB,EAAE,KAAa;QACnE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF;AAVD,0CAUC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,kBAAkB;IAMrD,YAAY,OAAe,EAAE,OAAe,EAAE,SAAiB,EAAE,KAAa;QAC5E,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF;AAbD,0CAaC;AAED;;GAEG;AACH,MAAa,sBAAuB,SAAQ,kBAAkB;IAI5D,YAAY,OAAe,EAAE,MAAc,EAAE,KAAa;QACxD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAVD,wDAUC;AAED;;GAEG;AACH,MAAa,yBAA0B,SAAQ,kBAAkB;IAI/D,YAAY,OAAe,EAAE,WAAqB,EAAE,KAAa;QAC/D,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACnE,CAAC;CACF;AAVD,8DAUC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * @dyanet/config-aws
4
+ *
5
+ * Framework-agnostic AWS configuration management library.
6
+ * Supports environment variables, AWS Secrets Manager, SSM Parameter Store,
7
+ * S3, and .env files with configurable precedence.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.EnvFileParser = exports.ConfigValidationUtil = exports.ConfigManager = exports.SSMParameterStoreLoader = exports.SecretsManagerLoader = exports.S3Loader = exports.EnvFileLoader = exports.EnvironmentLoader = exports.MissingConfigurationError = exports.ConfigurationLoadError = exports.AWSServiceError = exports.ValidationError = exports.ConfigurationError = void 0;
11
+ // Error classes
12
+ var errors_1 = require("./errors");
13
+ Object.defineProperty(exports, "ConfigurationError", { enumerable: true, get: function () { return errors_1.ConfigurationError; } });
14
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
15
+ Object.defineProperty(exports, "AWSServiceError", { enumerable: true, get: function () { return errors_1.AWSServiceError; } });
16
+ Object.defineProperty(exports, "ConfigurationLoadError", { enumerable: true, get: function () { return errors_1.ConfigurationLoadError; } });
17
+ Object.defineProperty(exports, "MissingConfigurationError", { enumerable: true, get: function () { return errors_1.MissingConfigurationError; } });
18
+ // Loaders
19
+ var environment_loader_1 = require("./loaders/environment.loader");
20
+ Object.defineProperty(exports, "EnvironmentLoader", { enumerable: true, get: function () { return environment_loader_1.EnvironmentLoader; } });
21
+ var env_file_loader_1 = require("./loaders/env-file.loader");
22
+ Object.defineProperty(exports, "EnvFileLoader", { enumerable: true, get: function () { return env_file_loader_1.EnvFileLoader; } });
23
+ var s3_loader_1 = require("./loaders/s3.loader");
24
+ Object.defineProperty(exports, "S3Loader", { enumerable: true, get: function () { return s3_loader_1.S3Loader; } });
25
+ var secrets_manager_loader_1 = require("./loaders/secrets-manager.loader");
26
+ Object.defineProperty(exports, "SecretsManagerLoader", { enumerable: true, get: function () { return secrets_manager_loader_1.SecretsManagerLoader; } });
27
+ var ssm_parameter_store_loader_1 = require("./loaders/ssm-parameter-store.loader");
28
+ Object.defineProperty(exports, "SSMParameterStoreLoader", { enumerable: true, get: function () { return ssm_parameter_store_loader_1.SSMParameterStoreLoader; } });
29
+ // ConfigManager
30
+ var config_manager_1 = require("./config-manager");
31
+ Object.defineProperty(exports, "ConfigManager", { enumerable: true, get: function () { return config_manager_1.ConfigManager; } });
32
+ // Utilities
33
+ var validation_util_1 = require("./utils/validation.util");
34
+ Object.defineProperty(exports, "ConfigValidationUtil", { enumerable: true, get: function () { return validation_util_1.ConfigValidationUtil; } });
35
+ var env_file_parser_util_1 = require("./utils/env-file-parser.util");
36
+ Object.defineProperty(exports, "EnvFileParser", { enumerable: true, get: function () { return env_file_parser_util_1.EnvFileParser; } });
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsCH,gBAAgB;AAChB,mCAMkB;AALhB,4GAAA,kBAAkB,OAAA;AAClB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,gHAAA,sBAAsB,OAAA;AACtB,mHAAA,yBAAyB,OAAA;AAG3B,UAAU;AACV,mEAAiE;AAAxD,uHAAA,iBAAiB,OAAA;AAC1B,6DAA0D;AAAjD,gHAAA,aAAa,OAAA;AACtB,iDAA+C;AAAtC,qGAAA,QAAQ,OAAA;AACjB,2EAAwE;AAA/D,8HAAA,oBAAoB,OAAA;AAC7B,mFAA+E;AAAtE,qIAAA,uBAAuB,OAAA;AAEhC,gBAAgB;AAChB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,YAAY;AACZ,2DAA+D;AAAtD,uHAAA,oBAAoB,OAAA;AAC7B,qEAA6D;AAApD,qHAAA,aAAa,OAAA"}