@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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for AWS ECS-compatible environment files.
|
|
3
|
+
*
|
|
4
|
+
* Format rules (per AWS ECS documentation):
|
|
5
|
+
* - Lines beginning with # are comments and ignored
|
|
6
|
+
* - Blank lines are ignored
|
|
7
|
+
* - Format: VARIABLE=VALUE (no spaces around =)
|
|
8
|
+
* - Variable names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/
|
|
9
|
+
* - Values are literal (no quote processing, no interpolation)
|
|
10
|
+
* - One variable per line
|
|
11
|
+
* - Lines without = are ignored
|
|
12
|
+
* - Maximum line length: 32KB
|
|
13
|
+
*
|
|
14
|
+
* @see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html
|
|
15
|
+
*/
|
|
16
|
+
export class EnvFileParser {
|
|
17
|
+
/**
|
|
18
|
+
* Parse environment file content into key-value pairs.
|
|
19
|
+
* @param content The raw content of the environment file
|
|
20
|
+
* @returns Record of environment variable names to values
|
|
21
|
+
*/
|
|
22
|
+
static parse(content) {
|
|
23
|
+
const result = {};
|
|
24
|
+
// Handle empty content
|
|
25
|
+
if (!content) {
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
const lines = content.split(/\r?\n/);
|
|
29
|
+
for (const line of lines) {
|
|
30
|
+
// Skip lines exceeding max length
|
|
31
|
+
if (line.length > this.MAX_LINE_LENGTH) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Skip blank lines
|
|
35
|
+
if (line.trim() === '') {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Skip comment lines (lines starting with # after optional whitespace)
|
|
39
|
+
if (line.trimStart().startsWith('#')) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// Find the first = sign
|
|
43
|
+
const equalsIndex = line.indexOf('=');
|
|
44
|
+
if (equalsIndex === -1) {
|
|
45
|
+
// Lines without = are ignored
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const key = line.substring(0, equalsIndex);
|
|
49
|
+
const value = line.substring(equalsIndex + 1);
|
|
50
|
+
// Validate variable name (must not be empty and must match pattern)
|
|
51
|
+
if (key.length === 0 || !this.VARIABLE_NAME_PATTERN.test(key)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
result[key] = value;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a variable name is valid per AWS ECS format.
|
|
60
|
+
* Variable names must:
|
|
61
|
+
* - Start with a letter (a-z, A-Z) or underscore (_)
|
|
62
|
+
* - Contain only alphanumeric characters and underscores
|
|
63
|
+
* - Not be empty
|
|
64
|
+
*
|
|
65
|
+
* @param name The variable name to check
|
|
66
|
+
* @returns true if the name is valid
|
|
67
|
+
*/
|
|
68
|
+
static isValidVariableName(name) {
|
|
69
|
+
if (!name || name.length === 0) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return this.VARIABLE_NAME_PATTERN.test(name);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Serialize a configuration object to AWS ECS-compatible env file format.
|
|
76
|
+
* @param config The configuration object to serialize
|
|
77
|
+
* @returns The serialized env file content
|
|
78
|
+
*/
|
|
79
|
+
static serialize(config) {
|
|
80
|
+
const lines = [];
|
|
81
|
+
for (const [key, value] of Object.entries(config)) {
|
|
82
|
+
// Only include valid variable names
|
|
83
|
+
if (this.isValidVariableName(key)) {
|
|
84
|
+
lines.push(`${key}=${value}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Maximum line length per AWS ECS specification */
|
|
91
|
+
EnvFileParser.MAX_LINE_LENGTH = 32 * 1024; // 32KB
|
|
92
|
+
/** Valid variable name pattern: alphanumeric + underscore, cannot start with digit */
|
|
93
|
+
EnvFileParser.VARIABLE_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
94
|
+
//# sourceMappingURL=env-file-parser.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file-parser.util.js","sourceRoot":"","sources":["../../../src/utils/env-file-parser.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,aAAa;IAOxB;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,OAAe;QAC1B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,uBAAuB;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,kCAAkC;YAClC,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,uEAAuE;YACvE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvB,8BAA8B;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YAE9C,oEAAoE;YACpE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,mBAAmB,CAAC,IAAY;QACrC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,MAA8B;QAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,oCAAoC;YACpC,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;;AA3FD,oDAAoD;AAC5B,6BAAe,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AAE5D,sFAAsF;AAC9D,mCAAqB,GAAG,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ValidationError } from '../errors';
|
|
2
|
+
/**
|
|
3
|
+
* Framework-agnostic validation utility for configuration values.
|
|
4
|
+
* Provides methods for validating configuration objects against Zod schemas.
|
|
5
|
+
*/
|
|
6
|
+
export class ConfigValidationUtil {
|
|
7
|
+
/**
|
|
8
|
+
* Validates a value against a Zod schema.
|
|
9
|
+
* @param schema The Zod schema to validate against
|
|
10
|
+
* @param value The value to validate
|
|
11
|
+
* @param context Optional context for error messages
|
|
12
|
+
* @returns The validated and transformed value
|
|
13
|
+
* @throws ValidationError if validation fails
|
|
14
|
+
*/
|
|
15
|
+
static validate(schema, value, context) {
|
|
16
|
+
const result = schema.safeParse(value);
|
|
17
|
+
if (result.success) {
|
|
18
|
+
return result.data;
|
|
19
|
+
}
|
|
20
|
+
const errors = this.formatValidationErrors(result.error);
|
|
21
|
+
const contextMessage = context
|
|
22
|
+
? `Configuration validation failed for ${context}`
|
|
23
|
+
: 'Configuration validation failed';
|
|
24
|
+
throw new ValidationError(contextMessage, errors);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Safely validates a value against a Zod schema without throwing.
|
|
28
|
+
* @param schema The Zod schema to validate against
|
|
29
|
+
* @param value The value to validate
|
|
30
|
+
* @returns Object with success flag and either data or error
|
|
31
|
+
*/
|
|
32
|
+
static safeValidate(schema, value) {
|
|
33
|
+
const result = schema.safeParse(value);
|
|
34
|
+
if (result.success) {
|
|
35
|
+
return { success: true, data: result.data };
|
|
36
|
+
}
|
|
37
|
+
const errors = this.formatValidationErrors(result.error);
|
|
38
|
+
const validationError = new ValidationError('Configuration validation failed', errors);
|
|
39
|
+
return { success: false, error: validationError };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Formats Zod validation errors into a structured format.
|
|
43
|
+
* @param error The ZodError to format
|
|
44
|
+
* @returns Formatted error object or string
|
|
45
|
+
*/
|
|
46
|
+
static formatValidationErrors(error) {
|
|
47
|
+
// If there's only one error at the root level, return just the message
|
|
48
|
+
if (error.issues.length === 1) {
|
|
49
|
+
const issue = error.issues[0];
|
|
50
|
+
if (issue && Array.isArray(issue.path) && issue.path.length === 0) {
|
|
51
|
+
return issue.message;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// For multiple errors or nested paths, create a structured object
|
|
55
|
+
return error.issues.reduce((errors, issue) => {
|
|
56
|
+
const path = issue.path.join('.');
|
|
57
|
+
const key = path || 'root';
|
|
58
|
+
if (!errors[key]) {
|
|
59
|
+
errors[key] = [];
|
|
60
|
+
}
|
|
61
|
+
errors[key].push({
|
|
62
|
+
message: issue.message,
|
|
63
|
+
code: issue.code,
|
|
64
|
+
path: issue.path,
|
|
65
|
+
});
|
|
66
|
+
return errors;
|
|
67
|
+
}, {});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates a detailed error message for configuration validation failures.
|
|
71
|
+
* @param error The ZodError to create a message for
|
|
72
|
+
* @param context Optional context for the error
|
|
73
|
+
* @returns Detailed error message string
|
|
74
|
+
*/
|
|
75
|
+
static createDetailedErrorMessage(error, context) {
|
|
76
|
+
const contextPrefix = context ? `${context}: ` : '';
|
|
77
|
+
if (error.issues.length === 1) {
|
|
78
|
+
const issue = error.issues[0];
|
|
79
|
+
if (issue) {
|
|
80
|
+
const pathStr = issue.path.length > 0 ? ` at '${issue.path.join('.')}'` : '';
|
|
81
|
+
return `${contextPrefix}${issue.message}${pathStr}`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const errorMessages = error.issues.map((issue) => {
|
|
85
|
+
const pathStr = issue.path.length > 0 ? ` at '${issue.path.join('.')}'` : '';
|
|
86
|
+
return ` - ${issue.message}${pathStr}`;
|
|
87
|
+
});
|
|
88
|
+
return `${contextPrefix}Multiple validation errors:\n${errorMessages.join('\n')}`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validates configuration with enhanced error context.
|
|
92
|
+
* @param schema The Zod schema to validate against
|
|
93
|
+
* @param value The configuration object to validate
|
|
94
|
+
* @param source The source of the configuration (e.g., 'environment', 'secrets-manager')
|
|
95
|
+
* @returns The validated configuration
|
|
96
|
+
* @throws ValidationError with enhanced context
|
|
97
|
+
*/
|
|
98
|
+
static validateConfiguration(schema, value, source) {
|
|
99
|
+
try {
|
|
100
|
+
return this.validate(schema, value, `${source} configuration`);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error instanceof ValidationError) {
|
|
104
|
+
// Enhance the error with source information
|
|
105
|
+
const enhancedMessage = `Configuration validation failed for source '${source}': ${error.message}`;
|
|
106
|
+
throw new ValidationError(enhancedMessage, error.validationErrors);
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=validation.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.util.js","sourceRoot":"","sources":["../../../src/utils/validation.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { ConfigManagerOptions, ConfigLoadResult, Logger, VerboseOptions } from './interfaces/config-manager.interface';
|
|
2
|
+
/**
|
|
3
|
+
* ConfigManager orchestrates loading configuration from multiple sources
|
|
4
|
+
* with configurable precedence and validation.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { ConfigManager, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/config-aws';
|
|
9
|
+
* import { z } from 'zod';
|
|
10
|
+
*
|
|
11
|
+
* const schema = z.object({
|
|
12
|
+
* DATABASE_URL: z.string(),
|
|
13
|
+
* API_KEY: z.string(),
|
|
14
|
+
* PORT: z.coerce.number().default(3000),
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* const manager = new ConfigManager({
|
|
18
|
+
* loaders: [
|
|
19
|
+
* new EnvironmentLoader({ prefix: 'APP_' }),
|
|
20
|
+
* new SecretsManagerLoader({ secretName: '/my-app/config' }),
|
|
21
|
+
* ],
|
|
22
|
+
* schema,
|
|
23
|
+
* precedence: 'aws-first',
|
|
24
|
+
* verbose: true,
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* await manager.load();
|
|
28
|
+
* const dbUrl = manager.get('DATABASE_URL');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class ConfigManager<T = Record<string, unknown>> {
|
|
32
|
+
/** @internal */
|
|
33
|
+
protected readonly _options: Required<Omit<ConfigManagerOptions<T>, 'schema' | 'logger' | 'verbose'>> & {
|
|
34
|
+
schema?: ConfigManagerOptions<T>['schema'];
|
|
35
|
+
logger?: Logger;
|
|
36
|
+
verbose?: VerboseOptions | boolean;
|
|
37
|
+
};
|
|
38
|
+
/** @internal */
|
|
39
|
+
protected readonly _logger: Logger;
|
|
40
|
+
/** @internal */
|
|
41
|
+
protected readonly _verboseOptions: Required<VerboseOptions> | null;
|
|
42
|
+
private config;
|
|
43
|
+
private loadResult;
|
|
44
|
+
private loaded;
|
|
45
|
+
constructor(options?: ConfigManagerOptions<T>);
|
|
46
|
+
/**
|
|
47
|
+
* Resolve verbose options from boolean or object
|
|
48
|
+
*/
|
|
49
|
+
private resolveVerboseOptions;
|
|
50
|
+
/**
|
|
51
|
+
* Log a message if logging is enabled
|
|
52
|
+
*/
|
|
53
|
+
private log;
|
|
54
|
+
/**
|
|
55
|
+
* Mask a value for logging
|
|
56
|
+
*/
|
|
57
|
+
private maskValue;
|
|
58
|
+
/**
|
|
59
|
+
* Get the loading order for loaders based on precedence strategy.
|
|
60
|
+
* Returns loaders sorted by priority (lower priority first, so higher priority loads last and wins).
|
|
61
|
+
*/
|
|
62
|
+
private getLoadOrder;
|
|
63
|
+
/**
|
|
64
|
+
* Sort loaders by custom precedence configuration
|
|
65
|
+
*/
|
|
66
|
+
private sortByCustomPrecedence;
|
|
67
|
+
/**
|
|
68
|
+
* Sort loaders by predefined order
|
|
69
|
+
*/
|
|
70
|
+
private sortByPredefinedOrder;
|
|
71
|
+
/**
|
|
72
|
+
* Load configuration from all configured loaders.
|
|
73
|
+
* Loaders are executed in precedence order, with later loaders overriding earlier ones.
|
|
74
|
+
*/
|
|
75
|
+
load(): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Get a specific configuration value by key.
|
|
78
|
+
* @param key The configuration key
|
|
79
|
+
* @returns The configuration value
|
|
80
|
+
* @throws ConfigurationError if configuration is not loaded
|
|
81
|
+
*/
|
|
82
|
+
get<K extends keyof T>(key: K): T[K];
|
|
83
|
+
/**
|
|
84
|
+
* Get all configuration values.
|
|
85
|
+
* @returns The complete configuration object
|
|
86
|
+
* @throws ConfigurationError if configuration is not loaded
|
|
87
|
+
*/
|
|
88
|
+
getAll(): T;
|
|
89
|
+
/**
|
|
90
|
+
* Check if configuration has been loaded.
|
|
91
|
+
* @returns true if configuration is loaded
|
|
92
|
+
*/
|
|
93
|
+
isLoaded(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Get the current application environment.
|
|
96
|
+
* @returns The APP_ENV value or 'development' as default
|
|
97
|
+
*/
|
|
98
|
+
getAppEnv(): string;
|
|
99
|
+
/**
|
|
100
|
+
* Get the load result with source information.
|
|
101
|
+
* @returns The load result or null if not loaded
|
|
102
|
+
*/
|
|
103
|
+
getLoadResult(): ConfigLoadResult<T> | null;
|
|
104
|
+
/**
|
|
105
|
+
* Serialize the current configuration to JSON string.
|
|
106
|
+
* @returns JSON string representation of the configuration
|
|
107
|
+
* @throws ConfigurationError if configuration is not loaded
|
|
108
|
+
*/
|
|
109
|
+
serialize(): string;
|
|
110
|
+
/**
|
|
111
|
+
* Create a new ConfigManager with configuration loaded from a JSON string.
|
|
112
|
+
* This is useful for restoring configuration from a serialized state.
|
|
113
|
+
* @param json JSON string to deserialize
|
|
114
|
+
* @param options Optional ConfigManager options (schema will be used for validation)
|
|
115
|
+
* @returns A new ConfigManager instance with the deserialized configuration
|
|
116
|
+
*/
|
|
117
|
+
static deserialize<T = Record<string, unknown>>(json: string, options?: ConfigManagerOptions<T>): ConfigManager<T>;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/config-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAEhB,MAAM,EAEN,cAAc,EACf,MAAM,uCAAuC,CAAC;AAsD/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,gBAAgB;IAChB,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG;QACtG,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;KACpC,CAAC;IACF,gBAAgB;IAChB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACnC,gBAAgB;IAChB,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;IAEpE,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM;IAcjD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,CAAC,SAAS;IAwBjB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAc9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0G3B;;;;;OAKG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAQpC;;;;OAIG;IACH,MAAM,IAAI,CAAC;IAOX;;;OAGG;IACH,QAAQ,IAAI,OAAO;IAInB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACH,aAAa,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3C;;;;OAIG;IACH,SAAS,IAAI,MAAM;IAOnB;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,aAAa,CAAC,CAAC,CAAC;CA4BpB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all configuration-related errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class ConfigurationError extends Error {
|
|
5
|
+
/** The underlying cause of this error */
|
|
6
|
+
readonly cause?: Error;
|
|
7
|
+
constructor(message: string, cause?: Error);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when configuration validation fails
|
|
11
|
+
*/
|
|
12
|
+
export declare class ValidationError extends ConfigurationError {
|
|
13
|
+
/** Detailed validation errors from Zod */
|
|
14
|
+
readonly validationErrors: unknown;
|
|
15
|
+
constructor(message: string, validationErrors: unknown, cause?: Error);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Error thrown when an AWS service operation fails
|
|
19
|
+
*/
|
|
20
|
+
export declare class AWSServiceError extends ConfigurationError {
|
|
21
|
+
/** The AWS service that failed */
|
|
22
|
+
readonly service: string;
|
|
23
|
+
/** The operation that failed */
|
|
24
|
+
readonly operation: string;
|
|
25
|
+
constructor(message: string, service: string, operation: string, cause?: Error);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Error thrown when a configuration loader fails to load
|
|
29
|
+
*/
|
|
30
|
+
export declare class ConfigurationLoadError extends ConfigurationError {
|
|
31
|
+
/** The name of the loader that failed */
|
|
32
|
+
readonly loader: string;
|
|
33
|
+
constructor(message: string, loader: string, cause?: Error);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Error thrown when required configuration keys are missing
|
|
37
|
+
*/
|
|
38
|
+
export declare class MissingConfigurationError extends ConfigurationError {
|
|
39
|
+
/** The keys that are missing */
|
|
40
|
+
readonly missingKeys: string[];
|
|
41
|
+
constructor(message: string, missingKeys: string[], cause?: Error);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,yCAAyC;IACzC,SAAgB,KAAK,CAAC,EAAE,KAAK,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,0CAA0C;IAC1C,SAAgB,gBAAgB,EAAE,OAAO,CAAC;gBAE9B,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK;CAMtE;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,kCAAkC;IAClC,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,gCAAgC;IAChC,SAAgB,SAAS,EAAE,MAAM,CAAC;gBAEtB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAO/E;AAED;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB;IAC5D,yCAAyC;IACzC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3D;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,kBAAkB;IAC/D,gCAAgC;IAChC,SAAgB,WAAW,EAAE,MAAM,EAAE,CAAC;gBAE1B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,KAAK;CAMlE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dyanet/config-aws
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic AWS configuration management library.
|
|
5
|
+
* Supports environment variables, AWS Secrets Manager, SSM Parameter Store,
|
|
6
|
+
* S3, and .env files with configurable precedence.
|
|
7
|
+
*/
|
|
8
|
+
export type { ConfigLoader, ConfigLoaderResult, } from './interfaces/config-loader.interface';
|
|
9
|
+
export type { ConfigManagerOptions, LoaderPrecedence, VerboseOptions, PrecedenceStrategy, ConfigLoadResult, ConfigSourceInfo, Logger, } from './interfaces/config-manager.interface';
|
|
10
|
+
export type { EnvironmentLoaderConfig, } from './interfaces/environment-loader.interface';
|
|
11
|
+
export type { EnvFileLoaderConfig, } from './interfaces/env-file-loader.interface';
|
|
12
|
+
export type { S3LoaderConfig, } from './interfaces/s3-loader.interface';
|
|
13
|
+
export type { SecretsManagerLoaderConfig, } from './interfaces/secrets-manager-loader.interface';
|
|
14
|
+
export type { SSMParameterStoreLoaderConfig, } from './interfaces/ssm-parameter-store-loader.interface';
|
|
15
|
+
export { ConfigurationError, ValidationError, AWSServiceError, ConfigurationLoadError, MissingConfigurationError, } from './errors';
|
|
16
|
+
export { EnvironmentLoader } from './loaders/environment.loader';
|
|
17
|
+
export { EnvFileLoader } from './loaders/env-file.loader';
|
|
18
|
+
export { S3Loader } from './loaders/s3.loader';
|
|
19
|
+
export { SecretsManagerLoader } from './loaders/secrets-manager.loader';
|
|
20
|
+
export { SSMParameterStoreLoader } from './loaders/ssm-parameter-store.loader';
|
|
21
|
+
export { ConfigManager } from './config-manager';
|
|
22
|
+
export { ConfigValidationUtil } from './utils/validation.util';
|
|
23
|
+
export { EnvFileParser } from './utils/env-file-parser.util';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,sCAAsC,CAAC;AAE9C,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,GACP,MAAM,uCAAuC,CAAC;AAE/C,YAAY,EACV,uBAAuB,GACxB,MAAM,2CAA2C,CAAC;AAEnD,YAAY,EACV,mBAAmB,GACpB,MAAM,wCAAwC,CAAC;AAEhD,YAAY,EACV,cAAc,GACf,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,0BAA0B,GAC3B,MAAM,+CAA+C,CAAC;AAEvD,YAAY,EACV,6BAA6B,GAC9B,MAAM,mDAAmD,CAAC;AAG3D,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result returned by a configuration loader
|
|
3
|
+
*/
|
|
4
|
+
export interface ConfigLoaderResult {
|
|
5
|
+
/** The loaded configuration key-value pairs */
|
|
6
|
+
config: Record<string, unknown>;
|
|
7
|
+
/** Keys that were loaded by this loader */
|
|
8
|
+
keysLoaded: string[];
|
|
9
|
+
/** Time taken to load in milliseconds */
|
|
10
|
+
duration: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Interface for configuration loaders.
|
|
14
|
+
* All loaders must implement this interface to be used with ConfigManager.
|
|
15
|
+
*/
|
|
16
|
+
export interface ConfigLoader {
|
|
17
|
+
/**
|
|
18
|
+
* Load configuration from the source.
|
|
19
|
+
* @returns Promise resolving to the loaded configuration
|
|
20
|
+
*/
|
|
21
|
+
load(): Promise<Record<string, unknown>>;
|
|
22
|
+
/**
|
|
23
|
+
* Get the name of this loader for logging and debugging.
|
|
24
|
+
* @returns The loader name
|
|
25
|
+
*/
|
|
26
|
+
getName(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Check if this loader is available and can load configuration.
|
|
29
|
+
* @returns Promise resolving to true if the loader can load configuration
|
|
30
|
+
*/
|
|
31
|
+
isAvailable(): Promise<boolean>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=config-loader.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/config-loader.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzC;;;OAGG;IACH,OAAO,IAAI,MAAM,CAAC;IAElB;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
import type { ConfigLoader } from './config-loader.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Logger interface for ConfigManager
|
|
5
|
+
*/
|
|
6
|
+
export interface Logger {
|
|
7
|
+
log(message: string): void;
|
|
8
|
+
error(message: string): void;
|
|
9
|
+
warn(message: string): void;
|
|
10
|
+
debug?(message: string): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Options for verbose logging output
|
|
14
|
+
*/
|
|
15
|
+
export interface VerboseOptions {
|
|
16
|
+
/** Log all variable names being loaded. Default: true */
|
|
17
|
+
logKeys?: boolean;
|
|
18
|
+
/** Log variable values (WARNING: may expose secrets). Default: false */
|
|
19
|
+
logValues?: boolean;
|
|
20
|
+
/** Log when a variable is overridden by a higher-precedence loader. Default: true */
|
|
21
|
+
logOverrides?: boolean;
|
|
22
|
+
/** Log loader timing information. Default: true */
|
|
23
|
+
logTiming?: boolean;
|
|
24
|
+
/** Mask sensitive values (show first/last 2 chars only). Default: true (when logValues is true) */
|
|
25
|
+
maskValues?: boolean;
|
|
26
|
+
/** Keys to always mask regardless of maskValues setting. Default: ['password', 'secret', 'key', 'token'] */
|
|
27
|
+
sensitiveKeys?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Custom loader precedence configuration
|
|
31
|
+
*/
|
|
32
|
+
export interface LoaderPrecedence {
|
|
33
|
+
/** Loader name */
|
|
34
|
+
loader: string;
|
|
35
|
+
/** Priority - higher values override lower values */
|
|
36
|
+
priority: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Precedence strategy for merging configurations
|
|
40
|
+
* - 'aws-first': env -> envFile -> s3 -> secretsManager -> ssm (AWS wins)
|
|
41
|
+
* - 'local-first': secretsManager -> ssm -> s3 -> envFile -> env (local wins)
|
|
42
|
+
* - Custom array: user-defined order via LoaderPrecedence[]
|
|
43
|
+
*/
|
|
44
|
+
export type PrecedenceStrategy = 'aws-first' | 'local-first' | LoaderPrecedence[];
|
|
45
|
+
/**
|
|
46
|
+
* Options for ConfigManager
|
|
47
|
+
*/
|
|
48
|
+
export interface ConfigManagerOptions<T = Record<string, unknown>> {
|
|
49
|
+
/** Array of loaders to use */
|
|
50
|
+
loaders?: ConfigLoader[];
|
|
51
|
+
/** Zod schema for validation */
|
|
52
|
+
schema?: ZodType<T>;
|
|
53
|
+
/** Precedence strategy for merging configurations */
|
|
54
|
+
precedence?: PrecedenceStrategy;
|
|
55
|
+
/** Whether to validate configuration on load. Default: true */
|
|
56
|
+
validateOnLoad?: boolean;
|
|
57
|
+
/** Enable logging. Default: false */
|
|
58
|
+
enableLogging?: boolean;
|
|
59
|
+
/** Custom logger instance */
|
|
60
|
+
logger?: Logger;
|
|
61
|
+
/** Verbose debugging output options */
|
|
62
|
+
verbose?: VerboseOptions | boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Information about a configuration source
|
|
66
|
+
*/
|
|
67
|
+
export interface ConfigSourceInfo {
|
|
68
|
+
/** Name of the loader */
|
|
69
|
+
loader: string;
|
|
70
|
+
/** Keys loaded by this loader */
|
|
71
|
+
keysLoaded: string[];
|
|
72
|
+
/** Time taken to load in milliseconds */
|
|
73
|
+
duration: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Result of loading configuration
|
|
77
|
+
*/
|
|
78
|
+
export interface ConfigLoadResult<T> {
|
|
79
|
+
/** The merged configuration */
|
|
80
|
+
config: T;
|
|
81
|
+
/** Information about each source */
|
|
82
|
+
sources: ConfigSourceInfo[];
|
|
83
|
+
/** When the configuration was loaded */
|
|
84
|
+
loadedAt: Date;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=config-manager.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/config-manager.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qFAAqF;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mGAAmG;IACnG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4GAA4G;IAC5G,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,aAAa,GAAG,gBAAgB,EAAE,CAAC;AAElF;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D,8BAA8B;IAC9B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,+DAA+D;IAC/D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,+BAA+B;IAC/B,MAAM,EAAE,CAAC,CAAC;IACV,oCAAoC;IACpC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,EAAE,IAAI,CAAC;CAChB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for EnvFileLoader
|
|
3
|
+
*/
|
|
4
|
+
export interface EnvFileLoaderConfig {
|
|
5
|
+
/** Paths to .env files to load. Default: ['.env', '.env.local'] */
|
|
6
|
+
paths?: string[];
|
|
7
|
+
/** File encoding. Default: 'utf-8' */
|
|
8
|
+
encoding?: BufferEncoding;
|
|
9
|
+
/** Whether later files override earlier ones. Default: true */
|
|
10
|
+
override?: boolean;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=env-file-loader.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-file-loader.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/env-file-loader.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for EnvironmentLoader
|
|
3
|
+
*/
|
|
4
|
+
export interface EnvironmentLoaderConfig {
|
|
5
|
+
/** Prefix to filter environment variables. Only variables starting with this prefix will be loaded. */
|
|
6
|
+
prefix?: string;
|
|
7
|
+
/** List of environment variable names to exclude from loading */
|
|
8
|
+
exclude?: string[];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=environment-loader.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment-loader.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/environment-loader.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,uGAAuG;IACvG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type { ConfigLoader, ConfigLoaderResult } from './config-loader.interface';
|
|
2
|
+
export type { ConfigManagerOptions, LoaderPrecedence, VerboseOptions, PrecedenceStrategy, ConfigLoadResult, ConfigSourceInfo, Logger, } from './config-manager.interface';
|
|
3
|
+
export type { EnvironmentLoaderConfig } from './environment-loader.interface';
|
|
4
|
+
export type { EnvFileLoaderConfig } from './env-file-loader.interface';
|
|
5
|
+
export type { S3LoaderConfig } from './s3-loader.interface';
|
|
6
|
+
export type { SecretsManagerLoaderConfig } from './secrets-manager-loader.interface';
|
|
7
|
+
export type { SSMParameterStoreLoaderConfig } from './ssm-parameter-store-loader.interface';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,GACP,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,YAAY,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for S3Loader
|
|
3
|
+
*/
|
|
4
|
+
export interface S3LoaderConfig {
|
|
5
|
+
/** S3 bucket name */
|
|
6
|
+
bucket: string;
|
|
7
|
+
/** S3 object key */
|
|
8
|
+
key: string;
|
|
9
|
+
/** AWS region. If not specified, uses default region from environment */
|
|
10
|
+
region?: string;
|
|
11
|
+
/** Format of the configuration file. Default: 'auto' (auto-detect based on content) */
|
|
12
|
+
format?: 'json' | 'env' | 'auto';
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=s3-loader.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-loader.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/s3-loader.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CAClC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration options for SecretsManagerLoader
|
|
3
|
+
*/
|
|
4
|
+
export interface SecretsManagerLoaderConfig {
|
|
5
|
+
/** Name or ARN of the secret to load */
|
|
6
|
+
secretName?: string;
|
|
7
|
+
/** AWS region. If not specified, uses default region from environment */
|
|
8
|
+
region?: string;
|
|
9
|
+
/** Mapping of environment names to path prefixes */
|
|
10
|
+
environmentMapping?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=secrets-manager-loader.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-manager-loader.interface.d.ts","sourceRoot":"","sources":["../../../src/interfaces/secrets-manager-loader.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C"}
|