@kibibit/configit 1.0.0-beta.25 → 1.0.0-beta.27
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 +419 -0
- package/lib/scripts/test-vault-comprehensive.d.ts +2 -0
- package/lib/scripts/test-vault-comprehensive.d.ts.map +1 -0
- package/lib/scripts/test-vault-comprehensive.js +422 -0
- package/lib/scripts/test-vault-comprehensive.js.map +1 -0
- package/lib/scripts/test-vault-dynamic.d.ts +2 -0
- package/lib/scripts/test-vault-dynamic.d.ts.map +1 -0
- package/lib/scripts/test-vault-dynamic.js +193 -0
- package/lib/scripts/test-vault-dynamic.js.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts +3 -0
- package/lib/scripts/test-vault-gcp-ttl.d.ts.map +1 -0
- package/lib/scripts/test-vault-gcp-ttl.js +218 -0
- package/lib/scripts/test-vault-gcp-ttl.js.map +1 -0
- package/lib/scripts/test-vault.d.ts +2 -0
- package/lib/scripts/test-vault.d.ts.map +1 -0
- package/lib/scripts/test-vault.js +167 -0
- package/lib/scripts/test-vault.js.map +1 -0
- package/lib/src/config.errors.d.ts.map +1 -0
- package/lib/src/config.errors.js.map +1 -0
- package/lib/src/config.model.d.ts.map +1 -0
- package/lib/src/config.model.js.map +1 -0
- package/lib/{config.service.d.ts → src/config.service.d.ts} +10 -1
- package/lib/src/config.service.d.ts.map +1 -0
- package/lib/{config.service.js → src/config.service.js} +75 -9
- package/lib/src/config.service.js.map +1 -0
- package/lib/src/environment.service.d.ts.map +1 -0
- package/lib/src/environment.service.js.map +1 -0
- package/lib/{index.d.ts → src/index.d.ts} +1 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/{index.js → src/index.js} +1 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/json-schema.validator.d.ts.map +1 -0
- package/lib/src/json-schema.validator.js.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts +2 -0
- package/lib/src/vault/__tests__/vault-integration.test.d.ts.map +1 -0
- package/lib/src/vault/__tests__/vault-integration.test.js +190 -0
- package/lib/src/vault/__tests__/vault-integration.test.js.map +1 -0
- package/lib/src/vault/decorators.d.ts +17 -0
- package/lib/src/vault/decorators.d.ts.map +1 -0
- package/lib/src/vault/decorators.js +149 -0
- package/lib/src/vault/decorators.js.map +1 -0
- package/lib/src/vault/index.d.ts +7 -0
- package/lib/src/vault/index.d.ts.map +1 -0
- package/lib/src/vault/index.js +42 -0
- package/lib/src/vault/index.js.map +1 -0
- package/lib/src/vault/secret-refresh-manager.d.ts +23 -0
- package/lib/src/vault/secret-refresh-manager.d.ts.map +1 -0
- package/lib/src/vault/secret-refresh-manager.js +149 -0
- package/lib/src/vault/secret-refresh-manager.js.map +1 -0
- package/lib/src/vault/types.d.ts +149 -0
- package/lib/src/vault/types.d.ts.map +1 -0
- package/lib/src/vault/types.js +4 -0
- package/lib/src/vault/types.js.map +1 -0
- package/lib/src/vault/vault-cache.d.ts +20 -0
- package/lib/src/vault/vault-cache.d.ts.map +1 -0
- package/lib/src/vault/vault-cache.js +139 -0
- package/lib/src/vault/vault-cache.js.map +1 -0
- package/lib/src/vault/vault-integration.d.ts +27 -0
- package/lib/src/vault/vault-integration.d.ts.map +1 -0
- package/lib/src/vault/vault-integration.js +211 -0
- package/lib/src/vault/vault-integration.js.map +1 -0
- package/lib/src/vault/vault-provider.d.ts +37 -0
- package/lib/src/vault/vault-provider.d.ts.map +1 -0
- package/lib/src/vault/vault-provider.js +354 -0
- package/lib/src/vault/vault-provider.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -74
- package/src/config.service.ts +155 -10
- package/src/config.service.vault.spec.ts +859 -0
- package/src/index.ts +1 -0
- package/src/vault/__tests__/vault-integration.test.ts +226 -0
- package/src/vault/decorators.ts +228 -0
- package/src/vault/index.ts +31 -0
- package/src/vault/secret-refresh-manager.ts +241 -0
- package/src/vault/types.ts +487 -0
- package/src/vault/vault-cache.ts +240 -0
- package/src/vault/vault-integration.ts +332 -0
- package/src/vault/vault-provider.ts +576 -0
- package/lib/config.errors.d.ts.map +0 -1
- package/lib/config.errors.js.map +0 -1
- package/lib/config.model.d.ts.map +0 -1
- package/lib/config.model.js.map +0 -1
- package/lib/config.service.d.ts.map +0 -1
- package/lib/config.service.js.map +0 -1
- package/lib/environment.service.d.ts.map +0 -1
- package/lib/environment.service.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/json-schema.validator.d.ts.map +0 -1
- package/lib/json-schema.validator.js.map +0 -1
- /package/lib/{config.errors.d.ts → src/config.errors.d.ts} +0 -0
- /package/lib/{config.errors.js → src/config.errors.js} +0 -0
- /package/lib/{config.model.d.ts → src/config.model.d.ts} +0 -0
- /package/lib/{config.model.js → src/config.model.js} +0 -0
- /package/lib/{environment.service.d.ts → src/environment.service.d.ts} +0 -0
- /package/lib/{environment.service.js → src/environment.service.js} +0 -0
- /package/lib/{json-schema.validator.d.ts → src/json-schema.validator.d.ts} +0 -0
- /package/lib/{json-schema.validator.js → src/json-schema.validator.js} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault-gcp-ttl.d.ts","sourceRoot":"","sources":["../../scripts/test-vault-gcp-ttl.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env npx ts-node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
20
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
22
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
23
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
24
|
+
};
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
33
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const vault_integration_1 = require("../src/vault/vault-integration");
|
|
39
|
+
const vault_provider_1 = require("../src/vault/vault-provider");
|
|
40
|
+
const decorators_1 = require("../src/vault/decorators");
|
|
41
|
+
process.env.VAULT_ADDR = 'http://127.0.0.1:8200';
|
|
42
|
+
const VAULT_ADDR = 'http://127.0.0.1:8200';
|
|
43
|
+
const KEY_FILE = path.join(process.cwd(), 'secrets/gcp-sa-key.json');
|
|
44
|
+
const GCP_PROJECT_FILE = path.join(process.cwd(), '.gcp-test-project');
|
|
45
|
+
class TestConfigWithDynamicSecret {
|
|
46
|
+
}
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, decorators_1.VaultEngine)('database'),
|
|
49
|
+
(0, decorators_1.VaultPath)('creds/configit-readonly'),
|
|
50
|
+
(0, decorators_1.VaultKey)('username'),
|
|
51
|
+
__metadata("design:type", String)
|
|
52
|
+
], TestConfigWithDynamicSecret.prototype, "dbUser", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, decorators_1.VaultEngine)('database'),
|
|
55
|
+
(0, decorators_1.VaultPath)('creds/configit-readonly'),
|
|
56
|
+
(0, decorators_1.VaultKey)('password'),
|
|
57
|
+
__metadata("design:type", String)
|
|
58
|
+
], TestConfigWithDynamicSecret.prototype, "dbPassword", void 0);
|
|
59
|
+
const GREEN = '\x1b[32m';
|
|
60
|
+
const RED = '\x1b[31m';
|
|
61
|
+
const YELLOW = '\x1b[33m';
|
|
62
|
+
const BLUE = '\x1b[34m';
|
|
63
|
+
const CYAN = '\x1b[36m';
|
|
64
|
+
const NC = '\x1b[0m';
|
|
65
|
+
function log(msg, color = NC) {
|
|
66
|
+
console.log(`${color}${msg}${NC}`);
|
|
67
|
+
}
|
|
68
|
+
function elapsed(start) {
|
|
69
|
+
return ((Date.now() - start) / 1000).toFixed(1);
|
|
70
|
+
}
|
|
71
|
+
async function sleep(ms) {
|
|
72
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
73
|
+
}
|
|
74
|
+
async function runTest() {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
log('\n============================================', BLUE);
|
|
77
|
+
log(' GCP IAM Auth TTL Test', BLUE);
|
|
78
|
+
log('============================================\n', BLUE);
|
|
79
|
+
if (!fs.existsSync(KEY_FILE)) {
|
|
80
|
+
log('ERROR: GCP key file not found', RED);
|
|
81
|
+
log('Run: ./scripts/vault-setup.sh (without --skip-gcp)', YELLOW);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (!fs.existsSync(GCP_PROJECT_FILE)) {
|
|
85
|
+
log('ERROR: GCP project file not found', RED);
|
|
86
|
+
log('Run: ./scripts/vault-setup.sh (without --skip-gcp)', YELLOW);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const keyData = JSON.parse(fs.readFileSync(KEY_FILE, 'utf-8'));
|
|
90
|
+
const serviceAccountEmail = keyData.client_email;
|
|
91
|
+
log(`Service Account: ${serviceAccountEmail}`, CYAN);
|
|
92
|
+
log('\n--- Test 1: GCP IAM Auth with 10s TTL ---', YELLOW);
|
|
93
|
+
const vaultOptions = {
|
|
94
|
+
endpoint: VAULT_ADDR,
|
|
95
|
+
auth: {
|
|
96
|
+
method: 'gcp',
|
|
97
|
+
role: 'configit-gcp-role',
|
|
98
|
+
serviceAccountKeyFile: KEY_FILE,
|
|
99
|
+
serviceAccountEmail
|
|
100
|
+
},
|
|
101
|
+
tls: { enabled: false, verifyCertificate: false }
|
|
102
|
+
};
|
|
103
|
+
const provider = new vault_provider_1.VaultProvider(vaultOptions);
|
|
104
|
+
const start1 = Date.now();
|
|
105
|
+
try {
|
|
106
|
+
await provider.connect();
|
|
107
|
+
log(`✓ Initial GCP auth successful (${elapsed(start1)}s)`, GREEN);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
log(`✗ GCP auth failed: ${err.message}`, RED);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
const secret1 = await provider.readSecret('configit/api', 'kv2');
|
|
114
|
+
log(`✓ Read KV secret: api_key=${(_a = secret1.data['api_key']) === null || _a === void 0 ? void 0 : _a.slice(0, 10)}...`, GREEN);
|
|
115
|
+
log('\n--- Test 2: Wait for Auth TTL (10s) to Expire ---', YELLOW);
|
|
116
|
+
log(' Waiting 12 seconds for token to expire...', CYAN);
|
|
117
|
+
await sleep(12000);
|
|
118
|
+
log(' Token should be expired now, attempting to read...', CYAN);
|
|
119
|
+
try {
|
|
120
|
+
const secret2 = await provider.readSecret('configit/api', 'kv2');
|
|
121
|
+
log(`✗ Unexpectedly succeeded - secret: ${JSON.stringify(secret2.data)}`, RED);
|
|
122
|
+
log(' This might mean token hasn\'t expired or was auto-renewed', YELLOW);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
log(`✓ Expected: Token expired - ${err.message.slice(0, 50)}...`, GREEN);
|
|
126
|
+
}
|
|
127
|
+
log('\n--- Test 3: Re-authenticate After Expiry ---', YELLOW);
|
|
128
|
+
const start3 = Date.now();
|
|
129
|
+
await provider.connect();
|
|
130
|
+
log(`✓ Re-authentication successful (${elapsed(start3)}s)`, GREEN);
|
|
131
|
+
const secret3 = await provider.readSecret('configit/api', 'kv2');
|
|
132
|
+
log(`✓ Read secret after re-auth: api_key=${(_b = secret3.data['api_key']) === null || _b === void 0 ? void 0 : _b.slice(0, 10)}...`, GREEN);
|
|
133
|
+
await provider.disconnect();
|
|
134
|
+
log('\n--- Test 4: VaultIntegration with Short Auth TTL ---', YELLOW);
|
|
135
|
+
log(' Testing: Auth TTL (10s) < Secret TTL (60s)', CYAN);
|
|
136
|
+
log(' This verifies secrets stay valid even when auth expires', CYAN);
|
|
137
|
+
const integration = new vault_integration_1.VaultIntegration({
|
|
138
|
+
endpoint: VAULT_ADDR,
|
|
139
|
+
auth: {
|
|
140
|
+
method: 'gcp',
|
|
141
|
+
role: 'configit-gcp-role',
|
|
142
|
+
serviceAccountKeyFile: KEY_FILE,
|
|
143
|
+
serviceAccountEmail
|
|
144
|
+
},
|
|
145
|
+
tls: { enabled: false, verifyCertificate: false },
|
|
146
|
+
refreshBuffer: 5
|
|
147
|
+
});
|
|
148
|
+
const testConfig = new TestConfigWithDynamicSecret();
|
|
149
|
+
const start4 = Date.now();
|
|
150
|
+
try {
|
|
151
|
+
await integration.initialize();
|
|
152
|
+
await integration.loadSecrets(testConfig);
|
|
153
|
+
log(`✓ Initial load successful (${elapsed(start4)}s)`, GREEN);
|
|
154
|
+
log(` DB User: ${testConfig.dbUser}`, CYAN);
|
|
155
|
+
log(` DB Pass: ${(_c = testConfig.dbPassword) === null || _c === void 0 ? void 0 : _c.slice(0, 10)}...`, CYAN);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
log(`✗ Failed: ${err.message}`, RED);
|
|
159
|
+
await integration.shutdown();
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
const health = integration.getHealth();
|
|
163
|
+
log('\n Health Status:', CYAN);
|
|
164
|
+
log(` Connected: ${health.connected}`, health.connected ? GREEN : RED);
|
|
165
|
+
log(` Cache Size: ${health.cacheSize}`, CYAN);
|
|
166
|
+
log(` Refresh Queue: ${health.refreshQueueSize}`, CYAN);
|
|
167
|
+
log('\n--- Test 5: Multiple Auth TTL Cycles ---', YELLOW);
|
|
168
|
+
log(' Monitoring for 35 seconds (3+ auth TTL cycles)...', CYAN);
|
|
169
|
+
const initialUser = testConfig.dbUser;
|
|
170
|
+
let refreshCount = 0;
|
|
171
|
+
const checkInterval = 5000;
|
|
172
|
+
const totalWait = 35000;
|
|
173
|
+
for (let waited = 0; waited < totalWait; waited += checkInterval) {
|
|
174
|
+
await sleep(checkInterval);
|
|
175
|
+
const currentHealth = integration.getHealth();
|
|
176
|
+
const timeStr = `[${((waited + checkInterval) / 1000).toFixed(0)}s]`;
|
|
177
|
+
log(` ${timeStr} Cache: ${currentHealth.cacheSize}, Queue: ${currentHealth.refreshQueueSize}`, CYAN);
|
|
178
|
+
const newUser = testConfig.dbUser;
|
|
179
|
+
if (newUser !== initialUser) {
|
|
180
|
+
refreshCount++;
|
|
181
|
+
log(` ${timeStr} ✓ Secret REFRESHED: ${initialUser} -> ${newUser}`, GREEN);
|
|
182
|
+
}
|
|
183
|
+
if (currentHealth.errors.length > 0) {
|
|
184
|
+
log(` ${timeStr} Errors: ${currentHealth.errors.length}`, YELLOW);
|
|
185
|
+
currentHealth.errors.slice(-2).forEach((e) => {
|
|
186
|
+
log(` - ${e.path}: ${e.error.slice(0, 40)}...`, YELLOW);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
log('\n--- Final Verification ---', YELLOW);
|
|
191
|
+
const finalUser = testConfig.dbUser;
|
|
192
|
+
const finalPass = testConfig.dbPassword;
|
|
193
|
+
if (finalUser && finalPass) {
|
|
194
|
+
log(`✓ Secrets still available after 35s:`, GREEN);
|
|
195
|
+
log(` DB User: ${finalUser}`, CYAN);
|
|
196
|
+
log(` DB Pass: ${finalPass === null || finalPass === void 0 ? void 0 : finalPass.slice(0, 10)}...`, CYAN);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
log(`✗ Secrets lost after auth cycles`, RED);
|
|
200
|
+
}
|
|
201
|
+
await integration.shutdown();
|
|
202
|
+
log('\n============================================', BLUE);
|
|
203
|
+
log(' Test Summary', BLUE);
|
|
204
|
+
log('============================================', BLUE);
|
|
205
|
+
log(' Auth Method: GCP IAM', CYAN);
|
|
206
|
+
log(' Auth TTL: 10 seconds', CYAN);
|
|
207
|
+
log(' Secret TTL: 60 seconds (database creds)', CYAN);
|
|
208
|
+
log(' Test Duration: 35 seconds', CYAN);
|
|
209
|
+
log(` Secret Refreshes: ${refreshCount}`, refreshCount > 0 ? GREEN : YELLOW);
|
|
210
|
+
log('\n ✓ Test Complete', GREEN);
|
|
211
|
+
log('============================================\n', BLUE);
|
|
212
|
+
}
|
|
213
|
+
runTest().catch((err) => {
|
|
214
|
+
log(`\nFATAL ERROR: ${err.message}`, RED);
|
|
215
|
+
console.error(err);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=test-vault-gcp-ttl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault-gcp-ttl.js","sourceRoot":"","sources":["../../scripts/test-vault-gcp-ttl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault.d.ts","sourceRoot":"","sources":["../../scripts/test-vault.ts"],"names":[],"mappings":"AAWA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
require("reflect-metadata");
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const vault_1 = require("../src/vault");
|
|
15
|
+
class TestVaultConfig {
|
|
16
|
+
}
|
|
17
|
+
__decorate([
|
|
18
|
+
(0, vault_1.VaultPath)('secret/data/configit/api'),
|
|
19
|
+
(0, vault_1.VaultKey)('api_key'),
|
|
20
|
+
(0, class_validator_1.IsString)(),
|
|
21
|
+
__metadata("design:type", String)
|
|
22
|
+
], TestVaultConfig.prototype, "API_KEY", void 0);
|
|
23
|
+
__decorate([
|
|
24
|
+
(0, vault_1.VaultPath)('secret/data/configit/api'),
|
|
25
|
+
(0, vault_1.VaultKey)('api_secret'),
|
|
26
|
+
(0, class_validator_1.IsString)(),
|
|
27
|
+
__metadata("design:type", String)
|
|
28
|
+
], TestVaultConfig.prototype, "API_SECRET", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
(0, vault_1.VaultPath)('secret/data/configit/database'),
|
|
31
|
+
(0, vault_1.VaultKey)('host'),
|
|
32
|
+
(0, class_validator_1.IsString)(),
|
|
33
|
+
__metadata("design:type", String)
|
|
34
|
+
], TestVaultConfig.prototype, "DB_HOST", void 0);
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, vault_1.VaultPath)('secret/data/configit/database'),
|
|
37
|
+
(0, vault_1.VaultKey)('port'),
|
|
38
|
+
(0, class_validator_1.IsString)(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], TestVaultConfig.prototype, "DB_PORT", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, vault_1.VaultPath)('secret/data/configit/database'),
|
|
43
|
+
(0, vault_1.VaultKey)('username'),
|
|
44
|
+
(0, class_validator_1.IsString)(),
|
|
45
|
+
__metadata("design:type", String)
|
|
46
|
+
], TestVaultConfig.prototype, "DB_USERNAME", void 0);
|
|
47
|
+
__decorate([
|
|
48
|
+
(0, vault_1.VaultPath)('secret/data/configit/database'),
|
|
49
|
+
(0, vault_1.VaultKey)('password'),
|
|
50
|
+
(0, class_validator_1.IsString)(),
|
|
51
|
+
__metadata("design:type", String)
|
|
52
|
+
], TestVaultConfig.prototype, "DB_PASSWORD", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, vault_1.VaultPath)('secret/data/configit/features'),
|
|
55
|
+
(0, vault_1.VaultKey)('enable_beta'),
|
|
56
|
+
(0, class_validator_1.IsString)(),
|
|
57
|
+
__metadata("design:type", String)
|
|
58
|
+
], TestVaultConfig.prototype, "ENABLE_BETA", void 0);
|
|
59
|
+
__decorate([
|
|
60
|
+
(0, vault_1.VaultPath)('secret/data/configit/features'),
|
|
61
|
+
(0, vault_1.VaultKey)('max_connections'),
|
|
62
|
+
(0, class_validator_1.IsString)(),
|
|
63
|
+
__metadata("design:type", String)
|
|
64
|
+
], TestVaultConfig.prototype, "MAX_CONNECTIONS", void 0);
|
|
65
|
+
const VAULT_CONFIG = {
|
|
66
|
+
endpoint: process.env.LOCAL_VAULT_ADDR || 'http://127.0.0.1:8200',
|
|
67
|
+
auth: {
|
|
68
|
+
methods: [
|
|
69
|
+
{
|
|
70
|
+
type: 'token',
|
|
71
|
+
config: {
|
|
72
|
+
type: 'token',
|
|
73
|
+
token: process.env.LOCAL_VAULT_TOKEN || 'configit-dev-token'
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
tls: {
|
|
79
|
+
enabled: false,
|
|
80
|
+
verifyCertificate: false
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
async function runTests() {
|
|
84
|
+
console.log('='.repeat(50));
|
|
85
|
+
console.log(' Configit Vault Integration Test');
|
|
86
|
+
console.log('='.repeat(50));
|
|
87
|
+
console.log('');
|
|
88
|
+
const integration = new vault_1.VaultIntegration(VAULT_CONFIG);
|
|
89
|
+
try {
|
|
90
|
+
console.log('Test 1: Initializing Vault connection...');
|
|
91
|
+
await integration.initialize();
|
|
92
|
+
console.log(' ✓ Initialized successfully\n');
|
|
93
|
+
console.log('Test 2: Loading secrets from Vault...');
|
|
94
|
+
await integration.loadSecrets(TestVaultConfig);
|
|
95
|
+
console.log(' ✓ Secrets loaded\n');
|
|
96
|
+
console.log('Test 3: Verifying secret values...');
|
|
97
|
+
const expectedSecrets = {
|
|
98
|
+
API_KEY: 'test-api-key-123',
|
|
99
|
+
API_SECRET: 'test-api-secret-xyz',
|
|
100
|
+
DB_HOST: 'localhost',
|
|
101
|
+
DB_PORT: '5432',
|
|
102
|
+
DB_USERNAME: 'testuser',
|
|
103
|
+
DB_PASSWORD: 'testpassword',
|
|
104
|
+
ENABLE_BETA: 'true',
|
|
105
|
+
MAX_CONNECTIONS: '100'
|
|
106
|
+
};
|
|
107
|
+
let allPassed = true;
|
|
108
|
+
for (const [key, expected] of Object.entries(expectedSecrets)) {
|
|
109
|
+
const actual = integration.getSecret(key);
|
|
110
|
+
const passed = actual === expected;
|
|
111
|
+
const status = passed ? '✓' : '✗';
|
|
112
|
+
console.log(` ${status} ${key}: ${passed ? 'correct' : `expected "${expected}", got "${actual}"`}`);
|
|
113
|
+
if (!passed) {
|
|
114
|
+
allPassed = false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log('');
|
|
118
|
+
console.log('Test 4: Checking health status...');
|
|
119
|
+
const health = integration.getHealth();
|
|
120
|
+
console.log(` Connected: ${health.connected}`);
|
|
121
|
+
console.log(` Authenticated: ${health.authenticated}`);
|
|
122
|
+
console.log(` Cache size: ${health.cacheSize}`);
|
|
123
|
+
console.log(` Errors: ${health.errors.length}`);
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log('Test 5: Testing cache invalidation...');
|
|
126
|
+
const beforeInvalidate = integration.getSecret('API_KEY');
|
|
127
|
+
integration.invalidateProperty('API_KEY');
|
|
128
|
+
const afterInvalidate = integration.getSecret('API_KEY');
|
|
129
|
+
if (beforeInvalidate === 'test-api-key-123' && afterInvalidate === null) {
|
|
130
|
+
console.log(' ✓ Cache invalidation works correctly\n');
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(' ✗ Cache invalidation failed\n');
|
|
134
|
+
allPassed = false;
|
|
135
|
+
}
|
|
136
|
+
console.log('='.repeat(50));
|
|
137
|
+
if (allPassed) {
|
|
138
|
+
console.log(' ✓ All tests passed!');
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
console.log(' ✗ Some tests failed');
|
|
142
|
+
}
|
|
143
|
+
console.log('='.repeat(50));
|
|
144
|
+
return allPassed;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('');
|
|
148
|
+
console.error('✗ Test failed with error:', error.message);
|
|
149
|
+
console.error('');
|
|
150
|
+
console.error('Make sure Vault is running:');
|
|
151
|
+
console.error(' docker compose -f docker-compose.vault.yml up -d');
|
|
152
|
+
console.error(' bash scripts/vault-setup.sh');
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
integration.shutdown();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
runTests()
|
|
160
|
+
.then((passed) => {
|
|
161
|
+
process.exit(passed ? 0 : 1);
|
|
162
|
+
})
|
|
163
|
+
.catch((error) => {
|
|
164
|
+
console.error('Unexpected error:', error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=test-vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-vault.js","sourceRoot":"","sources":["../../scripts/test-vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.errors.d.ts","sourceRoot":"","sources":["../../src/config.errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,OAAO,OAAO,MAAM,mBAAmB,CAAC;AAExC,qBAAa,qBAAsB,SAAQ,OAAO;gBACpC,gBAAgB,EAAE,eAAe,EAAE;CAkBhD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.errors.js","sourceRoot":"","sources":["../../src/config.errors.ts"],"names":[],"mappings":";;;;;;AACA,mCAAmC;AACnC,mCAAuC;AAEvC,iEAAwC;AAExC,MAAa,qBAAsB,SAAQ,kBAAO;IAChD,YAAY,gBAAmC;QAC7C,MAAM,OAAO,GAAG,gBAAgB;aAC7B,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,IAAA,aAAI,EAAC,IAAA,cAAK,EAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO;gBACL,EAAE;gBACF,IAAI;gBACJ,IAAK,IAAA,aAAI,EAAC,WAAW,CAAE,IAAK,eAAe,CAAC,QAAS,EAAE;gBACvD,IAAK,IAAA,aAAI,EAAC,QAAQ,CAAE,IAAK,IAAA,YAAG,EAAC,eAAe,CAAC,KAAK,CAAE,EAAE;gBACtD,IAAI;gBACJ,IAAA,eAAM,EAAC,eAAe,CAAC,WAAW,CAAC;qBAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAU,IAAA,YAAG,EAAC,KAAK,CAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;QAEvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAnBD,sDAmBC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.model.d.ts","sourceRoot":"","sources":["../../src/config.model.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD,eAAO,MAAM,wBAAwB,UAQpC,CAAC;AAEF,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAElD,qBACa,UAAU;IACrB,IAAI,EAAE,MAAM,CAAC;IAOX,QAAQ,SAAiB;IAOzB,UAAU,UAAS;IAQnB,OAAO,EAAE,YAAY,CAAC;IAQtB,OAAO,MAAC;IAQR,QAAQ,MAAC;gBAEC,OAAO,GAAE,OAAO,CAAC,UAAU,CAAM;IAItC,YAAY;IAwCnB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC;IAIxC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,UAAQ;IAU/C,iBAAiB;CAGlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.model.js","sourceRoot":"","sources":["../../src/config.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BaseConfig } from './config.model';
|
|
2
|
+
import { IVaultConfigOptions, VaultHealth } from './vault';
|
|
2
3
|
export interface IConfigServiceOptions {
|
|
3
4
|
convertToCamelCase?: boolean;
|
|
4
5
|
convertUppercaseBooleans?: boolean;
|
|
@@ -12,6 +13,7 @@ export interface IConfigServiceOptions {
|
|
|
12
13
|
algorithm: string;
|
|
13
14
|
secret: string;
|
|
14
15
|
};
|
|
16
|
+
vault?: IVaultConfigOptions;
|
|
15
17
|
}
|
|
16
18
|
export declare enum EFileFormats {
|
|
17
19
|
json = "json",
|
|
@@ -30,14 +32,21 @@ export declare class ConfigService<T extends BaseConfig> {
|
|
|
30
32
|
private fileExtension;
|
|
31
33
|
readonly mode: string;
|
|
32
34
|
readonly options: IConfigServiceOptions;
|
|
33
|
-
|
|
35
|
+
private _config?;
|
|
34
36
|
readonly genericClass?: TClass<T>;
|
|
35
37
|
readonly fileName?: string;
|
|
36
38
|
readonly configFileName: string;
|
|
37
39
|
readonly configFileFullPath?: string;
|
|
38
40
|
readonly configFileRoot?: string;
|
|
39
41
|
readonly appRoot: string;
|
|
42
|
+
private vaultIntegration?;
|
|
40
43
|
constructor(givenClass: TClass<T>, passedConfig?: Partial<T>, options?: IConfigServiceOptions);
|
|
44
|
+
get config(): T;
|
|
45
|
+
initializeVault(): Promise<void>;
|
|
46
|
+
getVaultHealth(): VaultHealth | null;
|
|
47
|
+
invalidateVaultCache(vaultPath: string): void;
|
|
48
|
+
invalidateVaultProperty(propertyName: string): void;
|
|
49
|
+
shutdownVault(): void;
|
|
41
50
|
toPlainObject(): Record<string, any>;
|
|
42
51
|
writeConfigToFile({ fileFormat, excludeSchema, objectWrapper, outputFolder }?: IWriteConfigToFileOptions): void;
|
|
43
52
|
private createConfigInstance;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/config.service.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAoB,MAAM,SAAS,CAAC;AAW7E,MAAM,WAAW,qBAAqB;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,oBAAY,YAAY;IACtB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,yBAAyB;IACtC,UAAU,EAAE,YAAY,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAQlD,qBAAa,aAAa,CAAC,CAAC,SAAS,UAAU;IAC7C,OAAO,CAAC,aAAa,CAAe;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAoB;IACzC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,OAAO,CAAC,OAAO,CAAC,CAAI;IACpB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAM;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;gBAG1C,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EACrB,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE,qBAA0B;IA4FrC,IAAI,MAAM,IAAI,CAAC,CAed;IAeK,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IA0DtC,cAAc,IAAI,WAAW,GAAG,IAAI;IAUpC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAS7C,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IASnD,aAAa,IAAI,IAAI;IAMrB,aAAa;IAKb,iBAAiB,CACf,EACE,UAAU,EACV,aAAa,EACb,aAAa,EACb,YAAY,EACb,GAAE,yBAGF;IA8DH,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,eAAe;IA2DvB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,uBAAuB;IAoC/B,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,wBAAwB;CAQjC"}
|
|
@@ -41,6 +41,7 @@ const yaml_1 = __importDefault(require("yaml"));
|
|
|
41
41
|
const nconfJsoncFormat = __importStar(require("@kibibit/nconf-jsonc"));
|
|
42
42
|
const config_errors_1 = require("./config.errors");
|
|
43
43
|
const environment_service_1 = require("./environment.service");
|
|
44
|
+
const vault_1 = require("./vault");
|
|
44
45
|
const nconfFormats = nconf_1.default.formats;
|
|
45
46
|
nconfFormats.yaml = nconf_yaml_1.default;
|
|
46
47
|
nconfFormats.jsonc = nconfJsoncFormat;
|
|
@@ -65,16 +66,19 @@ class ConfigService {
|
|
|
65
66
|
this.appRoot = this.findRoot();
|
|
66
67
|
this.genericClass = givenClass;
|
|
67
68
|
this.fileExtension = this.options.fileFormat || EFileFormats.json;
|
|
68
|
-
this.
|
|
69
|
-
this.configFileName = this.
|
|
69
|
+
this._config = this.createConfigInstance(this.genericClass, {});
|
|
70
|
+
this.configFileName = this._config.getFileName(this.fileExtension);
|
|
70
71
|
this.configFileRoot = this.findConfigRoot();
|
|
71
72
|
this.configFileFullPath = (0, path_1.join)(this.configFileRoot, this.configFileName);
|
|
72
73
|
this.initializeNconf();
|
|
74
|
+
if (this.options.vault) {
|
|
75
|
+
this.vaultIntegration = new vault_1.VaultIntegration(this.options.vault);
|
|
76
|
+
}
|
|
73
77
|
const config = passedConfig || nconf_1.default.get();
|
|
74
78
|
const pathDoesNotExist = (0, fs_extra_1.pathExistsSync)(this.configFileFullPath) === false;
|
|
75
79
|
if (pathDoesNotExist && (config.saveToFile || config.init)) {
|
|
76
80
|
console.log((0, colors_1.cyan)('Initializing Configuration File'));
|
|
77
|
-
this.
|
|
81
|
+
this._config = this.createConfigInstance(this.genericClass, {});
|
|
78
82
|
this.writeConfigToFile();
|
|
79
83
|
this.writeSchema();
|
|
80
84
|
console.log((0, colors_1.cyan)('EXITING'));
|
|
@@ -94,7 +98,7 @@ class ConfigService {
|
|
|
94
98
|
return;
|
|
95
99
|
}
|
|
96
100
|
envConfig.NODE_ENV = this.mode;
|
|
97
|
-
this.
|
|
101
|
+
this._config = this.createConfigInstance(this.genericClass, envConfig);
|
|
98
102
|
if (config.saveToFile || config.init) {
|
|
99
103
|
if (config.convert) {
|
|
100
104
|
console.log((0, colors_1.cyan)('Converting Configuration File'));
|
|
@@ -108,8 +112,70 @@ class ConfigService {
|
|
|
108
112
|
}
|
|
109
113
|
configService = this;
|
|
110
114
|
}
|
|
115
|
+
get config() {
|
|
116
|
+
if (this.options.vault && this.vaultIntegration && !this.vaultIntegration.isInitialized()) {
|
|
117
|
+
console.warn('Warning: Vault is configured but not initialized. ' +
|
|
118
|
+
'Call await configService.initializeVault() before accessing config. ' +
|
|
119
|
+
'Config may not include Vault secrets.');
|
|
120
|
+
}
|
|
121
|
+
if (!this._config) {
|
|
122
|
+
throw new Error('ConfigService config not initialized');
|
|
123
|
+
}
|
|
124
|
+
return this._config;
|
|
125
|
+
}
|
|
126
|
+
async initializeVault() {
|
|
127
|
+
if (!this.options.vault) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (!this.vaultIntegration) {
|
|
131
|
+
throw new Error('VaultIntegration not created. Check constructor.');
|
|
132
|
+
}
|
|
133
|
+
if (!this.genericClass) {
|
|
134
|
+
throw new Error('ConfigService not properly initialized');
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
await this.vaultIntegration.initialize();
|
|
138
|
+
await this.vaultIntegration.loadSecrets(this.genericClass);
|
|
139
|
+
const config = nconf_1.default.get();
|
|
140
|
+
const envConfig = this.validateInput(config);
|
|
141
|
+
if (envConfig) {
|
|
142
|
+
envConfig.NODE_ENV = this.mode;
|
|
143
|
+
this._config = this.createConfigInstance(this.genericClass, envConfig);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const fallback = this.options.vault.fallback;
|
|
148
|
+
if ((fallback === null || fallback === void 0 ? void 0 : fallback.required) !== false) {
|
|
149
|
+
throw new Error(`Vault initialization failed: ${(error === null || error === void 0 ? void 0 : error.message) || 'Unknown error'}. ` +
|
|
150
|
+
`Vault is required for this configuration.`);
|
|
151
|
+
}
|
|
152
|
+
console.warn(`Vault initialization failed: ${(error === null || error === void 0 ? void 0 : error.message) || 'Unknown error'}. ` +
|
|
153
|
+
`Continuing without Vault secrets.`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
getVaultHealth() {
|
|
157
|
+
if (!this.vaultIntegration) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return this.vaultIntegration.getHealth();
|
|
161
|
+
}
|
|
162
|
+
invalidateVaultCache(vaultPath) {
|
|
163
|
+
if (this.vaultIntegration) {
|
|
164
|
+
this.vaultIntegration.invalidateCache(vaultPath);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
invalidateVaultProperty(propertyName) {
|
|
168
|
+
if (this.vaultIntegration) {
|
|
169
|
+
this.vaultIntegration.invalidateProperty(propertyName);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
shutdownVault() {
|
|
173
|
+
if (this.vaultIntegration) {
|
|
174
|
+
this.vaultIntegration.shutdown();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
111
177
|
toPlainObject() {
|
|
112
|
-
return (0, class_transformer_1.classToPlain)(new this.genericClass(this.
|
|
178
|
+
return (0, class_transformer_1.classToPlain)(new this.genericClass(this._config));
|
|
113
179
|
}
|
|
114
180
|
writeConfigToFile({ fileFormat, excludeSchema, objectWrapper, outputFolder } = {
|
|
115
181
|
fileFormat: this.options.fileFormat,
|
|
@@ -217,8 +283,8 @@ class ConfigService {
|
|
|
217
283
|
const sharedConfigSchema = this.writeSharedSchema(sharedConfig);
|
|
218
284
|
sharedConfigsSchemas.push(sharedConfigSchema);
|
|
219
285
|
}
|
|
220
|
-
const schema = this.
|
|
221
|
-
const schemaFullPath = (0, path_1.join)(this.configFileRoot, '/', this.options.schemaFolderName, '/', this.
|
|
286
|
+
const schema = this._config.toJsonSchema();
|
|
287
|
+
const schemaFullPath = (0, path_1.join)(this.configFileRoot, '/', this.options.schemaFolderName, '/', this._config.getSchemaFileName());
|
|
222
288
|
let sharedConfigsProperties = {};
|
|
223
289
|
for (const sharedConfigSchema of sharedConfigsSchemas) {
|
|
224
290
|
(0, lodash_1.mapValues)(sharedConfigSchema.properties, (value) => value.description = `(OVERRIDE SHARED CONFIG)\n${value.description}`);
|
|
@@ -247,7 +313,7 @@ class ConfigService {
|
|
|
247
313
|
return schema;
|
|
248
314
|
}
|
|
249
315
|
writeSharedConfigToFile(configClass) {
|
|
250
|
-
const config = this.createConfigInstance(configClass, this.
|
|
316
|
+
const config = this.createConfigInstance(configClass, this._config);
|
|
251
317
|
const plainConfig = (0, class_transformer_1.classToPlain)(config);
|
|
252
318
|
const relativePathToSchema = (0, path_1.relative)(this.configFileRoot, (0, path_1.join)(this.appRoot, `/${this.options.schemaFolderName}/${config.getSchemaFileName()}`));
|
|
253
319
|
plainConfig.$schema = relativePathToSchema;
|
|
@@ -312,7 +378,7 @@ class ConfigService {
|
|
|
312
378
|
}
|
|
313
379
|
if (validationErrors.length > 0) {
|
|
314
380
|
const validationError = new config_errors_1.ConfigValidationError(validationErrors);
|
|
315
|
-
const errorMessageTitle = `${(0, lodash_1.startCase)(this.
|
|
381
|
+
const errorMessageTitle = `${(0, lodash_1.startCase)(this._config.name)} Configuration Errors`;
|
|
316
382
|
const titleBar = this.generateTerminalTitleBar(errorMessageTitle);
|
|
317
383
|
console.error(titleBar, validationError.message);
|
|
318
384
|
shouldExitProcess = shouldExitProcess || validationErrors.length > 0;
|