@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
@@ -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,3 @@
1
+ export { ConfigValidationUtil } from './validation.util';
2
+ export { EnvFileParser } from './env-file-parser.util';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}