@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.
- package/README.md +195 -0
- package/dist/cjs/config-manager.js +360 -0
- package/dist/cjs/config-manager.js.map +1 -0
- package/dist/cjs/errors/index.js +65 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/config-loader.interface.js +3 -0
- package/dist/cjs/interfaces/config-loader.interface.js.map +1 -0
- package/dist/cjs/interfaces/config-manager.interface.js +3 -0
- package/dist/cjs/interfaces/config-manager.interface.js.map +1 -0
- package/dist/cjs/interfaces/env-file-loader.interface.js +3 -0
- package/dist/cjs/interfaces/env-file-loader.interface.js.map +1 -0
- package/dist/cjs/interfaces/environment-loader.interface.js +3 -0
- package/dist/cjs/interfaces/environment-loader.interface.js.map +1 -0
- package/dist/cjs/interfaces/index.js +3 -0
- package/dist/cjs/interfaces/index.js.map +1 -0
- package/dist/cjs/interfaces/s3-loader.interface.js +3 -0
- package/dist/cjs/interfaces/s3-loader.interface.js.map +1 -0
- package/dist/cjs/interfaces/secrets-manager-loader.interface.js +3 -0
- package/dist/cjs/interfaces/secrets-manager-loader.interface.js.map +1 -0
- package/dist/cjs/interfaces/ssm-parameter-store-loader.interface.js +3 -0
- package/dist/cjs/interfaces/ssm-parameter-store-loader.interface.js.map +1 -0
- package/dist/cjs/loaders/env-file.loader.js +167 -0
- package/dist/cjs/loaders/env-file.loader.js.map +1 -0
- package/dist/cjs/loaders/environment.loader.js +83 -0
- package/dist/cjs/loaders/environment.loader.js.map +1 -0
- package/dist/cjs/loaders/index.js +14 -0
- package/dist/cjs/loaders/index.js.map +1 -0
- package/dist/cjs/loaders/s3.loader.js +141 -0
- package/dist/cjs/loaders/s3.loader.js.map +1 -0
- package/dist/cjs/loaders/secrets-manager.loader.js +156 -0
- package/dist/cjs/loaders/secrets-manager.loader.js.map +1 -0
- package/dist/cjs/loaders/ssm-parameter-store.loader.js +193 -0
- package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +1 -0
- package/dist/cjs/utils/env-file-parser.util.js +98 -0
- package/dist/cjs/utils/env-file-parser.util.js.map +1 -0
- package/dist/cjs/utils/index.js +8 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/validation.util.js +116 -0
- package/dist/cjs/utils/validation.util.js.map +1 -0
- package/dist/esm/config-manager.js +356 -0
- package/dist/esm/config-manager.js.map +1 -0
- package/dist/esm/errors/index.js +57 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/index.js +21 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/config-loader.interface.js +2 -0
- package/dist/esm/interfaces/config-loader.interface.js.map +1 -0
- package/dist/esm/interfaces/config-manager.interface.js +2 -0
- package/dist/esm/interfaces/config-manager.interface.js.map +1 -0
- package/dist/esm/interfaces/env-file-loader.interface.js +2 -0
- package/dist/esm/interfaces/env-file-loader.interface.js.map +1 -0
- package/dist/esm/interfaces/environment-loader.interface.js +2 -0
- package/dist/esm/interfaces/environment-loader.interface.js.map +1 -0
- package/dist/esm/interfaces/index.js +2 -0
- package/dist/esm/interfaces/index.js.map +1 -0
- package/dist/esm/interfaces/s3-loader.interface.js +2 -0
- package/dist/esm/interfaces/s3-loader.interface.js.map +1 -0
- package/dist/esm/interfaces/secrets-manager-loader.interface.js +2 -0
- package/dist/esm/interfaces/secrets-manager-loader.interface.js.map +1 -0
- package/dist/esm/interfaces/ssm-parameter-store-loader.interface.js +2 -0
- package/dist/esm/interfaces/ssm-parameter-store-loader.interface.js.map +1 -0
- package/dist/esm/loaders/env-file.loader.js +130 -0
- package/dist/esm/loaders/env-file.loader.js.map +1 -0
- package/dist/esm/loaders/environment.loader.js +79 -0
- package/dist/esm/loaders/environment.loader.js.map +1 -0
- package/dist/esm/loaders/index.js +6 -0
- package/dist/esm/loaders/index.js.map +1 -0
- package/dist/esm/loaders/s3.loader.js +137 -0
- package/dist/esm/loaders/s3.loader.js.map +1 -0
- package/dist/esm/loaders/secrets-manager.loader.js +152 -0
- package/dist/esm/loaders/secrets-manager.loader.js.map +1 -0
- package/dist/esm/loaders/ssm-parameter-store.loader.js +189 -0
- package/dist/esm/loaders/ssm-parameter-store.loader.js.map +1 -0
- package/dist/esm/utils/env-file-parser.util.js +94 -0
- package/dist/esm/utils/env-file-parser.util.js.map +1 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/validation.util.js +112 -0
- package/dist/esm/utils/validation.util.js.map +1 -0
- package/dist/types/config-manager.d.ts +119 -0
- package/dist/types/config-manager.d.ts.map +1 -0
- package/dist/types/errors/index.d.ts +43 -0
- package/dist/types/errors/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +24 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/config-loader.interface.d.ts +33 -0
- package/dist/types/interfaces/config-loader.interface.d.ts.map +1 -0
- package/dist/types/interfaces/config-manager.interface.d.ts +86 -0
- package/dist/types/interfaces/config-manager.interface.d.ts.map +1 -0
- package/dist/types/interfaces/env-file-loader.interface.d.ts +12 -0
- package/dist/types/interfaces/env-file-loader.interface.d.ts.map +1 -0
- package/dist/types/interfaces/environment-loader.interface.d.ts +10 -0
- package/dist/types/interfaces/environment-loader.interface.d.ts.map +1 -0
- package/dist/types/interfaces/index.d.ts +8 -0
- package/dist/types/interfaces/index.d.ts.map +1 -0
- package/dist/types/interfaces/s3-loader.interface.d.ts +14 -0
- package/dist/types/interfaces/s3-loader.interface.d.ts.map +1 -0
- package/dist/types/interfaces/secrets-manager-loader.interface.d.ts +12 -0
- package/dist/types/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
- package/dist/types/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
- package/dist/types/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
- package/dist/types/loaders/env-file.loader.d.ts +69 -0
- package/dist/types/loaders/env-file.loader.d.ts.map +1 -0
- package/dist/types/loaders/environment.loader.d.ts +46 -0
- package/dist/types/loaders/environment.loader.d.ts.map +1 -0
- package/dist/types/loaders/index.d.ts +6 -0
- package/dist/types/loaders/index.d.ts.map +1 -0
- package/dist/types/loaders/s3.loader.d.ts +62 -0
- package/dist/types/loaders/s3.loader.d.ts.map +1 -0
- package/dist/types/loaders/secrets-manager.loader.d.ts +68 -0
- package/dist/types/loaders/secrets-manager.loader.d.ts.map +1 -0
- package/dist/types/loaders/ssm-parameter-store.loader.d.ts +78 -0
- package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
- package/dist/types/utils/env-file-parser.util.d.ts +45 -0
- package/dist/types/utils/env-file-parser.util.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/validation.util.d.ts +53 -0
- package/dist/types/utils/validation.util.d.ts.map +1 -0
- 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"}
|