@insureco/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +112 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +41 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +219 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +12 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +62 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +42 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init-ai.d.ts +7 -0
- package/dist/commands/init-ai.d.ts.map +1 -0
- package/dist/commands/init-ai.js +257 -0
- package/dist/commands/init-ai.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +228 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +10 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +193 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +164 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +362 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/preflight.d.ts +8 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +188 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/program.d.ts +7 -0
- package/dist/commands/program.d.ts.map +1 -0
- package/dist/commands/program.js +59 -0
- package/dist/commands/program.js.map +1 -0
- package/dist/commands/push.d.ts +12 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +171 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register.d.ts +7 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +124 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/rollback.d.ts +11 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +172 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/sample.d.ts +11 -0
- package/dist/commands/sample.d.ts.map +1 -0
- package/dist/commands/sample.js +114 -0
- package/dist/commands/sample.js.map +1 -0
- package/dist/commands/services.d.ts +13 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +95 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +170 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/troubleshoot.d.ts +19 -0
- package/dist/commands/troubleshoot.d.ts.map +1 -0
- package/dist/commands/troubleshoot.js +465 -0
- package/dist/commands/troubleshoot.js.map +1 -0
- package/dist/commands/versions.d.ts +16 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +162 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai/client.d.ts +36 -0
- package/dist/lib/ai/client.d.ts.map +1 -0
- package/dist/lib/ai/client.js +140 -0
- package/dist/lib/ai/client.js.map +1 -0
- package/dist/lib/ai/generator.d.ts +17 -0
- package/dist/lib/ai/generator.d.ts.map +1 -0
- package/dist/lib/ai/generator.js +338 -0
- package/dist/lib/ai/generator.js.map +1 -0
- package/dist/lib/ai/prompts.d.ts +47 -0
- package/dist/lib/ai/prompts.d.ts.map +1 -0
- package/dist/lib/ai/prompts.js +247 -0
- package/dist/lib/ai/prompts.js.map +1 -0
- package/dist/lib/ai/scanner.d.ts +50 -0
- package/dist/lib/ai/scanner.d.ts.map +1 -0
- package/dist/lib/ai/scanner.js +237 -0
- package/dist/lib/ai/scanner.js.map +1 -0
- package/dist/lib/api.d.ts +18 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +67 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/builder.d.ts +34 -0
- package/dist/lib/builder.d.ts.map +1 -0
- package/dist/lib/builder.js +132 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/config.d.ts +20 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +124 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +12 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +39 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scaffold.d.ts +29 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +166 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
- package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
- package/dist/lib/troubleshoot/analyzer.js +541 -0
- package/dist/lib/troubleshoot/analyzer.js.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.js +373 -0
- package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
- package/dist/lib/troubleshoot/index.d.ts +5 -0
- package/dist/lib/troubleshoot/index.d.ts.map +1 -0
- package/dist/lib/troubleshoot/index.js +6 -0
- package/dist/lib/troubleshoot/index.js.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.js +431 -0
- package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
- package/dist/lib/troubleshoot/redactor.d.ts +35 -0
- package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
- package/dist/lib/troubleshoot/redactor.js +208 -0
- package/dist/lib/troubleshoot/redactor.js.map +1 -0
- package/dist/lib/validators/catalog-validator.d.ts +3 -0
- package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
- package/dist/lib/validators/catalog-validator.js +205 -0
- package/dist/lib/validators/catalog-validator.js.map +1 -0
- package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
- package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
- package/dist/lib/validators/dockerfile-validator.js +262 -0
- package/dist/lib/validators/dockerfile-validator.js.map +1 -0
- package/dist/lib/validators/env-validator.d.ts +3 -0
- package/dist/lib/validators/env-validator.d.ts.map +1 -0
- package/dist/lib/validators/env-validator.js +268 -0
- package/dist/lib/validators/env-validator.js.map +1 -0
- package/dist/lib/validators/git-validator.d.ts +3 -0
- package/dist/lib/validators/git-validator.d.ts.map +1 -0
- package/dist/lib/validators/git-validator.js +236 -0
- package/dist/lib/validators/git-validator.js.map +1 -0
- package/dist/lib/validators/health-detector.d.ts +4 -0
- package/dist/lib/validators/health-detector.d.ts.map +1 -0
- package/dist/lib/validators/health-detector.js +159 -0
- package/dist/lib/validators/health-detector.js.map +1 -0
- package/dist/lib/validators/index.d.ts +7 -0
- package/dist/lib/validators/index.d.ts.map +1 -0
- package/dist/lib/validators/index.js +7 -0
- package/dist/lib/validators/index.js.map +1 -0
- package/dist/lib/validators/route-validator.d.ts +3 -0
- package/dist/lib/validators/route-validator.d.ts.map +1 -0
- package/dist/lib/validators/route-validator.js +238 -0
- package/dist/lib/validators/route-validator.js.map +1 -0
- package/dist/types/index.d.ts +455 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { readFile, access } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
// Framework detection patterns
|
|
4
|
+
const FRAMEWORK_PATTERNS = [
|
|
5
|
+
{
|
|
6
|
+
name: 'Next.js',
|
|
7
|
+
files: ['next.config.js', 'next.config.mjs', 'next.config.ts'],
|
|
8
|
+
packageJson: { dependencies: ['next'] },
|
|
9
|
+
dockerfile: 'Dockerfile.nextjs',
|
|
10
|
+
defaultPort: 3000,
|
|
11
|
+
healthPath: '/api/health',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'NestJS',
|
|
15
|
+
files: ['nest-cli.json'],
|
|
16
|
+
packageJson: { dependencies: ['@nestjs/core'] },
|
|
17
|
+
dockerfile: 'Dockerfile.nestjs',
|
|
18
|
+
defaultPort: 3000,
|
|
19
|
+
healthPath: '/health',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: 'Express',
|
|
23
|
+
files: [],
|
|
24
|
+
packageJson: { dependencies: ['express'] },
|
|
25
|
+
dockerfile: 'Dockerfile.express',
|
|
26
|
+
defaultPort: 3000,
|
|
27
|
+
healthPath: '/health',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Fastify',
|
|
31
|
+
files: [],
|
|
32
|
+
packageJson: { dependencies: ['fastify'] },
|
|
33
|
+
dockerfile: 'Dockerfile.fastify',
|
|
34
|
+
defaultPort: 3000,
|
|
35
|
+
healthPath: '/health',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Go',
|
|
39
|
+
files: ['go.mod', 'go.sum'],
|
|
40
|
+
dockerfile: 'Dockerfile.go',
|
|
41
|
+
defaultPort: 8080,
|
|
42
|
+
healthPath: '/health',
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Python/FastAPI',
|
|
46
|
+
files: ['requirements.txt', 'pyproject.toml'],
|
|
47
|
+
dockerfile: 'Dockerfile.python',
|
|
48
|
+
defaultPort: 8000,
|
|
49
|
+
healthPath: '/health',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'Rust',
|
|
53
|
+
files: ['Cargo.toml'],
|
|
54
|
+
dockerfile: 'Dockerfile.rust',
|
|
55
|
+
defaultPort: 8080,
|
|
56
|
+
healthPath: '/health',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
export async function validateDockerfile(cwd = process.cwd()) {
|
|
60
|
+
const checks = [];
|
|
61
|
+
// Check for Dockerfile
|
|
62
|
+
const dockerfilePath = join(cwd, 'Dockerfile');
|
|
63
|
+
const dockerfileExists = await fileExists(dockerfilePath);
|
|
64
|
+
if (dockerfileExists) {
|
|
65
|
+
const dockerfileCheck = await analyzeDockerfile(dockerfilePath);
|
|
66
|
+
checks.push(dockerfileCheck);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Detect framework and suggest Dockerfile
|
|
70
|
+
const frameworkInfo = await detectFramework(cwd);
|
|
71
|
+
if (frameworkInfo) {
|
|
72
|
+
checks.push({
|
|
73
|
+
name: 'Dockerfile exists',
|
|
74
|
+
status: 'warn',
|
|
75
|
+
message: `No Dockerfile found, but detected ${frameworkInfo.name} project`,
|
|
76
|
+
details: [
|
|
77
|
+
`Suggested Dockerfile: ${frameworkInfo.dockerfile}`,
|
|
78
|
+
`Default port: ${frameworkInfo.defaultPort}`,
|
|
79
|
+
`Health endpoint: ${frameworkInfo.healthPath}`,
|
|
80
|
+
],
|
|
81
|
+
remediation: `Run "iec init --dockerfile" to generate a Dockerfile for ${frameworkInfo.name}`,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
checks.push({
|
|
86
|
+
name: 'Dockerfile exists',
|
|
87
|
+
status: 'fail',
|
|
88
|
+
message: 'No Dockerfile found and could not detect framework',
|
|
89
|
+
remediation: 'Create a Dockerfile or run "iec init --dockerfile" to generate one',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Check for .dockerignore
|
|
94
|
+
const dockerignorePath = join(cwd, '.dockerignore');
|
|
95
|
+
const dockerignoreExists = await fileExists(dockerignorePath);
|
|
96
|
+
if (dockerignoreExists) {
|
|
97
|
+
const ignoreCheck = await analyzeDockerignore(dockerignorePath);
|
|
98
|
+
checks.push(ignoreCheck);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
checks.push({
|
|
102
|
+
name: '.dockerignore exists',
|
|
103
|
+
status: 'warn',
|
|
104
|
+
message: 'No .dockerignore found',
|
|
105
|
+
details: ['Build context may include unnecessary files'],
|
|
106
|
+
remediation: 'Create a .dockerignore file to exclude node_modules, .git, etc.',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return { checks };
|
|
110
|
+
}
|
|
111
|
+
export async function detectFramework(cwd) {
|
|
112
|
+
// Check for framework-specific files
|
|
113
|
+
for (const framework of FRAMEWORK_PATTERNS) {
|
|
114
|
+
for (const file of framework.files) {
|
|
115
|
+
if (await fileExists(join(cwd, file))) {
|
|
116
|
+
return {
|
|
117
|
+
name: framework.name,
|
|
118
|
+
dockerfile: framework.dockerfile,
|
|
119
|
+
defaultPort: framework.defaultPort,
|
|
120
|
+
healthPath: framework.healthPath,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Check package.json for Node.js frameworks
|
|
126
|
+
const packageJsonPath = join(cwd, 'package.json');
|
|
127
|
+
if (await fileExists(packageJsonPath)) {
|
|
128
|
+
try {
|
|
129
|
+
const content = await readFile(packageJsonPath, 'utf-8');
|
|
130
|
+
const pkg = JSON.parse(content);
|
|
131
|
+
const allDeps = {
|
|
132
|
+
...pkg.dependencies,
|
|
133
|
+
...pkg.devDependencies,
|
|
134
|
+
};
|
|
135
|
+
for (const framework of FRAMEWORK_PATTERNS) {
|
|
136
|
+
if (!framework.packageJson)
|
|
137
|
+
continue;
|
|
138
|
+
const deps = [
|
|
139
|
+
...(framework.packageJson.dependencies || []),
|
|
140
|
+
...(framework.packageJson.devDependencies || []),
|
|
141
|
+
];
|
|
142
|
+
for (const dep of deps) {
|
|
143
|
+
if (allDeps[dep]) {
|
|
144
|
+
return {
|
|
145
|
+
name: framework.name,
|
|
146
|
+
dockerfile: framework.dockerfile,
|
|
147
|
+
defaultPort: framework.defaultPort,
|
|
148
|
+
healthPath: framework.healthPath,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Default to generic Node.js
|
|
154
|
+
return {
|
|
155
|
+
name: 'Node.js',
|
|
156
|
+
dockerfile: 'Dockerfile.node',
|
|
157
|
+
defaultPort: 3000,
|
|
158
|
+
healthPath: '/health',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Ignore parse errors
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
async function analyzeDockerfile(path) {
|
|
168
|
+
try {
|
|
169
|
+
const content = await readFile(path, 'utf-8');
|
|
170
|
+
const issues = [];
|
|
171
|
+
const details = [];
|
|
172
|
+
// Check for multi-stage build
|
|
173
|
+
const stageCount = (content.match(/^FROM\s+/gm) || []).length;
|
|
174
|
+
if (stageCount > 1) {
|
|
175
|
+
details.push(`Multi-stage build: ${stageCount} stages`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
issues.push('Consider using multi-stage build for smaller images');
|
|
179
|
+
}
|
|
180
|
+
// Check for EXPOSE
|
|
181
|
+
const exposeMatch = content.match(/^EXPOSE\s+(\d+)/m);
|
|
182
|
+
if (exposeMatch) {
|
|
183
|
+
details.push(`Exposed port: ${exposeMatch[1]}`);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
issues.push('No EXPOSE instruction found');
|
|
187
|
+
}
|
|
188
|
+
// Check for HEALTHCHECK
|
|
189
|
+
if (content.includes('HEALTHCHECK')) {
|
|
190
|
+
details.push('HEALTHCHECK instruction present');
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
issues.push('No HEALTHCHECK instruction found');
|
|
194
|
+
}
|
|
195
|
+
// Check for non-root user
|
|
196
|
+
if (content.match(/^USER\s+(?!root)/m)) {
|
|
197
|
+
details.push('Runs as non-root user');
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
issues.push('Consider running as non-root user for security');
|
|
201
|
+
}
|
|
202
|
+
// Check for .dockerignore patterns that should be in Dockerfile
|
|
203
|
+
if (content.includes('COPY . .') && !content.includes('.dockerignore')) {
|
|
204
|
+
issues.push('COPY . . found - ensure .dockerignore excludes unnecessary files');
|
|
205
|
+
}
|
|
206
|
+
const status = issues.length === 0 ? 'pass' : issues.length <= 2 ? 'warn' : 'fail';
|
|
207
|
+
return {
|
|
208
|
+
name: 'Dockerfile valid',
|
|
209
|
+
status,
|
|
210
|
+
message: status === 'pass' ? 'Dockerfile follows best practices' : 'Dockerfile has potential issues',
|
|
211
|
+
details: [...details, ...issues.map(i => `Warning: ${i}`)],
|
|
212
|
+
remediation: issues.length > 0 ? 'Review Dockerfile best practices at https://docs.docker.com/develop/develop-images/dockerfile_best-practices/' : undefined,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
name: 'Dockerfile valid',
|
|
218
|
+
status: 'fail',
|
|
219
|
+
message: `Failed to read Dockerfile: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function analyzeDockerignore(path) {
|
|
224
|
+
try {
|
|
225
|
+
const content = await readFile(path, 'utf-8');
|
|
226
|
+
const lines = content.split('\n').filter(l => l.trim() && !l.startsWith('#'));
|
|
227
|
+
const recommended = ['node_modules', '.git', '*.log', '.env', 'coverage', 'dist'];
|
|
228
|
+
const missing = recommended.filter(r => !lines.some(l => l.includes(r)));
|
|
229
|
+
if (missing.length === 0) {
|
|
230
|
+
return {
|
|
231
|
+
name: '.dockerignore complete',
|
|
232
|
+
status: 'pass',
|
|
233
|
+
message: '.dockerignore includes recommended patterns',
|
|
234
|
+
details: [`${lines.length} patterns defined`],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
name: '.dockerignore complete',
|
|
239
|
+
status: 'warn',
|
|
240
|
+
message: '.dockerignore may be missing patterns',
|
|
241
|
+
details: missing.map(m => `Missing: ${m}`),
|
|
242
|
+
remediation: `Add missing patterns to .dockerignore: ${missing.join(', ')}`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
return {
|
|
247
|
+
name: '.dockerignore complete',
|
|
248
|
+
status: 'fail',
|
|
249
|
+
message: `Failed to read .dockerignore: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
async function fileExists(path) {
|
|
254
|
+
try {
|
|
255
|
+
await access(path);
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=dockerfile-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dockerfile-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/dockerfile-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/env-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAmC,MAAM,sBAAsB,CAAA;AA+B5F,wBAAsB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6G3F"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { readFile, readdir, access } from 'node:fs/promises';
|
|
2
|
+
import { join, extname } from 'node:path';
|
|
3
|
+
import { parse } from 'yaml';
|
|
4
|
+
// Patterns to detect environment variable usage
|
|
5
|
+
const ENV_PATTERNS = [
|
|
6
|
+
// Node.js
|
|
7
|
+
/process\.env\.([A-Z][A-Z0-9_]*)/g,
|
|
8
|
+
/process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]/g,
|
|
9
|
+
// Go
|
|
10
|
+
/os\.Getenv\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\)/g,
|
|
11
|
+
// Python
|
|
12
|
+
/os\.environ(?:\.get)?\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]/g,
|
|
13
|
+
/os\.getenv\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]/g,
|
|
14
|
+
// Rust
|
|
15
|
+
/std::env::var\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\)/g,
|
|
16
|
+
// Generic ${VAR} pattern in config files
|
|
17
|
+
/\$\{([A-Z][A-Z0-9_]*)\}/g,
|
|
18
|
+
];
|
|
19
|
+
// System/common env vars to ignore
|
|
20
|
+
const SYSTEM_ENV_VARS = new Set([
|
|
21
|
+
'NODE_ENV', 'PORT', 'HOST', 'HOME', 'PATH', 'USER', 'PWD',
|
|
22
|
+
'SHELL', 'TERM', 'LANG', 'LC_ALL', 'TZ', 'DEBUG',
|
|
23
|
+
'CI', 'GITHUB_ACTIONS', 'GITLAB_CI', 'VERCEL',
|
|
24
|
+
]);
|
|
25
|
+
// File extensions to scan
|
|
26
|
+
const SCAN_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.go', '.py', '.rs', '.yaml', '.yml', '.json'];
|
|
27
|
+
// Directories to skip
|
|
28
|
+
const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__', 'target', 'vendor'];
|
|
29
|
+
export async function validateEnvVars(cwd = process.cwd()) {
|
|
30
|
+
const checks = [];
|
|
31
|
+
try {
|
|
32
|
+
// Find env vars used in code
|
|
33
|
+
const codeEnvVars = await scanForEnvVars(cwd);
|
|
34
|
+
// Find env vars defined in Helm values
|
|
35
|
+
const helmEnvVars = await getHelmEnvVars(cwd);
|
|
36
|
+
// Find env vars in .env.example
|
|
37
|
+
const exampleEnvVars = await getExampleEnvVars(cwd);
|
|
38
|
+
// Cross-reference: vars used in code but not in Helm
|
|
39
|
+
const missingInHelm = codeEnvVars.filter(v => !SYSTEM_ENV_VARS.has(v.name) &&
|
|
40
|
+
!helmEnvVars.has(v.name));
|
|
41
|
+
// Group by variable name
|
|
42
|
+
const missingByName = new Map();
|
|
43
|
+
for (const ref of missingInHelm) {
|
|
44
|
+
const existing = missingByName.get(ref.name) || [];
|
|
45
|
+
missingByName.set(ref.name, [...existing, ref]);
|
|
46
|
+
}
|
|
47
|
+
if (missingByName.size > 0) {
|
|
48
|
+
const details = Array.from(missingByName.entries()).map(([name, refs]) => {
|
|
49
|
+
const locations = refs.slice(0, 3).map(r => `${r.file}:${r.line}`).join(', ');
|
|
50
|
+
const more = refs.length > 3 ? ` (+${refs.length - 3} more)` : '';
|
|
51
|
+
return `${name}: ${locations}${more}`;
|
|
52
|
+
});
|
|
53
|
+
checks.push({
|
|
54
|
+
name: 'Environment variables in Helm',
|
|
55
|
+
status: 'warn',
|
|
56
|
+
message: `${missingByName.size} env var(s) used in code but not found in Helm values`,
|
|
57
|
+
details,
|
|
58
|
+
remediation: 'Add missing environment variables to helm/values.yaml under env: section',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else if (codeEnvVars.length > 0) {
|
|
62
|
+
checks.push({
|
|
63
|
+
name: 'Environment variables in Helm',
|
|
64
|
+
status: 'pass',
|
|
65
|
+
message: 'All environment variables are defined in Helm values',
|
|
66
|
+
details: [`Found ${helmEnvVars.size} env vars in Helm, ${codeEnvVars.length} references in code`],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
checks.push({
|
|
71
|
+
name: 'Environment variables in Helm',
|
|
72
|
+
status: 'skip',
|
|
73
|
+
message: 'No environment variable usage detected in code',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Check for .env.example
|
|
77
|
+
if (exampleEnvVars.size > 0) {
|
|
78
|
+
const missingInExample = Array.from(new Set(codeEnvVars.map(v => v.name)))
|
|
79
|
+
.filter(name => !SYSTEM_ENV_VARS.has(name) && !exampleEnvVars.has(name));
|
|
80
|
+
if (missingInExample.length > 0) {
|
|
81
|
+
checks.push({
|
|
82
|
+
name: '.env.example complete',
|
|
83
|
+
status: 'warn',
|
|
84
|
+
message: `${missingInExample.length} env var(s) missing from .env.example`,
|
|
85
|
+
details: missingInExample.slice(0, 10),
|
|
86
|
+
remediation: 'Add missing variables to .env.example for documentation',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
checks.push({
|
|
91
|
+
name: '.env.example complete',
|
|
92
|
+
status: 'pass',
|
|
93
|
+
message: '.env.example contains all required variables',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
checks.push({
|
|
99
|
+
name: '.env.example exists',
|
|
100
|
+
status: 'warn',
|
|
101
|
+
message: 'No .env.example file found',
|
|
102
|
+
remediation: 'Create .env.example to document required environment variables',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Check for secrets that might be in code
|
|
106
|
+
const sensitivePatterns = ['_KEY', '_SECRET', '_PASSWORD', '_TOKEN', 'API_KEY', 'AUTH_'];
|
|
107
|
+
const potentialSecrets = codeEnvVars.filter(v => sensitivePatterns.some(p => v.name.includes(p)));
|
|
108
|
+
if (potentialSecrets.length > 0) {
|
|
109
|
+
const secretNames = [...new Set(potentialSecrets.map(v => v.name))];
|
|
110
|
+
checks.push({
|
|
111
|
+
name: 'Secrets management',
|
|
112
|
+
status: 'warn',
|
|
113
|
+
message: `${secretNames.length} potential secret(s) detected`,
|
|
114
|
+
details: secretNames.slice(0, 10),
|
|
115
|
+
remediation: 'Ensure secrets are stored in Kubernetes Secrets, not ConfigMaps or values.yaml',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
checks.push({
|
|
121
|
+
name: 'Environment variable scan',
|
|
122
|
+
status: 'fail',
|
|
123
|
+
message: `Failed to scan environment variables: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return { checks };
|
|
127
|
+
}
|
|
128
|
+
async function scanForEnvVars(dir, baseDir = dir) {
|
|
129
|
+
const refs = [];
|
|
130
|
+
try {
|
|
131
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
const fullPath = join(dir, entry.name);
|
|
134
|
+
if (entry.isDirectory()) {
|
|
135
|
+
if (!SKIP_DIRS.includes(entry.name) && !entry.name.startsWith('.')) {
|
|
136
|
+
const subRefs = await scanForEnvVars(fullPath, baseDir);
|
|
137
|
+
refs.push(...subRefs);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else if (entry.isFile()) {
|
|
141
|
+
const ext = extname(entry.name);
|
|
142
|
+
if (SCAN_EXTENSIONS.includes(ext)) {
|
|
143
|
+
const fileRefs = await scanFileForEnvVars(fullPath, baseDir);
|
|
144
|
+
refs.push(...fileRefs);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Ignore permission errors
|
|
151
|
+
}
|
|
152
|
+
return refs;
|
|
153
|
+
}
|
|
154
|
+
async function scanFileForEnvVars(filePath, baseDir) {
|
|
155
|
+
const refs = [];
|
|
156
|
+
try {
|
|
157
|
+
const content = await readFile(filePath, 'utf-8');
|
|
158
|
+
const lines = content.split('\n');
|
|
159
|
+
const relativePath = filePath.replace(baseDir + '/', '');
|
|
160
|
+
for (let i = 0; i < lines.length; i++) {
|
|
161
|
+
const line = lines[i];
|
|
162
|
+
for (const pattern of ENV_PATTERNS) {
|
|
163
|
+
pattern.lastIndex = 0;
|
|
164
|
+
let match;
|
|
165
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
166
|
+
refs.push({
|
|
167
|
+
name: match[1],
|
|
168
|
+
file: relativePath,
|
|
169
|
+
line: i + 1,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Ignore read errors
|
|
177
|
+
}
|
|
178
|
+
return refs;
|
|
179
|
+
}
|
|
180
|
+
async function getHelmEnvVars(cwd) {
|
|
181
|
+
const envVars = new Set();
|
|
182
|
+
const helmPaths = [
|
|
183
|
+
join(cwd, 'helm', 'values.yaml'),
|
|
184
|
+
join(cwd, 'chart', 'values.yaml'),
|
|
185
|
+
join(cwd, 'values.yaml'),
|
|
186
|
+
];
|
|
187
|
+
for (const helmPath of helmPaths) {
|
|
188
|
+
try {
|
|
189
|
+
await access(helmPath);
|
|
190
|
+
const content = await readFile(helmPath, 'utf-8');
|
|
191
|
+
const values = parse(content);
|
|
192
|
+
// Look for env vars in common locations
|
|
193
|
+
extractEnvVarsFromObject(values, envVars);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// File doesn't exist or can't be parsed
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return envVars;
|
|
200
|
+
}
|
|
201
|
+
function extractEnvVarsFromObject(obj, envVars, path = '') {
|
|
202
|
+
if (!obj || typeof obj !== 'object')
|
|
203
|
+
return;
|
|
204
|
+
if (Array.isArray(obj)) {
|
|
205
|
+
for (const item of obj) {
|
|
206
|
+
if (typeof item === 'object' && item !== null) {
|
|
207
|
+
const envItem = item;
|
|
208
|
+
if (envItem.name && typeof envItem.name === 'string') {
|
|
209
|
+
envVars.add(envItem.name);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
extractEnvVarsFromObject(item, envVars, path);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
const record = obj;
|
|
217
|
+
for (const [key, value] of Object.entries(record)) {
|
|
218
|
+
// Common patterns for env vars in Helm
|
|
219
|
+
if (key === 'env' || key === 'envVars' || key === 'environment') {
|
|
220
|
+
if (Array.isArray(value)) {
|
|
221
|
+
for (const item of value) {
|
|
222
|
+
const envItem = item;
|
|
223
|
+
if (envItem.name) {
|
|
224
|
+
envVars.add(envItem.name);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (typeof value === 'object' && value !== null) {
|
|
229
|
+
for (const envName of Object.keys(value)) {
|
|
230
|
+
envVars.add(envName);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else if (key === 'extraEnv' || key === 'extraEnvVars') {
|
|
235
|
+
extractEnvVarsFromObject(value, envVars, `${path}.${key}`);
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
extractEnvVarsFromObject(value, envVars, `${path}.${key}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function getExampleEnvVars(cwd) {
|
|
244
|
+
const envVars = new Set();
|
|
245
|
+
const envPaths = [
|
|
246
|
+
join(cwd, '.env.example'),
|
|
247
|
+
join(cwd, '.env.sample'),
|
|
248
|
+
join(cwd, '.env.template'),
|
|
249
|
+
];
|
|
250
|
+
for (const envPath of envPaths) {
|
|
251
|
+
try {
|
|
252
|
+
await access(envPath);
|
|
253
|
+
const content = await readFile(envPath, 'utf-8');
|
|
254
|
+
const lines = content.split('\n');
|
|
255
|
+
for (const line of lines) {
|
|
256
|
+
const match = line.match(/^([A-Z][A-Z0-9_]*)=/);
|
|
257
|
+
if (match) {
|
|
258
|
+
envVars.add(match[1]);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
// File doesn't exist
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return envVars;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=env-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/env-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/git-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAA;AAI3E,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiKvF"}
|