vaulter 0.2.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/LICENSE +21 -0
- package/README.md +490 -0
- package/dist/bin/minienv-mcp.cjs +17 -0
- package/dist/bin/minienv.cjs +146 -0
- package/dist/cli/commands/delete.d.ts +22 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +85 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/export.d.ts +21 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +126 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/get.d.ts +21 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +62 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +98 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/integrations/helm.d.ts +21 -0
- package/dist/cli/commands/integrations/helm.d.ts.map +1 -0
- package/dist/cli/commands/integrations/helm.js +113 -0
- package/dist/cli/commands/integrations/helm.js.map +1 -0
- package/dist/cli/commands/integrations/kubernetes.d.ts +25 -0
- package/dist/cli/commands/integrations/kubernetes.d.ts.map +1 -0
- package/dist/cli/commands/integrations/kubernetes.js +199 -0
- package/dist/cli/commands/integrations/kubernetes.js.map +1 -0
- package/dist/cli/commands/integrations/terraform.d.ts +25 -0
- package/dist/cli/commands/integrations/terraform.d.ts.map +1 -0
- package/dist/cli/commands/integrations/terraform.js +131 -0
- package/dist/cli/commands/integrations/terraform.js.map +1 -0
- package/dist/cli/commands/key.d.ts +19 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +247 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/list.d.ts +21 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +94 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +22 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +142 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +22 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +181 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/services.d.ts +18 -0
- package/dist/cli/commands/services.d.ts.map +1 -0
- package/dist/cli/commands/services.js +92 -0
- package/dist/cli/commands/services.js.map +1 -0
- package/dist/cli/commands/set.d.ts +22 -0
- package/dist/cli/commands/set.d.ts.map +1 -0
- package/dist/cli/commands/set.js +93 -0
- package/dist/cli/commands/set.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +23 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +362 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +266 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/create-client.d.ts +21 -0
- package/dist/cli/lib/create-client.d.ts.map +1 -0
- package/dist/cli/lib/create-client.js +68 -0
- package/dist/cli/lib/create-client.js.map +1 -0
- package/dist/cli/lib/hooks.d.ts +5 -0
- package/dist/cli/lib/hooks.d.ts.map +1 -0
- package/dist/cli/lib/hooks.js +17 -0
- package/dist/cli/lib/hooks.js.map +1 -0
- package/dist/cli/preload.d.ts +6 -0
- package/dist/cli/preload.d.ts.map +1 -0
- package/dist/cli/preload.js +7 -0
- package/dist/cli/preload.js.map +1 -0
- package/dist/client.d.ts +89 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +350 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/batch-runner.d.ts +39 -0
- package/dist/lib/batch-runner.d.ts.map +1 -0
- package/dist/lib/batch-runner.js +117 -0
- package/dist/lib/batch-runner.js.map +1 -0
- package/dist/lib/config-loader.d.ts +45 -0
- package/dist/lib/config-loader.d.ts.map +1 -0
- package/dist/lib/config-loader.js +357 -0
- package/dist/lib/config-loader.js.map +1 -0
- package/dist/lib/env-parser.d.ts +38 -0
- package/dist/lib/env-parser.d.ts.map +1 -0
- package/dist/lib/env-parser.js +281 -0
- package/dist/lib/env-parser.js.map +1 -0
- package/dist/lib/monorepo.d.ts +39 -0
- package/dist/lib/monorepo.d.ts.map +1 -0
- package/dist/lib/monorepo.js +181 -0
- package/dist/lib/monorepo.js.map +1 -0
- package/dist/lib/pattern-matcher.d.ts +5 -0
- package/dist/lib/pattern-matcher.d.ts.map +1 -0
- package/dist/lib/pattern-matcher.js +18 -0
- package/dist/lib/pattern-matcher.js.map +1 -0
- package/dist/lib/s3-key-loader.d.ts +33 -0
- package/dist/lib/s3-key-loader.d.ts.map +1 -0
- package/dist/lib/s3-key-loader.js +83 -0
- package/dist/lib/s3-key-loader.js.map +1 -0
- package/dist/lib/secret-patterns.d.ts +10 -0
- package/dist/lib/secret-patterns.d.ts.map +1 -0
- package/dist/lib/secret-patterns.js +27 -0
- package/dist/lib/secret-patterns.js.map +1 -0
- package/dist/load.d.ts +14 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +15 -0
- package/dist/load.js.map +1 -0
- package/dist/loader.d.ts +63 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +50 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +14 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/preload.d.ts +6 -0
- package/dist/mcp/preload.d.ts.map +1 -0
- package/dist/mcp/preload.js +7 -0
- package/dist/mcp/preload.js.map +1 -0
- package/dist/mcp/resources.d.ts +23 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +112 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +20 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +405 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/types.d.ts +182 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter - .env File Parser
|
|
3
|
+
*
|
|
4
|
+
* Robust parser for .env files with support for:
|
|
5
|
+
* - Single, double, and backtick quotes
|
|
6
|
+
* - Escape sequences in double quotes
|
|
7
|
+
* - Variable expansion (${VAR} and $VAR)
|
|
8
|
+
* - Multiline values
|
|
9
|
+
* - Comments
|
|
10
|
+
*/
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
const MAX_LINES_PER_VALUE = 100;
|
|
13
|
+
/**
|
|
14
|
+
* Parse a .env file from path
|
|
15
|
+
*/
|
|
16
|
+
export function parseEnvFile(filePath, options = {}) {
|
|
17
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
18
|
+
return parseEnvString(content, options);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse a .env string
|
|
22
|
+
*/
|
|
23
|
+
export function parseEnvString(content, options = {}) {
|
|
24
|
+
const { expand = true, env = process.env } = options;
|
|
25
|
+
const result = {};
|
|
26
|
+
const lines = content.split(/\r?\n/);
|
|
27
|
+
let i = 0;
|
|
28
|
+
while (i < lines.length) {
|
|
29
|
+
const line = lines[i].trim();
|
|
30
|
+
i++;
|
|
31
|
+
// Skip empty lines and comments
|
|
32
|
+
if (!line || line.startsWith('#') || line.startsWith(';')) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Parse KEY=VALUE
|
|
36
|
+
const match = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(.*)$/);
|
|
37
|
+
if (!match) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const key = match[1];
|
|
41
|
+
let value = match[2];
|
|
42
|
+
// Handle different quote styles
|
|
43
|
+
if (value.startsWith('"')) {
|
|
44
|
+
// Double quotes - process escape sequences
|
|
45
|
+
const parsed = parseDoubleQuoted(value, lines, i);
|
|
46
|
+
value = parsed.value;
|
|
47
|
+
i = parsed.nextIndex;
|
|
48
|
+
}
|
|
49
|
+
else if (value.startsWith("'")) {
|
|
50
|
+
// Single quotes - literal, no escapes
|
|
51
|
+
const parsed = parseSingleQuoted(value, lines, i);
|
|
52
|
+
value = parsed.value;
|
|
53
|
+
i = parsed.nextIndex;
|
|
54
|
+
}
|
|
55
|
+
else if (value.startsWith('`')) {
|
|
56
|
+
// Backticks
|
|
57
|
+
const parsed = parseBacktickQuoted(value, lines, i);
|
|
58
|
+
value = parsed.value;
|
|
59
|
+
i = parsed.nextIndex;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Unquoted - trim trailing comments
|
|
63
|
+
const commentIndex = value.indexOf('#');
|
|
64
|
+
if (commentIndex > 0) {
|
|
65
|
+
value = value.substring(0, commentIndex).trim();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Variable expansion
|
|
69
|
+
if (expand) {
|
|
70
|
+
value = expandVariables(value, { ...env, ...result });
|
|
71
|
+
}
|
|
72
|
+
result[key] = value;
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse double-quoted value with escape sequences
|
|
78
|
+
*/
|
|
79
|
+
function parseDoubleQuoted(startValue, lines, currentIndex) {
|
|
80
|
+
let value = startValue.substring(1); // Remove opening quote
|
|
81
|
+
let lineCount = 0;
|
|
82
|
+
// Find closing quote, handling escapes
|
|
83
|
+
let result = '';
|
|
84
|
+
let i = 0;
|
|
85
|
+
let index = currentIndex;
|
|
86
|
+
while (lineCount < MAX_LINES_PER_VALUE) {
|
|
87
|
+
while (i < value.length) {
|
|
88
|
+
const char = value[i];
|
|
89
|
+
if (char === '\\' && i + 1 < value.length) {
|
|
90
|
+
// Escape sequence
|
|
91
|
+
const next = value[i + 1];
|
|
92
|
+
switch (next) {
|
|
93
|
+
case 'n':
|
|
94
|
+
result += '\n';
|
|
95
|
+
break;
|
|
96
|
+
case 'r':
|
|
97
|
+
result += '\r';
|
|
98
|
+
break;
|
|
99
|
+
case 't':
|
|
100
|
+
result += '\t';
|
|
101
|
+
break;
|
|
102
|
+
case '"':
|
|
103
|
+
result += '"';
|
|
104
|
+
break;
|
|
105
|
+
case '\\':
|
|
106
|
+
result += '\\';
|
|
107
|
+
break;
|
|
108
|
+
case '$':
|
|
109
|
+
result += '$';
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
result += char + next;
|
|
113
|
+
}
|
|
114
|
+
i += 2;
|
|
115
|
+
}
|
|
116
|
+
else if (char === '"') {
|
|
117
|
+
// Closing quote found
|
|
118
|
+
return { value: result, nextIndex: index };
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
result += char;
|
|
122
|
+
i++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Need more lines
|
|
126
|
+
if (index >= lines.length) {
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
result += '\n';
|
|
130
|
+
value = lines[index];
|
|
131
|
+
index++;
|
|
132
|
+
i = 0;
|
|
133
|
+
lineCount++;
|
|
134
|
+
}
|
|
135
|
+
// No closing quote found, return what we have
|
|
136
|
+
return { value: result, nextIndex: index };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Parse single-quoted value (literal, no escapes)
|
|
140
|
+
*/
|
|
141
|
+
function parseSingleQuoted(startValue, lines, currentIndex) {
|
|
142
|
+
let value = startValue.substring(1); // Remove opening quote
|
|
143
|
+
let lineCount = 0;
|
|
144
|
+
let result = '';
|
|
145
|
+
let i = 0;
|
|
146
|
+
let index = currentIndex;
|
|
147
|
+
while (lineCount < MAX_LINES_PER_VALUE) {
|
|
148
|
+
while (i < value.length) {
|
|
149
|
+
const char = value[i];
|
|
150
|
+
if (char === "'" && value[i + 1] !== "'") {
|
|
151
|
+
// Closing quote (not escaped '')
|
|
152
|
+
return { value: result, nextIndex: index };
|
|
153
|
+
}
|
|
154
|
+
else if (char === "'" && value[i + 1] === "'") {
|
|
155
|
+
// Escaped single quote ('')
|
|
156
|
+
result += "'";
|
|
157
|
+
i += 2;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
result += char;
|
|
161
|
+
i++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Need more lines
|
|
165
|
+
if (index >= lines.length) {
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
result += '\n';
|
|
169
|
+
value = lines[index];
|
|
170
|
+
index++;
|
|
171
|
+
i = 0;
|
|
172
|
+
lineCount++;
|
|
173
|
+
}
|
|
174
|
+
return { value: result, nextIndex: index };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Parse backtick-quoted value
|
|
178
|
+
*/
|
|
179
|
+
function parseBacktickQuoted(startValue, lines, currentIndex) {
|
|
180
|
+
let value = startValue.substring(1); // Remove opening quote
|
|
181
|
+
let lineCount = 0;
|
|
182
|
+
let result = '';
|
|
183
|
+
let i = 0;
|
|
184
|
+
let index = currentIndex;
|
|
185
|
+
while (lineCount < MAX_LINES_PER_VALUE) {
|
|
186
|
+
const closeIndex = value.indexOf('`', i);
|
|
187
|
+
if (closeIndex !== -1) {
|
|
188
|
+
result += value.substring(i, closeIndex);
|
|
189
|
+
return { value: result, nextIndex: index };
|
|
190
|
+
}
|
|
191
|
+
result += value.substring(i);
|
|
192
|
+
// Need more lines
|
|
193
|
+
if (index >= lines.length) {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
result += '\n';
|
|
197
|
+
value = lines[index];
|
|
198
|
+
index++;
|
|
199
|
+
i = 0;
|
|
200
|
+
lineCount++;
|
|
201
|
+
}
|
|
202
|
+
return { value: result, nextIndex: index };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Expand variables in a value
|
|
206
|
+
* Supports ${VAR}, ${VAR:-default}, $VAR
|
|
207
|
+
*/
|
|
208
|
+
function expandVariables(value, env) {
|
|
209
|
+
// ${VAR:-default} pattern
|
|
210
|
+
value = value.replace(/\$\{([a-zA-Z_][a-zA-Z0-9_]*):-([^}]*)\}/g, (_, key, defaultVal) => {
|
|
211
|
+
return env[key] ?? defaultVal;
|
|
212
|
+
});
|
|
213
|
+
// ${VAR} pattern
|
|
214
|
+
value = value.replace(/\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (_, key) => {
|
|
215
|
+
return env[key] ?? '';
|
|
216
|
+
});
|
|
217
|
+
// $VAR pattern (word boundary)
|
|
218
|
+
value = value.replace(/\$([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, key) => {
|
|
219
|
+
return env[key] ?? '';
|
|
220
|
+
});
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Serialize a ParsedEnv object to .env format
|
|
225
|
+
*/
|
|
226
|
+
export function serializeEnv(env) {
|
|
227
|
+
const lines = [];
|
|
228
|
+
for (const [key, value] of Object.entries(env)) {
|
|
229
|
+
// Determine if we need quotes
|
|
230
|
+
const needsQuotes = value.includes('\n') ||
|
|
231
|
+
value.includes(' ') ||
|
|
232
|
+
value.includes('#') ||
|
|
233
|
+
value.includes('"') ||
|
|
234
|
+
value.includes("'") ||
|
|
235
|
+
value.includes('$') ||
|
|
236
|
+
value.includes('=');
|
|
237
|
+
if (needsQuotes) {
|
|
238
|
+
// Use double quotes and escape special chars
|
|
239
|
+
const escaped = value
|
|
240
|
+
.replace(/\\/g, '\\\\')
|
|
241
|
+
.replace(/"/g, '\\"')
|
|
242
|
+
.replace(/\n/g, '\\n')
|
|
243
|
+
.replace(/\r/g, '\\r')
|
|
244
|
+
.replace(/\t/g, '\\t');
|
|
245
|
+
lines.push(`${key}="${escaped}"`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
lines.push(`${key}=${value}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return lines.join('\n');
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Read stdin as .env content
|
|
255
|
+
*/
|
|
256
|
+
export async function parseEnvFromStdin(options = {}) {
|
|
257
|
+
return new Promise((resolve, reject) => {
|
|
258
|
+
let data = '';
|
|
259
|
+
process.stdin.setEncoding('utf8');
|
|
260
|
+
process.stdin.on('data', chunk => {
|
|
261
|
+
data += chunk;
|
|
262
|
+
});
|
|
263
|
+
process.stdin.on('end', () => {
|
|
264
|
+
try {
|
|
265
|
+
const result = parseEnvString(data, options);
|
|
266
|
+
resolve(result);
|
|
267
|
+
}
|
|
268
|
+
catch (err) {
|
|
269
|
+
reject(err);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
process.stdin.on('error', reject);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check if stdin has data (is piped)
|
|
277
|
+
*/
|
|
278
|
+
export function hasStdinData() {
|
|
279
|
+
return !process.stdin.isTTY;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=env-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-parser.js","sourceRoot":"","sources":["../../src/lib/env-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAA;AAExB,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAW/B;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,UAAwB,EAAE;IACvE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAClD,OAAO,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,UAAwB,EAAE;IACxE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAA6B,EAAE,GAAG,OAAO,CAAA;IAE9E,MAAM,MAAM,GAAc,EAAE,CAAA;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAEpC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC5B,CAAC,EAAE,CAAA;QAEH,gCAAgC;QAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,SAAQ;QACV,CAAC;QAED,kBAAkB;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;QACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAQ;QACV,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAEpB,gCAAgC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,2CAA2C;YAC3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YACjD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;YACpB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAA;QACtB,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,sCAAsC;YACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YACjD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;YACpB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAA;QACtB,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,YAAY;YACZ,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YACnD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;YACpB,CAAC,GAAG,MAAM,CAAC,SAAS,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA;YACjD,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,UAAkB,EAClB,KAAe,EACf,YAAoB;IAEpB,IAAI,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAC,uBAAuB;IAC3D,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,uCAAuC;IACvC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,KAAK,GAAG,YAAY,CAAA;IAExB,OAAO,SAAS,GAAG,mBAAmB,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAErB,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1C,kBAAkB;gBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACzB,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,GAAG;wBACN,MAAM,IAAI,IAAI,CAAA;wBACd,MAAK;oBACP,KAAK,GAAG;wBACN,MAAM,IAAI,IAAI,CAAA;wBACd,MAAK;oBACP,KAAK,GAAG;wBACN,MAAM,IAAI,IAAI,CAAA;wBACd,MAAK;oBACP,KAAK,GAAG;wBACN,MAAM,IAAI,GAAG,CAAA;wBACb,MAAK;oBACP,KAAK,IAAI;wBACP,MAAM,IAAI,IAAI,CAAA;wBACd,MAAK;oBACP,KAAK,GAAG;wBACN,MAAM,IAAI,GAAG,CAAA;wBACb,MAAK;oBACP;wBACE,MAAM,IAAI,IAAI,GAAG,IAAI,CAAA;gBACzB,CAAC;gBACD,CAAC,IAAI,CAAC,CAAA;YACR,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxB,sBAAsB;gBACtB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,IAAI,CAAA;gBACd,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAK;QACP,CAAC;QAED,MAAM,IAAI,IAAI,CAAA;QACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,KAAK,EAAE,CAAA;QACP,CAAC,GAAG,CAAC,CAAA;QACL,SAAS,EAAE,CAAA;IACb,CAAC;IAED,8CAA8C;IAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,UAAkB,EAClB,KAAe,EACf,YAAoB;IAEpB,IAAI,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAC,uBAAuB;IAC3D,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,KAAK,GAAG,YAAY,CAAA;IAExB,OAAO,SAAS,GAAG,mBAAmB,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YAErB,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzC,iCAAiC;gBACjC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;YAC5C,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChD,4BAA4B;gBAC5B,MAAM,IAAI,GAAG,CAAA;gBACb,CAAC,IAAI,CAAC,CAAA;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,IAAI,CAAA;gBACd,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAK;QACP,CAAC;QAED,MAAM,IAAI,IAAI,CAAA;QACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,KAAK,EAAE,CAAA;QACP,CAAC,GAAG,CAAC,CAAA;QACL,SAAS,EAAE,CAAA;IACb,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,KAAe,EACf,YAAoB;IAEpB,IAAI,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA,CAAC,uBAAuB;IAC3D,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,KAAK,GAAG,YAAY,CAAA;IAExB,OAAO,SAAS,GAAG,mBAAmB,EAAE,CAAC;QACvC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACxC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;QAC5C,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAE5B,kBAAkB;QAClB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAK;QACP,CAAC;QAED,MAAM,IAAI,IAAI,CAAA;QACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,KAAK,EAAE,CAAA;QACP,CAAC,GAAG,CAAC,CAAA;QACL,SAAS,EAAE,CAAA;IACb,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;AAC5C,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,GAA2B;IACjE,0BAA0B;IAC1B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,0CAA0C,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;QACvF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,UAAU,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,iBAAiB;IACjB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,iCAAiC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClE,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,+BAA+B;IAC/B,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC9D,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAc;IACzC,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,8BAA8B;QAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAErB,IAAI,WAAW,EAAE,CAAC;YAChB,6CAA6C;YAC7C,MAAM,OAAO,GAAG,KAAK;iBAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;iBACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;iBACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;iBACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;YAExB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,GAAG,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAwB,EAAE;IAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,IAAI,GAAG,EAAE,CAAA;QAEb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAA;QACf,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBAC5C,OAAO,CAAC,MAAM,CAAC,CAAA;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,GAAG,CAAC,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Support
|
|
3
|
+
*
|
|
4
|
+
* Discovers services in monorepos and supports batch operations
|
|
5
|
+
*/
|
|
6
|
+
import type { VaulterConfig } from '../types.js';
|
|
7
|
+
export interface ServiceInfo {
|
|
8
|
+
name: string;
|
|
9
|
+
path: string;
|
|
10
|
+
configDir: string;
|
|
11
|
+
config: VaulterConfig;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Find all services in a monorepo
|
|
15
|
+
* Searches for .vaulter directories in subdirectories
|
|
16
|
+
*/
|
|
17
|
+
export declare function discoverServices(rootDir?: string): ServiceInfo[];
|
|
18
|
+
/**
|
|
19
|
+
* Filter services by name pattern
|
|
20
|
+
* Supports comma-separated list and glob patterns
|
|
21
|
+
*/
|
|
22
|
+
export declare function filterServices(services: ServiceInfo[], pattern: string): ServiceInfo[];
|
|
23
|
+
/**
|
|
24
|
+
* Get the root config directory of a monorepo
|
|
25
|
+
*/
|
|
26
|
+
export declare function findMonorepoRoot(startDir?: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Check if current directory is inside a monorepo
|
|
29
|
+
*/
|
|
30
|
+
export declare function isMonorepo(startDir?: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Get service info for current directory
|
|
33
|
+
*/
|
|
34
|
+
export declare function getCurrentService(startDir?: string): ServiceInfo | null;
|
|
35
|
+
/**
|
|
36
|
+
* Print service list for user display
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatServiceList(services: ServiceInfo[]): string;
|
|
39
|
+
//# sourceMappingURL=monorepo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../../src/lib/monorepo.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMhD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,aAAa,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAsB,GAAG,WAAW,EAAE,CAsD/E;AA8BD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,WAAW,EAAE,CAwBf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAsBhF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,GAAE,MAAsB,GAAG,OAAO,CAMpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,WAAW,GAAG,IAAI,CAiBtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAajE"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Support
|
|
3
|
+
*
|
|
4
|
+
* Discovers services in monorepos and supports batch operations
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { loadConfig, findConfigDir } from './config-loader.js';
|
|
9
|
+
const CONFIG_DIR = '.vaulter';
|
|
10
|
+
const CONFIG_FILE = 'config.yaml';
|
|
11
|
+
const MAX_DEPTH = 5;
|
|
12
|
+
/**
|
|
13
|
+
* Find all services in a monorepo
|
|
14
|
+
* Searches for .vaulter directories in subdirectories
|
|
15
|
+
*/
|
|
16
|
+
export function discoverServices(rootDir = process.cwd()) {
|
|
17
|
+
const services = [];
|
|
18
|
+
const visited = new Set();
|
|
19
|
+
function searchDir(dir, depth) {
|
|
20
|
+
if (depth > MAX_DEPTH)
|
|
21
|
+
return;
|
|
22
|
+
const absoluteDir = path.resolve(dir);
|
|
23
|
+
if (visited.has(absoluteDir))
|
|
24
|
+
return;
|
|
25
|
+
visited.add(absoluteDir);
|
|
26
|
+
try {
|
|
27
|
+
const entries = fs.readdirSync(absoluteDir, { withFileTypes: true });
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
if (!entry.isDirectory())
|
|
30
|
+
continue;
|
|
31
|
+
// Skip common non-service directories
|
|
32
|
+
if (shouldSkipDir(entry.name))
|
|
33
|
+
continue;
|
|
34
|
+
const subDir = path.join(absoluteDir, entry.name);
|
|
35
|
+
// Check if this directory has a .vaulter config
|
|
36
|
+
const configDir = path.join(subDir, CONFIG_DIR);
|
|
37
|
+
const configFile = path.join(configDir, CONFIG_FILE);
|
|
38
|
+
if (fs.existsSync(configFile)) {
|
|
39
|
+
try {
|
|
40
|
+
const config = loadConfig(subDir);
|
|
41
|
+
const serviceName = config.service || entry.name;
|
|
42
|
+
services.push({
|
|
43
|
+
name: serviceName,
|
|
44
|
+
path: subDir,
|
|
45
|
+
configDir,
|
|
46
|
+
config
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
// Skip invalid configs
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Recurse into subdirectories
|
|
54
|
+
searchDir(subDir, depth + 1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// Permission denied or other errors, skip
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Start search from root
|
|
62
|
+
searchDir(rootDir, 0);
|
|
63
|
+
return services;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Directories to skip during service discovery
|
|
67
|
+
*/
|
|
68
|
+
function shouldSkipDir(name) {
|
|
69
|
+
const skipPatterns = [
|
|
70
|
+
'node_modules',
|
|
71
|
+
'.git',
|
|
72
|
+
'.svn',
|
|
73
|
+
'.hg',
|
|
74
|
+
'dist',
|
|
75
|
+
'build',
|
|
76
|
+
'coverage',
|
|
77
|
+
'.cache',
|
|
78
|
+
'.next',
|
|
79
|
+
'.nuxt',
|
|
80
|
+
'.output',
|
|
81
|
+
'__pycache__',
|
|
82
|
+
'venv',
|
|
83
|
+
'.venv',
|
|
84
|
+
'vendor',
|
|
85
|
+
'target',
|
|
86
|
+
'.terraform',
|
|
87
|
+
'.terragrunt-cache'
|
|
88
|
+
];
|
|
89
|
+
return skipPatterns.includes(name) || name.startsWith('.');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Filter services by name pattern
|
|
93
|
+
* Supports comma-separated list and glob patterns
|
|
94
|
+
*/
|
|
95
|
+
export function filterServices(services, pattern) {
|
|
96
|
+
// Split by comma for multiple services
|
|
97
|
+
const patterns = pattern.split(',').map(p => p.trim()).filter(Boolean);
|
|
98
|
+
if (patterns.length === 0) {
|
|
99
|
+
return services;
|
|
100
|
+
}
|
|
101
|
+
return services.filter(service => {
|
|
102
|
+
return patterns.some(p => {
|
|
103
|
+
// Exact match
|
|
104
|
+
if (p === service.name)
|
|
105
|
+
return true;
|
|
106
|
+
// Glob-like matching (simple * support)
|
|
107
|
+
if (p.includes('*')) {
|
|
108
|
+
const regex = new RegExp('^' + p.replace(/\*/g, '.*').replace(/\?/g, '.') + '$');
|
|
109
|
+
return regex.test(service.name);
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the root config directory of a monorepo
|
|
117
|
+
*/
|
|
118
|
+
export function findMonorepoRoot(startDir = process.cwd()) {
|
|
119
|
+
let currentDir = path.resolve(startDir);
|
|
120
|
+
let rootConfigDir = null;
|
|
121
|
+
// Walk up to find the topmost .vaulter directory
|
|
122
|
+
while (true) {
|
|
123
|
+
const configDir = path.join(currentDir, CONFIG_DIR);
|
|
124
|
+
const configFile = path.join(configDir, CONFIG_FILE);
|
|
125
|
+
if (fs.existsSync(configFile)) {
|
|
126
|
+
rootConfigDir = currentDir;
|
|
127
|
+
}
|
|
128
|
+
const parentDir = path.dirname(currentDir);
|
|
129
|
+
if (parentDir === currentDir) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
currentDir = parentDir;
|
|
133
|
+
}
|
|
134
|
+
return rootConfigDir;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Check if current directory is inside a monorepo
|
|
138
|
+
*/
|
|
139
|
+
export function isMonorepo(startDir = process.cwd()) {
|
|
140
|
+
const root = findMonorepoRoot(startDir);
|
|
141
|
+
if (!root)
|
|
142
|
+
return false;
|
|
143
|
+
const services = discoverServices(root);
|
|
144
|
+
return services.length > 1;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get service info for current directory
|
|
148
|
+
*/
|
|
149
|
+
export function getCurrentService(startDir = process.cwd()) {
|
|
150
|
+
const configDir = findConfigDir(startDir);
|
|
151
|
+
if (!configDir)
|
|
152
|
+
return null;
|
|
153
|
+
const servicePath = path.dirname(configDir);
|
|
154
|
+
try {
|
|
155
|
+
const config = loadConfig(servicePath);
|
|
156
|
+
return {
|
|
157
|
+
name: config.service || path.basename(servicePath),
|
|
158
|
+
path: servicePath,
|
|
159
|
+
configDir,
|
|
160
|
+
config
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Print service list for user display
|
|
169
|
+
*/
|
|
170
|
+
export function formatServiceList(services) {
|
|
171
|
+
if (services.length === 0) {
|
|
172
|
+
return 'No services found';
|
|
173
|
+
}
|
|
174
|
+
const lines = ['Services found:'];
|
|
175
|
+
for (const service of services) {
|
|
176
|
+
const relativePath = path.relative(process.cwd(), service.path);
|
|
177
|
+
lines.push(` • ${service.name} (${relativePath || '.'})`);
|
|
178
|
+
}
|
|
179
|
+
return lines.join('\n');
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=monorepo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo.js","sourceRoot":"","sources":["../../src/lib/monorepo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-matcher.d.ts","sourceRoot":"","sources":["../../src/lib/pattern-matcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAelF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple glob matcher for patterns using * and ?
|
|
3
|
+
*/
|
|
4
|
+
export function compileGlobPatterns(patterns) {
|
|
5
|
+
const regexes = patterns
|
|
6
|
+
.map(pattern => pattern.trim())
|
|
7
|
+
.filter(Boolean)
|
|
8
|
+
.map(pattern => {
|
|
9
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
10
|
+
const source = '^' + escaped.replace(/\*/g, '.*').replace(/\?/g, '.') + '$';
|
|
11
|
+
return new RegExp(source, 'i');
|
|
12
|
+
});
|
|
13
|
+
if (regexes.length === 0) {
|
|
14
|
+
return () => false;
|
|
15
|
+
}
|
|
16
|
+
return (value) => regexes.some(regex => regex.test(value));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=pattern-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-matcher.js","sourceRoot":"","sources":["../../src/lib/pattern-matcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,mBAAmB,CAAC,QAAkB;IACpD,MAAM,OAAO,GAAG,QAAQ;SACrB,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,OAAO,CAAC,EAAE;QACb,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;QAC3E,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,EAAE,CAAC,KAAK,CAAA;IACpB,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AACpE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Key Loader
|
|
3
|
+
*
|
|
4
|
+
* Fetches encryption keys from S3-compatible storage
|
|
5
|
+
* Supports: AWS S3, MinIO, R2, Spaces, B2
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Parse S3 URL into components
|
|
9
|
+
* Formats supported:
|
|
10
|
+
* s3://bucket/path/to/key.txt
|
|
11
|
+
* s3://bucket/path/to/key.txt?region=us-east-1
|
|
12
|
+
* http://localhost:9000/bucket/path/to/key.txt (MinIO)
|
|
13
|
+
* https://account.r2.cloudflarestorage.com/bucket/path
|
|
14
|
+
*/
|
|
15
|
+
export interface S3KeyLocation {
|
|
16
|
+
bucket: string;
|
|
17
|
+
key: string;
|
|
18
|
+
region?: string;
|
|
19
|
+
endpoint?: string;
|
|
20
|
+
accessKeyId?: string;
|
|
21
|
+
secretAccessKey?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function parseS3Url(url: string): S3KeyLocation;
|
|
24
|
+
/**
|
|
25
|
+
* Fetch a key from S3
|
|
26
|
+
* Uses dynamic import to avoid bundling AWS SDK when not needed
|
|
27
|
+
*/
|
|
28
|
+
export declare function fetchKeyFromS3(location: S3KeyLocation): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Load encryption key from S3 URL
|
|
31
|
+
*/
|
|
32
|
+
export declare function loadKeyFromS3(s3Url: string): Promise<string>;
|
|
33
|
+
//# sourceMappingURL=s3-key-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-key-loader.d.ts","sourceRoot":"","sources":["../../src/lib/s3-key-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CA8BrD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD7E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE"}
|